PSR-2 formatting

This commit is contained in:
Bot 2017-01-02 03:57:23 +01:00 committed by Igor Scheller
parent b839e40106
commit 7313e15ce8
82 changed files with 6351 additions and 6003 deletions

View File

@ -47,10 +47,10 @@ $shift_sum_formula = "SUM(
))*(`Shifts`.`end` - `Shifts`.`start`)*(1 - 3 * `ShiftEntry`.`freeloaded`) ))*(`Shifts`.`end` - `Shifts`.`start`)*(1 - 3 * `ShiftEntry`.`freeloaded`)
)"; )";
// voucher calculation // voucher calculation
$voucher_settings = [ $voucher_settings = [
"initial_vouchers" => 2, "initial_vouchers" => 2,
"shifts_per_voucher" => 1 "shifts_per_voucher" => 1
]; ];
// weigh every shift the same // weigh every shift the same
@ -66,4 +66,3 @@ $config = [
'pw' => "", 'pw' => "",
'db' => "engelsystem" 'db' => "engelsystem"
]; ];
?>

View File

@ -3,17 +3,19 @@
/** /**
* Text for Angeltype related links. * Text for Angeltype related links.
*/ */
function angeltypes_title() { function angeltypes_title()
return _("Angeltypes"); {
return _("Angeltypes");
} }
/** /**
* Route angeltype actions. * Route angeltype actions.
*/ */
function angeltypes_controller() { function angeltypes_controller()
$action = strip_request_item('action', 'list'); {
$action = strip_request_item('action', 'list');
switch ($action) { switch ($action) {
default: default:
case 'list': case 'list':
return angeltypes_list_controller(); return angeltypes_list_controller();
@ -31,196 +33,202 @@ function angeltypes_controller() {
/** /**
* Path to angeltype view. * Path to angeltype view.
* *
* @param AngelType $angeltype_id * @param AngelType $angeltype_id
*/ */
function angeltype_link($angeltype_id) { function angeltype_link($angeltype_id)
return page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype_id; {
return page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype_id;
} }
/** /**
* Job description for all angeltypes (public to everyone) * Job description for all angeltypes (public to everyone)
*/ */
function angeltypes_about_controller() { function angeltypes_about_controller()
global $user; {
global $user;
if (isset($user)) { if (isset($user)) {
$angeltypes = AngelTypes_with_user($user); $angeltypes = AngelTypes_with_user($user);
} else { } else {
$angeltypes = AngelTypes(); $angeltypes = AngelTypes();
} }
return [ return [
_("Teams/Job description"), _("Teams/Job description"),
AngelTypes_about_view($angeltypes, isset($user)) AngelTypes_about_view($angeltypes, isset($user))
]; ];
} }
/** /**
* Delete an Angeltype. * Delete an Angeltype.
*/ */
function angeltype_delete_controller() { function angeltype_delete_controller()
global $privileges; {
global $privileges;
if (! in_array('admin_angel_types', $privileges)) { if (! in_array('admin_angel_types', $privileges)) {
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$angeltype = load_angeltype(); $angeltype = load_angeltype();
if (isset($_REQUEST['confirmed'])) { if (isset($_REQUEST['confirmed'])) {
AngelType_delete($angeltype); AngelType_delete($angeltype);
success(sprintf(_("Angeltype %s deleted."), AngelType_name_render($angeltype))); success(sprintf(_("Angeltype %s deleted."), AngelType_name_render($angeltype)));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
return [ return [
sprintf(_("Delete angeltype %s"), $angeltype['name']), sprintf(_("Delete angeltype %s"), $angeltype['name']),
AngelType_delete_view($angeltype) AngelType_delete_view($angeltype)
]; ];
} }
/** /**
* Change an Angeltype. * Change an Angeltype.
*/ */
function angeltype_edit_controller() { function angeltype_edit_controller()
global $privileges, $user; {
global $privileges, $user;
// In supporter mode only allow to modify description // In supporter mode only allow to modify description
$supporter_mode = ! in_array('admin_angel_types', $privileges); $supporter_mode = ! in_array('admin_angel_types', $privileges);
if (isset($_REQUEST['angeltype_id'])) { if (isset($_REQUEST['angeltype_id'])) {
// Edit existing angeltype // Edit existing angeltype
$angeltype = load_angeltype(); $angeltype = load_angeltype();
if (! User_is_AngelType_supporter($user, $angeltype)) { if (! User_is_AngelType_supporter($user, $angeltype)) {
redirect(page_link_to('angeltypes')); 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();
}
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."));
} }
} } else {
// New angeltype
$angeltype['restricted'] = isset($_REQUEST['restricted']); if ($supporter_mode) {
$angeltype['no_self_signup'] = isset($_REQUEST['no_self_signup']); // Supporters aren't allowed to create new angeltypes.
redirect(page_link_to('angeltypes'));
$angeltype['requires_driver_license'] = isset($_REQUEST['requires_driver_license']);
} }
$angeltype = AngelType_new();
$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 [ 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['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']), sprintf(_("Edit %s"), $angeltype['name']),
AngelType_edit_view($angeltype, $supporter_mode) AngelType_edit_view($angeltype, $supporter_mode)
]; ];
} }
/** /**
* View details of a given angeltype. * View details of a given angeltype.
*/ */
function angeltype_controller() { function angeltype_controller()
global $privileges, $user; {
global $privileges, $user;
if (! in_array('angeltypes', $privileges)) { if (! in_array('angeltypes', $privileges)) {
redirect('?'); redirect('?');
} }
$angeltype = load_angeltype(); $angeltype = load_angeltype();
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
$user_driver_license = UserDriverLicense($user['UID']); $user_driver_license = UserDriverLicense($user['UID']);
$members = Users_by_angeltype($angeltype); $members = Users_by_angeltype($angeltype);
return [ return [
sprintf(_("Team %s"), $angeltype['name']), 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) 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. * View a list of all angeltypes.
*/ */
function angeltypes_list_controller() { function angeltypes_list_controller()
global $privileges, $user; {
global $privileges, $user;
if (! in_array('angeltypes', $privileges)) { if (! in_array('angeltypes', $privileges)) {
redirect('?'); redirect('?');
} }
$angeltypes = AngelTypes_with_user($user); $angeltypes = AngelTypes_with_user($user);
foreach ($angeltypes as &$angeltype) { foreach ($angeltypes as &$angeltype) {
$actions = [ $actions = [
button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("view"), "btn-xs") button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("view"), "btn-xs")
]; ];
if (in_array('admin_angel_types', $privileges)) { 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=edit&angeltype_id=' . $angeltype['id'], _("edit"), "btn-xs");
$actions[] = button(page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'], _("delete"), "btn-xs"); $actions[] = button(page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'], _("delete"), "btn-xs");
} }
$angeltype['membership'] = AngelType_render_membership($angeltype); $angeltype['membership'] = AngelType_render_membership($angeltype);
if ($angeltype['user_angeltype_id'] != null) { 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"); $actions[] = button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $angeltype['user_angeltype_id'], _("leave"), "btn-xs");
} else { } else {
$actions[] = button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("join"), "btn-xs"); $actions[] = button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("join"), "btn-xs");
} }
$angeltype['restricted'] = $angeltype['restricted'] ? glyph('lock') : ''; $angeltype['restricted'] = $angeltype['restricted'] ? glyph('lock') : '';
$angeltype['no_self_signup'] = $angeltype['no_self_signup'] ? '' : glyph('share'); $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['name'] = '<a href="' . page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'] . '">' . $angeltype['name'] . '</a>';
$angeltype['actions'] = table_buttons($actions); $angeltype['actions'] = table_buttons($actions);
} }
return [ return [
angeltypes_title(), angeltypes_title(),
AngelTypes_list_view($angeltypes, in_array('admin_angel_types', $privileges)) AngelTypes_list_view($angeltypes, in_array('admin_angel_types', $privileges))
]; ];
} }
/** /**
* Loads an angeltype from given angeltype_id request param. * Loads an angeltype from given angeltype_id request param.
*/ */
function load_angeltype() { function load_angeltype()
if (! isset($_REQUEST['angeltype_id'])) { {
redirect(page_link_to('angeltypes')); if (! isset($_REQUEST['angeltype_id'])) {
} redirect(page_link_to('angeltypes'));
}
$angeltype = AngelType($_REQUEST['angeltype_id']); $angeltype = AngelType($_REQUEST['angeltype_id']);
if ($angeltype == null) { if ($angeltype == null) {
error(_("Angeltype doesn't exist.")); error(_("Angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
return $angeltype; return $angeltype;
} }
?>

View File

@ -1,103 +1,103 @@
<?php <?php
function event_config_title() { function event_config_title()
return _("Event config"); {
return _("Event config");
} }
function event_config_edit_controller() { function event_config_edit_controller()
global $privileges; {
global $privileges;
if (! in_array('admin_event_config', $privileges)) { if (! in_array('admin_event_config', $privileges)) {
redirect('?'); redirect('?');
} }
$event_name = null; $event_name = null;
$event_welcome_msg = null; $event_welcome_msg = null;
$buildup_start_date = null; $buildup_start_date = null;
$event_start_date = null; $event_start_date = null;
$event_end_date = null; $event_end_date = null;
$teardown_end_date = null; $teardown_end_date = null;
$event_config = EventConfig(); $event_config = EventConfig();
if ($event_config != null) { if ($event_config != null) {
$event_name = $event_config['event_name']; $event_name = $event_config['event_name'];
$buildup_start_date = $event_config['buildup_start_date']; $buildup_start_date = $event_config['buildup_start_date'];
$event_start_date = $event_config['event_start_date']; $event_start_date = $event_config['event_start_date'];
$event_end_date = $event_config['event_end_date']; $event_end_date = $event_config['event_end_date'];
$teardown_end_date = $event_config['teardown_end_date']; $teardown_end_date = $event_config['teardown_end_date'];
$event_welcome_msg = $event_config['event_welcome_msg']; $event_welcome_msg = $event_config['event_welcome_msg'];
} }
if (isset($_REQUEST['submit'])) { if (isset($_REQUEST['submit'])) {
$valid = true; $valid = true;
if (isset($_REQUEST['event_name'])) { if (isset($_REQUEST['event_name'])) {
$event_name = strip_request_item('event_name'); $event_name = strip_request_item('event_name');
} }
if ($event_name == '') { if ($event_name == '') {
$event_name = null; $event_name = null;
} }
if (isset($_REQUEST['event_welcome_msg'])) { if (isset($_REQUEST['event_welcome_msg'])) {
$event_welcome_msg = strip_request_item_nl('event_welcome_msg'); $event_welcome_msg = strip_request_item_nl('event_welcome_msg');
} }
if ($event_welcome_msg == '') { if ($event_welcome_msg == '') {
$event_welcome_msg = null; $event_welcome_msg = null;
} }
$result = check_request_date('buildup_start_date', _("Please enter buildup start date."), true); $result = check_request_date('buildup_start_date', _("Please enter buildup start date."), true);
$buildup_start_date = $result->getValue(); $buildup_start_date = $result->getValue();
$valid &= $result->isValid(); $valid &= $result->isValid();
$result = check_request_date('event_start_date', _("Please enter event start date."), true); $result = check_request_date('event_start_date', _("Please enter event start date."), true);
$event_start_date = $result->getValue(); $event_start_date = $result->getValue();
$valid &= $result->isValid(); $valid &= $result->isValid();
$result = check_request_date('event_end_date', _("Please enter event end date."), true); $result = check_request_date('event_end_date', _("Please enter event end date."), true);
$event_end_date = $result->getValue(); $event_end_date = $result->getValue();
$valid &= $result->isValid(); $valid &= $result->isValid();
$result = check_request_date('teardown_end_date', _("Please enter teardown end date."), true); $result = check_request_date('teardown_end_date', _("Please enter teardown end date."), true);
$teardown_end_date = $result->getValue(); $teardown_end_date = $result->getValue();
$valid &= $result->isValid(); $valid &= $result->isValid();
if ($buildup_start_date != null && $event_start_date != null && $buildup_start_date > $event_start_date) { if ($buildup_start_date != null && $event_start_date != null && $buildup_start_date > $event_start_date) {
$valid = false; $valid = false;
error(_("The buildup start date has to be before the event start date.")); 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) { if ($event_start_date != null && $event_end_date != null && $event_start_date > $event_end_date) {
$valid = false; $valid = false;
error(_("The event start date has to be before the event end date.")); 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) { if ($event_end_date != null && $teardown_end_date != null && $event_end_date > $teardown_end_date) {
$valid = false; $valid = false;
error(_("The event end date has to be before the teardown end date.")); 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) { if ($buildup_start_date != null && $teardown_end_date != null && $buildup_start_date > $teardown_end_date) {
$valid = false; $valid = false;
error(_("The buildup start date has to be before the teardown end date.")); error(_("The buildup start date has to be before the teardown end date."));
} }
if ($valid) { if ($valid) {
$result = EventConfig_update($event_name, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date, $event_welcome_msg); $result = EventConfig_update($event_name, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date, $event_welcome_msg);
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to update event config."); 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)); 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.")); success(_("Settings saved."));
redirect(page_link_to('admin_event_config')); redirect(page_link_to('admin_event_config'));
}
} }
}
return [ return [
event_config_title(), event_config_title(),
EventConfig_edit_view($event_name, $event_welcome_msg, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date) EventConfig_edit_view($event_name, $event_welcome_msg, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date)
]; ];
} }
?>

View File

@ -10,56 +10,58 @@ use Engelsystem\ShiftCalendarRenderer;
/** /**
* View a room with its shifts. * View a room with its shifts.
*/ */
function room_controller() { function room_controller()
global $privileges; {
global $privileges;
if (! in_array('view_rooms', $privileges)) { if (! in_array('view_rooms', $privileges)) {
redirect(page_link_to()); 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 = load_room();
$room['RID'] $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()); ], AngelType_ids());
$selected_day = date("Y-m-d"); $selected_day = date("Y-m-d");
if (! empty($days)) { if (! empty($days)) {
$selected_day = $days[0]; $selected_day = $days[0];
} }
if (isset($_REQUEST['shifts_filter_day'])) { if (isset($_REQUEST['shifts_filter_day'])) {
$selected_day = $_REQUEST['shifts_filter_day']; $selected_day = $_REQUEST['shifts_filter_day'];
} }
$shiftsFilter->setStartTime(parse_date("Y-m-d H:i", $selected_day . ' 00:00')); $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')); $shiftsFilter->setEndTime(parse_date("Y-m-d H:i", $selected_day . ' 23:59'));
$shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter); $shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter);
$shiftsFilterRenderer->enableDaySelection($days); $shiftsFilterRenderer->enableDaySelection($days);
$shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter); $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter);
return [ return [
$room['Name'], $room['Name'],
Room_view($room, $shiftsFilterRenderer, $shiftCalendarRenderer) Room_view($room, $shiftsFilterRenderer, $shiftCalendarRenderer)
]; ];
} }
/** /**
* Dispatch different room actions. * Dispatch different room actions.
*/ */
function rooms_controller() { function rooms_controller()
if (! isset($_REQUEST['action'])) { {
$_REQUEST['action'] = 'list'; if (! isset($_REQUEST['action'])) {
} $_REQUEST['action'] = 'list';
}
switch ($_REQUEST['action']) { switch ($_REQUEST['action']) {
default: default:
case 'list': case 'list':
redirect(page_link_to('admin_rooms')); redirect(page_link_to('admin_rooms'));
@ -68,28 +70,29 @@ function rooms_controller() {
} }
} }
function room_link($room) { function room_link($room)
return page_link_to('rooms') . '&action=view&room_id=' . $room['RID']; {
return page_link_to('rooms') . '&action=view&room_id=' . $room['RID'];
} }
function room_edit_link($room) { function room_edit_link($room)
return page_link_to('admin_rooms') . '&show=edit&id=' . $room['RID']; {
return page_link_to('admin_rooms') . '&show=edit&id=' . $room['RID'];
} }
/** /**
* Loads room by request param room_id * Loads room by request param room_id
*/ */
function load_room() { function load_room()
if (! test_request_int('room_id')) { {
redirect(page_link_to()); if (! test_request_int('room_id')) {
} redirect(page_link_to());
}
$room = Room($_REQUEST['room_id']); $room = Room($_REQUEST['room_id']);
if ($room == null) { if ($room == null) {
redirect(page_link_to()); redirect(page_link_to());
} }
return $room; return $room;
} }
?>

View File

@ -3,159 +3,160 @@
/** /**
* Sign up for a shift. * Sign up for a shift.
*/ */
function shift_entry_add_controller() { function shift_entry_add_controller()
global $privileges, $user; {
global $privileges, $user;
if (isset($_REQUEST['shift_id']) && preg_match("/^[0-9]*$/", $_REQUEST['shift_id'])) { if (isset($_REQUEST['shift_id']) && preg_match("/^[0-9]*$/", $_REQUEST['shift_id'])) {
$shift_id = $_REQUEST['shift_id']; $shift_id = $_REQUEST['shift_id'];
} else { } else {
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
// Locations laden // Locations laden
$rooms = sql_select("SELECT * FROM `Room` WHERE `show`='Y' ORDER BY `Name`"); $rooms = sql_select("SELECT * FROM `Room` WHERE `show`='Y' ORDER BY `Name`");
$room_array = []; $room_array = [];
foreach ($rooms as $room) { foreach ($rooms as $room) {
$room_array[$room['RID']] = $room['Name']; $room_array[$room['RID']] = $room['Name'];
} }
$shift = Shift($shift_id); $shift = Shift($shift_id);
$shift['Name'] = $room_array[$shift['RID']]; $shift['Name'] = $room_array[$shift['RID']];
if ($shift == null) { 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) {
redirect(page_link_to('user_shifts')); 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) {
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) { 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']; $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) . "'")) { 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); return error("This angel does already have an entry for this shift.", true);
} }
$freeloaded = $shift['freeloaded']; $freeloaded = $shift['freeloaded'];
$freeload_comment = $shift['freeload_comment']; $freeload_comment = $shift['freeload_comment'];
if (in_array("user_shifts_admin", $privileges)) { if (in_array("user_shifts_admin", $privileges)) {
$freeloaded = isset($_REQUEST['freeloaded']); $freeloaded = isset($_REQUEST['freeloaded']);
$freeload_comment = strip_request_item_nl('freeload_comment'); $freeload_comment = strip_request_item_nl('freeload_comment');
} }
$comment = strip_request_item_nl('comment'); $comment = strip_request_item_nl('comment');
$result = ShiftEntry_create([ $result = ShiftEntry_create([
'SID' => $shift_id, 'SID' => $shift_id,
'TID' => $selected_type_id, 'TID' => $selected_type_id,
'UID' => $user_id, 'UID' => $user_id,
'Comment' => $comment, 'Comment' => $comment,
'freeloaded' => $freeloaded, 'freeloaded' => $freeloaded,
'freeload_comment' => $freeload_comment 'freeload_comment' => $freeload_comment
]); ]);
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to create shift entry.'); engelsystem_error('Unable to create shift entry.');
} }
if ($type['restricted'] == 0 && sql_num_query("SELECT * FROM `UserAngelTypes` INNER JOIN `AngelTypes` ON `AngelTypes`.`id` = `UserAngelTypes`.`angeltype_id` WHERE `angeltype_id` = '" . sql_escape($selected_type_id) . "' AND `user_id` = '" . sql_escape($user_id) . "'") == 0) { 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) . "')"); sql_query("INSERT INTO `UserAngelTypes` (`user_id`, `angeltype_id`) VALUES ('" . sql_escape($user_id) . "', '" . sql_escape($selected_type_id) . "')");
} }
$user_source = User($user_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'])); 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") . ' &raquo;</a>'); success(_("You are subscribed. Thank you!") . ' <a href="' . page_link_to('user_myshifts') . '">' . _("My shifts") . ' &raquo;</a>');
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
if (in_array('user_shifts_admin', $privileges)) { 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 = sql_select("SELECT *, (SELECT count(*) FROM `ShiftEntry` WHERE `freeloaded`=1 AND `ShiftEntry`.`UID`=`User`.`UID`) AS `freeloaded` FROM `User` ORDER BY `Nick`");
$users_select = []; $users_select = [];
foreach ($users as $usr) { foreach ($users as $usr) {
$users_select[$usr['UID']] = $usr['Nick'] . ($usr['freeloaded'] == 0 ? "" : " (" . _("Freeloader") . ")"); $users_select[$usr['UID']] = $usr['Nick'] . ($usr['freeloaded'] == 0 ? "" : " (" . _("Freeloader") . ")");
} }
$user_text = html_select_key('user_id', 'user_id', $users_select, $user['UID']); $user_text = html_select_key('user_id', 'user_id', $users_select, $user['UID']);
$angeltypes_source = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`"); $angeltypes_source = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`");
$angeltypes = []; $angeltypes = [];
foreach ($angeltypes_source as $angeltype) { foreach ($angeltypes_source as $angeltype) {
$angeltypes[$angeltype['id']] = $angeltype['name']; $angeltypes[$angeltype['id']] = $angeltype['name'];
} }
$angeltype_select = html_select_key('angeltype_id', 'angeltype_id', $angeltypes, $type['id']); $angeltype_select = html_select_key('angeltype_id', 'angeltype_id', $angeltypes, $type['id']);
} elseif (in_array('shiftentry_edit_angeltype_supporter', $privileges)) { } elseif (in_array('shiftentry_edit_angeltype_supporter', $privileges)) {
$users = Users_by_angeltype($type); $users = Users_by_angeltype($type);
$users_select = []; $users_select = [];
foreach ($users as $usr) { foreach ($users as $usr) {
if (! $type['restricted'] || $usr['confirm_user_id'] != null) { if (! $type['restricted'] || $usr['confirm_user_id'] != null) {
$users_select[$usr['UID']] = $usr['Nick']; $users_select[$usr['UID']] = $usr['Nick'];
} }
} }
$user_text = html_select_key('user_id', 'user_id', $users_select, $user['UID']); $user_text = html_select_key('user_id', 'user_id', $users_select, $user['UID']);
$angeltypes_source = User_angeltypes($user); $angeltypes_source = User_angeltypes($user);
$angeltypes = []; $angeltypes = [];
foreach ($angeltypes_source as $angeltype) { foreach ($angeltypes_source as $angeltype) {
if ($angeltype['supporter']) { if ($angeltype['supporter']) {
$angeltypes[$angeltype['id']] = $angeltype['name']; $angeltypes[$angeltype['id']] = $angeltype['name'];
} }
$angeltype_select = html_select_key('angeltype_id', 'angeltype_id', $angeltypes, $type['id']); $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']) . ' &ndash; ' . 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']) . ' &ndash; ' . 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. * Remove somebody from a shift.
*/ */
function shift_entry_delete_controller() { function shift_entry_delete_controller()
global $privileges, $user; {
global $privileges, $user;
if (! isset($_REQUEST['entry_id']) || ! test_request_int('entry_id')) { if (! isset($_REQUEST['entry_id']) || ! test_request_int('entry_id')) {
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
$entry_id = $_REQUEST['entry_id']; $entry_id = $_REQUEST['entry_id'];
$shift_entry_source = sql_select(" $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` SELECT `User`.`Nick`, `ShiftEntry`.`Comment`, `ShiftEntry`.`UID`, `ShiftTypes`.`name`, `Shifts`.*, `Room`.`Name`, `AngelTypes`.`name` as `angel_type`, `AngelTypes`.`id` as `angeltype_id`
FROM `ShiftEntry` FROM `ShiftEntry`
JOIN `User` ON (`User`.`UID`=`ShiftEntry`.`UID`) JOIN `User` ON (`User`.`UID`=`ShiftEntry`.`UID`)
@ -164,24 +165,22 @@ function shift_entry_delete_controller() {
JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`)
JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`)
WHERE `ShiftEntry`.`id`='" . sql_escape($entry_id) . "'"); WHERE `ShiftEntry`.`id`='" . sql_escape($entry_id) . "'");
if (count($shift_entry_source) > 0) { if (count($shift_entry_source) > 0) {
$shift_entry_source = $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'])))) { 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')); 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."));
} }
redirect(shift_link($shift_entry_source));
$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."));
}
redirect(shift_link($shift_entry_source));
} }
?>

View File

@ -1,136 +1,140 @@
<?php <?php
use Engelsystem\ShiftSignupState; use Engelsystem\ShiftSignupState;
function shift_link($shift) { function shift_link($shift)
return page_link_to('shifts') . '&action=view&shift_id=' . $shift['SID']; {
return page_link_to('shifts') . '&action=view&shift_id=' . $shift['SID'];
} }
function shift_delete_link($shift) { function shift_delete_link($shift)
return page_link_to('user_shifts') . '&delete_shift=' . $shift['SID']; {
return page_link_to('user_shifts') . '&delete_shift=' . $shift['SID'];
} }
function shift_edit_link($shift) { function shift_edit_link($shift)
return page_link_to('user_shifts') . '&edit_shift=' . $shift['SID']; {
return page_link_to('user_shifts') . '&edit_shift=' . $shift['SID'];
} }
/** /**
* Edit a single shift. * Edit a single shift.
*/ */
function shift_edit_controller() { function shift_edit_controller()
global $privileges; {
global $privileges;
// Schicht bearbeiten // Schicht bearbeiten
$msg = ""; $msg = "";
$valid = true; $valid = true;
if (! in_array('admin_shifts', $privileges)) { if (! in_array('admin_shifts', $privileges)) {
redirect(page_link_to('user_shifts')); 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;
} }
}
$shifttype_id = $shift['shifttype_id']; if (! isset($_REQUEST['edit_shift']) || ! test_request_int('edit_shift')) {
$title = $shift['title']; redirect(page_link_to('user_shifts'));
$rid = $shift['RID']; }
$start = $shift['start']; $shift_id = $_REQUEST['edit_shift'];
$end = $shift['end'];
if (isset($_REQUEST['submit'])) { $shift = Shift($shift_id);
// Name/Bezeichnung der Schicht, darf leer sein
$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;
}
}
$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'); $title = strip_request_item('title');
// Auswahl der sichtbaren Locations für die Schichten // Auswahl der sichtbaren Locations für die Schichten
if (isset($_REQUEST['rid']) && preg_match("/^[0-9]+$/", $_REQUEST['rid']) && isset($room[$_REQUEST['rid']])) { if (isset($_REQUEST['rid']) && preg_match("/^[0-9]+$/", $_REQUEST['rid']) && isset($room[$_REQUEST['rid']])) {
$rid = $_REQUEST['rid']; $rid = $_REQUEST['rid'];
} else { } 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; $valid = false;
$msg .= error(sprintf(_("Please check your input for needed angels of type %s."), $needed_angeltype_name), true); $msg .= error(_("Please select a room."), true);
}
} }
if ($valid) { if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) {
$shift['shifttype_id'] = $shifttype_id; $shifttype_id = $_REQUEST['shifttype_id'];
$shift['title'] = $title; } else {
$shift['RID'] = $rid; $valid = false;
$shift['start'] = $start; $msg .= error(_('Please select a shifttype.'), true);
$shift['end'] = $end; }
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); $result = Shift_update($shift);
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to update shift.'); engelsystem_error('Unable to update shift.');
} }
NeededAngelTypes_delete_by_shift($shift_id); NeededAngelTypes_delete_by_shift($shift_id);
$needed_angel_types_info = []; $needed_angel_types_info = [];
foreach ($needed_angel_types as $type_id => $count) { foreach ($needed_angel_types as $type_id => $count) {
NeededAngelType_add($shift_id, $type_id, null, $count); NeededAngelType_add($shift_id, $type_id, null, $count);
$needed_angel_types_info[] = $angeltypes[$type_id] . ": " . $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)); 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.")); success(_("Shift updated."));
redirect(shift_link([ redirect(shift_link([
'SID' => $shift_id 'SID' => $shift_id
])); ]));
}
} }
}
$angel_types_spinner = ""; $angel_types_spinner = "";
foreach ($angeltypes as $angeltype_id => $angeltype_name) { foreach ($angeltypes as $angeltype_id => $angeltype_name) {
$angel_types_spinner .= form_spinner('type_' . $angeltype_id, $angeltype_name, $needed_angel_types[$angeltype_id]); $angel_types_spinner .= form_spinner('type_' . $angeltype_id, $angeltype_name, $needed_angel_types[$angeltype_id]);
} }
return page_with_title(shifts_title(), [ return page_with_title(shifts_title(), [
msg(), msg(),
'<noscript>' . info(_("This page is much more comfortable with javascript."), true) . '</noscript>', '<noscript>' . info(_("This page is much more comfortable with javascript."), true) . '</noscript>',
form([ form([
@ -141,92 +145,95 @@ function shift_edit_controller() {
form_text('end', _("End:"), date("Y-m-d H:i", $end)), form_text('end', _("End:"), date("Y-m-d H:i", $end)),
'<h2>' . _("Needed angels") . '</h2>', '<h2>' . _("Needed angels") . '</h2>',
$angel_types_spinner, $angel_types_spinner,
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]) ])
]); ]);
} }
function shift_delete_controller() { function shift_delete_controller()
global $privileges; {
global $privileges;
if (! in_array('user_shifts_admin', $privileges)) { if (! in_array('user_shifts_admin', $privileges)) {
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
// Schicht komplett löschen (nur für admins/user mit user_shifts_admin privileg) // 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'])) { if (! isset($_REQUEST['delete_shift']) || ! preg_match("/^[0-9]*$/", $_REQUEST['delete_shift'])) {
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
$shift_id = $_REQUEST['delete_shift']; $shift_id = $_REQUEST['delete_shift'];
$shift = Shift($shift_id); $shift = Shift($shift_id);
if ($shift == null) { if ($shift == null) {
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
// Schicht löschen bestätigt // Schicht löschen bestätigt
if (isset($_REQUEST['delete'])) { if (isset($_REQUEST['delete'])) {
Shift_delete($shift_id); 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'])); 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.")); success(_("Shift deleted."));
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
return page_with_title(shifts_title(), [ 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), 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>' '<a class="button" href="?p=user_shifts&delete_shift=' . $shift_id . '&delete">' . _("delete") . '</a>'
]); ]);
} }
function shift_controller() { function shift_controller()
global $user, $privileges; {
global $user, $privileges;
if (! in_array('user_shifts', $privileges)) { if (! in_array('user_shifts', $privileges)) {
redirect(page_link_to('?')); 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);
} }
$angeltype['shift_signup_state'] = $angeltype_signup_state;
}
return [ 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);
}
$angeltype['shift_signup_state'] = $angeltype_signup_state;
}
return [
$shift['name'], $shift['name'],
Shift_view($shift, $shifttype, $room, $angeltypes, $shift_signup_state) Shift_view($shift, $shifttype, $room, $angeltypes, $shift_signup_state)
]; ];
} }
function shifts_controller() { function shifts_controller()
if (! isset($_REQUEST['action'])) { {
redirect(page_link_to('user_shifts')); if (! isset($_REQUEST['action'])) {
} redirect(page_link_to('user_shifts'));
}
switch ($_REQUEST['action']) { switch ($_REQUEST['action']) {
default: default:
redirect(page_link_to('?')); redirect(page_link_to('?'));
case 'view': case 'view':
@ -239,86 +246,88 @@ function shifts_controller() {
/** /**
* Redirects the user to his next shift. * Redirects the user to his next shift.
*/ */
function shift_next_controller() { function shift_next_controller()
global $user, $privileges; {
global $user, $privileges;
if (! in_array('user_shifts', $privileges)) { if (! in_array('user_shifts', $privileges)) {
redirect(page_link_to('?')); redirect(page_link_to('?'));
} }
$upcoming_shifts = ShiftEntries_upcoming_for_user($user); $upcoming_shifts = ShiftEntries_upcoming_for_user($user);
if ($upcoming_shifts === false) { if ($upcoming_shifts === false) {
return false; return false;
} }
if (count($upcoming_shifts) > 0) { if (count($upcoming_shifts) > 0) {
redirect(shift_link($upcoming_shifts[0])); redirect(shift_link($upcoming_shifts[0]));
} }
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
/** /**
* Export all shifts using api-key. * Export all shifts using api-key.
*/ */
function shifts_json_export_all_controller() { function shifts_json_export_all_controller()
global $api_key; {
global $api_key;
if ($api_key == "") { if ($api_key == "") {
engelsystem_error("Config contains empty apikey."); engelsystem_error("Config contains empty apikey.");
} }
if (! isset($_REQUEST['api_key'])) { if (! isset($_REQUEST['api_key'])) {
engelsystem_error("Missing parameter api_key."); engelsystem_error("Missing parameter api_key.");
} }
if ($_REQUEST['api_key'] != $api_key) { if ($_REQUEST['api_key'] != $api_key) {
engelsystem_error("Invalid api_key."); engelsystem_error("Invalid api_key.");
} }
$shifts_source = Shifts(); $shifts_source = Shifts();
if ($shifts_source === false) { if ($shifts_source === false) {
engelsystem_error("Unable to load shifts."); engelsystem_error("Unable to load shifts.");
} }
header("Content-Type: application/json; charset=utf-8"); header("Content-Type: application/json; charset=utf-8");
raw_output(json_encode($shifts_source)); raw_output(json_encode($shifts_source));
} }
/** /**
* Export filtered shifts via JSON. * Export filtered shifts via JSON.
* (Like iCal Export or shifts view) * (Like iCal Export or shifts view)
*/ */
function shifts_json_export_controller() { function shifts_json_export_controller()
global $user; {
global $user;
if (! isset($_REQUEST['key']) || ! preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) { if (! isset($_REQUEST['key']) || ! preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) {
engelsystem_error("Missing key."); engelsystem_error("Missing key.");
} }
$key = $_REQUEST['key']; $key = $_REQUEST['key'];
$user = User_by_api_key($key); $user = User_by_api_key($key);
if ($user == null) { if ($user == null) {
engelsystem_error("Key invalid."); engelsystem_error("Key invalid.");
} }
if (! in_array('shifts_json_export', privileges_for_user($user['UID']))) { if (! in_array('shifts_json_export', privileges_for_user($user['UID']))) {
engelsystem_error("No privilege for shifts_json_export."); engelsystem_error("No privilege for shifts_json_export.");
} }
$shifts = load_ical_shifts(); $shifts = load_ical_shifts();
header("Content-Type: application/json; charset=utf-8"); header("Content-Type: application/json; charset=utf-8");
raw_output(json_encode($shifts)); raw_output(json_encode($shifts));
} }
/** /**
* Returns users shifts to export. * Returns users shifts to export.
*/ */
function load_ical_shifts() { function load_ical_shifts()
global $user; {
global $user;
return Shifts_by_user($user); return Shifts_by_user($user);
} }
?>

View File

@ -1,169 +1,176 @@
<?php <?php
function shifttype_link($shifttype) { function shifttype_link($shifttype)
return page_link_to('shifttypes') . '&action=view&shifttype_id=' . $shifttype['id']; {
return page_link_to('shifttypes') . '&action=view&shifttype_id=' . $shifttype['id'];
} }
/** /**
* Delete a shifttype. * Delete a shifttype.
*/ */
function shifttype_delete_controller() { function shifttype_delete_controller()
if (! isset($_REQUEST['shifttype_id'])) { {
redirect(page_link_to('shifttypes')); 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.');
} }
engelsystem_log('Deleted shifttype ' . $shifttype['name']);
success(sprintf(_('Shifttype %s deleted.'), $shifttype['name']));
redirect(page_link_to('shifttypes'));
}
return [ $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.');
}
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']), sprintf(_("Delete shifttype %s"), $shifttype['name']),
ShiftType_delete_view($shifttype) ShiftType_delete_view($shifttype)
]; ];
} }
/** /**
* Edit or create shift type. * Edit or create shift type.
*/ */
function shifttype_edit_controller() { function shifttype_edit_controller()
$shifttype_id = null; {
$name = ""; $shifttype_id = null;
$angeltype_id = null; $name = "";
$description = ""; $angeltype_id = null;
$description = "";
$angeltypes = AngelTypes(); $angeltypes = AngelTypes();
if (isset($_REQUEST['shifttype_id'])) { if (isset($_REQUEST['shifttype_id'])) {
$shifttype = ShiftType($_REQUEST['shifttype_id']); $shifttype = ShiftType($_REQUEST['shifttype_id']);
if ($shifttype === false) { if ($shifttype === false) {
engelsystem_error('Unable to load shifttype.'); 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.'));
}
if (isset($_REQUEST['angeltype_id']) && preg_match("/^[0-9]+$/", $_REQUEST['angeltype_id'])) {
$angeltype_id = $_REQUEST['angeltype_id'];
} else {
$angeltype_id = null;
}
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); if ($shifttype == null) {
success(_('Updated shifttype.')); error(_('Shifttype not found.'));
} else { redirect(page_link_to('shifttypes'));
$shifttype_id = ShiftType_create($name, $angeltype_id, $description);
if ($shifttype_id === false) {
engelsystem_error('Unable to create shifttype.');
} }
engelsystem_log('Created shifttype ' . $name); $shifttype_id = $shifttype['id'];
success(_('Created shifttype.')); $name = $shifttype['name'];
} $angeltype_id = $shifttype['angeltype_id'];
redirect(page_link_to('shifttypes') . '&action=view&shifttype_id=' . $shifttype_id); $description = $shifttype['description'];
} }
}
return [ 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("/^[0-9]+$/", $_REQUEST['angeltype_id'])) {
$angeltype_id = $_REQUEST['angeltype_id'];
} else {
$angeltype_id = null;
}
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);
}
}
return [
shifttypes_title(), shifttypes_title(),
ShiftType_edit_view($name, $angeltype_id, $angeltypes, $description, $shifttype_id) ShiftType_edit_view($name, $angeltype_id, $angeltypes, $description, $shifttype_id)
]; ];
} }
function shifttype_controller() { function shifttype_controller()
if (! isset($_REQUEST['shifttype_id'])) { {
redirect(page_link_to('shifttypes')); if (! isset($_REQUEST['shifttype_id'])) {
} redirect(page_link_to('shifttypes'));
$shifttype = ShiftType($_REQUEST['shifttype_id']); }
if ($shifttype === false) { $shifttype = ShiftType($_REQUEST['shifttype_id']);
engelsystem_error('Unable to load shifttype.'); if ($shifttype === false) {
} engelsystem_error('Unable to load shifttype.');
if ($shifttype == null) { }
redirect(page_link_to('shifttypes')); if ($shifttype == null) {
} redirect(page_link_to('shifttypes'));
}
$angeltype = null; $angeltype = null;
if ($shifttype['angeltype_id'] != null) { if ($shifttype['angeltype_id'] != null) {
$angeltype = AngelType($shifttype['angeltype_id']); $angeltype = AngelType($shifttype['angeltype_id']);
} }
return [ return [
$shifttype['name'], $shifttype['name'],
ShiftType_view($shifttype, $angeltype) ShiftType_view($shifttype, $angeltype)
]; ];
} }
/** /**
* List all shift types. * List all shift types.
*/ */
function shifttypes_list_controller() { function shifttypes_list_controller()
$shifttypes = ShiftTypes(); {
if ($shifttypes === false) { $shifttypes = ShiftTypes();
engelsystem_error("Unable to load shifttypes."); if ($shifttypes === false) {
} engelsystem_error("Unable to load shifttypes.");
}
return [ return [
shifttypes_title(), shifttypes_title(),
ShiftTypes_list_view($shifttypes) ShiftTypes_list_view($shifttypes)
]; ];
} }
/** /**
* Text for shift type related links. * Text for shift type related links.
*/ */
function shifttypes_title() { function shifttypes_title()
return _("Shifttypes"); {
return _("Shifttypes");
} }
/** /**
* Route shift type actions * Route shift type actions
*/ */
function shifttypes_controller() { function shifttypes_controller()
if (! isset($_REQUEST['action'])) { {
$_REQUEST['action'] = 'list'; if (! isset($_REQUEST['action'])) {
} $_REQUEST['action'] = 'list';
}
switch ($_REQUEST['action']) { switch ($_REQUEST['action']) {
default: default:
case 'list': case 'list':
return shifttypes_list_controller(); return shifttypes_list_controller();
@ -175,5 +182,3 @@ function shifttypes_controller() {
return shifttype_delete_controller(); return shifttype_delete_controller();
} }
} }
?>

View File

@ -3,272 +3,279 @@
/** /**
* Display a hint for team/angeltype supporters if there are unconfirmed users for his angeltype. * Display a hint for team/angeltype supporters if there are unconfirmed users for his angeltype.
*/ */
function user_angeltypes_unconfirmed_hint() { function user_angeltypes_unconfirmed_hint()
global $user; {
global $user;
$unconfirmed_user_angeltypes = User_unconfirmed_AngelTypes($user); $unconfirmed_user_angeltypes = User_unconfirmed_AngelTypes($user);
if (count($unconfirmed_user_angeltypes) == 0) { if (count($unconfirmed_user_angeltypes) == 0) {
return null; return null;
} }
$unconfirmed_links = []; $unconfirmed_links = [];
foreach ($unconfirmed_user_angeltypes as $user_angeltype) { 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>'; $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); 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. * Remove all unconfirmed users from a specific angeltype.
*/ */
function user_angeltypes_delete_all_controller() { function user_angeltypes_delete_all_controller()
global $user; {
global $user;
if (! isset($_REQUEST['angeltype_id'])) { if (! isset($_REQUEST['angeltype_id'])) {
error(_("Angeltype doesn't exist.")); error(_("Angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$angeltype = AngelType($_REQUEST['angeltype_id']); $angeltype = AngelType($_REQUEST['angeltype_id']);
if ($angeltype == null) { if ($angeltype == null) {
error(_("Angeltype doesn't exist.")); error(_("Angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
if (! User_is_AngelType_supporter($user, $angeltype)) { if (! User_is_AngelType_supporter($user, $angeltype)) {
error(_("You are not allowed to delete all users for this angeltype.")); error(_("You are not allowed to delete all users for this angeltype."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
if (isset($_REQUEST['confirmed'])) { if (isset($_REQUEST['confirmed'])) {
UserAngelTypes_delete_all($angeltype['id']); UserAngelTypes_delete_all($angeltype['id']);
engelsystem_log(sprintf("Denied all users for angeltype %s", AngelType_name_render($angeltype))); 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))); success(sprintf(_("Denied all users for angeltype %s."), AngelType_name_render($angeltype)));
redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']);
} }
return [ return [
_("Deny all users"), _("Deny all users"),
UserAngelTypes_delete_all_view($angeltype) UserAngelTypes_delete_all_view($angeltype)
]; ];
} }
/** /**
* Confirm all unconfirmed users for an angeltype. * Confirm all unconfirmed users for an angeltype.
*/ */
function user_angeltypes_confirm_all_controller() { function user_angeltypes_confirm_all_controller()
global $user, $privileges; {
global $user, $privileges;
if (! isset($_REQUEST['angeltype_id'])) { if (! isset($_REQUEST['angeltype_id'])) {
error(_("Angeltype doesn't exist.")); error(_("Angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$angeltype = AngelType($_REQUEST['angeltype_id']); $angeltype = AngelType($_REQUEST['angeltype_id']);
if ($angeltype == null) { if ($angeltype == null) {
error(_("Angeltype doesn't exist.")); error(_("Angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
if ($user_angeltype == null) { if ($user_angeltype == null) {
error(_("User angeltype doesn't exist.")); error(_("User angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
if (! in_array('admin_user_angeltypes', $privileges) && ! $user_angeltype['supporter']) { if (! in_array('admin_user_angeltypes', $privileges) && ! $user_angeltype['supporter']) {
error(_("You are not allowed to confirm all users for this angeltype.")); error(_("You are not allowed to confirm all users for this angeltype."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
if (isset($_REQUEST['confirmed'])) { if (isset($_REQUEST['confirmed'])) {
UserAngelTypes_confirm_all($angeltype['id'], $user); UserAngelTypes_confirm_all($angeltype['id'], $user);
engelsystem_log(sprintf("Confirmed all users for angeltype %s", AngelType_name_render($angeltype))); 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))); success(sprintf(_("Confirmed all users for angeltype %s."), AngelType_name_render($angeltype)));
redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']);
} }
return [ return [
_("Confirm all users"), _("Confirm all users"),
UserAngelTypes_confirm_all_view($angeltype) UserAngelTypes_confirm_all_view($angeltype)
]; ];
} }
/** /**
* Confirm an user for an angeltype. * Confirm an user for an angeltype.
*/ */
function user_angeltype_confirm_controller() { function user_angeltype_confirm_controller()
global $user; {
global $user;
if (! isset($_REQUEST['user_angeltype_id'])) { if (! isset($_REQUEST['user_angeltype_id'])) {
error(_("User angeltype doesn't exist.")); error(_("User angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); 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 [ $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"), _("Confirm angeltype for user"),
UserAngelType_confirm_view($user_angeltype, $user_source, $angeltype) UserAngelType_confirm_view($user_angeltype, $user_source, $angeltype)
]; ];
} }
/** /**
* Remove a user from an Angeltype. * Remove a user from an Angeltype.
*/ */
function user_angeltype_delete_controller() { function user_angeltype_delete_controller()
global $user; {
global $user;
if (! isset($_REQUEST['user_angeltype_id'])) { if (! isset($_REQUEST['user_angeltype_id'])) {
error(_("User angeltype doesn't exist.")); error(_("User angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); 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 [ $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"), _("Remove angeltype"),
UserAngelType_delete_view($user_angeltype, $user_source, $angeltype) UserAngelType_delete_view($user_angeltype, $user_source, $angeltype)
]; ];
} }
/** /**
* Update an UserAngelType. * Update an UserAngelType.
*/ */
function user_angeltype_update_controller() { function user_angeltype_update_controller()
global $privileges; {
global $privileges;
if (! in_array('admin_angel_types', $privileges)) { if (! in_array('admin_angel_types', $privileges)) {
error(_("You are not allowed to set supporter rights.")); error(_("You are not allowed to set supporter rights."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
if (! isset($_REQUEST['user_angeltype_id'])) { if (! isset($_REQUEST['user_angeltype_id'])) {
error(_("User angeltype doesn't exist.")); error(_("User angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
if (isset($_REQUEST['supporter']) && preg_match("/^[01]$/", $_REQUEST['supporter'])) { if (isset($_REQUEST['supporter']) && preg_match("/^[01]$/", $_REQUEST['supporter'])) {
$supporter = $_REQUEST['supporter'] == "1"; $supporter = $_REQUEST['supporter'] == "1";
} else { } else {
error(_("No supporter update given.")); error(_("No supporter update given."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$user_angeltype = UserAngelType($_REQUEST['user_angeltype_id']); $user_angeltype = UserAngelType($_REQUEST['user_angeltype_id']);
if ($user_angeltype == null) { if ($user_angeltype == null) {
error(_("User angeltype doesn't exist.")); error(_("User angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$angeltype = AngelType($user_angeltype['angeltype_id']); $angeltype = AngelType($user_angeltype['angeltype_id']);
if ($angeltype == null) { if ($angeltype == null) {
error(_("Angeltype doesn't exist.")); error(_("Angeltype doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$user_source = User($user_angeltype['user_id']); $user_source = User($user_angeltype['user_id']);
if ($user_source == null) { if ($user_source == null) {
error(_("User doesn't exist.")); error(_("User doesn't exist."));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
if (isset($_REQUEST['confirmed'])) { if (isset($_REQUEST['confirmed'])) {
UserAngelType_update($user_angeltype['id'], $supporter); 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)); $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); engelsystem_log($success_message);
success($success_message); success($success_message);
redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']);
} }
return [ return [
$supporter ? _("Add supporter rights") : _("Remove supporter rights"), $supporter ? _("Add supporter rights") : _("Remove supporter rights"),
UserAngelType_update_view($user_angeltype, $user_source, $angeltype, $supporter) UserAngelType_update_view($user_angeltype, $user_source, $angeltype, $supporter)
]; ];
} }
/** /**
* User joining an Angeltype (Or supporter doing this for him). * User joining an Angeltype (Or supporter doing this for him).
*/ */
function user_angeltype_add_controller() { function user_angeltype_add_controller()
global $user; {
global $user;
$angeltype = load_angeltype(); $angeltype = load_angeltype();
// User is joining by itself // User is joining by itself
if (! User_is_AngelType_supporter($user, $angeltype)) { if (! User_is_AngelType_supporter($user, $angeltype)) {
return user_angeltype_join_controller($angeltype); return user_angeltype_join_controller($angeltype);
} }
// Allow to add any user // Allow to add any user
@ -279,70 +286,72 @@ function user_angeltype_add_controller() {
// Load possible users, that are not in the angeltype already // Load possible users, that are not in the angeltype already
$users_source = Users_by_angeltype_inverted($angeltype); $users_source = Users_by_angeltype_inverted($angeltype);
if (isset($_REQUEST['submit'])) { if (isset($_REQUEST['submit'])) {
$user_source = load_user(); $user_source = load_user();
if (! UserAngelType_exists($user_source, $angeltype)) { if (! UserAngelType_exists($user_source, $angeltype)) {
$user_angeltype_id = UserAngelType_create($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))); 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))); success(sprintf(_("User %s added to %s."), User_Nick_render($user_source), AngelType_name_render($angeltype)));
UserAngelType_confirm($user_angeltype_id, $user_source); UserAngelType_confirm($user_angeltype_id, $user_source);
engelsystem_log(sprintf("User %s confirmed as %s.", User_Nick_render($user), AngelType_name_render($angeltype))); 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']); redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']);
}
} }
}
return [ return [
_("Add user to angeltype"), _("Add user to angeltype"),
UserAngelType_add_view($angeltype, $users_source, $user_source['UID']) UserAngelType_add_view($angeltype, $users_source, $user_source['UID'])
]; ];
} }
/** /**
* A user joins an angeltype. * A user joins an angeltype.
*/ */
function user_angeltype_join_controller($angeltype) { function user_angeltype_join_controller($angeltype)
global $user, $privileges; {
global $user, $privileges;
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
if ($user_angeltype != null) { if ($user_angeltype != null) {
error(sprintf(_("You are already a %s."), $angeltype['name'])); error(sprintf(_("You are already a %s."), $angeltype['name']));
redirect(page_link_to('angeltypes')); 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 [ 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']), sprintf(_("Become a %s"), $angeltype['name']),
UserAngelType_join_view($user, $angeltype) UserAngelType_join_view($user, $angeltype)
]; ];
} }
/** /**
* Route UserAngelType actions. * Route UserAngelType actions.
*/ */
function user_angeltypes_controller() { function user_angeltypes_controller()
if (! isset($_REQUEST['action'])) { {
redirect(page_link_to('angeltypes')); if (! isset($_REQUEST['action'])) {
} redirect(page_link_to('angeltypes'));
}
switch ($_REQUEST['action']) { switch ($_REQUEST['action']) {
case 'delete_all': case 'delete_all':
return user_angeltypes_delete_all_controller(); return user_angeltypes_delete_all_controller();
case 'confirm_all': case 'confirm_all':
@ -359,5 +368,3 @@ function user_angeltypes_controller() {
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
} }
?>

View File

@ -3,39 +3,41 @@
/** /**
* 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.
*/ */
function user_driver_license_required_hint() { function user_driver_license_required_hint()
global $user; {
global $user;
$angeltypes = User_angeltypes($user); $angeltypes = User_angeltypes($user);
$user_driver_license = UserDriverLicense($user['UID']); $user_driver_license = UserDriverLicense($user['UID']);
// User has already entered data, no hint needed. // User has already entered data, no hint needed.
if ($user_driver_license != null) { if ($user_driver_license != null) {
return null; return null;
} }
foreach ($angeltypes as $angeltype) { foreach ($angeltypes as $angeltype) {
if ($angeltype['requires_driver_license']) { 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 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; return null;
} }
/** /**
* Route user driver licenses actions. * Route user driver licenses actions.
*/ */
function user_driver_licenses_controller() { function user_driver_licenses_controller()
global $user; {
global $user;
if (! isset($user)) { if (! isset($user)) {
redirect(page_link_to('')); redirect(page_link_to(''));
} }
$action = strip_request_item('action', 'edit'); $action = strip_request_item('action', 'edit');
switch ($action) { switch ($action) {
default: default:
case 'edit': case 'edit':
return user_driver_license_edit_controller(); return user_driver_license_edit_controller();
@ -45,88 +47,89 @@ function user_driver_licenses_controller() {
/** /**
* Link to user driver license edit page for given user. * Link to user driver license edit page for given user.
* *
* @param User $user * @param User $user
*/ */
function user_driver_license_edit_link($user = null) { function user_driver_license_edit_link($user = null)
if ($user == null) { {
return page_link_to('user_driver_licenses'); if ($user == null) {
} return page_link_to('user_driver_licenses');
return page_link_to('user_driver_licenses') . '&user_id=' . $user['UID']; }
return page_link_to('user_driver_licenses') . '&user_id=' . $user['UID'];
} }
/** /**
* Loads the user for the driver license. * Loads the user for the driver license.
*/ */
function user_driver_license_load_user() { function user_driver_license_load_user()
global $user; {
global $user;
$user_source = $user; $user_source = $user;
if (isset($_REQUEST['user_id'])) { if (isset($_REQUEST['user_id'])) {
$user_source = User($_REQUEST['user_id']); $user_source = User($_REQUEST['user_id']);
if ($user_source == null) { if ($user_source == null) {
redirect(user_driver_license_edit_link()); redirect(user_driver_license_edit_link());
}
} }
}
return $user_source; return $user_source;
} }
/** /**
* Edit a users driver license information. * Edit a users driver license information.
*/ */
function user_driver_license_edit_controller() { function user_driver_license_edit_controller()
global $privileges, $user; {
global $privileges, $user;
$user_source = user_driver_license_load_user(); $user_source = user_driver_license_load_user();
// only privilege admin_user can edit other users driver license information // only privilege admin_user can edit other users driver license information
if ($user['UID'] != $user_source['UID'] && ! in_array('admin_user', $privileges)) { if ($user['UID'] != $user_source['UID'] && ! in_array('admin_user', $privileges)) {
redirect(user_driver_license_edit_link()); redirect(user_driver_license_edit_link());
} }
$user_driver_license = UserDriverLicense($user_source['UID']); $user_driver_license = UserDriverLicense($user_source['UID']);
if ($user_driver_license == null) { if ($user_driver_license == null) {
$wants_to_drive = false; $wants_to_drive = false;
$user_driver_license = UserDriverLicense_new(); $user_driver_license = UserDriverLicense_new();
} else { } else {
$wants_to_drive = true; $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);
}
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 [ 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);
}
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']), sprintf(_("Edit %s driving license information"), $user_source['Nick']),
UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver_license) UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver_license)
]; ];
} }
?>

View File

@ -5,18 +5,19 @@ use Engelsystem\ShiftCalendarRenderer;
/** /**
* Route user actions. * Route user actions.
*/ */
function users_controller() { function users_controller()
global $user; {
global $user;
if (! isset($user)) { if (! isset($user)) {
redirect(page_link_to('')); redirect(page_link_to(''));
} }
if (! isset($_REQUEST['action'])) { if (! isset($_REQUEST['action'])) {
$_REQUEST['action'] = 'list'; $_REQUEST['action'] = 'list';
} }
switch ($_REQUEST['action']) { switch ($_REQUEST['action']) {
default: default:
case 'list': case 'list':
return users_list_controller(); return users_list_controller();
@ -34,338 +35,350 @@ function users_controller() {
/** /**
* Delete a user, requires to enter own password for reasons. * Delete a user, requires to enter own password for reasons.
*/ */
function user_delete_controller() { function user_delete_controller()
global $privileges, $user; {
global $privileges, $user;
if (isset($_REQUEST['user_id'])) { if (isset($_REQUEST['user_id'])) {
$user_source = User($_REQUEST['user_id']); $user_source = User($_REQUEST['user_id']);
} else { } else {
$user_source = $user; $user_source = $user;
} }
if (! in_array('admin_user', $privileges)) { if (! in_array('admin_user', $privileges)) {
redirect(page_link_to('')); redirect(page_link_to(''));
} }
// You cannot delete yourself // You cannot delete yourself
if ($user['UID'] == $user_source['UID']) { if ($user['UID'] == $user_source['UID']) {
error(_("You cannot delete yourself.")); error(_("You cannot delete yourself."));
redirect(user_link($user)); redirect(user_link($user));
} }
if (isset($_REQUEST['submit'])) { if (isset($_REQUEST['submit'])) {
$valid = true; $valid = true;
if (! (isset($_REQUEST['password']) && verify_password($_REQUEST['password'], $user['Passwort'], $user['UID']))) { if (! (isset($_REQUEST['password']) && verify_password($_REQUEST['password'], $user['Passwort'], $user['UID']))) {
$valid = false; $valid = false;
error(_("Your password is incorrect. Please try it again.")); error(_("Your password is incorrect. Please try it again."));
} }
if ($valid) { if ($valid) {
$result = User_delete($user_source['UID']); $result = User_delete($user_source['UID']);
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to delete user.'); engelsystem_error('Unable to delete user.');
} }
mail_user_delete($user_source); mail_user_delete($user_source);
success(_("User deleted.")); success(_("User deleted."));
engelsystem_log(sprintf("Deleted %s", User_Nick_render($user_source))); engelsystem_log(sprintf("Deleted %s", User_Nick_render($user_source)));
redirect(users_link()); redirect(users_link());
}
} }
}
return [ return [
sprintf(_("Delete %s"), $user_source['Nick']), sprintf(_("Delete %s"), $user_source['Nick']),
User_delete_view($user_source) User_delete_view($user_source)
]; ];
} }
function users_link() { function users_link()
return page_link_to('users'); {
return page_link_to('users');
} }
function user_edit_link($user) { function user_edit_link($user)
return page_link_to('admin_user') . '&user_id=' . $user['UID']; {
return page_link_to('admin_user') . '&user_id=' . $user['UID'];
} }
function user_delete_link($user) { function user_delete_link($user)
return page_link_to('users') . '&action=delete&user_id=' . $user['UID']; {
return page_link_to('users') . '&action=delete&user_id=' . $user['UID'];
} }
function user_link($user) { function user_link($user)
return page_link_to('users') . '&action=view&user_id=' . $user['UID']; {
return page_link_to('users') . '&action=view&user_id=' . $user['UID'];
} }
function user_edit_vouchers_controller() { function user_edit_vouchers_controller()
global $privileges, $user; {
global $privileges, $user;
if (isset($_REQUEST['user_id'])) { if (isset($_REQUEST['user_id'])) {
$user_source = User($_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']);
} else { } else {
$valid = false; $user_source = $user;
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 [ 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']);
} 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']), sprintf(_("%s's vouchers"), $user_source['Nick']),
User_edit_vouchers_view($user_source) User_edit_vouchers_view($user_source)
]; ];
} }
function user_controller() { function user_controller()
global $privileges, $user; {
global $privileges, $user;
$user_source = $user; $user_source = $user;
if (isset($_REQUEST['user_id'])) { if (isset($_REQUEST['user_id'])) {
$user_source = User($_REQUEST['user_id']); $user_source = User($_REQUEST['user_id']);
if ($user_source == null) { if ($user_source == null) {
error(_("User not found.")); error(_("User not found."));
redirect('?'); redirect('?');
}
} }
}
$shifts = Shifts_by_user($user_source, in_array("user_shifts_admin", $privileges)); $shifts = Shifts_by_user($user_source, in_array("user_shifts_admin", $privileges));
foreach ($shifts as &$shift) { foreach ($shifts as &$shift) {
// TODO: Move queries to model // 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`"); $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) { foreach ($shift['needed_angeltypes'] as &$needed_angeltype) {
$needed_angeltype['users'] = sql_select(" $needed_angeltype['users'] = sql_select("
SELECT `ShiftEntry`.`freeloaded`, `User`.* SELECT `ShiftEntry`.`freeloaded`, `User`.*
FROM `ShiftEntry` FROM `ShiftEntry`
JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID`
WHERE `ShiftEntry`.`SID`='" . sql_escape($shift['SID']) . "' WHERE `ShiftEntry`.`SID`='" . sql_escape($shift['SID']) . "'
AND `ShiftEntry`.`TID`='" . sql_escape($needed_angeltype['id']) . "'"); AND `ShiftEntry`.`TID`='" . sql_escape($needed_angeltype['id']) . "'");
}
} }
}
if ($user_source['api_key'] == "") { if ($user_source['api_key'] == "") {
User_reset_api_key($user_source, false); User_reset_api_key($user_source, false);
} }
return [ return [
$user_source['Nick'], $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']) 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. * List all users.
*/ */
function users_list_controller() { function users_list_controller()
global $privileges; {
global $privileges;
if (! in_array('admin_user', $privileges)) { if (! in_array('admin_user', $privileges)) {
redirect(page_link_to('')); redirect(page_link_to(''));
} }
$order_by = 'Nick'; $order_by = 'Nick';
if (isset($_REQUEST['OrderBy']) && in_array($_REQUEST['OrderBy'], User_sortable_columns())) { if (isset($_REQUEST['OrderBy']) && in_array($_REQUEST['OrderBy'], User_sortable_columns())) {
$order_by = $_REQUEST['OrderBy']; $order_by = $_REQUEST['OrderBy'];
} }
$users = Users($order_by); $users = Users($order_by);
if ($users === false) { if ($users === false) {
engelsystem_error('Unable to load users.'); engelsystem_error('Unable to load users.');
} }
foreach ($users as &$user) { foreach ($users as &$user) {
$user['freeloads'] = count(ShiftEntries_freeloaded_by_user($user)); $user['freeloads'] = count(ShiftEntries_freeloaded_by_user($user));
} }
return [ return [
_('All users'), _('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()) 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 * Second step of password recovery: set a new password using the token link from email
*/ */
function user_password_recovery_set_new_controller() { function user_password_recovery_set_new_controller()
global $min_password_length; {
$user_source = User_by_password_recovery_token($_REQUEST['token']); global $min_password_length;
if ($user_source == null) { $user_source = User_by_password_recovery_token($_REQUEST['token']);
error(_("Token is not correct.")); if ($user_source == null) {
redirect(page_link_to('login')); error(_("Token is not correct."));
} redirect(page_link_to('login'));
}
if (isset($_REQUEST['submit'])) { if (isset($_REQUEST['submit'])) {
$valid = true; $valid = true;
if (isset($_REQUEST['password']) && strlen($_REQUEST['password']) >= $min_password_length) { if (isset($_REQUEST['password']) && strlen($_REQUEST['password']) >= $min_password_length) {
if ($_REQUEST['password'] != $_REQUEST['password2']) { if ($_REQUEST['password'] != $_REQUEST['password2']) {
$valid = false; $valid = false;
error(_("Your passwords don't match.")); error(_("Your passwords don't match."));
} }
} else { } else {
$valid = false; $valid = false;
error(_("Your password is to short (please use at least 6 characters).")); error(_("Your password is to short (please use at least 6 characters)."));
} }
if ($valid) { if ($valid) {
set_password($user_source['UID'], $_REQUEST['password']); set_password($user_source['UID'], $_REQUEST['password']);
success(_("Password saved.")); success(_("Password saved."));
redirect(page_link_to('login')); 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 * First step of password recovery: display a form that asks for your email and send email with recovery link
*/ */
function user_password_recovery_start_controller() { function user_password_recovery_start_controller()
if (isset($_REQUEST['submit'])) { {
$valid = true; if (isset($_REQUEST['submit'])) {
$valid = true;
if (isset($_REQUEST['email']) && strlen(strip_request_item('email')) > 0) { if (isset($_REQUEST['email']) && strlen(strip_request_item('email')) > 0) {
$email = strip_request_item('email'); $email = strip_request_item('email');
if (check_email($email)) { if (check_email($email)) {
$user_source = User_by_email($email); $user_source = User_by_email($email);
if ($user_source == null) { if ($user_source == null) {
$valid = false; $valid = false;
error(_("E-mail address is not correct.")); 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."));
} }
} else {
$valid = false;
error(_("E-mail address is not correct."));
}
} else {
$valid = false;
error(_("Please enter your e-mail."));
}
if ($valid) { if ($valid) {
$token = User_generate_password_recovery_token($user_source); $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)); 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.")); success(_("We sent an email containing your password recovery link."));
redirect(page_link_to('login')); redirect(page_link_to('login'));
}
} }
}
return User_password_recovery_view(); return User_password_recovery_view();
} }
/** /**
* User password recovery in 2 steps. * User password recovery in 2 steps.
* (By email) * (By email)
*/ */
function user_password_recovery_controller() { function user_password_recovery_controller()
if (isset($_REQUEST['token'])) { {
return user_password_recovery_set_new_controller(); if (isset($_REQUEST['token'])) {
} else { return user_password_recovery_set_new_controller();
return user_password_recovery_start_controller(); } else {
} return user_password_recovery_start_controller();
}
} }
/** /**
* Menu title for password recovery. * Menu title for password recovery.
*/ */
function user_password_recovery_title() { function user_password_recovery_title()
return _("Password recovery"); {
return _("Password recovery");
} }
/** /**
* Loads a user from param user_id. * Loads a user from param user_id.
*/ */
function load_user() { function load_user()
if (! isset($_REQUEST['user_id'])) { {
redirect(page_link_to()); if (! isset($_REQUEST['user_id'])) {
} redirect(page_link_to());
}
$user = User($_REQUEST['user_id']); $user = User($_REQUEST['user_id']);
if ($user === false) { if ($user === false) {
engelsystem_error("Unable to load user."); engelsystem_error("Unable to load user.");
} }
if ($user == null) { if ($user == null) {
error(_("User doesn't exist.")); error(_("User doesn't exist."));
redirect(page_link_to()); redirect(page_link_to());
} }
return $user; return $user;
} }
function shiftCalendarRendererByShiftFilter(ShiftsFilter $shiftsFilter) { function shiftCalendarRendererByShiftFilter(ShiftsFilter $shiftsFilter)
$shifts = Shifts_by_ShiftsFilter($shiftsFilter); {
$needed_angeltypes_source = NeededAngeltypes_by_ShiftsFilter($shiftsFilter); $shifts = Shifts_by_ShiftsFilter($shiftsFilter);
$shift_entries_source = ShiftEntries_by_ShiftsFilter($shiftsFilter); $needed_angeltypes_source = NeededAngeltypes_by_ShiftsFilter($shiftsFilter);
$shift_entries_source = ShiftEntries_by_ShiftsFilter($shiftsFilter);
$needed_angeltypes = []; $needed_angeltypes = [];
$shift_entries = []; $shift_entries = [];
foreach ($shifts as $shift) { foreach ($shifts as $shift) {
$needed_angeltypes[$shift['SID']] = []; $needed_angeltypes[$shift['SID']] = [];
$shift_entries[$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;
} }
} foreach ($shift_entries_source as $shift_entry) {
foreach ($needed_angeltypes_source as $needed_angeltype) { if (isset($shift_entries[$shift_entry['SID']])) {
if (isset($needed_angeltypes[$needed_angeltype['SID']])) { $shift_entries[$shift_entry['SID']][] = $shift_entry;
$needed_angeltypes[$needed_angeltype['SID']][] = $needed_angeltype;
}
}
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 ++;
} }
}
$needed_angels_count += max(0, $needed_angeltype['count'] - $taken);
} }
if (in_array(ShiftsFilter::FILLED_FREE, $shiftsFilter->getFilled()) && $taken < $needed_angels_count) { foreach ($needed_angeltypes_source as $needed_angeltype) {
$filtered_shifts[] = $shift; if (isset($needed_angeltypes[$needed_angeltype['SID']])) {
$needed_angeltypes[$needed_angeltype['SID']][] = $needed_angeltype;
}
} }
if (in_array(ShiftsFilter::FILLED_FILLED, $shiftsFilter->getFilled()) && $taken >= $needed_angels_count) { unset($needed_angeltypes_source);
$filtered_shifts[] = $shift; unset($shift_entries_source);
}
}
return new ShiftCalendarRenderer($filtered_shifts, $needed_angeltypes, $shift_entries, $shiftsFilter); 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 ++;
}
}
$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);
} }
?>

View File

@ -2,8 +2,8 @@
/** /**
* This file includes all needed functions, connects to the db etc. * This file includes all needed functions, connects to the db etc.
*/ */
if(!is_readable(__DIR__ . '/../vendor/autoload.php')){ if (!is_readable(__DIR__ . '/../vendor/autoload.php')) {
die('Please run composer.phar install'); die('Please run composer.phar install');
} }
require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/autoload.php';
@ -70,12 +70,12 @@ require_once realpath(__DIR__ . '/../includes/mailer/users_mailer.php');
require_once realpath(__DIR__ . '/../config/config.default.php'); require_once realpath(__DIR__ . '/../config/config.default.php');
if (file_exists(realpath(__DIR__ . '/../config/config.php'))) { if (file_exists(realpath(__DIR__ . '/../config/config.php'))) {
require_once realpath(__DIR__ . '/../config/config.php'); require_once realpath(__DIR__ . '/../config/config.php');
} }
if ($maintenance_mode) { if ($maintenance_mode) {
echo file_get_contents(__DIR__ . '/../public/maintenance.html'); echo file_get_contents(__DIR__ . '/../public/maintenance.html');
die(); die();
} }
require_once realpath(__DIR__ . '/../includes/pages/admin_active.php'); require_once realpath(__DIR__ . '/../includes/pages/admin_active.php');
@ -103,5 +103,3 @@ gettext_init();
sql_connect($config['host'], $config['user'], $config['pw'], $config['db']); sql_connect($config['host'], $config['user'], $config['pw'], $config['db']);
load_auth(); load_auth();
?>

View File

@ -1,25 +1,25 @@
<?php <?php
function engelsystem_email_to_user($recipient_user, $title, $message, $not_if_its_me = false) { function engelsystem_email_to_user($recipient_user, $title, $message, $not_if_its_me = false)
global $user; {
global $user;
if ($not_if_its_me && $user['UID'] == $recipient_user['UID']) { if ($not_if_its_me && $user['UID'] == $recipient_user['UID']) {
return true; return true;
} }
gettext_locale($recipient_user['Sprache']); 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."); $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(); gettext_locale();
return engelsystem_email($recipient_user['email'], $title, $message); return engelsystem_email($recipient_user['email'], $title, $message);
} }
function engelsystem_email($address, $title, $message) { 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) { $result = mail($address, $title, $message, "Content-Type: text/plain; charset=UTF-8\r\nFrom: Engelsystem <noreply@engelsystem.de>");
engelsystem_error('Unable to send email.'); if ($result === false) {
} engelsystem_error('Unable to send email.');
}
} }
?>

View File

@ -5,8 +5,7 @@
* *
* @param string $message * @param string $message
*/ */
function engelsystem_error($message) { function engelsystem_error($message)
raw_output($message); {
raw_output($message);
} }
?>

View File

@ -7,35 +7,34 @@
* @param unknown $colors colors for the data rows * @param unknown $colors colors for the data rows
* @param unknown $data the data * @param unknown $data the data
*/ */
function bargraph($dom_id, $key, $row_names, $colors, $data) { function bargraph($dom_id, $key, $row_names, $colors, $data)
$labels = []; {
foreach ($data as $dataset) { $labels = [];
$labels[] = $dataset[$key];
}
$datasets = [];
foreach ($row_names as $row_key => $name) {
$values = [];
foreach ($data as $dataset) { foreach ($data as $dataset) {
$values[] = $dataset[$row_key]; $labels[] = $dataset[$key];
} }
$datasets[] = [
$datasets = [];
foreach ($row_names as $row_key => $name) {
$values = [];
foreach ($data as $dataset) {
$values[] = $dataset[$row_key];
}
$datasets[] = [
'label' => $name, 'label' => $name,
'fillColor' => $colors[$row_key], 'fillColor' => $colors[$row_key],
'data' => $values 'data' => $values
]; ];
} }
return '<canvas id="' . $dom_id . '" style="width: 100%; height: 300px;"></canvas> return '<canvas id="' . $dom_id . '" style="width: 100%; height: 300px;"></canvas>
<script type="text/javascript"> <script type="text/javascript">
$(function(){ $(function(){
var ctx = $("#' . $dom_id . '").get(0).getContext("2d"); var ctx = $("#' . $dom_id . '").get(0).getContext("2d");
var chart = new Chart(ctx).Bar(' . json_encode([ var chart = new Chart(ctx).Bar(' . json_encode([
'labels' => $labels, 'labels' => $labels,
'datasets' => $datasets 'datasets' => $datasets
]) . '); ]) . ');
}); });
</script>'; </script>';
} }
?>

View File

@ -1,7 +1,7 @@
<?php <?php
$locales = [ $locales = [
'de_DE.UTF-8' => "Deutsch", 'de_DE.UTF-8' => "Deutsch",
'en_US.UTF-8' => "English" 'en_US.UTF-8' => "English"
]; ];
$default_locale = 'en_US.UTF-8'; $default_locale = 'en_US.UTF-8';
@ -9,47 +9,51 @@ $default_locale = 'en_US.UTF-8';
/** /**
* Return currently active locale * Return currently active locale
*/ */
function locale() { function locale()
return $_SESSION['locale']; {
return $_SESSION['locale'];
} }
/** /**
* Returns two letter language code from currently active locale * Returns two letter language code from currently active locale
*/ */
function locale_short() { function locale_short()
return substr(locale(), 0, 2); {
return substr(locale(), 0, 2);
} }
/** /**
* Initializes gettext for internationalization and updates the sessions locale to use for translation. * Initializes gettext for internationalization and updates the sessions locale to use for translation.
*/ */
function gettext_init() { function gettext_init()
global $locales, $default_locale; {
global $locales, $default_locale;
if (isset($_REQUEST['set_locale']) && isset($locales[$_REQUEST['set_locale']])) { if (isset($_REQUEST['set_locale']) && isset($locales[$_REQUEST['set_locale']])) {
$_SESSION['locale'] = $_REQUEST['set_locale']; $_SESSION['locale'] = $_REQUEST['set_locale'];
} elseif (! isset($_SESSION['locale'])) { } elseif (! isset($_SESSION['locale'])) {
$_SESSION['locale'] = $default_locale; $_SESSION['locale'] = $default_locale;
} }
gettext_locale(); gettext_locale();
bindtextdomain('default', realpath(__DIR__ . '/../../locale')); bindtextdomain('default', realpath(__DIR__ . '/../../locale'));
bind_textdomain_codeset('default', 'UTF-8'); bind_textdomain_codeset('default', 'UTF-8');
textdomain('default'); textdomain('default');
} }
/** /**
* Swich gettext locale. * Swich gettext locale.
* *
* @param string $locale * @param string $locale
*/ */
function gettext_locale($locale = null) { function gettext_locale($locale = null)
if ($locale == null) { {
$locale = $_SESSION['locale']; if ($locale == null) {
} $locale = $_SESSION['locale'];
}
putenv('LC_ALL=' . $locale); putenv('LC_ALL=' . $locale);
setlocale(LC_ALL, $locale); setlocale(LC_ALL, $locale);
} }
/** /**
@ -57,15 +61,14 @@ function gettext_locale($locale = null) {
* *
* @return string * @return string
*/ */
function make_langselect() { function make_langselect()
global $locales; {
$URL = $_SERVER["REQUEST_URI"] . (strpos($_SERVER["REQUEST_URI"], "?") > 0 ? '&' : '?') . "set_locale="; global $locales;
$URL = $_SERVER["REQUEST_URI"] . (strpos($_SERVER["REQUEST_URI"], "?") > 0 ? '&' : '?') . "set_locale=";
$items = []; $items = [];
foreach ($locales as $locale => $name) { foreach ($locales as $locale => $name) {
$items[] = toolbar_item_link(htmlspecialchars($URL) . $locale, '', '<img src="pic/flag/' . $locale . '.png" alt="' . $name . '" title="' . $name . '"> ' . $name); $items[] = toolbar_item_link(htmlspecialchars($URL) . $locale, '', '<img src="pic/flag/' . $locale . '.png" alt="' . $name . '" title="' . $name . '"> ' . $name);
} }
return $items; return $items;
} }
?>

View File

@ -3,51 +3,54 @@
/** /**
* Gibt zwischengespeicherte Fehlermeldungen zurück und löscht den Zwischenspeicher * Gibt zwischengespeicherte Fehlermeldungen zurück und löscht den Zwischenspeicher
*/ */
function msg() { function msg()
if (! isset($_SESSION['msg'])) { {
return ""; if (! isset($_SESSION['msg'])) {
} return "";
$msg = $_SESSION['msg']; }
$_SESSION['msg'] = ""; $msg = $_SESSION['msg'];
return $msg; $_SESSION['msg'] = "";
return $msg;
} }
/** /**
* Rendert eine Information * Rendert eine Information
*/ */
function info($msg, $immediatly = false) { function info($msg, $immediatly = false)
return alert('info', $msg, $immediatly); {
return alert('info', $msg, $immediatly);
} }
/** /**
* Rendert eine Fehlermeldung * Rendert eine Fehlermeldung
*/ */
function error($msg, $immediatly = false) { function error($msg, $immediatly = false)
return alert('danger', $msg, $immediatly); {
return alert('danger', $msg, $immediatly);
} }
/** /**
* Rendert eine Erfolgsmeldung * Rendert eine Erfolgsmeldung
*/ */
function success($msg, $immediatly = false) { function success($msg, $immediatly = false)
return alert('success', $msg, $immediatly); {
return alert('success', $msg, $immediatly);
} }
/** /**
* Renders an alert with given alert-* class. * Renders an alert with given alert-* class.
*/ */
function alert($class, $msg, $immediatly = false) { function alert($class, $msg, $immediatly = false)
if ($immediatly) { {
if ($msg == "") { if ($immediatly) {
return ""; if ($msg == "") {
return "";
}
return '<div class="alert alert-' . $class . '">' . $msg . '</div>';
} }
return '<div class="alert alert-' . $class . '">' . $msg . '</div>';
}
if (! isset($_SESSION['msg'])) { if (! isset($_SESSION['msg'])) {
$_SESSION['msg'] = ""; $_SESSION['msg'] = "";
} }
$_SESSION['msg'] .= alert($class, $msg, true); $_SESSION['msg'] .= alert($class, $msg, true);
} }
?>

View File

@ -1,104 +1,106 @@
<?php <?php
function mail_shift_change($old_shift, $new_shift) { function mail_shift_change($old_shift, $new_shift)
$users = ShiftEntries_by_shift($old_shift["SID"]); {
$old_room = Room($old_shift["RID"]); $users = ShiftEntries_by_shift($old_shift["SID"]);
$new_room = Room($new_shift["RID"]); $old_room = Room($old_shift["RID"]);
$new_room = Room($new_shift["RID"]);
$noticable_changes = false; $noticable_changes = false;
$message = _("A Shift you are registered on has changed:"); $message = _("A Shift you are registered on has changed:");
$message .= "\n"; $message .= "\n";
if ($old_shift["name"] != $new_shift["name"]) { if ($old_shift["name"] != $new_shift["name"]) {
$message .= sprintf(_("* Shift type changed from %s to %s"), $old_shift["name"], $new_shift["name"]) . "\n"; $message .= sprintf(_("* Shift type changed from %s to %s"), $old_shift["name"], $new_shift["name"]) . "\n";
$noticable_changes = true; $noticable_changes = true;
} }
if ($old_shift["title"] != $new_shift["title"]) { if ($old_shift["title"] != $new_shift["title"]) {
$message .= sprintf(_("* Shift title changed from %s to %s"), $old_shift["title"], $new_shift["title"]) . "\n"; $message .= sprintf(_("* Shift title changed from %s to %s"), $old_shift["title"], $new_shift["title"]) . "\n";
$noticable_changes = true; $noticable_changes = true;
} }
if ($old_shift["start"] != $new_shift["start"]) { 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"; $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; $noticable_changes = true;
} }
if ($old_shift["end"] != $new_shift["end"]) { 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"; $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; $noticable_changes = true;
} }
if ($old_shift["RID"] != $new_shift["RID"]) { if ($old_shift["RID"] != $new_shift["RID"]) {
$message .= sprintf(_("* Shift Location changed from %s to %s"), $old_room["Name"], $new_room["Name"]) . "\n"; $message .= sprintf(_("* Shift Location changed from %s to %s"), $old_room["Name"], $new_room["Name"]) . "\n";
$noticable_changes = true; $noticable_changes = true;
} }
if (! $noticable_changes) { if (! $noticable_changes) {
// There are no changes worth sending an E-Mail // There are no changes worth sending an E-Mail
return; 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);
} }
}
$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_delete($shift) { function mail_shift_delete($shift)
$users = ShiftEntries_by_shift($shift["SID"]); {
$room = Room($shift["RID"]); $users = ShiftEntries_by_shift($shift["SID"]);
$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_assign($user, $shift) {
if ($user["email_shiftinfo"]) {
$room = Room($shift["RID"]); $room = Room($shift["RID"]);
$message = _("You have been assigned to a Shift:") . "\n"; $message = _("A Shift you are registered on was deleted:") . "\n";
$message .= $shift["name"] . "\n"; $message .= $shift["name"] . "\n";
$message .= $shift["title"] . "\n"; $message .= $shift["title"] . "\n";
$message .= date("Y-m-d H:i", $shift["start"]) . " - " . date("H:i", $shift["end"]) . "\n"; $message .= date("Y-m-d H:i", $shift["start"]) . " - " . date("H:i", $shift["end"]) . "\n";
$message .= $room["Name"] . "\n"; $message .= $room["Name"] . "\n";
engelsystem_email_to_user($user, '[engelsystem] ' . _("Assigned to Shift"), $message, true); 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) { function mail_shift_assign($user, $shift)
if ($user["email_shiftinfo"]) { {
$room = Room($shift["RID"]); if ($user["email_shiftinfo"]) {
$room = Room($shift["RID"]);
$message = _("You have been removed from a Shift:") . "\n"; $message = _("You have been assigned to a Shift:") . "\n";
$message .= $shift["name"] . "\n"; $message .= $shift["name"] . "\n";
$message .= $shift["title"] . "\n"; $message .= $shift["title"] . "\n";
$message .= date("Y-m-d H:i", $shift["start"]) . " - " . date("H:i", $shift["end"]) . "\n"; $message .= date("Y-m-d H:i", $shift["start"]) . " - " . date("H:i", $shift["end"]) . "\n";
$message .= $room["Name"] . "\n"; $message .= $room["Name"] . "\n";
engelsystem_email_to_user($user, '[engelsystem] ' . _("Removed from Shift"), $message, true); engelsystem_email_to_user($user, '[engelsystem] ' . _("Assigned to Shift"), $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);
}
}

View File

@ -3,7 +3,7 @@
/** /**
* @param User $user_source * @param User $user_source
*/ */
function mail_user_delete($user) { 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.")); {
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."));
} }
?>

View File

@ -5,8 +5,9 @@ use Engelsystem\ValidationResult;
* Returns an array containing the basic attributes of angeltypes. * Returns an array containing the basic attributes of angeltypes.
* FIXME! This is the big sign for needing entity objects * FIXME! This is the big sign for needing entity objects
*/ */
function AngelType_new() { function AngelType_new()
return [ {
return [
'id' => null, 'id' => null,
'name' => "", 'name' => "",
'restricted' => false, 'restricted' => false,
@ -16,7 +17,7 @@ function AngelType_new() {
'contact_user_id' => null, 'contact_user_id' => null,
'contact_name' => null, 'contact_name' => null,
'contact_dect' => null, 'contact_dect' => null,
'contact_email' => null 'contact_email' => null
]; ];
} }
@ -27,17 +28,18 @@ function AngelType_new() {
* The angeltype * The angeltype
* @return ValidationResult * @return ValidationResult
*/ */
function AngelType_validate_contact_user_id($angeltype) { function AngelType_validate_contact_user_id($angeltype)
if (! isset($angeltype['contact_user_id'])) { {
return new ValidationResult(true, null); 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 (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']); if (User($angeltype['contact_user_id']) == null) {
} return new ValidationResult(false, $angeltype['contact_user_id']);
return new ValidationResult(true, $angeltype['contact_user_id']); }
return new ValidationResult(true, $angeltype['contact_user_id']);
} }
/** /**
@ -46,43 +48,45 @@ function AngelType_validate_contact_user_id($angeltype) {
* @param Angeltype $angeltype * @param Angeltype $angeltype
* The angeltype * The angeltype
*/ */
function AngelType_contact_info($angeltype) { function AngelType_contact_info($angeltype)
if (isset($angeltype['contact_user_id'])) { {
$contact_user = User($angeltype['contact_user_id']); if (isset($angeltype['contact_user_id'])) {
$contact_data = [ $contact_user = User($angeltype['contact_user_id']);
$contact_data = [
'contact_name' => $contact_user['Nick'], 'contact_name' => $contact_user['Nick'],
'contact_dect' => $contact_user['DECT'] 'contact_dect' => $contact_user['DECT']
]; ];
if ($contact_user['email_by_human_allowed']) { if ($contact_user['email_by_human_allowed']) {
$contact_data['contact_email'] = $contact_user['email']; $contact_data['contact_email'] = $contact_user['email'];
}
return $contact_data;
} }
return $contact_data; if (isset($angeltype['contact_name'])) {
} return [
if (isset($angeltype['contact_name'])) {
return [
'contact_name' => $angeltype['contact_name'], 'contact_name' => $angeltype['contact_name'],
'contact_dect' => $angeltype['contact_dect'], 'contact_dect' => $angeltype['contact_dect'],
'contact_email' => $angeltype['contact_email'] 'contact_email' => $angeltype['contact_email']
]; ];
} }
return null; return null;
} }
/** /**
* Delete an Angeltype. * Delete an Angeltype.
* *
* @param Angeltype $angeltype * @param Angeltype $angeltype
*/ */
function AngelType_delete($angeltype) { function AngelType_delete($angeltype)
$result = sql_query(" {
$result = sql_query("
DELETE FROM `AngelTypes` DELETE FROM `AngelTypes`
WHERE `id`='" . sql_escape($angeltype['id']) . "' WHERE `id`='" . sql_escape($angeltype['id']) . "'
LIMIT 1"); LIMIT 1");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to delete angeltype."); engelsystem_error("Unable to delete angeltype.");
} }
engelsystem_log("Deleted angeltype: " . AngelType_name_render($angeltype)); engelsystem_log("Deleted angeltype: " . AngelType_name_render($angeltype));
return $result; return $result;
} }
/** /**
@ -91,8 +95,9 @@ function AngelType_delete($angeltype) {
* @param Angeltype $angeltype * @param Angeltype $angeltype
* The angeltype * The angeltype
*/ */
function AngelType_update($angeltype) { function AngelType_update($angeltype)
$result = sql_query(" {
$result = sql_query("
UPDATE `AngelTypes` SET UPDATE `AngelTypes` SET
`name`='" . sql_escape($angeltype['name']) . "', `name`='" . sql_escape($angeltype['name']) . "',
`restricted`=" . sql_bool($angeltype['restricted']) . ", `restricted`=" . sql_bool($angeltype['restricted']) . ",
@ -104,11 +109,11 @@ function AngelType_update($angeltype) {
`contact_dect`=" . sql_null($angeltype['contact_dect']) . ", `contact_dect`=" . sql_null($angeltype['contact_dect']) . ",
`contact_email`=" . sql_null($angeltype['contact_email']) . " `contact_email`=" . sql_null($angeltype['contact_email']) . "
WHERE `id`='" . sql_escape($angeltype['id']) . "'"); WHERE `id`='" . sql_escape($angeltype['id']) . "'");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to update angeltype."); 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" : "")); 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; return $result;
} }
/** /**
@ -118,8 +123,9 @@ function AngelType_update($angeltype) {
* The angeltype * The angeltype
* @return the created angeltype * @return the created angeltype
*/ */
function AngelType_create($angeltype) { function AngelType_create($angeltype)
$result = sql_query(" {
$result = sql_query("
INSERT INTO `AngelTypes` SET INSERT INTO `AngelTypes` SET
`name`='" . sql_escape($angeltype['name']) . "', `name`='" . sql_escape($angeltype['name']) . "',
`restricted`=" . sql_bool($angeltype['restricted']) . ", `restricted`=" . sql_bool($angeltype['restricted']) . ",
@ -130,12 +136,12 @@ function AngelType_create($angeltype) {
`contact_name`=" . sql_null($angeltype['contact_name']) . ", `contact_name`=" . sql_null($angeltype['contact_name']) . ",
`contact_dect`=" . sql_null($angeltype['contact_dect']) . ", `contact_dect`=" . sql_null($angeltype['contact_dect']) . ",
`contact_email`=" . sql_null($angeltype['contact_email'])); `contact_email`=" . sql_null($angeltype['contact_email']));
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to create angeltype."); engelsystem_error("Unable to create angeltype.");
} }
$angeltype['id'] = sql_id(); $angeltype['id'] = sql_id();
engelsystem_log("Created angeltype: " . $angeltype['name'] . ($angeltype['restricted'] ? ", restricted" : "") . ($angeltype['requires_driver_license'] ? ", requires driver license" : "")); engelsystem_log("Created angeltype: " . $angeltype['name'] . ($angeltype['restricted'] ? ", restricted" : "") . ($angeltype['requires_driver_license'] ? ", requires driver license" : ""));
return $angeltype; return $angeltype;
} }
/** /**
@ -148,35 +154,37 @@ function AngelType_create($angeltype) {
* The angeltype the name is for * The angeltype the name is for
* @return ValidationResult result and validated name * @return ValidationResult result and validated name
*/ */
function AngelType_validate_name($name, $angeltype) { function AngelType_validate_name($name, $angeltype)
$name = strip_item($name); {
if ($name == "") { $name = strip_item($name);
return new ValidationResult(false, ""); if ($name == "") {
} return new ValidationResult(false, "");
if ($angeltype != null && isset($angeltype['id'])) { }
$valid = sql_num_query(" if ($angeltype != null && isset($angeltype['id'])) {
$valid = sql_num_query("
SELECT * SELECT *
FROM `AngelTypes` FROM `AngelTypes`
WHERE `name`='" . sql_escape($name) . "' WHERE `name`='" . sql_escape($name) . "'
AND NOT `id`='" . sql_escape($angeltype['id']) . "' AND NOT `id`='" . sql_escape($angeltype['id']) . "'
LIMIT 1") == 0; LIMIT 1") == 0;
return new ValidationResult($valid, $name); return new ValidationResult($valid, $name);
} }
$valid = sql_num_query(" $valid = sql_num_query("
SELECT `id` SELECT `id`
FROM `AngelTypes` FROM `AngelTypes`
WHERE `name`='" . sql_escape($name) . "' WHERE `name`='" . sql_escape($name) . "'
LIMIT 1") == 0; LIMIT 1") == 0;
return new ValidationResult($valid, $name); return new ValidationResult($valid, $name);
} }
/** /**
* Returns all angeltypes and subscription state to each of them for given user. * Returns all angeltypes and subscription state to each of them for given user.
* *
* @param User $user * @param User $user
*/ */
function AngelTypes_with_user($user) { function AngelTypes_with_user($user)
$result = sql_select(" {
$result = sql_select("
SELECT `AngelTypes`.*, SELECT `AngelTypes`.*,
`UserAngelTypes`.`id` as `user_angeltype_id`, `UserAngelTypes`.`id` as `user_angeltype_id`,
`UserAngelTypes`.`confirm_user_id`, `UserAngelTypes`.`confirm_user_id`,
@ -185,35 +193,37 @@ function AngelTypes_with_user($user) {
LEFT JOIN `UserAngelTypes` ON `AngelTypes`.`id`=`UserAngelTypes`.`angeltype_id` LEFT JOIN `UserAngelTypes` ON `AngelTypes`.`id`=`UserAngelTypes`.`angeltype_id`
AND `UserAngelTypes`.`user_id`=" . $user['UID'] . " AND `UserAngelTypes`.`user_id`=" . $user['UID'] . "
ORDER BY `name`"); ORDER BY `name`");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load angeltypes."); engelsystem_error("Unable to load angeltypes.");
} }
return $result; return $result;
} }
/** /**
* Returns all angeltypes. * Returns all angeltypes.
*/ */
function AngelTypes() { function AngelTypes()
$result = sql_select(" {
$result = sql_select("
SELECT * SELECT *
FROM `AngelTypes` FROM `AngelTypes`
ORDER BY `name`"); ORDER BY `name`");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load angeltypes."); engelsystem_error("Unable to load angeltypes.");
} }
return $result; return $result;
} }
/** /**
* Returns AngelType id array * Returns AngelType id array
*/ */
function AngelType_ids() { function AngelType_ids()
$result = sql_select("SELECT `id` FROM `AngelTypes`"); {
if ($result === false) { $result = sql_select("SELECT `id` FROM `AngelTypes`");
engelsystem_error("Unable to load angeltypes."); if ($result === false) {
} engelsystem_error("Unable to load angeltypes.");
return select_array($result, 'id', 'id'); }
return select_array($result, 'id', 'id');
} }
/** /**
@ -222,15 +232,14 @@ function AngelType_ids() {
* @param $angeltype_id angelType * @param $angeltype_id angelType
* ID * ID
*/ */
function AngelType($angeltype_id) { function AngelType($angeltype_id)
$angelType_source = sql_select("SELECT * FROM `AngelTypes` WHERE `id`='" . sql_escape($angeltype_id) . "'"); {
if ($angelType_source === false) { $angelType_source = sql_select("SELECT * FROM `AngelTypes` WHERE `id`='" . sql_escape($angeltype_id) . "'");
engelsystem_error("Unable to load angeltype."); if ($angelType_source === false) {
} engelsystem_error("Unable to load angeltype.");
if (count($angelType_source) > 0) { }
return $angelType_source[0]; if (count($angelType_source) > 0) {
} return $angelType_source[0];
return null; }
return null;
} }
?>

View File

@ -3,39 +3,41 @@
/** /**
* Get event config. * Get event config.
*/ */
function EventConfig() { function EventConfig()
$event_config = sql_select("SELECT * FROM `EventConfig` LIMIT 1"); {
if ($event_config === false) { $event_config = sql_select("SELECT * FROM `EventConfig` LIMIT 1");
engelsystem_error("Unable to load event config."); if ($event_config === false) {
return false; engelsystem_error("Unable to load event config.");
} return false;
if (count($event_config) > 0) { }
return $event_config[0]; if (count($event_config) > 0) {
} return $event_config[0];
return null; }
return null;
} }
/** /**
* Update event config. * Update event config.
* *
* @param string $event_name * @param string $event_name
* @param int $buildup_start_date * @param int $buildup_start_date
* @param int $event_start_date * @param int $event_start_date
* @param int $event_end_date * @param int $event_end_date
* @param int $teardown_end_date * @param int $teardown_end_date
* @param string $event_welcome_msg * @param string $event_welcome_msg
*/ */
function EventConfig_update($event_name, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date, $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 sql_query("INSERT INTO `EventConfig` SET if (EventConfig() == null) {
return sql_query("INSERT INTO `EventConfig` SET
`event_name`=" . sql_null($event_name) . ", `event_name`=" . sql_null($event_name) . ",
`buildup_start_date`=" . sql_null($buildup_start_date) . ", `buildup_start_date`=" . sql_null($buildup_start_date) . ",
`event_start_date`=" . sql_null($event_start_date) . ", `event_start_date`=" . sql_null($event_start_date) . ",
`event_end_date`=" . sql_null($event_end_date) . ", `event_end_date`=" . sql_null($event_end_date) . ",
`teardown_end_date`=" . sql_null($teardown_end_date) . ", `teardown_end_date`=" . sql_null($teardown_end_date) . ",
`event_welcome_msg`=" . sql_null($event_welcome_msg)); `event_welcome_msg`=" . sql_null($event_welcome_msg));
} }
return sql_query("UPDATE `EventConfig` SET return sql_query("UPDATE `EventConfig` SET
`event_name`=" . sql_null($event_name) . ", `event_name`=" . sql_null($event_name) . ",
`buildup_start_date`=" . sql_null($buildup_start_date) . ", `buildup_start_date`=" . sql_null($buildup_start_date) . ",
`event_start_date`=" . sql_null($event_start_date) . ", `event_start_date`=" . sql_null($event_start_date) . ",
@ -43,4 +45,3 @@ function EventConfig_update($event_name, $buildup_start_date, $event_start_date,
`teardown_end_date`=" . sql_null($teardown_end_date) . ", `teardown_end_date`=" . sql_null($teardown_end_date) . ",
`event_welcome_msg`=" . sql_null($event_welcome_msg)); `event_welcome_msg`=" . sql_null($event_welcome_msg));
} }
?>

View File

@ -7,32 +7,34 @@
* @param $message Log * @param $message Log
* Message * Message
*/ */
function LogEntry_create($nick, $message) { function LogEntry_create($nick, $message)
return sql_query("INSERT INTO `LogEntries` SET `timestamp`='" . sql_escape(time()) . "', `nick`='" . sql_escape($nick) . "', `message`='" . sql_escape($message) . "'"); {
return sql_query("INSERT INTO `LogEntries` SET `timestamp`='" . sql_escape(time()) . "', `nick`='" . sql_escape($nick) . "', `message`='" . sql_escape($message) . "'");
} }
/** /**
* Returns log entries with maximum count of 10000. * Returns log entries with maximum count of 10000.
*/ */
function LogEntries() { function LogEntries()
return sql_select("SELECT * FROM `LogEntries` ORDER BY `timestamp` DESC LIMIT 10000"); {
return sql_select("SELECT * FROM `LogEntries` ORDER BY `timestamp` DESC LIMIT 10000");
} }
/** /**
* Returns log entries filtered by a keyword * Returns log entries filtered by a keyword
*/ */
function LogEntries_filter($keyword) { function LogEntries_filter($keyword)
if ($keyword == "") { {
return LogEntries(); 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"); }
return sql_select("SELECT * FROM `LogEntries` WHERE `nick` LIKE '%" . sql_escape($keyword) . "%' OR `message` LIKE '%" . sql_escape($keyword) . "%' ORDER BY `timestamp` DESC");
} }
/** /**
* Delete all log entries. * Delete all log entries.
*/ */
function LogEntries_clear_all() { function LogEntries_clear_all()
return sql_query("TRUNCATE `LogEntries`"); {
return sql_query("TRUNCATE `LogEntries`");
} }
?>

View File

@ -3,8 +3,9 @@
/** /**
* Returns Message id array * Returns Message id array
*/ */
function Message_ids() { function Message_ids()
return sql_select("SELECT `id` FROM `Messages`"); {
return sql_select("SELECT `id` FROM `Messages`");
} }
/** /**
@ -13,15 +14,16 @@ function Message_ids() {
* @param $message_id message * @param $message_id message
* ID * ID
*/ */
function Message($message_id) { function Message($message_id)
$message_source = sql_select("SELECT * FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); {
if ($message_source === false) { $message_source = sql_select("SELECT * FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1");
return false; if ($message_source === false) {
} return false;
if (count($message_source) > 0) { }
return $message_source[0]; if (count($message_source) > 0) {
} return $message_source[0];
return null; }
return null;
} }
/** /**
@ -34,18 +36,17 @@ function Message($message_id) {
* @param $text Text * @param $text Text
* of Message * of Message
*/ */
function Message_send($receiver_user_id, $text) { function Message_send($receiver_user_id, $text)
global $user; {
global $user;
$text = preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", '', strip_tags($text)); $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)); $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)) { 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) . "'"); 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 true;
} }
return false; return false;
} }
?>

View File

@ -16,17 +16,18 @@
* @param int $count * @param int $count
* How many angels are needed? * How many angels are needed?
*/ */
function NeededAngelType_add($shift_id, $angeltype_id, $room_id, $count) { function NeededAngelType_add($shift_id, $angeltype_id, $room_id, $count)
$result = sql_query(" {
$result = sql_query("
INSERT INTO `NeededAngelTypes` SET INSERT INTO `NeededAngelTypes` SET
`shift_id`=" . sql_null($shift_id) . ", `shift_id`=" . sql_null($shift_id) . ",
`angel_type_id`='" . sql_escape($angeltype_id) . "', `angel_type_id`='" . sql_escape($angeltype_id) . "',
`room_id`=" . sql_null($room_id) . ", `room_id`=" . sql_null($room_id) . ",
`count`='" . sql_escape($count) . "'"); `count`='" . sql_escape($count) . "'");
if ($result === false) { if ($result === false) {
return false; return false;
} }
return sql_id(); return sql_id();
} }
/** /**
@ -35,8 +36,9 @@ function NeededAngelType_add($shift_id, $angeltype_id, $room_id, $count) {
* @param int $shift_id * @param int $shift_id
* id of the shift * id of the shift
*/ */
function NeededAngelTypes_delete_by_shift($shift_id) { function NeededAngelTypes_delete_by_shift($shift_id)
return sql_query("DELETE FROM `NeededAngelTypes` WHERE `shift_id`='" . sql_escape($shift_id) . "'"); {
return sql_query("DELETE FROM `NeededAngelTypes` WHERE `shift_id`='" . sql_escape($shift_id) . "'");
} }
/** /**
@ -45,8 +47,9 @@ function NeededAngelTypes_delete_by_shift($shift_id) {
* @param int $room_id * @param int $room_id
* id of the room * id of the room
*/ */
function NeededAngelTypes_delete_by_room($room_id) { function NeededAngelTypes_delete_by_room($room_id)
return sql_query("DELETE FROM `NeededAngelTypes` WHERE `room_id`='" . sql_escape($room_id) . "'"); {
return sql_query("DELETE FROM `NeededAngelTypes` WHERE `room_id`='" . sql_escape($room_id) . "'");
} }
/** /**
@ -55,8 +58,9 @@ function NeededAngelTypes_delete_by_room($room_id) {
* @param int $shiftID * @param int $shiftID
* id of shift * id of shift
*/ */
function NeededAngelTypes_by_shift($shiftId) { function NeededAngelTypes_by_shift($shiftId)
$needed_angeltypes_source = sql_select(" {
$needed_angeltypes_source = sql_select("
SELECT `NeededAngelTypes`.*, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup` SELECT `NeededAngelTypes`.*, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup`
FROM `NeededAngelTypes` FROM `NeededAngelTypes`
JOIN `AngelTypes` ON `AngelTypes`.`id` = `NeededAngelTypes`.`angel_type_id` JOIN `AngelTypes` ON `AngelTypes`.`id` = `NeededAngelTypes`.`angel_type_id`
@ -64,13 +68,13 @@ function NeededAngelTypes_by_shift($shiftId) {
AND `count` > 0 AND `count` > 0
ORDER BY `room_id` DESC ORDER BY `room_id` DESC
"); ");
if ($needed_angeltypes_source === false) { if ($needed_angeltypes_source === false) {
engelsystem_error("Unable to load needed angeltypes."); engelsystem_error("Unable to load needed angeltypes.");
} }
// Use settings from room // Use settings from room
if (count($needed_angeltypes_source) == 0) { if (count($needed_angeltypes_source) == 0) {
$needed_angeltypes_source = sql_select(" $needed_angeltypes_source = sql_select("
SELECT `NeededAngelTypes`.*, `AngelTypes`.`name`, `AngelTypes`.`restricted` SELECT `NeededAngelTypes`.*, `AngelTypes`.`name`, `AngelTypes`.`restricted`
FROM `NeededAngelTypes` FROM `NeededAngelTypes`
JOIN `AngelTypes` ON `AngelTypes`.`id` = `NeededAngelTypes`.`angel_type_id` JOIN `AngelTypes` ON `AngelTypes`.`id` = `NeededAngelTypes`.`angel_type_id`
@ -79,27 +83,25 @@ function NeededAngelTypes_by_shift($shiftId) {
AND `count` > 0 AND `count` > 0
ORDER BY `room_id` DESC ORDER BY `room_id` DESC
"); ");
if ($needed_angeltypes_source === false) { if ($needed_angeltypes_source === false) {
engelsystem_error("Unable to load needed angeltypes."); 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;
} }
}
$needed_angeltypes[] = $angeltype;
} }
return $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;
}
}
$needed_angeltypes[] = $angeltype;
}
return $needed_angeltypes;
} }
?>

View File

@ -4,17 +4,19 @@
* returns a list of rooms. * returns a list of rooms.
* @param boolean $show_all returns also hidden rooms when true * @param boolean $show_all returns also hidden rooms when true
*/ */
function Rooms($show_all = false) { function Rooms($show_all = false)
return sql_select("SELECT * FROM `Room`" . ($show_all ? "" : " WHERE `show`='Y'") . " ORDER BY `Name`"); {
return sql_select("SELECT * FROM `Room`" . ($show_all ? "" : " WHERE `show`='Y'") . " ORDER BY `Name`");
} }
/** /**
* Delete a room * Delete a room
* *
* @param int $room_id * @param int $room_id
*/ */
function Room_delete($room_id) { function Room_delete($room_id)
return sql_query("DELETE FROM `Room` WHERE `RID`=" . sql_escape($room_id)); {
return sql_query("DELETE FROM `Room` WHERE `RID`=" . sql_escape($room_id));
} }
/** /**
@ -27,34 +29,34 @@ function Room_delete($room_id) {
* @param boolean $public * @param boolean $public
* Is the room visible for angels? * Is the room visible for angels?
*/ */
function Room_create($name, $from_frab, $public) { function Room_create($name, $from_frab, $public)
$result = sql_query(" {
$result = sql_query("
INSERT INTO `Room` SET INSERT INTO `Room` SET
`Name`='" . sql_escape($name) . "', `Name`='" . sql_escape($name) . "',
`FromPentabarf`='" . sql_escape($from_frab ? 'Y' : '') . "', `FromPentabarf`='" . sql_escape($from_frab ? 'Y' : '') . "',
`show`='" . sql_escape($public ? 'Y' : '') . "', `show`='" . sql_escape($public ? 'Y' : '') . "',
`Number`=0"); `Number`=0");
if ($result === false) { if ($result === false) {
return false; return false;
} }
return sql_id(); return sql_id();
} }
/** /**
* Returns room by id. * Returns room by id.
* *
* @param $room_id RID * @param $room_id RID
*/ */
function Room($room_id) { function Room($room_id)
$room_source = sql_select("SELECT * FROM `Room` WHERE `RID`='" . sql_escape($room_id) . "' AND `show` = 'Y'"); {
$room_source = sql_select("SELECT * FROM `Room` WHERE `RID`='" . sql_escape($room_id) . "' AND `show` = 'Y'");
if ($room_source === false) { if ($room_source === false) {
return false; return false;
} }
if (count($room_source) > 0) { if (count($room_source) > 0) {
return $room_source[0]; return $room_source[0];
} }
return null; return null;
} }
?>

View File

@ -4,30 +4,33 @@
* Returns an array with the attributes of shift entries. * Returns an array with the attributes of shift entries.
* FIXME! Needs entity object. * FIXME! Needs entity object.
*/ */
function ShiftEntry_new() { function ShiftEntry_new()
return [ {
return [
'id' => null, 'id' => null,
'SID' => null, 'SID' => null,
'TID' => null, 'TID' => null,
'UID' => null, 'UID' => null,
'Comment' => null, 'Comment' => null,
'freeloaded_comment' => null, 'freeloaded_comment' => null,
'freeloaded' => false 'freeloaded' => false
]; ];
} }
/** /**
* Counts all freeloaded shifts. * Counts all freeloaded shifts.
*/ */
function ShiftEntries_freeleaded_count() { function ShiftEntries_freeleaded_count()
return sql_select_single_cell("SELECT COUNT(*) FROM `ShiftEntry` WHERE `freeloaded` = 1"); {
return sql_select_single_cell("SELECT COUNT(*) FROM `ShiftEntry` WHERE `freeloaded` = 1");
} }
/** /**
* List users subsribed to a given shift. * List users subsribed to a given shift.
*/ */
function ShiftEntries_by_shift($shift_id) { function ShiftEntries_by_shift($shift_id)
return sql_select(" {
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` 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` FROM `ShiftEntry`
JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID`
@ -38,11 +41,12 @@ function ShiftEntries_by_shift($shift_id) {
/** /**
* Create a new shift entry. * Create a new shift entry.
* *
* @param ShiftEntry $shift_entry * @param ShiftEntry $shift_entry
*/ */
function ShiftEntry_create($shift_entry) { function ShiftEntry_create($shift_entry)
mail_shift_assign(User($shift_entry['UID']), Shift($shift_entry['SID'])); {
return sql_query("INSERT INTO `ShiftEntry` SET mail_shift_assign(User($shift_entry['UID']), Shift($shift_entry['SID']));
return sql_query("INSERT INTO `ShiftEntry` SET
`SID`='" . sql_escape($shift_entry['SID']) . "', `SID`='" . sql_escape($shift_entry['SID']) . "',
`TID`='" . sql_escape($shift_entry['TID']) . "', `TID`='" . sql_escape($shift_entry['TID']) . "',
`UID`='" . sql_escape($shift_entry['UID']) . "', `UID`='" . sql_escape($shift_entry['UID']) . "',
@ -54,8 +58,9 @@ function ShiftEntry_create($shift_entry) {
/** /**
* Update a shift entry. * Update a shift entry.
*/ */
function ShiftEntry_update($shift_entry) { function ShiftEntry_update($shift_entry)
return sql_query("UPDATE `ShiftEntry` SET {
return sql_query("UPDATE `ShiftEntry` SET
`Comment`='" . sql_escape($shift_entry['Comment']) . "', `Comment`='" . sql_escape($shift_entry['Comment']) . "',
`freeload_comment`='" . sql_escape($shift_entry['freeload_comment']) . "', `freeload_comment`='" . sql_escape($shift_entry['freeload_comment']) . "',
`freeloaded`=" . sql_bool($shift_entry['freeloaded']) . " `freeloaded`=" . sql_bool($shift_entry['freeloaded']) . "
@ -65,33 +70,36 @@ function ShiftEntry_update($shift_entry) {
/** /**
* Get a shift entry. * Get a shift entry.
*/ */
function ShiftEntry($shift_entry_id) { function ShiftEntry($shift_entry_id)
$shift_entry = sql_select("SELECT * FROM `ShiftEntry` WHERE `id`='" . sql_escape($shift_entry_id) . "'"); {
if ($shift_entry === false) { $shift_entry = sql_select("SELECT * FROM `ShiftEntry` WHERE `id`='" . sql_escape($shift_entry_id) . "'");
return false; if ($shift_entry === false) {
} return false;
if (count($shift_entry) == 0) { }
return null; if (count($shift_entry) == 0) {
} return null;
return $shift_entry[0]; }
return $shift_entry[0];
} }
/** /**
* Delete a shift entry. * Delete a shift entry.
*/ */
function ShiftEntry_delete($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'])); $shift_entry = ShiftEntry($shift_entry_id);
return sql_query("DELETE FROM `ShiftEntry` WHERE `id`='" . sql_escape($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) . "'");
} }
/** /**
* Returns next (or current) shifts of given user. * Returns next (or current) shifts of given user.
* *
* @param User $user * @param User $user
*/ */
function ShiftEntries_upcoming_for_user($user) { function ShiftEntries_upcoming_for_user($user)
return sql_select(" {
return sql_select("
SELECT * SELECT *
FROM `ShiftEntry` FROM `ShiftEntry`
JOIN `Shifts` ON (`Shifts`.`SID` = `ShiftEntry`.`SID`) JOIN `Shifts` ON (`Shifts`.`SID` = `ShiftEntry`.`SID`)
@ -105,10 +113,11 @@ function ShiftEntries_upcoming_for_user($user) {
/** /**
* Returns shifts completed by the given user. * Returns shifts completed by the given user.
* *
* @param User $user * @param User $user
*/ */
function ShiftEntries_finished_by_user($user) { function ShiftEntries_finished_by_user($user)
return sql_select(" {
return sql_select("
SELECT * SELECT *
FROM `ShiftEntry` FROM `ShiftEntry`
JOIN `Shifts` ON (`Shifts`.`SID` = `ShiftEntry`.`SID`) JOIN `Shifts` ON (`Shifts`.`SID` = `ShiftEntry`.`SID`)
@ -123,30 +132,30 @@ function ShiftEntries_finished_by_user($user) {
/** /**
* Returns all shift entries in given shift for given angeltype. * Returns all shift entries in given shift for given angeltype.
* *
* @param int $shift_id * @param int $shift_id
* @param int $angeltype_id * @param int $angeltype_id
*/ */
function ShiftEntries_by_shift_and_angeltype($shift_id, $angeltype_id) { function ShiftEntries_by_shift_and_angeltype($shift_id, $angeltype_id)
$result = sql_select(" {
$result = sql_select("
SELECT * SELECT *
FROM `ShiftEntry` FROM `ShiftEntry`
WHERE `SID`=" . sql_escape($shift_id) . " WHERE `SID`=" . sql_escape($shift_id) . "
AND `TID`=" . sql_escape($angeltype_id) . " AND `TID`=" . sql_escape($angeltype_id) . "
"); ");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load shift entries."); engelsystem_error("Unable to load shift entries.");
} }
return $result; return $result;
} }
/** /**
* Returns all freeloaded shifts for given user. * Returns all freeloaded shifts for given user.
*/ */
function ShiftEntries_freeloaded_by_user($user) { function ShiftEntries_freeloaded_by_user($user)
return sql_select("SELECT * {
return sql_select("SELECT *
FROM `ShiftEntry` FROM `ShiftEntry`
WHERE `freeloaded` = 1 WHERE `freeloaded` = 1
AND `UID`=" . sql_escape($user['UID'])); AND `UID`=" . sql_escape($user['UID']));
} }
?>

View File

@ -6,7 +6,8 @@ namespace Engelsystem;
* BO to represent if there are free slots on a shift for a given angeltype * 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.) * and if signup for a given user is possible (or not, because of collisions, etc.)
*/ */
class ShiftSignupState { class ShiftSignupState
{
/** /**
* Shift has free places * Shift has free places
@ -43,14 +44,15 @@ class ShiftSignupState {
*/ */
const SIGNED_UP = 'SIGNED_UP'; const SIGNED_UP = 'SIGNED_UP';
private $state; private $state;
private $freeEntries; private $freeEntries;
public function __construct($state, $free_entries) { public function __construct($state, $free_entries)
$this->state = $state; {
$this->freeEntries = $free_entries; $this->state = $state;
} $this->freeEntries = $free_entries;
}
/** /**
* Combine this state with another state from the same shift. * Combine this state with another state from the same shift.
@ -58,16 +60,18 @@ class ShiftSignupState {
* @param ShiftSignupState $shiftSignupState * @param ShiftSignupState $shiftSignupState
* The other state to combine * The other state to combine
*/ */
public function combineWith(ShiftSignupState $shiftSignupState) { public function combineWith(ShiftSignupState $shiftSignupState)
$this->freeEntries += $shiftSignupState->getFreeEntries(); {
$this->freeEntries += $shiftSignupState->getFreeEntries();
if ($this->valueForState($shiftSignupState->state) > $this->valueForState($this->state)) { if ($this->valueForState($shiftSignupState->state) > $this->valueForState($this->state)) {
$this->state = $shiftSignupState->state; $this->state = $shiftSignupState->state;
} }
} }
private function valueForState($state) { private function valueForState($state)
switch ($state) { {
switch ($state) {
case ShiftSignupState::SHIFT_ENDED: case ShiftSignupState::SHIFT_ENDED:
return 100; return 100;
@ -85,33 +89,34 @@ class ShiftSignupState {
case ShiftSignupState::ADMIN: case ShiftSignupState::ADMIN:
return 60; return 60;
} }
} }
/** /**
* Returns true, if signup is allowed * Returns true, if signup is allowed
*/ */
public function isSignupAllowed() { public function isSignupAllowed()
switch ($this->state) { {
switch ($this->state) {
case ShiftSignupState::FREE: case ShiftSignupState::FREE:
case ShiftSignupState::ADMIN: case ShiftSignupState::ADMIN:
return true; return true;
} }
return false; return false;
} }
/** /**
* Return the shift signup state * Return the shift signup state
*/ */
public function getState() { public function getState()
return $this->state; {
return $this->state;
} }
/** /**
* How many places are free in this shift for the angeltype? * How many places are free in this shift for the angeltype?
*/ */
public function getFreeEntries() { public function getFreeEntries()
return $this->freeEntries; {
return $this->freeEntries;
} }
} }
?>

View File

@ -4,20 +4,22 @@
* Delete a shift type. * Delete a shift type.
* @param int $shifttype_id * @param int $shifttype_id
*/ */
function ShiftType_delete($shifttype_id) { function ShiftType_delete($shifttype_id)
return sql_query("DELETE FROM `ShiftTypes` WHERE `id`='" . sql_escape($shifttype_id) . "'"); {
return sql_query("DELETE FROM `ShiftTypes` WHERE `id`='" . sql_escape($shifttype_id) . "'");
} }
/** /**
* Update a shift type. * Update a shift type.
* *
* @param int $shifttype_id * @param int $shifttype_id
* @param string $name * @param string $name
* @param int $angeltype_id * @param int $angeltype_id
* @param string $description * @param string $description
*/ */
function ShiftType_update($shifttype_id, $name, $angeltype_id, $description) { function ShiftType_update($shifttype_id, $name, $angeltype_id, $description)
return sql_query("UPDATE `ShiftTypes` SET {
return sql_query("UPDATE `ShiftTypes` SET
`name`='" . sql_escape($name) . "', `name`='" . sql_escape($name) . "',
`angeltype_id`=" . sql_null($angeltype_id) . ", `angeltype_id`=" . sql_null($angeltype_id) . ",
`description`='" . sql_escape($description) . "' `description`='" . sql_escape($description) . "'
@ -27,43 +29,44 @@ function ShiftType_update($shifttype_id, $name, $angeltype_id, $description) {
/** /**
* Create a shift type. * Create a shift type.
* *
* @param string $name * @param string $name
* @param int $angeltype_id * @param int $angeltype_id
* @param string $description * @param string $description
* @return new shifttype id * @return new shifttype id
*/ */
function ShiftType_create($name, $angeltype_id, $description) { function ShiftType_create($name, $angeltype_id, $description)
$result = sql_query("INSERT INTO `ShiftTypes` SET {
$result = sql_query("INSERT INTO `ShiftTypes` SET
`name`='" . sql_escape($name) . "', `name`='" . sql_escape($name) . "',
`angeltype_id`=" . sql_null($angeltype_id) . ", `angeltype_id`=" . sql_null($angeltype_id) . ",
`description`='" . sql_escape($description) . "'"); `description`='" . sql_escape($description) . "'");
if ($result === false) { if ($result === false) {
return false; return false;
} }
return sql_id(); return sql_id();
} }
/** /**
* Get a shift type by id. * Get a shift type by id.
* *
* @param int $shifttype_id * @param int $shifttype_id
*/ */
function ShiftType($shifttype_id) { function ShiftType($shifttype_id)
$shifttype = sql_select("SELECT * FROM `ShiftTypes` WHERE `id`='" . sql_escape($shifttype_id) . "'"); {
if ($shifttype === false) { $shifttype = sql_select("SELECT * FROM `ShiftTypes` WHERE `id`='" . sql_escape($shifttype_id) . "'");
engelsystem_error('Unable to load shift type.'); if ($shifttype === false) {
} engelsystem_error('Unable to load shift type.');
if ($shifttype == null) { }
return null; if ($shifttype == null) {
} return null;
return $shifttype[0]; }
return $shifttype[0];
} }
/** /**
* Get all shift types. * Get all shift types.
*/ */
function ShiftTypes() { function ShiftTypes()
return sql_select("SELECT * FROM `ShiftTypes` ORDER BY `name`"); {
return sql_select("SELECT * FROM `ShiftTypes` ORDER BY `name`");
} }
?>

View File

@ -7,7 +7,8 @@ namespace Engelsystem;
* *
* @author msquare * @author msquare
*/ */
class ShiftsFilter { class ShiftsFilter
{
/** /**
* How long can the time interval be? * How long can the time interval be?
@ -32,90 +33,101 @@ class ShiftsFilter {
*/ */
private $userShiftsAdmin; private $userShiftsAdmin;
private $filled = []; private $filled = [];
private $rooms = []; private $rooms = [];
private $types = []; private $types = [];
private $startTime = null; private $startTime = null;
private $endTime = null; private $endTime = null;
public function __construct($user_shifts_admin, $rooms, $types) { public function __construct($user_shifts_admin, $rooms, $types)
$this->user_shifts_admin = $user_shifts_admin; {
$this->rooms = $rooms; $this->user_shifts_admin = $user_shifts_admin;
$this->types = $types; $this->rooms = $rooms;
$this->types = $types;
$this->filled = [ $this->filled = [
ShiftsFilter::FILLED_FREE ShiftsFilter::FILLED_FREE
]; ];
if ($user_shifts_admin) { if ($user_shifts_admin) {
$this->filled[] = ShiftsFilter::FILLED_FILLED; $this->filled[] = ShiftsFilter::FILLED_FILLED;
}
} }
}
public function getStartTime() { public function getStartTime()
return $this->startTime; {
} return $this->startTime;
public function setStartTime($startTime) {
$this->startTime = $startTime;
}
public function getEndTime() {
return $this->endTime;
}
public function setEndTime($endTime) {
if ($endTime - $this->startTime > ShiftsFilter::MAX_DURATION) {
$endTime = $this->startTime + ShiftsFilter::MAX_DURATION;
} }
$this->endTime = $endTime;
}
public function getTypes() { public function setStartTime($startTime)
if (count($this->types) == 0) { {
return [ $this->startTime = $startTime;
0 }
public function getEndTime()
{
return $this->endTime;
}
public function setEndTime($endTime)
{
if ($endTime - $this->startTime > ShiftsFilter::MAX_DURATION) {
$endTime = $this->startTime + ShiftsFilter::MAX_DURATION;
}
$this->endTime = $endTime;
}
public function getTypes()
{
if (count($this->types) == 0) {
return [
0
]; ];
}
return $this->types;
} }
return $this->types;
}
public function setTypes($types) { public function setTypes($types)
$this->types = $types; {
} $this->types = $types;
}
public function getRooms() { public function getRooms()
if (count($this->rooms) == 0) { {
return [ if (count($this->rooms) == 0) {
0 return [
0
]; ];
}
return $this->rooms;
} }
return $this->rooms;
}
public function setRooms($rooms) { public function setRooms($rooms)
$this->rooms = $rooms; {
} $this->rooms = $rooms;
}
public function isUserShiftsAdmin() { public function isUserShiftsAdmin()
return $this->userShiftsAdmin; {
} return $this->userShiftsAdmin;
}
public function setUserShiftsAdmin($userShiftsAdmin) { public function setUserShiftsAdmin($userShiftsAdmin)
$this->userShiftsAdmin = $userShiftsAdmin; {
} $this->userShiftsAdmin = $userShiftsAdmin;
}
public function getFilled() { public function getFilled()
return $this->filled; {
} return $this->filled;
}
public function setFilled($filled) { public function setFilled($filled)
$this->filled = $filled; {
} $this->filled = $filled;
}
} }
?>

View File

@ -2,16 +2,18 @@
use Engelsystem\ShiftsFilter; use Engelsystem\ShiftsFilter;
use Engelsystem\ShiftSignupState; use Engelsystem\ShiftSignupState;
function Shifts_by_room($room) { function Shifts_by_room($room)
$result = sql_select("SELECT * FROM `Shifts` WHERE `RID`=" . sql_escape($room['RID']) . " ORDER BY `start`"); {
if ($result === false) { $result = sql_select("SELECT * FROM `Shifts` WHERE `RID`=" . sql_escape($room['RID']) . " ORDER BY `start`");
engelsystem_error("Unable to load shifts."); if ($result === false) {
} engelsystem_error("Unable to load shifts.");
return $result; }
return $result;
} }
function Shifts_by_ShiftsFilter(ShiftsFilter $shiftsFilter) { function Shifts_by_ShiftsFilter(ShiftsFilter $shiftsFilter)
$SQL = "SELECT * FROM ( {
$SQL = "SELECT * FROM (
SELECT DISTINCT `Shifts`.*, `ShiftTypes`.`name`, `Room`.`Name` as `room_name` SELECT DISTINCT `Shifts`.*, `ShiftTypes`.`name`, `Room`.`Name` as `room_name`
FROM `Shifts` FROM `Shifts`
JOIN `Room` USING (`RID`) JOIN `Room` USING (`RID`)
@ -37,15 +39,16 @@ function Shifts_by_ShiftsFilter(ShiftsFilter $shiftsFilter) {
AND NOT `Shifts`.`PSID` IS NULL) as tmp_shifts AND NOT `Shifts`.`PSID` IS NULL) as tmp_shifts
ORDER BY `start`"; ORDER BY `start`";
$result = sql_select($SQL); $result = sql_select($SQL);
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load shifts by filter."); engelsystem_error("Unable to load shifts by filter.");
} }
return $result; return $result;
} }
function NeededAngeltypes_by_ShiftsFilter(ShiftsFilter $shiftsFilter) { function NeededAngeltypes_by_ShiftsFilter(ShiftsFilter $shiftsFilter)
$SQL = "SELECT `NeededAngelTypes`.*, `Shifts`.`SID`, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup` {
$SQL = "SELECT `NeededAngelTypes`.*, `Shifts`.`SID`, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup`
FROM `Shifts` FROM `Shifts`
JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id`=`Shifts`.`SID` JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id`=`Shifts`.`SID`
JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id` JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id`
@ -62,15 +65,16 @@ function NeededAngeltypes_by_ShiftsFilter(ShiftsFilter $shiftsFilter) {
WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ") WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ")
AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime() . " AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime() . "
AND NOT `Shifts`.`PSID` IS NULL"; AND NOT `Shifts`.`PSID` IS NULL";
$result = sql_select($SQL); $result = sql_select($SQL);
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load needed angeltypes by filter."); engelsystem_error("Unable to load needed angeltypes by filter.");
} }
return $result; return $result;
} }
function NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype) { 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` {
$result = sql_select("SELECT `NeededAngelTypes`.*, `Shifts`.`SID`, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup`
FROM `Shifts` FROM `Shifts`
JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id`=`Shifts`.`SID` JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id`=`Shifts`.`SID`
JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id` JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id`
@ -87,58 +91,61 @@ function NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype) {
WHERE `Shifts`.`SID`=" . sql_escape($shift['SID']) . " WHERE `Shifts`.`SID`=" . sql_escape($shift['SID']) . "
AND `AngelTypes`.`id`=" . sql_escape($angeltype['id']) . " AND `AngelTypes`.`id`=" . sql_escape($angeltype['id']) . "
AND NOT `Shifts`.`PSID` IS NULL"); AND NOT `Shifts`.`PSID` IS NULL");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load needed angeltypes by filter."); engelsystem_error("Unable to load needed angeltypes by filter.");
} }
if (count($result) == 0) { if (count($result) == 0) {
return null; return null;
} }
return $result[0]; return $result[0];
} }
function ShiftEntries_by_ShiftsFilter(ShiftsFilter $shiftsFilter) { 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` {
$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` FROM `Shifts`
JOIN `ShiftEntry` ON `ShiftEntry`.`SID`=`Shifts`.`SID` JOIN `ShiftEntry` ON `ShiftEntry`.`SID`=`Shifts`.`SID`
JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID`
WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ") WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ")
AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime() . " AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime() . "
ORDER BY `Shifts`.`start`"; ORDER BY `Shifts`.`start`";
$result = sql_select($SQL); $result = sql_select($SQL);
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load shift entries by filter."); engelsystem_error("Unable to load shift entries by filter.");
} }
return $result; return $result;
} }
/** /**
* Check if a shift collides with other shifts (in time). * Check if a shift collides with other shifts (in time).
* *
* @param Shift $shift * @param Shift $shift
* @param array<Shift> $shifts * @param array<Shift> $shifts
*/ */
function Shift_collides($shift, $shifts) { function Shift_collides($shift, $shifts)
foreach ($shifts as $other_shift) { {
if ($shift['SID'] != $other_shift['SID']) { foreach ($shifts as $other_shift) {
if (! ($shift['start'] >= $other_shift['end'] || $shift['end'] <= $other_shift['start'])) { if ($shift['SID'] != $other_shift['SID']) {
return true; if (! ($shift['start'] >= $other_shift['end'] || $shift['end'] <= $other_shift['start'])) {
} return true;
}
}
} }
} return false;
return false;
} }
/** /**
* Returns the number of needed angels/free shift entries for an angeltype. * Returns the number of needed angels/free shift entries for an angeltype.
*/ */
function Shift_free_entries($needed_angeltype, $shift_entries) { function Shift_free_entries($needed_angeltype, $shift_entries)
$taken = 0; {
foreach ($shift_entries as $shift_entry) { $taken = 0;
if ($shift_entry['freeloaded'] == 0) { foreach ($shift_entries as $shift_entry) {
$taken ++; if ($shift_entry['freeloaded'] == 0) {
$taken ++;
}
} }
} return max(0, $needed_angeltype['count'] - $taken);
return max(0, $needed_angeltype['count'] - $taken);
} }
/** /**
@ -153,55 +160,56 @@ function Shift_free_entries($needed_angeltype, $shift_entries) {
* @param boolean $angeltype_supporter * @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. * True, if the user has angeltype supporter rights for the angeltype, which enables him to sign somebody up for the shift.
*/ */
function Shift_signup_allowed_angel($user, $shift, $angeltype, $user_angeltype, $user_shifts, $needed_angeltype, $shift_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); {
$free_entries = Shift_free_entries($needed_angeltype, $shift_entries);
if ($user['Gekommen'] == 0) { if ($user['Gekommen'] == 0) {
return new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, $free_entries); 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) { if ($user_shifts == null) {
// you cannot join if you already singed up for this shift $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); return new ShiftSignupState(ShiftSignupState::SIGNED_UP, $free_entries);
} }
if (time() > $shift['start']) { if (time() > $shift['start']) {
// you can only join if the shift is in future // you can only join if the shift is in future
return new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, $free_entries); return new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, $free_entries);
} }
if ($free_entries == 0) { if ($free_entries == 0) {
// you cannot join if shift is full // you cannot join if shift is full
return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries); return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries);
} }
if ($user_angeltype == null) { if ($user_angeltype == null) {
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); $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']))) { 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 user is not of this angel type
// you cannot join if you are not confirmed // you cannot join if you are not confirmed
// you cannot join if angeltype has no self signup // you cannot join if angeltype has no self signup
return new ShiftSignupState(ShiftSignupState::ANGELTYPE, $free_entries); return new ShiftSignupState(ShiftSignupState::ANGELTYPE, $free_entries);
} }
if (Shift_collides($shift, $user_shifts)) { if (Shift_collides($shift, $user_shifts)) {
// you cannot join if user alread joined a parallel or this shift // you cannot join if user alread joined a parallel or this shift
return new ShiftSignupState(ShiftSignupState::COLLIDES, $free_entries); return new ShiftSignupState(ShiftSignupState::COLLIDES, $free_entries);
} }
// Hooray, shift is free for you! // Hooray, shift is free for you!
return new ShiftSignupState(ShiftSignupState::FREE, $free_entries); return new ShiftSignupState(ShiftSignupState::FREE, $free_entries);
@ -210,13 +218,14 @@ function Shift_signup_allowed_angel($user, $shift, $angeltype, $user_angeltype,
/** /**
* Check if an angeltype supporter can sign up a user to a shift. * Check if an angeltype supporter can sign up a user to a shift.
*/ */
function Shift_signup_allowed_angeltype_supporter($angeltype, $needed_angeltype, $shift_entries) { function Shift_signup_allowed_angeltype_supporter($angeltype, $needed_angeltype, $shift_entries)
$free_entries = Shift_free_entries($needed_angeltype, $shift_entries); {
if ($free_entries == 0) { $free_entries = Shift_free_entries($needed_angeltype, $shift_entries);
return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries); if ($free_entries == 0) {
} return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries);
}
return new ShiftSignupState(ShiftSignupState::FREE, $free_entries); return new ShiftSignupState(ShiftSignupState::FREE, $free_entries);
} }
/** /**
@ -227,15 +236,16 @@ function Shift_signup_allowed_angeltype_supporter($angeltype, $needed_angeltype,
* @param AngelType $angeltype * @param AngelType $angeltype
* The angeltype to which the user wants to sign up * The angeltype to which the user wants to sign up
*/ */
function Shift_signup_allowed_admin($angeltype, $needed_angeltype, $shift_entries) { function Shift_signup_allowed_admin($angeltype, $needed_angeltype, $shift_entries)
$free_entries = Shift_free_entries($needed_angeltype, $shift_entries); {
$free_entries = Shift_free_entries($needed_angeltype, $shift_entries);
if ($free_entries == 0) { if ($free_entries == 0) {
// User shift admins may join anybody in every shift // User shift admins may join anybody in every shift
return new ShiftSignupState(ShiftSignupState::ADMIN, $free_entries); return new ShiftSignupState(ShiftSignupState::ADMIN, $free_entries);
} }
return new ShiftSignupState(ShiftSignupState::FREE, $free_entries); return new ShiftSignupState(ShiftSignupState::FREE, $free_entries);
} }
/** /**
@ -248,49 +258,53 @@ function Shift_signup_allowed_admin($angeltype, $needed_angeltype, $shift_entrie
* @param array<Shift> $user_shifts * @param array<Shift> $user_shifts
* List of the users shifts * List of the users shifts
*/ */
function Shift_signup_allowed($signup_user, $shift, $angeltype, $user_angeltype = null, $user_shifts = null, $needed_angeltype, $shift_entries) { function Shift_signup_allowed($signup_user, $shift, $angeltype, $user_angeltype = null, $user_shifts = null, $needed_angeltype, $shift_entries)
global $user, $privileges; {
global $user, $privileges;
if (in_array('user_shifts_admin', $privileges)) { if (in_array('user_shifts_admin', $privileges)) {
return Shift_signup_allowed_admin($angeltype, $needed_angeltype, $shift_entries); return Shift_signup_allowed_admin($angeltype, $needed_angeltype, $shift_entries);
} }
if (in_array('shiftentry_edit_angeltype_supporter', $privileges) && User_is_AngelType_supporter($user, $angeltype)) { 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_angeltype_supporter($angeltype, $needed_angeltype, $shift_entries);
} }
return Shift_signup_allowed_angel($signup_user, $shift, $angeltype, $user_angeltype, $user_shifts, $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. * Delete a shift by its external id.
*/ */
function Shift_delete_by_psid($shift_psid) { function Shift_delete_by_psid($shift_psid)
return sql_query("DELETE FROM `Shifts` WHERE `PSID`='" . sql_escape($shift_psid) . "'"); {
return sql_query("DELETE FROM `Shifts` WHERE `PSID`='" . sql_escape($shift_psid) . "'");
} }
/** /**
* Delete a shift. * Delete a shift.
*/ */
function Shift_delete($shift_id) { function Shift_delete($shift_id)
mail_shift_delete(Shift($shift_id)); {
mail_shift_delete(Shift($shift_id));
$result = sql_query("DELETE FROM `Shifts` WHERE `SID`='" . sql_escape($shift_id) . "'"); $result = sql_query("DELETE FROM `Shifts` WHERE `SID`='" . sql_escape($shift_id) . "'");
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to delete shift.'); engelsystem_error('Unable to delete shift.');
} }
return $result; return $result;
} }
/** /**
* Update a shift. * Update a shift.
*/ */
function Shift_update($shift) { function Shift_update($shift)
global $user; {
$shift['name'] = ShiftType($shift['shifttype_id'])['name']; global $user;
mail_shift_change(Shift($shift['SID']), $shift); $shift['name'] = ShiftType($shift['shifttype_id'])['name'];
mail_shift_change(Shift($shift['SID']), $shift);
return sql_query("UPDATE `Shifts` SET return sql_query("UPDATE `Shifts` SET
`shifttype_id`='" . sql_escape($shift['shifttype_id']) . "', `shifttype_id`='" . sql_escape($shift['shifttype_id']) . "',
`start`='" . sql_escape($shift['start']) . "', `start`='" . sql_escape($shift['start']) . "',
`end`='" . sql_escape($shift['end']) . "', `end`='" . sql_escape($shift['end']) . "',
@ -306,16 +320,17 @@ function Shift_update($shift) {
/** /**
* Update a shift by its external id. * Update a shift by its external id.
*/ */
function Shift_update_by_psid($shift) { function Shift_update_by_psid($shift)
$shift_source = sql_select("SELECT `SID` FROM `Shifts` WHERE `PSID`=" . $shift['PSID']); {
if ($shift_source === false) { $shift_source = sql_select("SELECT `SID` FROM `Shifts` WHERE `PSID`=" . $shift['PSID']);
return false; if ($shift_source === false) {
} return false;
if (count($shift_source) == 0) { }
return null; if (count($shift_source) == 0) {
} return null;
$shift['SID'] = $shift_source[0]['SID']; }
return Shift_update($shift); $shift['SID'] = $shift_source[0]['SID'];
return Shift_update($shift);
} }
/** /**
@ -323,9 +338,10 @@ function Shift_update_by_psid($shift) {
* *
* @return new shift id or false * @return new shift id or false
*/ */
function Shift_create($shift) { function Shift_create($shift)
global $user; {
$result = sql_query("INSERT INTO `Shifts` SET global $user;
$result = sql_query("INSERT INTO `Shifts` SET
`shifttype_id`='" . sql_escape($shift['shifttype_id']) . "', `shifttype_id`='" . sql_escape($shift['shifttype_id']) . "',
`start`='" . sql_escape($shift['start']) . "', `start`='" . sql_escape($shift['start']) . "',
`end`='" . sql_escape($shift['end']) . "', `end`='" . sql_escape($shift['end']) . "',
@ -335,17 +351,18 @@ function Shift_create($shift) {
`PSID`=" . sql_null($shift['PSID']) . ", `PSID`=" . sql_null($shift['PSID']) . ",
`created_by_user_id`='" . sql_escape($user['UID']) . "', `created_by_user_id`='" . sql_escape($user['UID']) . "',
`created_at_timestamp`=" . time()); `created_at_timestamp`=" . time());
if ($result === false) { if ($result === false) {
return false; return false;
} }
return sql_id(); return sql_id();
} }
/** /**
* Return users shifts. * Return users shifts.
*/ */
function Shifts_by_user($user, $include_freeload_comments = false) { function Shifts_by_user($user, $include_freeload_comments = false)
$result = sql_select(" {
$result = sql_select("
SELECT `ShiftTypes`.`id` as `shifttype_id`, `ShiftTypes`.`name`, SELECT `ShiftTypes`.`id` as `shifttype_id`, `ShiftTypes`.`name`,
`ShiftEntry`.`id`, `ShiftEntry`.`SID`, `ShiftEntry`.`TID`, `ShiftEntry`.`UID`, `ShiftEntry`.`freeloaded`, `ShiftEntry`.`Comment`, `ShiftEntry`.`id`, `ShiftEntry`.`SID`, `ShiftEntry`.`TID`, `ShiftEntry`.`UID`, `ShiftEntry`.`freeloaded`, `ShiftEntry`.`Comment`,
" . ($include_freeload_comments ? "`ShiftEntry`.`freeload_comment`, " : "") . " " . ($include_freeload_comments ? "`ShiftEntry`.`freeload_comment`, " : "") . "
@ -357,10 +374,10 @@ function Shifts_by_user($user, $include_freeload_comments = false) {
WHERE `UID`='" . sql_escape($user['UID']) . "' WHERE `UID`='" . sql_escape($user['UID']) . "'
ORDER BY `start` ORDER BY `start`
"); ");
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to load users shifts.'); engelsystem_error('Unable to load users shifts.');
} }
return $result; return $result;
} }
/** /**
@ -369,64 +386,64 @@ function Shifts_by_user($user, $include_freeload_comments = false) {
* @param $shift_id Shift * @param $shift_id Shift
* ID * ID
*/ */
function Shift($shift_id) { function Shift($shift_id)
$shifts_source = sql_select(" {
$shifts_source = sql_select("
SELECT `Shifts`.*, `ShiftTypes`.`name` SELECT `Shifts`.*, `ShiftTypes`.`name`
FROM `Shifts` FROM `Shifts`
JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`)
WHERE `SID`='" . sql_escape($shift_id) . "'"); WHERE `SID`='" . sql_escape($shift_id) . "'");
$shiftsEntry_source = sql_select("SELECT `id`, `TID` , `UID` , `freeloaded` FROM `ShiftEntry` 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) { if ($shifts_source === false) {
engelsystem_error('Unable to load shift.'); engelsystem_error('Unable to load shift.');
} }
if (empty($shifts_source)) { if (empty($shifts_source)) {
return null; return null;
} }
$result = $shifts_source[0]; $result = $shifts_source[0];
$result['ShiftEntry'] = $shiftsEntry_source; $result['ShiftEntry'] = $shiftsEntry_source;
$result['NeedAngels'] = []; $result['NeedAngels'] = [];
$temp = NeededAngelTypes_by_shift($shift_id); $temp = NeededAngelTypes_by_shift($shift_id);
foreach ($temp as $e) { foreach ($temp as $e) {
$result['NeedAngels'][] = [ $result['NeedAngels'][] = [
'TID' => $e['angel_type_id'], 'TID' => $e['angel_type_id'],
'count' => $e['count'], 'count' => $e['count'],
'restricted' => $e['restricted'], 'restricted' => $e['restricted'],
'taken' => $e['taken'] 'taken' => $e['taken']
]; ];
} }
return $result; return $result;
} }
/** /**
* Returns all shifts with needed angeltypes and count of subscribed jobs. * Returns all shifts with needed angeltypes and count of subscribed jobs.
*/ */
function Shifts() { function Shifts()
$shifts_source = sql_select(" {
$shifts_source = sql_select("
SELECT `ShiftTypes`.`name`, `Shifts`.*, `Room`.`RID`, `Room`.`Name` as `room_name` SELECT `ShiftTypes`.`name`, `Shifts`.*, `Room`.`RID`, `Room`.`Name` as `room_name`
FROM `Shifts` FROM `Shifts`
JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`)
JOIN `Room` ON `Room`.`RID` = `Shifts`.`RID` JOIN `Room` ON `Room`.`RID` = `Shifts`.`RID`
"); ");
if ($shifts_source === false) { if ($shifts_source === false) {
return 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; 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;
} }
?>

View File

@ -13,8 +13,9 @@
* The angeltype to be checked * The angeltype to be checked
* @return boolean * @return boolean
*/ */
function UserAngelType_exists($user, $angeltype) { function UserAngelType_exists($user, $angeltype)
return sql_num_query(" {
return sql_num_query("
SELECT `id` SELECT `id`
FROM `UserAngelTypes` FROM `UserAngelTypes`
WHERE `UserAngelTypes`.`user_id`='" . sql_escape($user['UID']) . "' WHERE `UserAngelTypes`.`user_id`='" . sql_escape($user['UID']) . "'
@ -25,29 +26,31 @@ function UserAngelType_exists($user, $angeltype) {
/** /**
* List users angeltypes. * List users angeltypes.
* *
* @param User $user * @param User $user
*/ */
function User_angeltypes($user) { function User_angeltypes($user)
$result = sql_select(" {
$result = sql_select("
SELECT `AngelTypes`.*, `UserAngelTypes`.`confirm_user_id`, `UserAngelTypes`.`supporter` SELECT `AngelTypes`.*, `UserAngelTypes`.`confirm_user_id`, `UserAngelTypes`.`supporter`
FROM `UserAngelTypes` FROM `UserAngelTypes`
JOIN `AngelTypes` ON `UserAngelTypes`.`angeltype_id` = `AngelTypes`.`id` JOIN `AngelTypes` ON `UserAngelTypes`.`angeltype_id` = `AngelTypes`.`id`
WHERE `UserAngelTypes`.`user_id`='" . sql_escape($user['UID']) . "' WHERE `UserAngelTypes`.`user_id`='" . sql_escape($user['UID']) . "'
"); ");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load user angeltypes."); engelsystem_error("Unable to load user angeltypes.");
return false; return false;
} }
return $result; return $result;
} }
/** /**
* Gets unconfirmed user angeltypes for angeltypes of which the given user is a supporter. * Gets unconfirmed user angeltypes for angeltypes of which the given user is a supporter.
* *
* @param User $user * @param User $user
*/ */
function User_unconfirmed_AngelTypes($user) { function User_unconfirmed_AngelTypes($user)
$result = sql_select(" {
$result = sql_select("
SELECT SELECT
`UserAngelTypes`.*, `UserAngelTypes`.*,
`AngelTypes`.`name`, `AngelTypes`.`name`,
@ -61,23 +64,24 @@ function User_unconfirmed_AngelTypes($user) {
AND `UnconfirmedMembers`.`confirm_user_id` IS NULL AND `UnconfirmedMembers`.`confirm_user_id` IS NULL
GROUP BY `UserAngelTypes`.`angeltype_id` GROUP BY `UserAngelTypes`.`angeltype_id`
ORDER BY `AngelTypes`.`name`"); ORDER BY `AngelTypes`.`name`");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load user angeltypes."); engelsystem_error("Unable to load user angeltypes.");
} }
return $result; return $result;
} }
/** /**
* Returns true if user is angeltype supporter or has privilege admin_user_angeltypes. * Returns true if user is angeltype supporter or has privilege admin_user_angeltypes.
* *
* @param User $user * @param User $user
* @param AngelType $angeltype * @param AngelType $angeltype
*/ */
function User_is_AngelType_supporter(&$user, $angeltype) { function User_is_AngelType_supporter(&$user, $angeltype)
if(!isset($user['privileges'])) { {
$user['privileges'] = privileges_for_user($user['UID']); if (!isset($user['privileges'])) {
} $user['privileges'] = privileges_for_user($user['UID']);
return (sql_num_query(" }
return (sql_num_query("
SELECT `id` SELECT `id`
FROM `UserAngelTypes` FROM `UserAngelTypes`
WHERE `user_id`='" . sql_escape($user['UID']) . "' WHERE `user_id`='" . sql_escape($user['UID']) . "'
@ -89,80 +93,85 @@ function User_is_AngelType_supporter(&$user, $angeltype) {
/** /**
* Add or remove supporter rights. * Add or remove supporter rights.
* *
* @param int $user_angeltype_id * @param int $user_angeltype_id
* @param bool $supporter * @param bool $supporter
*/ */
function UserAngelType_update($user_angeltype_id, $supporter) { function UserAngelType_update($user_angeltype_id, $supporter)
$result = sql_query(" {
$result = sql_query("
UPDATE `UserAngelTypes` UPDATE `UserAngelTypes`
SET `supporter`=" . sql_bool($supporter) . " SET `supporter`=" . sql_bool($supporter) . "
WHERE `id`='" . sql_escape($user_angeltype_id) . "' WHERE `id`='" . sql_escape($user_angeltype_id) . "'
LIMIT 1"); LIMIT 1");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to update supporter rights."); engelsystem_error("Unable to update supporter rights.");
} }
return $result; return $result;
} }
/** /**
* Delete all unconfirmed UserAngelTypes for given Angeltype. * Delete all unconfirmed UserAngelTypes for given Angeltype.
* *
* @param int $angeltype_id * @param int $angeltype_id
*/ */
function UserAngelTypes_delete_all($angeltype_id) { function UserAngelTypes_delete_all($angeltype_id)
$result = sql_query(" {
$result = sql_query("
DELETE FROM `UserAngelTypes` DELETE FROM `UserAngelTypes`
WHERE `angeltype_id`='" . sql_escape($angeltype_id) . "' WHERE `angeltype_id`='" . sql_escape($angeltype_id) . "'
AND `confirm_user_id` IS NULL"); AND `confirm_user_id` IS NULL");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to delete all unconfirmed users."); engelsystem_error("Unable to delete all unconfirmed users.");
} }
return $result; return $result;
} }
/** /**
* Confirm all unconfirmed UserAngelTypes for given Angeltype. * Confirm all unconfirmed UserAngelTypes for given Angeltype.
* *
* @param int $angeltype_id * @param int $angeltype_id
* @param User $confirm_user * @param User $confirm_user
*/ */
function UserAngelTypes_confirm_all($angeltype_id, $confirm_user) { function UserAngelTypes_confirm_all($angeltype_id, $confirm_user)
$result = sql_query(" {
$result = sql_query("
UPDATE `UserAngelTypes` UPDATE `UserAngelTypes`
SET `confirm_user_id`='" . sql_escape($confirm_user['UID']) . "' SET `confirm_user_id`='" . sql_escape($confirm_user['UID']) . "'
WHERE `angeltype_id`='" . sql_escape($angeltype_id) . "' WHERE `angeltype_id`='" . sql_escape($angeltype_id) . "'
AND `confirm_user_id` IS NULL"); AND `confirm_user_id` IS NULL");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to confirm all users."); engelsystem_error("Unable to confirm all users.");
} }
return $result; return $result;
} }
/** /**
* Confirm an UserAngelType with confirming user. * Confirm an UserAngelType with confirming user.
* *
* @param int $user_angeltype_id * @param int $user_angeltype_id
* @param User $confirm_user * @param User $confirm_user
*/ */
function UserAngelType_confirm($user_angeltype_id, $confirm_user) { function UserAngelType_confirm($user_angeltype_id, $confirm_user)
$result = sql_query(" {
$result = sql_query("
UPDATE `UserAngelTypes` UPDATE `UserAngelTypes`
SET `confirm_user_id`='" . sql_escape($confirm_user['UID']) . "' SET `confirm_user_id`='" . sql_escape($confirm_user['UID']) . "'
WHERE `id`='" . sql_escape($user_angeltype_id) . "' WHERE `id`='" . sql_escape($user_angeltype_id) . "'
LIMIT 1"); LIMIT 1");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to confirm user angeltype."); engelsystem_error("Unable to confirm user angeltype.");
} }
return $result; return $result;
} }
/** /**
* Delete an UserAngelType. * Delete an UserAngelType.
* *
* @param UserAngelType $user_angeltype * @param UserAngelType $user_angeltype
*/ */
function UserAngelType_delete($user_angeltype) { function UserAngelType_delete($user_angeltype)
return sql_query(" {
return sql_query("
DELETE FROM `UserAngelTypes` DELETE FROM `UserAngelTypes`
WHERE `id`='" . sql_escape($user_angeltype['id']) . "' WHERE `id`='" . sql_escape($user_angeltype['id']) . "'
LIMIT 1"); LIMIT 1");
@ -171,59 +180,61 @@ function UserAngelType_delete($user_angeltype) {
/** /**
* Create an UserAngelType. * Create an UserAngelType.
* *
* @param User $user * @param User $user
* @param Angeltype $angeltype * @param Angeltype $angeltype
*/ */
function UserAngelType_create($user, $angeltype) { function UserAngelType_create($user, $angeltype)
$result = sql_query(" {
$result = sql_query("
INSERT INTO `UserAngelTypes` SET INSERT INTO `UserAngelTypes` SET
`user_id`='" . sql_escape($user['UID']) . "', `user_id`='" . sql_escape($user['UID']) . "',
`angeltype_id`='" . sql_escape($angeltype['id']) . "'"); `angeltype_id`='" . sql_escape($angeltype['id']) . "'");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to create user angeltype."); engelsystem_error("Unable to create user angeltype.");
} }
return sql_id(); return sql_id();
} }
/** /**
* Get an UserAngelType by its id. * Get an UserAngelType by its id.
* *
* @param int $user_angeltype_id * @param int $user_angeltype_id
*/ */
function UserAngelType($user_angeltype_id) { function UserAngelType($user_angeltype_id)
$angeltype = sql_select(" {
$angeltype = sql_select("
SELECT * SELECT *
FROM `UserAngelTypes` FROM `UserAngelTypes`
WHERE `id`='" . sql_escape($user_angeltype_id) . "' WHERE `id`='" . sql_escape($user_angeltype_id) . "'
LIMIT 1"); LIMIT 1");
if ($angeltype === false) { if ($angeltype === false) {
engelsystem_error("Unable to load user angeltype."); engelsystem_error("Unable to load user angeltype.");
} }
if (count($angeltype) == 0) { if (count($angeltype) == 0) {
return null; return null;
} }
return $angeltype[0]; return $angeltype[0];
} }
/** /**
* Get an UserAngelType by user and angeltype. * Get an UserAngelType by user and angeltype.
* *
* @param User $user * @param User $user
* @param Angeltype $angeltype * @param Angeltype $angeltype
*/ */
function UserAngelType_by_User_and_AngelType($user, $angeltype) { function UserAngelType_by_User_and_AngelType($user, $angeltype)
$angeltype = sql_select(" {
$angeltype = sql_select("
SELECT * SELECT *
FROM `UserAngelTypes` FROM `UserAngelTypes`
WHERE `user_id`='" . sql_escape($user['UID']) . "' WHERE `user_id`='" . sql_escape($user['UID']) . "'
AND `angeltype_id`='" . sql_escape($angeltype['id']) . "' AND `angeltype_id`='" . sql_escape($angeltype['id']) . "'
LIMIT 1"); LIMIT 1");
if ($angeltype === false) { if ($angeltype === false) {
engelsystem_error("Unable to load user angeltype."); engelsystem_error("Unable to load user angeltype.");
} }
if (count($angeltype) == 0) { if (count($angeltype) == 0) {
return null; return null;
} }
return $angeltype[0]; return $angeltype[0];
} }
?>

View File

@ -4,15 +4,16 @@
* Returns a new empty UserDriverLicense * Returns a new empty UserDriverLicense
* FIXME entity object needed * FIXME entity object needed
*/ */
function UserDriverLicense_new() { function UserDriverLicense_new()
return [ {
return [
'user_id' => null, 'user_id' => null,
'has_car' => false, 'has_car' => false,
'has_license_car' => false, 'has_license_car' => false,
'has_license_3_5t_transporter' => false, 'has_license_3_5t_transporter' => false,
'has_license_7_5t_truck' => false, 'has_license_7_5t_truck' => false,
'has_license_12_5t_truck' => false, 'has_license_12_5t_truck' => false,
'has_license_forklift' => false 'has_license_forklift' => false
]; ];
} }
@ -23,8 +24,9 @@ function UserDriverLicense_new() {
* The UserDriverLicense to check * The UserDriverLicense to check
* @return boolean * @return boolean
*/ */
function UserDriverLicense_valid($user_driver_license) { 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']; {
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'];
} }
/** /**
@ -33,16 +35,17 @@ function UserDriverLicense_valid($user_driver_license) {
* @param int $user_id * @param int $user_id
* The users id * The users id
*/ */
function UserDriverLicense($user_id) { function UserDriverLicense($user_id)
$user_driver_license = sql_select("SELECT * FROM `UserDriverLicenses` WHERE `user_id`='" . sql_escape($user_id) . "'"); {
if ($user_driver_license === false) { $user_driver_license = sql_select("SELECT * FROM `UserDriverLicenses` WHERE `user_id`='" . sql_escape($user_id) . "'");
engelsystem_error('Unable to load user driver license.'); if ($user_driver_license === false) {
return false; engelsystem_error('Unable to load user driver license.');
} return false;
if (count($user_driver_license) > 0) { }
return $user_driver_license[0]; if (count($user_driver_license) > 0) {
} return $user_driver_license[0];
return null; }
return null;
} }
/** /**
@ -51,9 +54,10 @@ function UserDriverLicense($user_id) {
* @param UserDriverLicense $user_driver_license * @param UserDriverLicense $user_driver_license
* The UserDriverLicense to create * The UserDriverLicense to create
*/ */
function UserDriverLicenses_create($user_driver_license, $user) { function UserDriverLicenses_create($user_driver_license, $user)
$user_driver_license['user_id'] = $user['UID']; {
$result = sql_query(" $user_driver_license['user_id'] = $user['UID'];
$result = sql_query("
INSERT INTO `UserDriverLicenses` SET INSERT INTO `UserDriverLicenses` SET
`user_id`=" . sql_escape($user_driver_license['user_id']) . ", `user_id`=" . sql_escape($user_driver_license['user_id']) . ",
`has_car`=" . sql_bool($user_driver_license['has_car']) . ", `has_car`=" . sql_bool($user_driver_license['has_car']) . ",
@ -62,10 +66,10 @@ function UserDriverLicenses_create($user_driver_license, $user) {
`has_license_7_5t_truck`=" . sql_bool($user_driver_license['has_license_7_5t_truck']) . ", `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_12_5t_truck`=" . sql_bool($user_driver_license['has_license_12_5t_truck']) . ",
`has_license_forklift`=" . sql_bool($user_driver_license['has_license_forklift'])); `has_license_forklift`=" . sql_bool($user_driver_license['has_license_forklift']));
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to create user driver license'); engelsystem_error('Unable to create user driver license');
} }
return $user_driver_license; return $user_driver_license;
} }
/** /**
@ -74,8 +78,9 @@ function UserDriverLicenses_create($user_driver_license, $user) {
* @param UserDriverLicense $user_driver_license * @param UserDriverLicense $user_driver_license
* The UserDriverLicense to update * The UserDriverLicense to update
*/ */
function UserDriverLicenses_update($user_driver_license) { function UserDriverLicenses_update($user_driver_license)
$result = sql_query("UPDATE `UserDriverLicenses` SET {
$result = sql_query("UPDATE `UserDriverLicenses` SET
`has_car`=" . sql_bool($user_driver_license['has_car']) . ", `has_car`=" . sql_bool($user_driver_license['has_car']) . ",
`has_license_car`=" . sql_bool($user_driver_license['has_license_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_3_5t_transporter`=" . sql_bool($user_driver_license['has_license_3_5t_transporter']) . ",
@ -83,22 +88,22 @@ function UserDriverLicenses_update($user_driver_license) {
`has_license_12_5t_truck`=" . sql_bool($user_driver_license['has_license_12_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']) . " `has_license_forklift`=" . sql_bool($user_driver_license['has_license_forklift']) . "
WHERE `user_id`='" . sql_escape($user_driver_license['user_id']) . "'"); WHERE `user_id`='" . sql_escape($user_driver_license['user_id']) . "'");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to update user driver license information"); engelsystem_error("Unable to update user driver license information");
} }
return $result; return $result;
} }
/** /**
* Delete a user's driver license entry * Delete a user's driver license entry
* *
* @param int $user_id * @param int $user_id
*/ */
function UserDriverLicenses_delete($user_id) { function UserDriverLicenses_delete($user_id)
$result = sql_query("DELETE FROM `UserDriverLicenses` WHERE `user_id`=" . sql_escape($user_id)); {
if ($result === false) { $result = sql_query("DELETE FROM `UserDriverLicenses` WHERE `user_id`=" . sql_escape($user_id));
engelsystem_error("Unable to remove user driver license information"); if ($result === false) {
} engelsystem_error("Unable to remove user driver license information");
return $result; }
return $result;
} }
?>

View File

@ -4,8 +4,9 @@
* Returns users groups * Returns users groups
* @param User $user * @param User $user
*/ */
function User_groups($user) { function User_groups($user)
return sql_select(" {
return sql_select("
SELECT `Groups`.* SELECT `Groups`.*
FROM `UserGroups` FROM `UserGroups`
JOIN `Groups` ON `Groups`.`UID`=`UserGroups`.`group_id` JOIN `Groups` ON `Groups`.`UID`=`UserGroups`.`group_id`
@ -13,5 +14,3 @@ function User_groups($user) {
ORDER BY `UserGroups`.`group_id` ORDER BY `UserGroups`.`group_id`
"); ");
} }
?>

View File

@ -8,19 +8,21 @@ use Engelsystem\ValidationResult;
/** /**
* Delete a user * Delete a user
* *
* @param int $user_id * @param int $user_id
*/ */
function User_delete($user_id) { function User_delete($user_id)
return sql_query("DELETE FROM `User` WHERE `UID`='" . sql_escape($user_id) . "'"); {
return sql_query("DELETE FROM `User` WHERE `UID`='" . sql_escape($user_id) . "'");
} }
/** /**
* Update user. * Update user.
* *
* @param User $user * @param User $user
*/ */
function User_update($user) { function User_update($user)
return sql_query("UPDATE `User` SET {
return sql_query("UPDATE `User` SET
`Nick`='" . sql_escape($user['Nick']) . "', `Nick`='" . sql_escape($user['Nick']) . "',
`Name`='" . sql_escape($user['Name']) . "', `Name`='" . sql_escape($user['Name']) . "',
`Vorname`='" . sql_escape($user['Vorname']) . "', `Vorname`='" . sql_escape($user['Vorname']) . "',
@ -50,31 +52,37 @@ function User_update($user) {
/** /**
* Counts all forced active users. * Counts all forced active users.
*/ */
function User_force_active_count() { function User_force_active_count()
return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `force_active` = 1"); {
return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `force_active` = 1");
} }
function User_active_count() { function User_active_count()
return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `Aktiv` = 1"); {
return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `Aktiv` = 1");
} }
function User_got_voucher_count() { function User_got_voucher_count()
return sql_select_single_cell("SELECT SUM(`got_voucher`) FROM `User`"); {
return sql_select_single_cell("SELECT SUM(`got_voucher`) FROM `User`");
} }
function User_arrived_count() { function User_arrived_count()
return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `Gekommen` = 1"); {
return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `Gekommen` = 1");
} }
function User_tshirts_count() { function User_tshirts_count()
return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `Tshirt` = 1"); {
return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `Tshirt` = 1");
} }
/** /**
* Returns all column names for sorting in an array. * Returns all column names for sorting in an array.
*/ */
function User_sortable_columns() { function User_sortable_columns()
return [ {
return [
'Nick', 'Nick',
'Name', 'Name',
'Vorname', 'Vorname',
@ -86,55 +94,59 @@ function User_sortable_columns() {
'Aktiv', 'Aktiv',
'force_active', 'force_active',
'Tshirt', 'Tshirt',
'lastLogIn' 'lastLogIn'
]; ];
} }
/** /**
* Get all users, ordered by Nick by default or by given param. * Get all users, ordered by Nick by default or by given param.
* *
* @param string $order_by * @param string $order_by
*/ */
function Users($order_by = 'Nick') { function Users($order_by = 'Nick')
return sql_select("SELECT * FROM `User` ORDER BY `" . sql_escape($order_by) . "` ASC"); {
return sql_select("SELECT * FROM `User` ORDER BY `" . sql_escape($order_by) . "` ASC");
} }
/** /**
* Returns true if user is freeloader * Returns true if user is freeloader
* *
* @param User $user * @param User $user
*/ */
function User_is_freeloader($user) { function User_is_freeloader($user)
global $max_freeloadable_shifts, $user; {
global $max_freeloadable_shifts, $user;
return count(ShiftEntries_freeloaded_by_user($user)) >= $max_freeloadable_shifts; return count(ShiftEntries_freeloaded_by_user($user)) >= $max_freeloadable_shifts;
} }
/** /**
* Returns all users that are not member of given angeltype. * Returns all users that are not member of given angeltype.
* *
* @param Angeltype $angeltype * @param Angeltype $angeltype
*/ */
function Users_by_angeltype_inverted($angeltype) { function Users_by_angeltype_inverted($angeltype)
$result = sql_select(" {
$result = sql_select("
SELECT `User`.* SELECT `User`.*
FROM `User` FROM `User`
LEFT JOIN `UserAngelTypes` ON (`User`.`UID`=`UserAngelTypes`.`user_id` AND `angeltype_id`='" . sql_escape($angeltype['id']) . "') LEFT JOIN `UserAngelTypes` ON (`User`.`UID`=`UserAngelTypes`.`user_id` AND `angeltype_id`='" . sql_escape($angeltype['id']) . "')
WHERE `UserAngelTypes`.`id` IS NULL WHERE `UserAngelTypes`.`id` IS NULL
ORDER BY `Nick`"); ORDER BY `Nick`");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load users."); engelsystem_error("Unable to load users.");
} }
return $result; return $result;
} }
/** /**
* Returns all members of given angeltype. * Returns all members of given angeltype.
* *
* @param Angeltype $angeltype * @param Angeltype $angeltype
*/ */
function Users_by_angeltype($angeltype) { function Users_by_angeltype($angeltype)
$result = sql_select(" {
$result = sql_select("
SELECT SELECT
`User`.*, `User`.*,
`UserAngelTypes`.`id` as `user_angeltype_id`, `UserAngelTypes`.`id` as `user_angeltype_id`,
@ -146,26 +158,28 @@ function Users_by_angeltype($angeltype) {
LEFT JOIN `UserDriverLicenses` ON `User`.`UID`=`UserDriverLicenses`.`user_id` LEFT JOIN `UserDriverLicenses` ON `User`.`UID`=`UserDriverLicenses`.`user_id`
WHERE `UserAngelTypes`.`angeltype_id`='" . sql_escape($angeltype['id']) . "' WHERE `UserAngelTypes`.`angeltype_id`='" . sql_escape($angeltype['id']) . "'
ORDER BY `Nick`"); ORDER BY `Nick`");
if ($result === false) { if ($result === false) {
engelsystem_error("Unable to load members."); engelsystem_error("Unable to load members.");
} }
return $result; return $result;
} }
/** /**
* Returns User id array * Returns User id array
*/ */
function User_ids() { function User_ids()
return sql_select("SELECT `UID` FROM `User`"); {
return sql_select("SELECT `UID` FROM `User`");
} }
/** /**
* Strip unwanted characters from a users nick. * Strip unwanted characters from a users nick.
* *
* @param string $nick * @param string $nick
*/ */
function User_validate_Nick($nick) { function User_validate_Nick($nick)
return preg_replace("/([^a-z0-9üöäß. _+*-]{1,})/ui", '', $nick); {
return preg_replace("/([^a-z0-9üöäß. _+*-]{1,})/ui", '', $nick);
} }
/** /**
@ -175,9 +189,10 @@ function User_validate_Nick($nick) {
* The email address to validate * The email address to validate
* @return ValidationResult * @return ValidationResult
*/ */
function User_validate_mail($mail) { function User_validate_mail($mail)
$mail = strip_item($mail); {
return new ValidationResult(check_email($mail), $mail); $mail = strip_item($mail);
return new ValidationResult(check_email($mail), $mail);
} }
/** /**
@ -187,13 +202,14 @@ function User_validate_mail($mail) {
* Jabber-ID to validate * Jabber-ID to validate
* @return ValidationResult * @return ValidationResult
*/ */
function User_validate_jabber($jabber) { function User_validate_jabber($jabber)
$jabber = strip_item($jabber); {
if ($jabber == '') { $jabber = strip_item($jabber);
// Empty is ok if ($jabber == '') {
// Empty is ok
return new ValidationResult(true, ''); return new ValidationResult(true, '');
} }
return new ValidationResult(check_email($jabber), $jabber); return new ValidationResult(check_email($jabber), $jabber);
} }
/** /**
@ -203,25 +219,26 @@ function User_validate_jabber($jabber) {
* Unix timestamp * Unix timestamp
* @return ValidationResult * @return ValidationResult
*/ */
function User_validate_planned_arrival_date($planned_arrival_date) { function User_validate_planned_arrival_date($planned_arrival_date)
if ($planned_arrival_date == null) { {
// null is not okay if ($planned_arrival_date == null) {
// null is not okay
return new ValidationResult(false, time()); return new ValidationResult(false, time());
} }
$event_config = EventConfig(); $event_config = EventConfig();
if ($event_config == null) { if ($event_config == null) {
// Nothing to validate against // Nothing to validate against
return new ValidationResult(true, $planned_arrival_date); return new ValidationResult(true, $planned_arrival_date);
} }
if (isset($event_config['buildup_start_date']) && $planned_arrival_date < $event_config['buildup_start_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 // Planned arrival can not be before buildup start date
return new ValidationResult(false, $event_config['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']) { if (isset($event_config['teardown_end_date']) && $planned_arrival_date > $event_config['teardown_end_date']) {
// Planned arrival can not be after teardown end date // Planned arrival can not be after teardown end date
return new ValidationResult(false, $event_config['teardown_end_date']); return new ValidationResult(false, $event_config['teardown_end_date']);
} }
return new ValidationResult(true, $planned_arrival_date); return new ValidationResult(true, $planned_arrival_date);
} }
/** /**
@ -233,45 +250,47 @@ function User_validate_planned_arrival_date($planned_arrival_date) {
* Unix timestamp * Unix timestamp
* @return ValidationResult * @return ValidationResult
*/ */
function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date) { function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date)
if ($planned_departure_date == null) { {
// null is okay if ($planned_departure_date == null) {
// null is okay
return new ValidationResult(true, null); return new ValidationResult(true, null);
} }
if ($planned_arrival_date > $planned_departure_date) { if ($planned_arrival_date > $planned_departure_date) {
// departure cannot be before arrival // departure cannot be before arrival
return new ValidationResult(false, $planned_arrival_date); return new ValidationResult(false, $planned_arrival_date);
} }
$event_config = EventConfig(); $event_config = EventConfig();
if ($event_config == null) { if ($event_config == null) {
// Nothing to validate against // Nothing to validate against
return new ValidationResult(true, $planned_departure_date); return new ValidationResult(true, $planned_departure_date);
} }
if (isset($event_config['buildup_start_date']) && $planned_departure_date < $event_config['buildup_start_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 // Planned arrival can not be before buildup start date
return new ValidationResult(false, $event_config['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']) { if (isset($event_config['teardown_end_date']) && $planned_departure_date > $event_config['teardown_end_date']) {
// Planned arrival can not be after teardown end date // Planned arrival can not be after teardown end date
return new ValidationResult(false, $event_config['teardown_end_date']); return new ValidationResult(false, $event_config['teardown_end_date']);
} }
return new ValidationResult(true, $planned_departure_date); return new ValidationResult(true, $planned_departure_date);
} }
/** /**
* Returns user by id. * Returns user by id.
* *
* @param $user_id UID * @param $user_id UID
*/ */
function User($user_id) { function User($user_id)
$user_source = sql_select("SELECT * FROM `User` WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); {
if ($user_source === false) { $user_source = sql_select("SELECT * FROM `User` WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1");
engelsystem_error("Unable to load user."); if ($user_source === false) {
} engelsystem_error("Unable to load user.");
if (count($user_source) > 0) { }
return $user_source[0]; if (count($user_source) > 0) {
} return $user_source[0];
return null; }
return null;
} }
/** /**
@ -281,94 +300,98 @@ function User($user_id) {
* User api key * User api key
* @return Matching user, null or false on error * @return Matching user, null or false on error
*/ */
function User_by_api_key($api_key) { 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) { $user = sql_select("SELECT * FROM `User` WHERE `api_key`='" . sql_escape($api_key) . "' LIMIT 1");
engelsystem_error("Unable to find user by api key."); if ($user === false) {
} engelsystem_error("Unable to find user by api key.");
if (count($user) == 0) { }
return null; if (count($user) == 0) {
} return null;
return $user[0]; }
return $user[0];
} }
/** /**
* Returns User by email. * Returns User by email.
* *
* @param string $email * @param string $email
* @return Matching user, null or false on error * @return Matching user, null or false on error
*/ */
function User_by_email($email) { function User_by_email($email)
$user = sql_select("SELECT * FROM `User` WHERE `email`='" . sql_escape($email) . "' LIMIT 1"); {
if ($user === false) { $user = sql_select("SELECT * FROM `User` WHERE `email`='" . sql_escape($email) . "' LIMIT 1");
engelsystem_error("Unable to load user."); if ($user === false) {
} engelsystem_error("Unable to load user.");
if (count($user) == 0) { }
return null; if (count($user) == 0) {
} return null;
return $user[0]; }
return $user[0];
} }
/** /**
* Returns User by password token. * Returns User by password token.
* *
* @param string $token * @param string $token
* @return Matching user, null or false on error * @return Matching user, null or false on error
*/ */
function User_by_password_recovery_token($token) { 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) { $user = sql_select("SELECT * FROM `User` WHERE `password_recovery_token`='" . sql_escape($token) . "' LIMIT 1");
engelsystem_error("Unable to load user."); if ($user === false) {
} engelsystem_error("Unable to load user.");
if (count($user) == 0) { }
return null; if (count($user) == 0) {
} return null;
return $user[0]; }
return $user[0];
} }
/** /**
* Generates a new api key for given user. * Generates a new api key for given user.
* *
* @param User $user * @param User $user
*/ */
function User_reset_api_key(&$user, $log = true) { 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"); $user['api_key'] = md5($user['Nick'] . time() . rand());
if ($result === false) { $result = sql_query("UPDATE `User` SET `api_key`='" . sql_escape($user['api_key']) . "' WHERE `UID`='" . sql_escape($user['UID']) . "' LIMIT 1");
return false; if ($result === false) {
} return false;
if ($log) { }
engelsystem_log(sprintf("API key resetted (%s).", User_Nick_render($user))); if ($log) {
} engelsystem_log(sprintf("API key resetted (%s).", User_Nick_render($user)));
}
} }
/** /**
* Generates a new password recovery token for given user. * Generates a new password recovery token for given user.
* *
* @param User $user * @param User $user
*/ */
function User_generate_password_recovery_token(&$user) { 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"); $user['password_recovery_token'] = md5($user['Nick'] . time() . rand());
if ($result === false) { $result = sql_query("UPDATE `User` SET `password_recovery_token`='" . sql_escape($user['password_recovery_token']) . "' WHERE `UID`='" . sql_escape($user['UID']) . "' LIMIT 1");
engelsystem_error("Unable to generate password recovery token."); 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']; engelsystem_log("Password recovery for " . User_Nick_render($user) . " started.");
return $user['password_recovery_token'];
} }
function User_get_eligable_voucher_count(&$user) { function User_get_eligable_voucher_count(&$user)
global $voucher_settings; {
global $voucher_settings;
$shifts_done = count(ShiftEntries_finished_by_user($user)); $shifts_done = count(ShiftEntries_finished_by_user($user));
$earned_vouchers = $user['got_voucher'] - $voucher_settings['initial_vouchers']; $earned_vouchers = $user['got_voucher'] - $voucher_settings['initial_vouchers'];
$elegible_vouchers = $shifts_done / $voucher_settings['shifts_per_voucher'] - $earned_vouchers; $elegible_vouchers = $shifts_done / $voucher_settings['shifts_per_voucher'] - $earned_vouchers;
if ($elegible_vouchers < 0) { if ($elegible_vouchers < 0) {
return 0; return 0;
} }
return $elegible_vouchers; return $elegible_vouchers;
} }
?>

View File

@ -6,11 +6,11 @@ namespace Engelsystem;
* BO that represents the result of an entity attribute validation. * BO that represents the result of an entity attribute validation.
* It contains the validated value and a bool for validation success. * It contains the validated value and a bool for validation success.
*/ */
class ValidationResult { class ValidationResult
{
private $valid;
private $valid; private $value;
private $value;
/** /**
* Constructor. * Constructor.
@ -20,23 +20,25 @@ class ValidationResult {
* @param * $value * @param * $value
* The validated value * The validated value
*/ */
public function __construct($valid, $value) { public function __construct($valid, $value)
$this->valid = $valid; {
$this->value = $value; $this->valid = $valid;
$this->value = $value;
} }
/** /**
* Is the value valid? * Is the value valid?
*/ */
public function isValid() { public function isValid()
return $this->valid; {
return $this->valid;
} }
/** /**
* The parsed/validated value. * The parsed/validated value.
*/ */
public function getValue() { public function getValue()
return $this->value; {
return $this->value;
} }
} }
?>

View File

@ -3,73 +3,79 @@
/** /**
* Close connection. * Close connection.
*/ */
function sql_close() { function sql_close()
global $sql_connection; {
global $sql_connection;
return $sql_connection->close(); return $sql_connection->close();
} }
/** /**
* Return NULL if given value is null. * Return NULL if given value is null.
*/ */
function sql_null($value = null) { function sql_null($value = null)
return $value == null ? 'NULL' : ("'" . sql_escape($value) . "'"); {
return $value == null ? 'NULL' : ("'" . sql_escape($value) . "'");
} }
/** /**
* Start new transaction. * Start new transaction.
*/ */
function sql_transaction_start() { function sql_transaction_start()
global $sql_nested_transaction_level; {
global $sql_nested_transaction_level;
if ($sql_nested_transaction_level ++ == 0) { if ($sql_nested_transaction_level ++ == 0) {
return sql_query("BEGIN"); return sql_query("BEGIN");
} }
return true; return true;
} }
/** /**
* Commit transaction. * Commit transaction.
*/ */
function sql_transaction_commit() { function sql_transaction_commit()
global $sql_nested_transaction_level; {
global $sql_nested_transaction_level;
if (-- $sql_nested_transaction_level == 0) { if (-- $sql_nested_transaction_level == 0) {
return sql_query("COMMIT"); return sql_query("COMMIT");
} }
return true; return true;
} }
/** /**
* Stop transaction, revert database. * Stop transaction, revert database.
*/ */
function sql_transaction_rollback() { function sql_transaction_rollback()
global $sql_nested_transaction_level; {
global $sql_nested_transaction_level;
if (-- $sql_nested_transaction_level == 0) { if (-- $sql_nested_transaction_level == 0) {
return sql_query("ROLLBACK"); return sql_query("ROLLBACK");
} }
return true; return true;
} }
/** /**
* Logs an sql error. * Logs an sql error.
* *
* @param string $message * @param string $message
* @return false * @return false
*/ */
function sql_error($message) { function sql_error($message)
sql_close(); {
sql_close();
$message = trim($message) . "\n"; $message = trim($message) . "\n";
$message .= debug_string_backtrace() . "\n"; $message .= debug_string_backtrace() . "\n";
error_log('mysql_provider error: ' . $message); error_log('mysql_provider error: ' . $message);
return false; return false;
} }
/** /**
@ -85,26 +91,27 @@ function sql_error($message) {
* DB to select * DB to select
* @return mysqli The connection handler * @return mysqli The connection handler
*/ */
function sql_connect($host, $user, $pass, $db_name) { function sql_connect($host, $user, $pass, $db_name)
global $sql_connection; {
global $sql_connection;
$sql_connection = new mysqli($host, $user, $pass, $db_name); $sql_connection = new mysqli($host, $user, $pass, $db_name);
if ($sql_connection->connect_errno) { if ($sql_connection->connect_errno) {
error("Unable to connect to MySQL: " . $sql_connection->connect_error); error("Unable to connect to MySQL: " . $sql_connection->connect_error);
return sql_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;"); $result = $sql_connection->query("SET CHARACTER SET utf8;");
if (! $result) { if (! $result) {
return sql_error("Unable to set utf8 character set (" . $sql_connection->errno . ") " . $sql_connection->error); return sql_error("Unable to set utf8 character set (" . $sql_connection->errno . ") " . $sql_connection->error);
} }
$result = $sql_connection->set_charset('utf8'); $result = $sql_connection->set_charset('utf8');
if (! $result) { if (! $result) {
return sql_error("Unable to set utf8 names (" . $sql_connection->errno . ") " . $sql_connection->error); return sql_error("Unable to set utf8 names (" . $sql_connection->errno . ") " . $sql_connection->error);
} }
return $sql_connection; return $sql_connection;
} }
/** /**
@ -114,53 +121,56 @@ function sql_connect($host, $user, $pass, $db_name) {
* $db_name * $db_name
* @return bool true on success, false on error * @return bool true on success, false on error
*/ */
function sql_select_db($db_name) { function sql_select_db($db_name)
global $sql_connection; {
if (! $sql_connection->select_db($db_name)) { global $sql_connection;
return sql_error("No database selected."); if (! $sql_connection->select_db($db_name)) {
} return sql_error("No database selected.");
return true; }
return true;
} }
/** /**
* MySQL SELECT query * MySQL SELECT query
* *
* @param string $query * @param string $query
* @return Result array or false on error * @return Result array or false on error
*/ */
function sql_select($query) { function sql_select($query)
global $sql_connection; {
global $sql_connection;
// echo $query . ";\n"; // echo $query . ";\n";
// echo debug_string_backtrace() . "\n"; // echo debug_string_backtrace() . "\n";
$result = $sql_connection->query($query); $result = $sql_connection->query($query);
if ($result) { if ($result) {
$data = []; $data = [];
while ($line = $result->fetch_assoc()) { while ($line = $result->fetch_assoc()) {
array_push($data, $line); array_push($data, $line);
}
return $data;
} }
return $data;
}
return sql_error("MySQL-query error: " . $query . " (" . $sql_connection->errno . ") " . $sql_connection->error); return sql_error("MySQL-query error: " . $query . " (" . $sql_connection->errno . ") " . $sql_connection->error);
} }
/** /**
* MySQL execute a query * MySQL execute a query
* *
* @param string $query * @param string $query
* @return mysqli_result boolean resource or false on error * @return mysqli_result boolean resource or false on error
*/ */
function sql_query($query) { function sql_query($query)
global $sql_connection; {
global $sql_connection;
$result = $sql_connection->query($query); $result = $sql_connection->query($query);
if ($result) { if ($result) {
return $result; return $result;
} }
return sql_error("MySQL-query error: " . $query . " (" . $sql_connection->errno . ") " . $sql_connection->error); return sql_error("MySQL-query error: " . $query . " (" . $sql_connection->errno . ") " . $sql_connection->error);
} }
/** /**
@ -168,49 +178,53 @@ function sql_query($query) {
* *
* @return int * @return int
*/ */
function sql_id() { function sql_id()
global $sql_connection; {
return $sql_connection->insert_id; global $sql_connection;
return $sql_connection->insert_id;
} }
/** /**
* Escape a string for a sql query. * Escape a string for a sql query.
* *
* @param string $query * @param string $query
* @return string * @return string
*/ */
function sql_escape($query) { function sql_escape($query)
global $sql_connection; {
return $sql_connection->real_escape_string($query); global $sql_connection;
return $sql_connection->real_escape_string($query);
} }
/** /**
* Convert a boolean for mysql-queries. * Convert a boolean for mysql-queries.
* *
* @param boolean $boolean * @param boolean $boolean
* @return string * @return string
*/ */
function sql_bool($boolean) { function sql_bool($boolean)
return $boolean == true ? 'TRUE' : 'FALSE'; {
return $boolean == true ? 'TRUE' : 'FALSE';
} }
/** /**
* Count query result lines. * Count query result lines.
* *
* @param string $query * @param string $query
* @return int Count of result lines * @return int Count of result lines
*/ */
function sql_num_query($query) { function sql_num_query($query)
return sql_query($query)->num_rows; {
return sql_query($query)->num_rows;
} }
function sql_select_single_col($query) { function sql_select_single_col($query)
$result = sql_select($query); {
return array_map('array_shift', $result); $result = sql_select($query);
return array_map('array_shift', $result);
} }
function sql_select_single_cell($query) { function sql_select_single_cell($query)
return array_shift(array_shift(sql_select($query))); {
return array_shift(array_shift(sql_select($query)));
} }
?>

View File

@ -1,45 +1,47 @@
<?php <?php
function admin_active_title() { function admin_active_title()
return _("Active angels"); {
return _("Active angels");
} }
function admin_active() { function admin_active()
global $tshirt_sizes, $shift_sum_formula; {
global $tshirt_sizes, $shift_sum_formula;
$msg = ""; $msg = "";
$search = ""; $search = "";
$forced_count = sql_num_query("SELECT * FROM `User` WHERE `force_active`=1"); $forced_count = sql_num_query("SELECT * FROM `User` WHERE `force_active`=1");
$count = $forced_count; $count = $forced_count;
$limit = ""; $limit = "";
$set_active = ""; $set_active = "";
if (isset($_REQUEST['search'])) { if (isset($_REQUEST['search'])) {
$search = strip_request_item('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);
} }
$show_all_shifts = isset($_REQUEST['show_all_shifts']);
if (isset($_REQUEST['set_active'])) {
$valid = true;
if ($valid) { if (isset($_REQUEST['count']) && preg_match("/^[0-9]+$/", $_REQUEST['count'])) {
$limit = " LIMIT " . $count; $count = strip_request_item('count');
} if ($count < $forced_count) {
if (isset($_REQUEST['ack'])) { error(sprintf(_("At least %s angels are forced to be active. The number has to be greater."), $forced_count));
sql_query("UPDATE `User` SET `Aktiv` = 0 WHERE `Tshirt` = 0"); redirect(page_link_to('admin_active'));
$users = sql_select(" }
} 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` SELECT `User`.*, COUNT(`ShiftEntry`.`id`) as `shift_count`, $shift_sum_formula as `shift_length`
FROM `User` FROM `User`
LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID` LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID`
@ -47,138 +49,138 @@ function admin_active() {
WHERE `User`.`Gekommen` = 1 AND `User`.`force_active`=0 WHERE `User`.`Gekommen` = 1 AND `User`.`force_active`=0
GROUP BY `User`.`UID` GROUP BY `User`.`UID`
ORDER BY `force_active` DESC, `shift_length` DESC" . $limit); ORDER BY `force_active` DESC, `shift_length` DESC" . $limit);
$user_nicks = []; $user_nicks = [];
foreach ($users as $usr) { foreach ($users as $usr) {
sql_query("UPDATE `User` SET `Aktiv` = 1 WHERE `UID`='" . sql_escape($usr['UID']) . "'"); sql_query("UPDATE `User` SET `Aktiv` = 1 WHERE `UID`='" . sql_escape($usr['UID']) . "'");
$user_nicks[] = User_Nick_render($usr); $user_nicks[] = User_Nick_render($usr);
} }
sql_query("UPDATE `User` SET `Aktiv`=1 WHERE `force_active`=TRUE"); sql_query("UPDATE `User` SET `Aktiv`=1 WHERE `force_active`=TRUE");
engelsystem_log("These angels are active now: " . join(", ", $user_nicks)); engelsystem_log("These angels are active now: " . join(", ", $user_nicks));
$limit = ""; $limit = "";
$msg = success(_("Marked angels."), true); $msg = success(_("Marked angels."), true);
} else { } else {
$set_active = '<a href="' . page_link_to('admin_active') . '&amp;serach=' . $search . '">&laquo; ' . _("back") . '</a> | <a href="' . page_link_to('admin_active') . '&amp;search=' . $search . '&amp;count=' . $count . '&amp;set_active&amp;ack">' . _("apply") . '</a>'; $set_active = '<a href="' . page_link_to('admin_active') . '&amp;serach=' . $search . '">&laquo; ' . _("back") . '</a> | <a href="' . page_link_to('admin_active') . '&amp;search=' . $search . '&amp;count=' . $count . '&amp;set_active&amp;ack">' . _("apply") . '</a>';
}
} }
}
if (isset($_REQUEST['active']) && preg_match("/^[0-9]+$/", $_REQUEST['active'])) { if (isset($_REQUEST['active']) && preg_match("/^[0-9]+$/", $_REQUEST['active'])) {
$user_id = $_REQUEST['active']; $user_id = $_REQUEST['active'];
$user_source = User($user_id); $user_source = User($user_id);
if ($user_source != null) { if ($user_source != null) {
sql_query("UPDATE `User` SET `Aktiv`=1 WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); 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."); engelsystem_log("User " . User_Nick_render($user_source) . " is active now.");
$msg = success(_("Angel has been marked as active."), true); $msg = success(_("Angel has been marked as active."), true);
} else { } else {
$msg = error(_("Angel not found."), true); $msg = error(_("Angel not found."), true);
}
} 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);
}
} 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);
}
} 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);
} else {
$msg = error(_("Angel not found."), true);
}
} }
} 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);
}
} 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);
}
} 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);
} else {
$msg = error(_("Angel not found."), true);
}
}
$users = sql_select(" $users = sql_select("
SELECT `User`.*, COUNT(`ShiftEntry`.`id`) as `shift_count`, ${shift_sum_formula} as `shift_length` SELECT `User`.*, COUNT(`ShiftEntry`.`id`) as `shift_count`, ${shift_sum_formula} as `shift_length`
FROM `User` LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID` 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)") . " LEFT JOIN `Shifts` ON `ShiftEntry`.`SID` = `Shifts`.`SID` " . ($show_all_shifts ? "" : "AND (`Shifts`.`end` < " . time() . " OR `Shifts`.`end` IS NULL)") . "
WHERE `User`.`Gekommen` = 1 WHERE `User`.`Gekommen` = 1
GROUP BY `User`.`UID` GROUP BY `User`.`UID`
ORDER BY `force_active` DESC, `shift_length` DESC" . $limit); ORDER BY `force_active` DESC, `shift_length` DESC" . $limit);
$matched_users = []; $matched_users = [];
if ($search == "") { if ($search == "") {
$tokens = []; $tokens = [];
} else { } else {
$tokens = explode(" ", $search); $tokens = explode(" ", $search);
} }
foreach ($users as &$usr) { foreach ($users as &$usr) {
if (count($tokens) > 0) { if (count($tokens) > 0) {
$match = false; $match = false;
foreach ($tokens as $t) { foreach ($tokens as $t) {
if (stristr($usr['Nick'], trim($t))) { if (stristr($usr['Nick'], trim($t))) {
$match = true; $match = true;
break; break;
}
}
if (! $match) {
continue;
}
} }
} $usr['nick'] = User_Nick_render($usr);
if (! $match) { $usr['shirt_size'] = $tshirt_sizes[$usr['Size']];
continue; $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['nick'] = User_Nick_render($usr); $usr['tshirt'] = glyph_bool($usr['Tshirt'] == 1);
$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 = []; $actions = [];
if ($usr['Aktiv'] == 0) { if ($usr['Aktiv'] == 0) {
$actions[] = '<a href="' . page_link_to('admin_active') . '&amp;active=' . $usr['UID'] . ($show_all_shifts ? '&amp;show_all_shifts=' : '') . '&amp;search=' . $search . '">' . _("set active") . '</a>'; $actions[] = '<a href="' . page_link_to('admin_active') . '&amp;active=' . $usr['UID'] . ($show_all_shifts ? '&amp;show_all_shifts=' : '') . '&amp;search=' . $search . '">' . _("set active") . '</a>';
} }
if ($usr['Aktiv'] == 1 && $usr['Tshirt'] == 0) { if ($usr['Aktiv'] == 1 && $usr['Tshirt'] == 0) {
$actions[] = '<a href="' . page_link_to('admin_active') . '&amp;not_active=' . $usr['UID'] . ($show_all_shifts ? '&amp;show_all_shifts=' : '') . '&amp;search=' . $search . '">' . _("remove active") . '</a>'; $actions[] = '<a href="' . page_link_to('admin_active') . '&amp;not_active=' . $usr['UID'] . ($show_all_shifts ? '&amp;show_all_shifts=' : '') . '&amp;search=' . $search . '">' . _("remove active") . '</a>';
$actions[] = '<a href="' . page_link_to('admin_active') . '&amp;tshirt=' . $usr['UID'] . ($show_all_shifts ? '&amp;show_all_shifts=' : '') . '&amp;search=' . $search . '">' . _("got t-shirt") . '</a>'; $actions[] = '<a href="' . page_link_to('admin_active') . '&amp;tshirt=' . $usr['UID'] . ($show_all_shifts ? '&amp;show_all_shifts=' : '') . '&amp;search=' . $search . '">' . _("got t-shirt") . '</a>';
} }
if ($usr['Tshirt'] == 1) { if ($usr['Tshirt'] == 1) {
$actions[] = '<a href="' . page_link_to('admin_active') . '&amp;not_tshirt=' . $usr['UID'] . ($show_all_shifts ? '&amp;show_all_shifts=' : '') . '&amp;search=' . $search . '">' . _("remove t-shirt") . '</a>'; $actions[] = '<a href="' . page_link_to('admin_active') . '&amp;not_tshirt=' . $usr['UID'] . ($show_all_shifts ? '&amp;show_all_shifts=' : '') . '&amp;search=' . $search . '">' . _("remove t-shirt") . '</a>';
} }
$usr['actions'] = join(' ', $actions); $usr['actions'] = join(' ', $actions);
$matched_users[] = $usr; $matched_users[] = $usr;
} }
$shirt_statistics = []; $shirt_statistics = [];
foreach (array_keys($tshirt_sizes) as $size) { foreach (array_keys($tshirt_sizes) as $size) {
if ($size != '') { if ($size != '') {
$shirt_statistics[] = [ $shirt_statistics[] = [
'size' => $size, 'size' => $size,
'needed' => sql_select_single_cell("SELECT count(*) FROM `User` WHERE `Size`='" . sql_escape($size) . "' AND `Gekommen`=1"), '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") 'given' => sql_select_single_cell("SELECT count(*) FROM `User` WHERE `Size`='" . sql_escape($size) . "' AND `Tshirt`=1")
]; ];
}
} }
} $shirt_statistics[] = [
$shirt_statistics[] = [
'size' => '<b>' . _("Sum") . '</b>', 'size' => '<b>' . _("Sum") . '</b>',
'needed' => '<b>' . User_arrived_count() . '</b>', 'needed' => '<b>' . User_arrived_count() . '</b>',
'given' => '<b>' . sql_select_single_cell("SELECT count(*) FROM `User` WHERE `Tshirt`=1") . '</b>' 'given' => '<b>' . sql_select_single_cell("SELECT count(*) FROM `User` WHERE `Tshirt`=1") . '</b>'
]; ];
return page_with_title(admin_active_title(), [ return page_with_title(admin_active_title(), [
form([ form([
form_text('search', _("Search angel:"), $search), form_text('search', _("Search angel:"), $search),
form_checkbox('show_all_shifts', _("Show all shifts"), $show_all_shifts), form_checkbox('show_all_shifts', _("Show all shifts"), $show_all_shifts),
form_submit('submit', _("Search")) form_submit('submit', _("Search"))
], page_link_to('admin_active')), ], page_link_to('admin_active')),
$set_active == "" ? form([ $set_active == "" ? form([
form_text('count', _("How much angels should be active?"), $count), form_text('count', _("How much angels should be active?"), $count),
form_submit('set_active', _("Preview")) form_submit('set_active', _("Preview"))
]) : $set_active, ]) : $set_active,
msg(), msg(),
table([ table([
@ -189,14 +191,13 @@ function admin_active() {
'active' => _("Active?"), 'active' => _("Active?"),
'force_active' => _("Forced"), 'force_active' => _("Forced"),
'tshirt' => _("T-shirt?"), 'tshirt' => _("T-shirt?"),
'actions' => "" 'actions' => ""
], $matched_users), ], $matched_users),
'<h2>' . _("Shirt statistics") . '</h2>', '<h2>' . _("Shirt statistics") . '</h2>',
table([ table([
'size' => _("Size"), 'size' => _("Size"),
'needed' => _("Needed shirts"), 'needed' => _("Needed shirts"),
'given' => _("Given shirts") 'given' => _("Given shirts")
], $shirt_statistics) ], $shirt_statistics)
]); ]);
} }
?>

View File

@ -1,145 +1,147 @@
<?php <?php
function admin_arrive_title() { function admin_arrive_title()
return _("Arrived angels"); {
return _("Arrived angels");
} }
function admin_arrive() { function admin_arrive()
$msg = ""; {
$search = ""; $msg = "";
if (isset($_REQUEST['search'])) { $search = "";
$search = strip_request_item('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);
}
}
$users = sql_select("SELECT * FROM `User` ORDER BY `Nick`"); if (isset($_REQUEST['reset']) && preg_match("/^[0-9]*$/", $_REQUEST['reset'])) {
$arrival_count_at_day = []; $user_id = $_REQUEST['reset'];
$planned_arrival_count_at_day = []; $user_source = User($user_id);
$planned_departure_count_at_day = []; if ($user_source != null) {
$users_matched = []; sql_query("UPDATE `User` SET `Gekommen`=0, `arrival_date` = NULL WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1");
if ($search == "") { engelsystem_log("User set to not arrived: " . User_Nick_render($user_source));
$tokens = []; success(_("Reset done. Angel has not arrived."));
} else { redirect(user_link($user_source));
$tokens = explode(" ", $search); } else {
} $msg = error(_("Angel not found."), true);
foreach ($users as $usr) { }
if (count($tokens) > 0) { } elseif (isset($_REQUEST['arrived']) && preg_match("/^[0-9]*$/", $_REQUEST['arrived'])) {
$match = false; $user_id = $_REQUEST['arrived'];
$index = join(" ", $usr); $user_source = User($user_id);
foreach ($tokens as $t) { if ($user_source != null) {
if (stristr($index, trim($t))) { sql_query("UPDATE `User` SET `Gekommen`=1, `arrival_date`='" . time() . "' WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1");
$match = true; engelsystem_log("User set has arrived: " . User_Nick_render($user_source));
break; 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); $users = sql_select("SELECT * FROM `User` ORDER BY `Nick`");
if ($usr['planned_departure_date'] != null) { $arrival_count_at_day = [];
$usr['rendered_planned_departure_date'] = date('Y-m-d', $usr['planned_departure_date']); $planned_arrival_count_at_day = [];
$planned_departure_count_at_day = [];
$users_matched = [];
if ($search == "") {
$tokens = [];
} else { } else {
$usr['rendered_planned_departure_date'] = '-'; $tokens = explode(" ", $search);
} }
$usr['rendered_planned_arrival_date'] = date('Y-m-d', $usr['planned_arrival_date']); foreach ($users as $usr) {
$usr['rendered_arrival_date'] = $usr['arrival_date'] > 0 ? date('Y-m-d', $usr['arrival_date']) : "-"; if (count($tokens) > 0) {
$usr['arrived'] = $usr['Gekommen'] == 1 ? _("yes") : ""; $match = false;
$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>'; $index = join(" ", $usr);
foreach ($tokens as $t) {
if (stristr($index, trim($t))) {
$match = true;
break;
}
}
if (! $match) {
continue;
}
}
if ($usr['arrival_date'] > 0) { $usr['nick'] = User_Nick_render($usr);
$day = date('Y-m-d', $usr['arrival_date']); if ($usr['planned_departure_date'] != null) {
if (! isset($arrival_count_at_day[$day])) { $usr['rendered_planned_departure_date'] = date('Y-m-d', $usr['planned_departure_date']);
$arrival_count_at_day[$day] = 0; } else {
} $usr['rendered_planned_departure_date'] = '-';
$arrival_count_at_day[$day] ++; }
$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] ++;
}
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;
}
ksort($arrival_count_at_day); ksort($arrival_count_at_day);
ksort($planned_arrival_count_at_day); ksort($planned_arrival_count_at_day);
ksort($planned_departure_count_at_day); ksort($planned_departure_count_at_day);
$arrival_at_day = []; $arrival_at_day = [];
$arrival_sum = 0; $arrival_sum = 0;
foreach ($arrival_count_at_day as $day => $count) { foreach ($arrival_count_at_day as $day => $count) {
$arrival_sum += $count; $arrival_sum += $count;
$arrival_at_day[$day] = [ $arrival_at_day[$day] = [
'day' => $day, 'day' => $day,
'count' => $count, 'count' => $count,
'sum' => $arrival_sum 'sum' => $arrival_sum
]; ];
} }
$planned_arrival_at_day = []; $planned_arrival_at_day = [];
$planned_arrival_sum = 0; $planned_arrival_sum = 0;
foreach ($planned_arrival_count_at_day as $day => $count) { foreach ($planned_arrival_count_at_day as $day => $count) {
$planned_arrival_sum += $count; $planned_arrival_sum += $count;
$planned_arrival_at_day[$day] = [ $planned_arrival_at_day[$day] = [
'day' => $day, 'day' => $day,
'count' => $count, 'count' => $count,
'sum' => $planned_arrival_sum 'sum' => $planned_arrival_sum
]; ];
} }
$planned_departure_at_day = []; $planned_departure_at_day = [];
$planned_departure_sum = 0; $planned_departure_sum = 0;
foreach ($planned_departure_count_at_day as $day => $count) { foreach ($planned_departure_count_at_day as $day => $count) {
$planned_departure_sum += $count; $planned_departure_sum += $count;
$planned_departure_at_day[$day] = [ $planned_departure_at_day[$day] = [
'day' => $day, 'day' => $day,
'count' => $count, 'count' => $count,
'sum' => $planned_departure_sum 'sum' => $planned_departure_sum
]; ];
} }
return page_with_title(admin_arrive_title(), [ return page_with_title(admin_arrive_title(), [
msg(), msg(),
form([ form([
form_text('search', _("Search"), $search), form_text('search', _("Search"), $search),
form_submit('submit', _("Search")) form_submit('submit', _("Search"))
]), ]),
table([ table([
'nick' => _("Nickname"), 'nick' => _("Nickname"),
@ -147,55 +149,54 @@ function admin_arrive() {
'arrived' => _("Arrived?"), 'arrived' => _("Arrived?"),
'rendered_arrival_date' => _("Arrival date"), 'rendered_arrival_date' => _("Arrival date"),
'rendered_planned_departure_date' => _("Planned departure"), 'rendered_planned_departure_date' => _("Planned departure"),
'actions' => "" 'actions' => ""
], $users_matched), ], $users_matched),
div('row', [ div('row', [
div('col-md-4', [ div('col-md-4', [
heading(_("Planned arrival statistics"), 2), heading(_("Planned arrival statistics"), 2),
bargraph('planned_arrives', 'day', [ bargraph('planned_arrives', 'day', [
'count' => _("arrived"), 'count' => _("arrived"),
'sum' => _("arrived sum") 'sum' => _("arrived sum")
], [ ], [
'count' => '#090', 'count' => '#090',
'sum' => '#888' 'sum' => '#888'
], $planned_arrival_at_day), ], $planned_arrival_at_day),
table([ table([
'day' => _("Date"), 'day' => _("Date"),
'count' => _("Count"), 'count' => _("Count"),
'sum' => _("Sum") 'sum' => _("Sum")
], $planned_arrival_at_day) ], $planned_arrival_at_day)
]), ]),
div('col-md-4', [ div('col-md-4', [
heading(_("Arrival statistics"), 2), heading(_("Arrival statistics"), 2),
bargraph('arrives', 'day', [ bargraph('arrives', 'day', [
'count' => _("arrived"), 'count' => _("arrived"),
'sum' => _("arrived sum") 'sum' => _("arrived sum")
], [ ], [
'count' => '#090', 'count' => '#090',
'sum' => '#888' 'sum' => '#888'
], $arrival_at_day), ], $arrival_at_day),
table([ table([
'day' => _("Date"), 'day' => _("Date"),
'count' => _("Count"), 'count' => _("Count"),
'sum' => _("Sum") 'sum' => _("Sum")
], $arrival_at_day) ], $arrival_at_day)
]), ]),
div('col-md-4', [ div('col-md-4', [
heading(_("Planned departure statistics"), 2), heading(_("Planned departure statistics"), 2),
bargraph('planned_departures', 'day', [ bargraph('planned_departures', 'day', [
'count' => _("arrived"), 'count' => _("arrived"),
'sum' => _("arrived sum") 'sum' => _("arrived sum")
], [ ], [
'count' => '#090', 'count' => '#090',
'sum' => '#888' 'sum' => '#888'
], $planned_departure_at_day), ], $planned_departure_at_day),
table([ table([
'day' => _("Date"), 'day' => _("Date"),
'count' => _("Count"), 'count' => _("Count"),
'sum' => _("Sum") 'sum' => _("Sum")
], $planned_departure_at_day) ], $planned_departure_at_day)
]) ])
]) ])
]); ]);
} }
?>

View File

@ -1,37 +1,39 @@
<?php <?php
function admin_free_title() { function admin_free_title()
return _("Free angels"); {
return _("Free angels");
} }
function admin_free() { function admin_free()
global $privileges; {
global $privileges;
$search = ""; $search = "";
if (isset($_REQUEST['search'])) { if (isset($_REQUEST['search'])) {
$search = strip_request_item('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`";
} }
$angeltypesearch .= ") ";
}
$angel_types_source = sql_select("SELECT `id`, `name` FROM `AngelTypes` ORDER BY `name`"); $angeltypesearch = "";
$angel_types = [ if (empty($_REQUEST['angeltype'])) {
'' => 'alle Typen' $_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`";
}
$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) { foreach ($angel_types_source as $angel_type) {
$angel_types[$angel_type['id']] = $angel_type['name']; $angel_types[$angel_type['id']] = $angel_type['name'];
} }
$users = sql_select(" $users = sql_select("
SELECT `User`.* SELECT `User`.*
FROM `User` FROM `User`
${angeltypesearch} ${angeltypesearch}
@ -41,52 +43,52 @@ function admin_free() {
GROUP BY `User`.`UID` GROUP BY `User`.`UID`
ORDER BY `Nick`"); ORDER BY `Nick`");
$free_users_table = []; $free_users_table = [];
if ($search == "") { if ($search == "") {
$tokens = []; $tokens = [];
} else { } else {
$tokens = explode(" ", $search); $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;
}
} }
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[] = [ $free_users_table[] = [
'name' => User_Nick_render($usr), 'name' => User_Nick_render($usr),
'shift_state' => User_shift_state_render($usr), 'shift_state' => User_shift_state_render($usr),
'dect' => $usr['DECT'], 'dect' => $usr['DECT'],
'jabber' => $usr['jabber'], 'jabber' => $usr['jabber'],
'email' => $usr['email_by_human_allowed'] ? $usr['email'] : glyph('eye-close'), 'email' => $usr['email_by_human_allowed'] ? $usr['email'] : glyph('eye-close'),
'actions' => in_array('admin_user', $privileges) ? button(page_link_to('admin_user') . '&amp;id=' . $usr['UID'], _("edit"), 'btn-xs') : '' 'actions' => in_array('admin_user', $privileges) ? button(page_link_to('admin_user') . '&amp;id=' . $usr['UID'], _("edit"), 'btn-xs') : ''
]; ];
} }
return page_with_title(admin_free_title(), [ return page_with_title(admin_free_title(), [
form([ form([
div('row', [ div('row', [
div('col-md-4', [ div('col-md-4', [
form_text('search', _("Search"), $search) form_text('search', _("Search"), $search)
]), ]),
div('col-md-4', [ div('col-md-4', [
form_select('angeltype', _("Angeltype"), $angel_types, $_REQUEST['angeltype']) form_select('angeltype', _("Angeltype"), $angel_types, $_REQUEST['angeltype'])
]), ]),
div('col-md-2', [ div('col-md-2', [
form_checkbox('confirmed_only', _("Only confirmed"), isset($_REQUEST['confirmed_only'])) form_checkbox('confirmed_only', _("Only confirmed"), isset($_REQUEST['confirmed_only']))
]), ]),
div('col-md-2', [ div('col-md-2', [
form_submit('submit', _("Search")) form_submit('submit', _("Search"))
]) ])
]) ])
]), ]),
table([ table([
'name' => _("Nick"), 'name' => _("Nick"),
@ -94,8 +96,7 @@ function admin_free() {
'dect' => _("DECT"), 'dect' => _("DECT"),
'jabber' => _("Jabber"), 'jabber' => _("Jabber"),
'email' => _("E-Mail"), 'email' => _("E-Mail"),
'actions' => '' 'actions' => ''
], $free_users_table) ], $free_users_table)
]); ]);
} }
?>

View File

@ -1,97 +1,98 @@
<?php <?php
function admin_groups_title() { function admin_groups_title()
return _("Grouprights"); {
return _("Grouprights");
} }
function admin_groups() { function admin_groups()
$html = ""; {
$groups = sql_select("SELECT * FROM `Groups` ORDER BY `Name`"); $html = "";
if (! isset($_REQUEST["action"])) { $groups = sql_select("SELECT * FROM `Groups` ORDER BY `Name`");
$groups_table = []; if (! isset($_REQUEST["action"])) {
foreach ($groups as $group) { $groups_table = [];
$privileges = sql_select("SELECT * FROM `GroupPrivileges` JOIN `Privileges` ON (`GroupPrivileges`.`privilege_id` = `Privileges`.`id`) WHERE `group_id`='" . sql_escape($group['UID']) . "'"); foreach ($groups as $group) {
$privileges_html = []; $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) { foreach ($privileges as $priv) {
$privileges_html[] = $priv['name']; $privileges_html[] = $priv['name'];
} }
$groups_table[] = [ $groups_table[] = [
'name' => $group['Name'], 'name' => $group['Name'],
'privileges' => join(', ', $privileges_html), 'privileges' => join(', ', $privileges_html),
'actions' => button(page_link_to('admin_groups') . '&action=edit&id=' . $group['UID'], _("edit"), 'btn-xs') 'actions' => button(page_link_to('admin_groups') . '&action=edit&id=' . $group['UID'], _("edit"), 'btn-xs')
]; ];
} }
return page_with_title(admin_groups_title(), [ return page_with_title(admin_groups_title(), [
table([ table([
'name' => _("Name"), 'name' => _("Name"),
'privileges' => _("Privileges"), 'privileges' => _("Privileges"),
'actions' => '' 'actions' => ''
], $groups_table) ], $groups_table)
]); ]);
} else { } else {
switch ($_REQUEST["action"]) { switch ($_REQUEST["action"]) {
case 'edit': case 'edit':
if (isset($_REQUEST['id']) && preg_match("/^-[0-9]{1,11}$/", $_REQUEST['id'])) { if (isset($_REQUEST['id']) && preg_match("/^-[0-9]{1,11}$/", $_REQUEST['id'])) {
$group_id = $_REQUEST['id']; $group_id = $_REQUEST['id'];
} else { } else {
return error("Incomplete call, missing Groups ID.", true); return error("Incomplete call, missing Groups ID.", true);
} }
$group = sql_select("SELECT * FROM `Groups` WHERE `UID`='" . sql_escape($group_id) . "' LIMIT 1"); $group = sql_select("SELECT * FROM `Groups` WHERE `UID`='" . sql_escape($group_id) . "' LIMIT 1");
if (count($group) > 0) { if (count($group) > 0) {
list($group) = $group; 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 = 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_html = "";
$privileges_form = []; $privileges_form = [];
foreach ($privileges as $priv) { foreach ($privileges as $priv) {
$privileges_form[] = form_checkbox('privileges[]', $priv['desc'] . ' (' . $priv['name'] . ')', $priv['group_id'] != "", $priv['id']); $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_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")); $privileges_form[] = form_submit('submit', _("Save"));
$html .= page_with_title(_("Edit group"), [ $html .= page_with_title(_("Edit group"), [
form($privileges_form, page_link_to('admin_groups') . '&action=save&id=' . $group_id) form($privileges_form, page_link_to('admin_groups') . '&action=save&id=' . $group_id)
]); ]);
} else { } else {
return error("No Group found.", true); return error("No Group found.", true);
} }
break; break;
case 'save': case 'save':
if (isset($_REQUEST['id']) && preg_match("/^-[0-9]{1,11}$/", $_REQUEST['id'])) { if (isset($_REQUEST['id']) && preg_match("/^-[0-9]{1,11}$/", $_REQUEST['id'])) {
$group_id = $_REQUEST['id']; $group_id = $_REQUEST['id'];
} else { } else {
return error("Incomplete call, missing Groups ID.", true); return error("Incomplete call, missing Groups ID.", true);
} }
$group = sql_select("SELECT * FROM `Groups` WHERE `UID`='" . sql_escape($group_id) . "' LIMIT 1"); $group = sql_select("SELECT * FROM `Groups` WHERE `UID`='" . sql_escape($group_id) . "' LIMIT 1");
if (! is_array($_REQUEST['privileges'])) { if (! is_array($_REQUEST['privileges'])) {
$_REQUEST['privileges'] = []; $_REQUEST['privileges'] = [];
} }
if (count($group) > 0) { if (count($group) > 0) {
list($group) = $group; list($group) = $group;
sql_query("DELETE FROM `GroupPrivileges` WHERE `group_id`='" . sql_escape($group_id) . "'"); sql_query("DELETE FROM `GroupPrivileges` WHERE `group_id`='" . sql_escape($group_id) . "'");
$privilege_names = []; $privilege_names = [];
foreach ($_REQUEST['privileges'] as $priv) { foreach ($_REQUEST['privileges'] as $priv) {
if (preg_match("/^[0-9]{1,}$/", $priv)) { if (preg_match("/^[0-9]{1,}$/", $priv)) {
$group_privileges_source = sql_select("SELECT * FROM `Privileges` WHERE `id`='" . sql_escape($priv) . "' LIMIT 1"); $group_privileges_source = sql_select("SELECT * FROM `Privileges` WHERE `id`='" . sql_escape($priv) . "' LIMIT 1");
if (count($group_privileges_source) > 0) { if (count($group_privileges_source) > 0) {
sql_query("INSERT INTO `GroupPrivileges` SET `group_id`='" . sql_escape($group_id) . "', `privilege_id`='" . sql_escape($priv) . "'"); sql_query("INSERT INTO `GroupPrivileges` SET `group_id`='" . sql_escape($group_id) . "', `privilege_id`='" . sql_escape($priv) . "'");
$privilege_names[] = $group_privileges_source[0]['name']; $privilege_names[] = $group_privileges_source[0]['name'];
} }
}
} }
} engelsystem_log("Group privileges of group " . $group['Name'] . " edited: " . join(", ", $privilege_names));
engelsystem_log("Group privileges of group " . $group['Name'] . " edited: " . join(", ", $privilege_names)); redirect(page_link_to("admin_groups"));
redirect(page_link_to("admin_groups"));
} else { } else {
return error("No Group found.", true); return error("No Group found.", true);
} }
break; break;
} }
} }
return $html; return $html;
} }
?>

View File

@ -1,96 +1,98 @@
<?php <?php
function admin_import_title() { function admin_import_title()
return _("Frab import"); {
return _("Frab import");
} }
function admin_import() { function admin_import()
global $rooms_import; {
global $user; global $rooms_import;
$html = ""; global $user;
$import_dir = __DIR__ . '/../../import'; $html = "";
$import_dir = __DIR__ . '/../../import';
$step = "input"; $step = "input";
if (isset($_REQUEST['step']) && in_array($step, [ if (isset($_REQUEST['step']) && in_array($step, [
'input', 'input',
'check', 'check',
'import' 'import'
])) { ])) {
$step = $_REQUEST['step']; $step = $_REQUEST['step'];
} }
if ($test_handle = @fopen($import_dir . '/tmp', 'w')) { if ($test_handle = @fopen($import_dir . '/tmp', 'w')) {
fclose($test_handle); fclose($test_handle);
@unlink($import_dir . '/tmp'); @unlink($import_dir . '/tmp');
} else { } else {
error(_('Webserver has no write-permission on import directory.')); error(_('Webserver has no write-permission on import directory.'));
} }
$import_file = $import_dir . '/import_' . $user['UID'] . '.xml'; $import_file = $import_dir . '/import_' . $user['UID'] . '.xml';
$shifttype_id = null; $shifttype_id = null;
$add_minutes_start = 15; $add_minutes_start = 15;
$add_minutes_end = 15; $add_minutes_end = 15;
$shifttypes_source = ShiftTypes(); $shifttypes_source = ShiftTypes();
if ($shifttypes_source === false) { if ($shifttypes_source === false) {
engelsystem_error('Unable to load shifttypes.'); engelsystem_error('Unable to load shifttypes.');
} }
$shifttypes = []; $shifttypes = [];
foreach ($shifttypes_source as $shifttype) { foreach ($shifttypes_source as $shifttype) {
$shifttypes[$shifttype['id']] = $shifttype['name']; $shifttypes[$shifttype['id']] = $shifttype['name'];
} }
switch ($step) { switch ($step) {
case 'input': case 'input':
$valid = false; $valid = false;
if (isset($_REQUEST['submit'])) { if (isset($_REQUEST['submit'])) {
$valid = true; $valid = true;
if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) {
$shifttype_id = $_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 { } else {
$valid = false; $valid = false;
error(_('File upload went wrong.')); 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.'));
} }
} else {
$valid = false;
error(_('Please provide some data.'));
}
} }
if ($valid) { 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); 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 { } else {
$html .= div('well well-sm text-center', [ $html .= div('well well-sm text-center', [
_('File Upload') . mute(glyph('arrow-right')) . mute(_('Validation')) . mute(glyph('arrow-right')) . mute(_('Import')) _('File Upload') . mute(glyph('arrow-right')) . mute(_('Validation')) . mute(glyph('arrow-right')) . mute(_('Import'))
]) . div('row', [ ]) . div('row', [
div('col-md-offset-3 col-md-6', [ div('col-md-offset-3 col-md-6', [
form([ form([
@ -99,55 +101,55 @@ function admin_import() {
form_spinner('add_minutes_start', _("Add minutes to start"), $add_minutes_start), 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_spinner('add_minutes_end', _("Add minutes to end"), $add_minutes_end),
form_file('xcal_file', _("xcal-File (.xcal)")), form_file('xcal_file', _("xcal-File (.xcal)")),
form_submit('submit', _("Import")) form_submit('submit', _("Import"))
]) ])
]) ])
]); ]);
} }
break; break;
case 'check': case 'check':
if (! file_exists($import_file)) { if (! file_exists($import_file)) {
error(_('Missing import file.')); error(_('Missing import file.'));
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) {
$shifttype_id = $_REQUEST['shifttype_id']; $shifttype_id = $_REQUEST['shifttype_id'];
} else { } else {
error(_('Please select a shift type.')); error(_('Please select a shift type.'));
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) { if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) {
$add_minutes_start = trim($_REQUEST['add_minutes_start']); $add_minutes_start = trim($_REQUEST['add_minutes_start']);
} else { } else {
error(_("Please enter an amount of minutes to add to a talk's begin.")); error(_("Please enter an amount of minutes to add to a talk's begin."));
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) { if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) {
$add_minutes_end = trim($_REQUEST['add_minutes_end']); $add_minutes_end = trim($_REQUEST['add_minutes_end']);
} else { } else {
error(_("Please enter an amount of minutes to add to a talk's end.")); error(_("Please enter an amount of minutes to add to a talk's end."));
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
list($rooms_new, $rooms_deleted) = prepare_rooms($import_file); 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); 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', [ $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')) '<span class="text-success">' . _('File Upload') . glyph('ok-circle') . '</span>' . mute(glyph('arrow-right')) . _('Validation') . mute(glyph('arrow-right')) . mute(_('Import'))
]) . form([ ]) . form([
div('row', [ div('row', [
div('col-sm-6', [ div('col-sm-6', [
'<h3>' . _("Rooms to create") . '</h3>', '<h3>' . _("Rooms to create") . '</h3>',
table(_("Name"), $rooms_new) table(_("Name"), $rooms_new)
]), ]),
div('col-sm-6', [ div('col-sm-6', [
'<h3>' . _("Rooms to delete") . '</h3>', '<h3>' . _("Rooms to delete") . '</h3>',
table(_("Name"), $rooms_deleted) table(_("Name"), $rooms_deleted)
]) ])
]), ]),
'<h3>' . _("Shifts to create") . '</h3>', '<h3>' . _("Shifts to create") . '</h3>',
table([ table([
@ -156,7 +158,7 @@ function admin_import() {
'end' => _("End"), 'end' => _("End"),
'shifttype' => _('Shift type'), 'shifttype' => _('Shift type'),
'title' => _("Title"), 'title' => _("Title"),
'room' => _("Room") 'room' => _("Room")
], shifts_printable($events_new, $shifttypes)), ], shifts_printable($events_new, $shifttypes)),
'<h3>' . _("Shifts to update") . '</h3>', '<h3>' . _("Shifts to update") . '</h3>',
table([ table([
@ -165,7 +167,7 @@ function admin_import() {
'end' => _("End"), 'end' => _("End"),
'shifttype' => _('Shift type'), 'shifttype' => _('Shift type'),
'title' => _("Title"), 'title' => _("Title"),
'room' => _("Room") 'room' => _("Room")
], shifts_printable($events_updated, $shifttypes)), ], shifts_printable($events_updated, $shifttypes)),
'<h3>' . _("Shifts to delete") . '</h3>', '<h3>' . _("Shifts to delete") . '</h3>',
table([ table([
@ -174,75 +176,75 @@ function admin_import() {
'end' => _("End"), 'end' => _("End"),
'shifttype' => _('Shift type'), 'shifttype' => _('Shift type'),
'title' => _("Title"), 'title' => _("Title"),
'room' => _("Room") 'room' => _("Room")
], shifts_printable($events_deleted, $shifttypes)), ], shifts_printable($events_deleted, $shifttypes)),
form_submit('submit', _("Import")) 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); ], page_link_to('admin_import') . '&step=import&shifttype_id=' . $shifttype_id . "&add_minutes_end=" . $add_minutes_end . "&add_minutes_start=" . $add_minutes_start);
break; break;
case 'import': case 'import':
if (! file_exists($import_file)) { if (! file_exists($import_file)) {
error(_('Missing import file.')); error(_('Missing import file.'));
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
if (! file_exists($import_file)) { if (! file_exists($import_file)) {
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) {
$shifttype_id = $_REQUEST['shifttype_id']; $shifttype_id = $_REQUEST['shifttype_id'];
} else { } else {
error(_('Please select a shift type.')); error(_('Please select a shift type.'));
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) { if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) {
$add_minutes_start = trim($_REQUEST['add_minutes_start']); $add_minutes_start = trim($_REQUEST['add_minutes_start']);
} else { } else {
error(_("Please enter an amount of minutes to add to a talk's begin.")); error(_("Please enter an amount of minutes to add to a talk's begin."));
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) { if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) {
$add_minutes_end = trim($_REQUEST['add_minutes_end']); $add_minutes_end = trim($_REQUEST['add_minutes_end']);
} else { } else {
error(_("Please enter an amount of minutes to add to a talk's end.")); error(_("Please enter an amount of minutes to add to a talk's end."));
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
list($rooms_new, $rooms_deleted) = prepare_rooms($import_file); list($rooms_new, $rooms_deleted) = prepare_rooms($import_file);
foreach ($rooms_new as $room) { foreach ($rooms_new as $room) {
$result = Room_create($room, true, true); $result = Room_create($room, true, true);
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to create room.'); engelsystem_error('Unable to create room.');
} }
$rooms_import[trim($room)] = sql_id(); $rooms_import[trim($room)] = sql_id();
} }
foreach ($rooms_deleted as $room) { foreach ($rooms_deleted as $room) {
sql_query("DELETE FROM `Room` WHERE `Name`='" . sql_escape($room) . "' LIMIT 1"); 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); list($events_new, $events_updated, $events_deleted) = prepare_events($import_file, $shifttype_id, $add_minutes_start, $add_minutes_end);
foreach ($events_new as $event) { foreach ($events_new as $event) {
$result = Shift_create($event); $result = Shift_create($event);
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to create shift.'); engelsystem_error('Unable to create shift.');
} }
} }
foreach ($events_updated as $event) { foreach ($events_updated as $event) {
$result = Shift_update_by_psid($event); $result = Shift_update_by_psid($event);
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to update shift.'); engelsystem_error('Unable to update shift.');
} }
} }
foreach ($events_deleted as $event) { foreach ($events_deleted as $event) {
$result = Shift_delete_by_psid($event['PSID']); $result = Shift_delete_by_psid($event['PSID']);
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to delete shift.'); engelsystem_error('Unable to delete shift.');
} }
} }
engelsystem_log("Frab import done"); engelsystem_log("Frab import done");
@ -250,143 +252,147 @@ function admin_import() {
unlink($import_file); unlink($import_file);
$html .= div('well well-sm text-center', [ $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>' '<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); ]) . success(_("It's done!"), true);
break; break;
default: default:
redirect(page_link_to('admin_import')); redirect(page_link_to('admin_import'));
} }
return page_with_title(admin_import_title(), [ return page_with_title(admin_import_title(), [
msg(), msg(),
$html $html
]); ]);
} }
function prepare_rooms($file) { function prepare_rooms($file)
global $rooms_import; {
$data = read_xml($file); global $rooms_import;
$data = read_xml($file);
// Load rooms from db for compare with input // Load rooms from db for compare with input
$rooms = sql_select("SELECT * FROM `Room` WHERE `FromPentabarf`='Y'"); $rooms = sql_select("SELECT * FROM `Room` WHERE `FromPentabarf`='Y'");
$rooms_db = []; $rooms_db = [];
$rooms_import = []; $rooms_import = [];
foreach ($rooms as $room) { foreach ($rooms as $room) {
$rooms_db[] = (string) $room['Name']; $rooms_db[] = (string) $room['Name'];
$rooms_import[$room['Name']] = $room['RID']; $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); $events = $data->vcalendar->vevent;
$rooms_deleted = array_diff($rooms_db, $rooms_pb); $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);
return [ $rooms_new = array_diff($rooms_pb, $rooms_db);
$rooms_deleted = array_diff($rooms_db, $rooms_pb);
return [
$rooms_new, $rooms_new,
$rooms_deleted $rooms_deleted
]; ];
} }
function prepare_events($file, $shifttype_id, $add_minutes_start, $add_minutes_end) { function prepare_events($file, $shifttype_id, $add_minutes_start, $add_minutes_end)
global $rooms_import; {
$data = read_xml($file); global $rooms_import;
$data = read_xml($file);
$rooms = sql_select("SELECT * FROM `Room`"); $rooms = sql_select("SELECT * FROM `Room`");
$rooms_db = []; $rooms_db = [];
foreach ($rooms as $room) { foreach ($rooms as $room) {
$rooms_db[$room['Name']] = $room['RID']; $rooms_db[$room['Name']] = $room['RID'];
} }
$events = $data->vcalendar->vevent; $events = $data->vcalendar->vevent;
$shifts_pb = []; $shifts_pb = [];
foreach ($events as $event) { foreach ($events as $event) {
$event_pb = $event->children("http://pentabarf.org"); $event_pb = $event->children("http://pentabarf.org");
$event_id = trim($event_pb->{ $event_id = trim($event_pb->{
'event-id' }); 'event-id' });
$shifts_pb[$event_id] = [ $shifts_pb[$event_id] = [
'shifttype_id' => $shifttype_id, 'shifttype_id' => $shifttype_id,
'start' => parse_date("Ymd\THis", $event->dtstart) - $add_minutes_start * 60, 'start' => parse_date("Ymd\THis", $event->dtstart) - $add_minutes_start * 60,
'end' => parse_date("Ymd\THis", $event->dtend) + $add_minutes_end * 60, 'end' => parse_date("Ymd\THis", $event->dtend) + $add_minutes_end * 60,
'RID' => $rooms_import[trim($event->location)], 'RID' => $rooms_import[trim($event->location)],
'title' => trim($event->summary), 'title' => trim($event->summary),
'URL' => trim($event->url), 'URL' => trim($event->url),
'PSID' => $event_id 'PSID' => $event_id
]; ];
}
$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;
}
} }
}
$shifts_deleted = []; $shifts = sql_select("SELECT * FROM `Shifts` WHERE `PSID` IS NOT NULL ORDER BY `start`");
foreach ($shifts_db as $shift) { $shifts_db = [];
if (! isset($shifts_pb[$shift['PSID']])) { foreach ($shifts as $shift) {
$shifts_deleted[] = $shift; $shifts_db[$shift['PSID']] = $shift;
} }
}
return [ $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_new,
$shifts_updated, $shifts_updated,
$shifts_deleted $shifts_deleted
]; ];
} }
function read_xml($file) { function read_xml($file)
global $xml_import; {
if (! isset($xml_import)) { global $xml_import;
$xml_import = simplexml_load_file($file); if (! isset($xml_import)) {
} $xml_import = simplexml_load_file($file);
return $xml_import; }
return $xml_import;
} }
function shifts_printable($shifts, $shifttypes) { function shifts_printable($shifts, $shifttypes)
global $rooms_import; {
$rooms = array_flip($rooms_import); global $rooms_import;
$rooms = array_flip($rooms_import);
uasort($shifts, 'shift_sort'); uasort($shifts, 'shift_sort');
$shifts_printable = []; $shifts_printable = [];
foreach ($shifts as $shift) { foreach ($shifts as $shift) {
$shifts_printable[] = [ $shifts_printable[] = [
'day' => date("l, Y-m-d", $shift['start']), 'day' => date("l, Y-m-d", $shift['start']),
'start' => date("H:i", $shift['start']), 'start' => date("H:i", $shift['start']),
'shifttype' => ShiftType_name_render([ 'shifttype' => ShiftType_name_render([
'id' => $shift['shifttype_id'], 'id' => $shift['shifttype_id'],
'name' => $shifttypes[$shift['shifttype_id']] 'name' => $shifttypes[$shift['shifttype_id']]
]), ]),
'title' => shorten($shift['title']), 'title' => shorten($shift['title']),
'end' => date("H:i", $shift['end']), 'end' => date("H:i", $shift['end']),
'room' => $rooms[$shift['RID']] 'room' => $rooms[$shift['RID']]
]; ];
} }
return $shifts_printable; return $shifts_printable;
} }
function shift_sort($shift_a, $shift_b) { function shift_sort($shift_a, $shift_b)
return ($shift_a['start'] < $shift_b['start']) ? - 1 : 1; {
return ($shift_a['start'] < $shift_b['start']) ? - 1 : 1;
} }
?>

View File

@ -1,33 +1,34 @@
<?php <?php
function admin_log_title() { function admin_log_title()
return _("Log"); {
return _("Log");
} }
function admin_log() { function admin_log()
$filter = ""; {
if (isset($_REQUEST['keyword'])) { $filter = "";
$filter = strip_request_item('keyword'); if (isset($_REQUEST['keyword'])) {
} $filter = strip_request_item('keyword');
$log_entries_source = LogEntries_filter($filter); }
$log_entries_source = LogEntries_filter($filter);
$log_entries = []; $log_entries = [];
foreach ($log_entries_source as $log_entry) { foreach ($log_entries_source as $log_entry) {
$log_entry['date'] = date("d.m.Y H:i", $log_entry['timestamp']); $log_entry['date'] = date("d.m.Y H:i", $log_entry['timestamp']);
$log_entries[] = $log_entry; $log_entries[] = $log_entry;
} }
return page_with_title(admin_log_title(), [ return page_with_title(admin_log_title(), [
msg(), msg(),
form([ form([
form_text('keyword', _("Search"), $filter), form_text('keyword', _("Search"), $filter),
form_submit(_("Search"), "Go") form_submit(_("Search"), "Go")
]), ]),
table([ table([
'date' => "Time", 'date' => "Time",
'nick' => "Angel", 'nick' => "Angel",
'message' => "Log Entry" 'message' => "Log Entry"
], $log_entries) ], $log_entries)
]); ]);
} }
?>

View File

@ -1,24 +1,25 @@
<?php <?php
function admin_news() { function admin_news()
global $user; {
global $user;
if (! isset($_GET["action"])) { if (! isset($_GET["action"])) {
redirect(page_link_to("news")); redirect(page_link_to("news"));
} }
$html = '<div class="col-md-12"><h1>' . _("Edit news entry") . '</h1>' . msg(); $html = '<div class="col-md-12"><h1>' . _("Edit news entry") . '</h1>' . msg();
if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) {
$news_id = $_REQUEST['id']; $news_id = $_REQUEST['id'];
} else { } else {
return error("Incomplete call, missing News ID.", true); return error("Incomplete call, missing News ID.", true);
} }
$news = sql_select("SELECT * FROM `News` WHERE `ID`='" . sql_escape($news_id) . "' LIMIT 1"); $news = sql_select("SELECT * FROM `News` WHERE `ID`='" . sql_escape($news_id) . "' LIMIT 1");
if (empty($news)) { if (empty($news)) {
return error("No News found.", true); return error("No News found.", true);
} }
switch ($_REQUEST["action"]) { switch ($_REQUEST["action"]) {
default: default:
redirect(page_link_to('news')); redirect(page_link_to('news'));
case 'edit': case 'edit':
@ -32,7 +33,7 @@ function admin_news() {
form_text('eBetreff', _("Subject"), $news['Betreff']), form_text('eBetreff', _("Subject"), $news['Betreff']),
form_textarea('eText', _("Message"), $news['Text']), form_textarea('eText', _("Message"), $news['Text']),
form_checkbox('eTreffen', _("Meeting"), $news['Treffen'] == 1, 1), form_checkbox('eTreffen', _("Meeting"), $news['Treffen'] == 1, 1),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
], page_link_to('admin_news&action=save&id=' . $news_id)); ], 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>'; $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>';
@ -62,6 +63,5 @@ function admin_news() {
redirect(page_link_to("news")); redirect(page_link_to("news"));
break; break;
} }
return $html . '</div>'; return $html . '</div>';
} }
?>

View File

@ -1,69 +1,72 @@
<?php <?php
function admin_questions_title() { function admin_questions_title()
return _("Answer questions"); {
return _("Answer questions");
} }
/** /**
* Renders a hint for new questions to answer. * Renders a hint for new questions to answer.
*/ */
function admin_new_questions() { function admin_new_questions()
global $privileges, $page; {
global $privileges, $page;
if ($page != "admin_questions") { if ($page != "admin_questions") {
if (in_array("admin_questions", $privileges)) { if (in_array("admin_questions", $privileges)) {
$new_messages = sql_num_query("SELECT * FROM `Questions` WHERE `AID` IS NULL"); $new_messages = sql_num_query("SELECT * FROM `Questions` WHERE `AID` IS NULL");
if ($new_messages > 0) { if ($new_messages > 0) {
return '<a href="' . page_link_to("admin_questions") . '">' . _('There are unanswered questions!') . '</a>'; return '<a href="' . page_link_to("admin_questions") . '">' . _('There are unanswered questions!') . '</a>';
} }
}
} }
}
return null; return null;
} }
function admin_questions() { function admin_questions()
global $user; {
global $user;
if (! isset($_REQUEST['action'])) { if (! isset($_REQUEST['action'])) {
$unanswered_questions_table = []; $unanswered_questions_table = [];
$questions = sql_select("SELECT * FROM `Questions` WHERE `AID` IS NULL"); $questions = sql_select("SELECT * FROM `Questions` WHERE `AID` IS NULL");
foreach ($questions as $question) { foreach ($questions as $question) {
$user_source = User($question['UID']); $user_source = User($question['UID']);
$unanswered_questions_table[] = [ $unanswered_questions_table[] = [
'from' => User_Nick_render($user_source), 'from' => User_Nick_render($user_source),
'question' => str_replace("\n", "<br />", $question['Question']), 'question' => str_replace("\n", "<br />", $question['Question']),
'answer' => form([ 'answer' => form([
form_textarea('answer', '', ''), form_textarea('answer', '', ''),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
], page_link_to('admin_questions') . '&action=answer&id=' . $question['QID']), ], 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') 'actions' => button(page_link_to("admin_questions") . '&action=delete&id=' . $question['QID'], _("delete"), 'btn-xs')
]; ];
} }
$answered_questions_table = []; $answered_questions_table = [];
$questions = sql_select("SELECT * FROM `Questions` WHERE NOT `AID` IS NULL"); $questions = sql_select("SELECT * FROM `Questions` WHERE NOT `AID` IS NULL");
foreach ($questions as $question) { foreach ($questions as $question) {
$user_source = User($question['UID']); $user_source = User($question['UID']);
$answer_user_source = User($question['AID']); $answer_user_source = User($question['AID']);
$answered_questions_table[] = [ $answered_questions_table[] = [
'from' => User_Nick_render($user_source), 'from' => User_Nick_render($user_source),
'question' => str_replace("\n", "<br />", $question['Question']), 'question' => str_replace("\n", "<br />", $question['Question']),
'answered_by' => User_Nick_render($answer_user_source), 'answered_by' => User_Nick_render($answer_user_source),
'answer' => str_replace("\n", "<br />", $question['Answer']), 'answer' => str_replace("\n", "<br />", $question['Answer']),
'actions' => button(page_link_to("admin_questions") . '&action=delete&id=' . $question['QID'], _("delete"), 'btn-xs') 'actions' => button(page_link_to("admin_questions") . '&action=delete&id=' . $question['QID'], _("delete"), 'btn-xs')
]; ];
} }
return page_with_title(admin_questions_title(), [ return page_with_title(admin_questions_title(), [
'<h2>' . _("Unanswered questions") . '</h2>', '<h2>' . _("Unanswered questions") . '</h2>',
table([ table([
'from' => _("From"), 'from' => _("From"),
'question' => _("Question"), 'question' => _("Question"),
'answer' => _("Answer"), 'answer' => _("Answer"),
'actions' => '' 'actions' => ''
], $unanswered_questions_table), ], $unanswered_questions_table),
'<h2>' . _("Answered questions") . '</h2>', '<h2>' . _("Answered questions") . '</h2>',
table([ table([
@ -71,50 +74,49 @@ function admin_questions() {
'question' => _("Question"), 'question' => _("Question"),
'answered_by' => _("Answered by"), 'answered_by' => _("Answered by"),
'answer' => _("Answer"), 'answer' => _("Answer"),
'actions' => '' 'actions' => ''
], $answered_questions_table) ], $answered_questions_table)
]); ]);
} else { } else {
switch ($_REQUEST['action']) { switch ($_REQUEST['action']) {
case 'answer': case 'answer':
if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) {
$question_id = $_REQUEST['id']; $question_id = $_REQUEST['id'];
} else { } else {
return error("Incomplete call, missing Question ID.", true); return error("Incomplete call, missing Question ID.", true);
} }
$question = sql_select("SELECT * FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); $question = sql_select("SELECT * FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1");
if (count($question) > 0 && $question[0]['AID'] == null) { 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']))); $answer = trim(preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", '', strip_tags($_REQUEST['answer'])));
if ($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"); 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); engelsystem_log("Question " . $question[0]['Question'] . " answered: " . $answer);
redirect(page_link_to("admin_questions")); redirect(page_link_to("admin_questions"));
} else { } else {
return error("Enter an answer!", true); return error("Enter an answer!", true);
} }
} else { } else {
return error("No question found.", true); return error("No question found.", true);
} }
break; break;
case 'delete': case 'delete':
if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) {
$question_id = $_REQUEST['id']; $question_id = $_REQUEST['id'];
} else { } else {
return error("Incomplete call, missing Question ID.", true); return error("Incomplete call, missing Question ID.", true);
} }
$question = sql_select("SELECT * FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); $question = sql_select("SELECT * FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1");
if (count($question) > 0) { if (count($question) > 0) {
sql_query("DELETE FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); sql_query("DELETE FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1");
engelsystem_log("Question deleted: " . $question[0]['Question']); engelsystem_log("Question deleted: " . $question[0]['Question']);
redirect(page_link_to("admin_questions")); redirect(page_link_to("admin_questions"));
} else { } else {
return error("No question found.", true); return error("No question found.", true);
} }
break; break;
} }
} }
} }
?>

View File

@ -1,140 +1,142 @@
<?php <?php
function admin_rooms_title() { function admin_rooms_title()
return _("Rooms"); {
return _("Rooms");
} }
function admin_rooms() { function admin_rooms()
$rooms_source = sql_select("SELECT * FROM `Room` ORDER BY `Name`"); {
$rooms = []; $rooms_source = sql_select("SELECT * FROM `Room` ORDER BY `Name`");
foreach ($rooms_source as $room) { $rooms = [];
$rooms[] = [ foreach ($rooms_source as $room) {
$rooms[] = [
'name' => Room_name_render($room), 'name' => Room_name_render($room),
'from_pentabarf' => $room['FromPentabarf'] == 'Y' ? '&#10003;' : '', 'from_pentabarf' => $room['FromPentabarf'] == 'Y' ? '&#10003;' : '',
'public' => $room['show'] == 'Y' ? '&#10003;' : '', 'public' => $room['show'] == 'Y' ? '&#10003;' : '',
'actions' => table_buttons([ 'actions' => table_buttons([
button(page_link_to('admin_rooms') . '&show=edit&id=' . $room['RID'], _("edit"), 'btn-xs'), 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') button(page_link_to('admin_rooms') . '&show=delete&id=' . $room['RID'], _("delete"), 'btn-xs')
]) ])
]; ];
} }
$room = null; $room = null;
if (isset($_REQUEST['show'])) { if (isset($_REQUEST['show'])) {
$msg = ""; $msg = "";
$name = ""; $name = "";
$from_pentabarf = ""; $from_pentabarf = "";
$public = 'Y'; $public = 'Y';
$number = ""; $number = "";
$angeltypes_source = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`"); $angeltypes_source = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`");
$angeltypes = []; $angeltypes = [];
$angeltypes_count = []; $angeltypes_count = [];
foreach ($angeltypes_source as $angeltype) { foreach ($angeltypes_source as $angeltype) {
$angeltypes[$angeltype['id']] = $angeltype['name']; $angeltypes[$angeltype['id']] = $angeltype['name'];
$angeltypes_count[$angeltype['id']] = 0; $angeltypes_count[$angeltype['id']] = 0;
} }
if (test_request_int('id')) { if (test_request_int('id')) {
$room = Room($_REQUEST['id']); $room = Room($_REQUEST['id']);
if ($room === false) { if ($room === false) {
engelsystem_error("Unable to load room."); 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'];
}
}
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);
}
}
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.");
} }
engelsystem_log("Room created: " . $name . ", pentabarf import: " . $from_pentabarf . ", public: " . $public . ", number: " . $number); if ($room == null) {
} redirect(page_link_to('admin_rooms'));
}
NeededAngelTypes_delete_by_room($room_id);
$needed_angeltype_info = []; $room_id = $_REQUEST['id'];
foreach ($angeltypes_count as $angeltype_id => $angeltype_count) { $name = $room['Name'];
$angeltype = AngelType($angeltype_id); $from_pentabarf = $room['FromPentabarf'];
if ($angeltype != null) { $public = $room['show'];
NeededAngelType_add(null, $angeltype_id, $room_id, $angeltype_count); $number = $room['Number'];
$needed_angeltype_info[] = $angeltype['name'] . ": " . $angeltype_count;
$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'];
} }
}
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 = []; if ($_REQUEST['show'] == 'edit') {
foreach ($angeltypes as $angeltype_id => $angeltype) { if (isset($_REQUEST['submit'])) {
$angeltypes_count_form[] = div('col-lg-4 col-md-6 col-xs-6', [ $valid = true;
form_spinner('angeltype_count_' . $angeltype_id, $angeltype, $angeltypes_count[$angeltype_id])
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);
}
}
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.");
}
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(), [ return page_with_title(admin_rooms_title(), [
buttons([ buttons([
button(page_link_to('admin_rooms'), _("back"), 'back') button(page_link_to('admin_rooms'), _("back"), 'back')
]), ]),
$msg, $msg,
form([ form([
@ -143,54 +145,53 @@ function admin_rooms() {
form_text('name', _("Name"), $name), form_text('name', _("Name"), $name),
form_checkbox('from_pentabarf', _("Frab import"), $from_pentabarf), form_checkbox('from_pentabarf', _("Frab import"), $from_pentabarf),
form_checkbox('public', _("Public"), $public), form_checkbox('public', _("Public"), $public),
form_text('number', _("Room number"), $number) form_text('number', _("Room number"), $number)
]), ]),
div('col-md-6', [ div('col-md-6', [
div('row', [ div('row', [
div('col-md-12', [ div('col-md-12', [
form_info(_("Needed angels:")) form_info(_("Needed angels:"))
]), ]),
join($angeltypes_count_form) join($angeltypes_count_form)
]) ])
]) ])
]), ]),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]) ])
]); ]);
} elseif ($_REQUEST['show'] == 'delete') { } elseif ($_REQUEST['show'] == 'delete') {
if (isset($_REQUEST['ack'])) { if (isset($_REQUEST['ack'])) {
if (! Room_delete($room_id)) { if (! Room_delete($room_id)) {
engelsystem_error("Unable to delete room."); engelsystem_error("Unable to delete room.");
} }
engelsystem_log("Room deleted: " . $name); engelsystem_log("Room deleted: " . $name);
success(sprintf(_("Room %s deleted."), $name)); success(sprintf(_("Room %s deleted."), $name));
redirect(page_link_to('admin_rooms')); redirect(page_link_to('admin_rooms'));
} }
return page_with_title(admin_rooms_title(), [ return page_with_title(admin_rooms_title(), [
buttons([ buttons([
button(page_link_to('admin_rooms'), _("back"), 'back') button(page_link_to('admin_rooms'), _("back"), 'back')
]), ]),
sprintf(_("Do you want to delete room %s?"), $name), sprintf(_("Do you want to delete room %s?"), $name),
buttons([ buttons([
button(page_link_to('admin_rooms') . '&show=delete&id=' . $room_id . '&ack', _("Delete"), 'delete') button(page_link_to('admin_rooms') . '&show=delete&id=' . $room_id . '&ack', _("Delete"), 'delete')
]) ])
]); ]);
}
} }
}
return page_with_title(admin_rooms_title(), [ return page_with_title(admin_rooms_title(), [
buttons([ buttons([
button(page_link_to('admin_rooms') . '&show=edit', _("add")) button(page_link_to('admin_rooms') . '&show=edit', _("add"))
]), ]),
msg(), msg(),
table([ table([
'name' => _("Name"), 'name' => _("Name"),
'from_pentabarf' => _("Frab import"), 'from_pentabarf' => _("Frab import"),
'public' => _("Public"), 'public' => _("Public"),
'actions' => "" 'actions' => ""
], $rooms) ], $rooms)
]); ]);
} }
?>

View File

@ -1,257 +1,259 @@
<?php <?php
function admin_shifts_title() { function admin_shifts_title()
return _("Create shifts"); {
return _("Create shifts");
} }
// Assistent zum Anlegen mehrerer neuer Schichten // Assistent zum Anlegen mehrerer neuer Schichten
function admin_shifts() { function admin_shifts()
$valid = true; {
$valid = true;
$rid = 0; $rid = 0;
$start = parse_date("Y-m-d H:i", date("Y-m-d") . " 00:00"); $start = parse_date("Y-m-d H:i", date("Y-m-d") . " 00:00");
$end = $start; $end = $start;
$mode = 'single'; $mode = 'single';
$angelmode = 'manually'; $angelmode = 'manually';
$length = ''; $length = '';
$change_hours = []; $change_hours = [];
$title = ""; $title = "";
$shifttype_id = null; $shifttype_id = null;
// Locations laden (auch unsichtbare - fuer Erzengel ist das ok) // Locations laden (auch unsichtbare - fuer Erzengel ist das ok)
$rooms = sql_select("SELECT * FROM `Room` ORDER BY `Name`"); $rooms = sql_select("SELECT * FROM `Room` ORDER BY `Name`");
$room_array = []; $room_array = [];
foreach ($rooms as $room) { foreach ($rooms as $room) {
$room_array[$room['RID']] = $room['Name']; $room_array[$room['RID']] = $room['Name'];
} }
// Engeltypen laden // Engeltypen laden
$types = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`"); $types = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`");
$needed_angel_types = []; $needed_angel_types = [];
foreach ($types as $type) { foreach ($types as $type) {
$needed_angel_types[$type['id']] = 0; $needed_angel_types[$type['id']] = 0;
} }
// Load shift types // Load shift types
$shifttypes_source = ShiftTypes(); $shifttypes_source = ShiftTypes();
if ($shifttypes_source === false) { if ($shifttypes_source === false) {
engelsystem_error('Unable to load shift types.'); 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.'));
} }
$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 // Name/Bezeichnung der Schicht, darf leer sein
$title = strip_request_item('title'); $title = strip_request_item('title');
// Auswahl der sichtbaren Locations für die Schichten // Auswahl der sichtbaren Locations für die Schichten
if (isset($_REQUEST['rid']) && preg_match("/^[0-9]+$/", $_REQUEST['rid']) && isset($room_array[$_REQUEST['rid']])) { if (isset($_REQUEST['rid']) && preg_match("/^[0-9]+$/", $_REQUEST['rid']) && isset($room_array[$_REQUEST['rid']])) {
$rid = $_REQUEST['rid']; $rid = $_REQUEST['rid'];
} else { } else {
$valid = false;
$rid = $rooms[0]['RID'];
error(_('Please select a location.'));
}
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(_('Please select an end time.'));
}
if ($start >= $end) {
$valid = false;
error(_('The shifts end has to be after its start.'));
}
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']);
} else {
$valid = false;
error(_('Please enter a shift duration in minutes.'));
}
} elseif ($_REQUEST['mode'] == 'variable') {
if (isset($_REQUEST['change_hours']) && preg_match("/^([0-9]{2}(,|$))/", trim(str_replace(" ", "", $_REQUEST['change_hours'])))) {
$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.'));
}
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 {
$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; $valid = false;
error(_('Please select a mode for needed angels.')); $rid = $rooms[0]['RID'];
} error(_('Please select a location.'));
} else {
$valid = false;
error(_('Please select needed angels.'));
} }
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(_('Please select an end time.'));
}
if ($start >= $end) {
$valid = false;
error(_('The shifts end has to be after its start.'));
}
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']);
} else {
$valid = false;
error(_('Please enter a shift duration in minutes.'));
}
} elseif ($_REQUEST['mode'] == 'variable') {
if (isset($_REQUEST['change_hours']) && preg_match("/^([0-9]{2}(,|$))/", trim(str_replace(" ", "", $_REQUEST['change_hours'])))) {
$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.'));
}
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 {
$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.'));
}
// Beim Zurück-Knopf das Formular zeigen // Beim Zurück-Knopf das Formular zeigen
if (isset($_REQUEST['back'])) { if (isset($_REQUEST['back'])) {
$valid = false; $valid = false;
} }
// Alle Eingaben in Ordnung // Alle Eingaben in Ordnung
if ($valid) { if ($valid) {
if ($angelmode == 'location') { if ($angelmode == 'location') {
$needed_angel_types = []; $needed_angel_types = [];
$needed_angel_types_location = sql_select("SELECT * FROM `NeededAngelTypes` WHERE `room_id`='" . sql_escape($rid) . "'"); $needed_angel_types_location = sql_select("SELECT * FROM `NeededAngelTypes` WHERE `room_id`='" . sql_escape($rid) . "'");
foreach ($needed_angel_types_location as $type) { foreach ($needed_angel_types_location as $type) {
$needed_angel_types[$type['angel_type_id']] = $type['count']; $needed_angel_types[$type['angel_type_id']] = $type['count'];
}
} }
} $shifts = [];
$shifts = []; if ($mode == 'single') {
if ($mode == 'single') { $shifts[] = [
$shifts[] = [
'start' => $start, 'start' => $start,
'end' => $end, 'end' => $end,
'RID' => $rid, 'RID' => $rid,
'title' => $title, 'title' => $title,
'shifttype_id' => $shifttype_id 'shifttype_id' => $shifttype_id
]; ];
} elseif ($mode == 'multi') { } elseif ($mode == 'multi') {
$shift_start = $start; $shift_start = $start;
do { do {
$shift_end = $shift_start + $length * 60; $shift_end = $shift_start + $length * 60;
if ($shift_end > $end) { if ($shift_end > $end) {
$shift_end = $end; $shift_end = $end;
} }
if ($shift_start >= $shift_end) { if ($shift_start >= $shift_end) {
break; break;
} }
$shifts[] = [ $shifts[] = [
'start' => $shift_start, 'start' => $shift_start,
'end' => $shift_end, 'end' => $shift_end,
'RID' => $rid, 'RID' => $rid,
'title' => $title, 'title' => $title,
'shifttype_id' => $shifttype_id 'shifttype_id' => $shifttype_id
]; ];
$shift_start = $shift_end; $shift_start = $shift_end;
} while ($shift_end < $end); } while ($shift_end < $end);
} elseif ($mode == 'variable') { } elseif ($mode == 'variable') {
rsort($change_hours); rsort($change_hours);
$day = parse_date("Y-m-d H:i", date("Y-m-d", $start) . " 00:00"); $day = parse_date("Y-m-d H:i", date("Y-m-d", $start) . " 00:00");
$change_index = 0; $change_index = 0;
// Ersten/nächsten passenden Schichtwechsel suchen // Ersten/nächsten passenden Schichtwechsel suchen
foreach ($change_hours as $i => $change_hour) { foreach ($change_hours as $i => $change_hour) {
if ($start < $day + $change_hour * 60 * 60) { if ($start < $day + $change_hour * 60 * 60) {
$change_index = $i; $change_index = $i;
} elseif ($start == $day + $change_hour * 60 * 60) { } elseif ($start == $day + $change_hour * 60 * 60) {
// Start trifft Schichtwechsel // Start trifft Schichtwechsel
$change_index = ($i + count($change_hours) - 1) % count($change_hours); $change_index = ($i + count($change_hours) - 1) % count($change_hours);
break; break;
} else { } else {
break; break;
} }
} }
$shift_start = $start; $shift_start = $start;
do { do {
$day = parse_date("Y-m-d H:i", date("Y-m-d", $shift_start) . " 00:00"); $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; $shift_end = $day + $change_hours[$change_index] * 60 * 60;
if ($shift_end > $end) { if ($shift_end > $end) {
$shift_end = $end; $shift_end = $end;
} }
if ($shift_start >= $shift_end) { if ($shift_start >= $shift_end) {
$shift_end += 24 * 60 * 60; $shift_end += 24 * 60 * 60;
} }
$shifts[] = [ $shifts[] = [
'start' => $shift_start, 'start' => $shift_start,
'end' => $shift_end, 'end' => $shift_end,
'RID' => $rid, 'RID' => $rid,
'title' => $title, 'title' => $title,
'shifttype_id' => $shifttype_id 'shifttype_id' => $shifttype_id
]; ];
$shift_start = $shift_end; $shift_start = $shift_end;
$change_index = ($change_index + count($change_hours) - 1) % count($change_hours); $change_index = ($change_index + count($change_hours) - 1) % count($change_hours);
} while ($shift_end < $end); } while ($shift_end < $end);
} }
$shifts_table = []; $shifts_table = [];
foreach ($shifts as $shift) { foreach ($shifts as $shift) {
$shifts_table_entry = [ $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'])), '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'] : ''), 'title' => ShiftType_name_render(ShiftType($shifttype_id)) . ($shift['title'] ? '<br />' . $shift['title'] : ''),
'needed_angels' => '' 'needed_angels' => ''
]; ];
foreach ($types as $type) { foreach ($types as $type) {
if (isset($needed_angel_types[$type['id']]) && $needed_angel_types[$type['id']] > 0) { 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_entry['needed_angels'] .= '<b>' . AngelType_name_render($type) . ':</b> ' . $needed_angel_types[$type['id']] . '<br />';
} }
}
$shifts_table[] = $shifts_table_entry;
} }
$shifts_table[] = $shifts_table_entry;
}
// Fürs Anlegen zwischenspeichern: // Fürs Anlegen zwischenspeichern:
$_SESSION['admin_shifts_shifts'] = $shifts; $_SESSION['admin_shifts_shifts'] = $shifts;
$_SESSION['admin_shifts_types'] = $needed_angel_types; $_SESSION['admin_shifts_types'] = $needed_angel_types;
$hidden_types = ""; $hidden_types = "";
foreach ($needed_angel_types as $type_id => $count) { foreach ($needed_angel_types as $type_id => $count) {
$hidden_types .= form_hidden('type_' . $type_id, $count); $hidden_types .= form_hidden('type_' . $type_id, $count);
} }
return page_with_title(_("Preview"), [ return page_with_title(_("Preview"), [
form([ form([
$hidden_types, $hidden_types,
form_hidden('shifttype_id', $shifttype_id), form_hidden('shifttype_id', $shifttype_id),
@ -267,53 +269,53 @@ function admin_shifts() {
table([ table([
'timeslot' => _('Time and location'), 'timeslot' => _('Time and location'),
'title' => _('Type and title'), 'title' => _('Type and title'),
'needed_angels' => _('Needed angels') 'needed_angels' => _('Needed angels')
], $shifts_table), ], $shifts_table),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]) ])
]); ]);
} }
} elseif (isset($_REQUEST['submit'])) { } elseif (isset($_REQUEST['submit'])) {
if (! is_array($_SESSION['admin_shifts_shifts']) || ! is_array($_SESSION['admin_shifts_types'])) { if (! is_array($_SESSION['admin_shifts_shifts']) || ! is_array($_SESSION['admin_shifts_types'])) {
redirect(page_link_to('admin_shifts')); redirect(page_link_to('admin_shifts'));
}
foreach ($_SESSION['admin_shifts_shifts'] as $shift) {
$shift['URL'] = null;
$shift['PSID'] = null;
$shift_id = Shift_create($shift);
if ($shift_id === false) {
engelsystem_error('Unable to create shift.');
}
engelsystem_log("Shift created: " . $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;
} }
}
}
engelsystem_log("Shift needs following angel types: " . join(", ", $needed_angel_types_info)); foreach ($_SESSION['admin_shifts_shifts'] as $shift) {
success("Schichten angelegt."); $shift['URL'] = null;
redirect(page_link_to('admin_shifts')); $shift['PSID'] = null;
} else { $shift_id = Shift_create($shift);
unset($_SESSION['admin_shifts_shifts']); if ($shift_id === false) {
unset($_SESSION['admin_shifts_types']); 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;
}
}
}
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'])) { if (! isset($_REQUEST['rid'])) {
$_REQUEST['rid'] = null; $_REQUEST['rid'] = null;
} }
$angel_types = ""; $angel_types = "";
foreach ($types as $type) { foreach ($types as $type) {
$angel_types .= '<div class="col-md-4">' . form_spinner('type_' . $type['id'], $type['name'], $needed_angel_types[$type['id']]) . '</div>'; $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(), [ return page_with_title(admin_shifts_title(), [
msg(), msg(),
form([ form([
form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id), form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id),
@ -328,19 +330,18 @@ function admin_shifts() {
form_radio('mode', _("Create multiple shifts"), $mode == 'multi', 'multi'), form_radio('mode', _("Create multiple shifts"), $mode == 'multi', 'multi'),
form_text('length', _("Length"), ! empty($_REQUEST['length']) ? $_REQUEST['length'] : '120'), form_text('length', _("Length"), ! empty($_REQUEST['length']) ? $_REQUEST['length'] : '120'),
form_radio('mode', _("Create multiple shifts with variable length"), $mode == 'variable', 'variable'), 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') 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', [ div('col-md-6', [
form_info(_("Needed angels"), ''), form_info(_("Needed angels"), ''),
form_radio('angelmode', _("Take needed angels from room settings"), $angelmode == 'location', 'location'), form_radio('angelmode', _("Take needed angels from room settings"), $angelmode == 'location', 'location'),
form_radio('angelmode', _("The following angels are needed"), $angelmode == 'manually', 'manually'), form_radio('angelmode', _("The following angels are needed"), $angelmode == 'manually', 'manually'),
div('row', [ div('row', [
$angel_types $angel_types
]) ])
]) ])
]), ]),
form_submit('preview', _("Preview")) form_submit('preview', _("Preview"))
]) ])
]); ]);
} }
?>

View File

@ -1,169 +1,171 @@
<?php <?php
function admin_user_title() { function admin_user_title()
return _("All Angels"); {
return _("All Angels");
} }
function admin_user() { function admin_user()
global $user, $privileges, $tshirt_sizes, $privileges; {
global $user, $privileges, $tshirt_sizes, $privileges;
$html = ''; $html = '';
if (! isset($_REQUEST['id'])) { if (! isset($_REQUEST['id'])) {
redirect(users_link()); 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());
} }
$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 &auml;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&auml;lt, bedeutet dies, dass der Engel " . "bereits sein T-Shirt erhalten hat.<br /><br />\n"; $html .= "Hallo,<br />" . "hier kannst du den Eintrag &auml;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&auml;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 .= "<form action=\"" . page_link_to("admin_user") . "&action=save&id=$user_id\" method=\"post\">\n";
$html .= "<table border=\"0\">\n"; $html .= "<table border=\"0\">\n";
$html .= "<input type=\"hidden\" name=\"Type\" value=\"Normal\">\n"; $html .= "<input type=\"hidden\" name=\"Type\" value=\"Normal\">\n";
$html .= "<tr><td>\n"; $html .= "<tr><td>\n";
$html .= "<table>\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>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>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>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>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>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>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>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"; $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']) { 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>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>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"; $html .= " <tr><td>Size</td><td>" . html_select_key('size', 'eSize', $tshirt_sizes, $user_source['Size']) . "</td></tr>\n";
$options = [ $options = [
'1' => _("Yes"), '1' => _("Yes"),
'0' => _("No") '0' => _("No")
]; ];
// Gekommen? // Gekommen?
$html .= " <tr><td>Gekommen</td><td>\n"; $html .= " <tr><td>Gekommen</td><td>\n";
$html .= html_options('eGekommen', $options, $user_source['Gekommen']) . "</td></tr>\n"; $html .= html_options('eGekommen', $options, $user_source['Gekommen']) . "</td></tr>\n";
// Aktiv? // Aktiv?
$html .= " <tr><td>Aktiv</td><td>\n"; $html .= " <tr><td>Aktiv</td><td>\n";
$html .= html_options('eAktiv', $options, $user_source['Aktiv']) . "</td></tr>\n"; $html .= html_options('eAktiv', $options, $user_source['Aktiv']) . "</td></tr>\n";
// Aktiv erzwingen // Aktiv erzwingen
if (in_array('admin_active', $privileges)) { if (in_array('admin_active', $privileges)) {
$html .= " <tr><td>" . _("Force active") . "</td><td>\n"; $html .= " <tr><td>" . _("Force active") . "</td><td>\n";
$html .= html_options('force_active', $options, $user_source['force_active']) . "</td></tr>\n"; $html .= html_options('force_active', $options, $user_source['force_active']) . "</td></tr>\n";
} }
// T-Shirt bekommen? // T-Shirt bekommen?
$html .= " <tr><td>T-Shirt</td><td>\n"; $html .= " <tr><td>T-Shirt</td><td>\n";
$html .= html_options('eTshirt', $options, $user_source['Tshirt']) . "</td></tr>\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 .= " <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 .= "</table>\n</td><td valign=\"top\"></td></tr>";
$html .= "</td></tr>\n"; $html .= "</td></tr>\n";
$html .= "</table>\n<br />\n"; $html .= "</table>\n<br />\n";
$html .= "<input type=\"submit\" value=\"Speichern\">\n"; $html .= "<input type=\"submit\" value=\"Speichern\">\n";
$html .= "</form>"; $html .= "</form>";
$html .= "<hr />"; $html .= "<hr />";
$html .= form_info('', _('Please visit the angeltypes page or the users profile to manage users angeltypes.')); $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 .= "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 .= "<table>\n";
$html .= " <tr><td>Passwort</td><td>" . "<input type=\"password\" size=\"40\" name=\"new_pw\" value=\"\"></td></tr>\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 .= " <tr><td>Wiederholung</td><td>" . "<input type=\"password\" size=\"40\" name=\"new_pw2\" value=\"\"></td></tr>\n";
$html .= "</table>"; $html .= "</table>";
$html .= "<input type=\"submit\" value=\"Speichern\">\n"; $html .= "<input type=\"submit\" value=\"Speichern\">\n";
$html .= "</form>"; $html .= "</form>";
$html .= "<hr />"; $html .= "<hr />";
$my_highest_group = sql_select("SELECT * FROM `UserGroups` WHERE `uid`='" . sql_escape($user['UID']) . "' ORDER BY `group_id` LIMIT 1"); $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) { if (count($my_highest_group) > 0) {
$my_highest_group = $my_highest_group[0]['group_id']; $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"); $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) { if (count($his_highest_group) > 0) {
$his_highest_group = $his_highest_group[0]['group_id']; $his_highest_group = $his_highest_group[0]['group_id'];
} }
if ($user_id != $user['UID'] && $my_highest_group <= $his_highest_group) { 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 .= "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>'; $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`"); $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) { 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 .= '<tr><td><input type="checkbox" name="groups[]" value="' . $group['UID'] . '"' . ($group['group_id'] != "" ? ' checked="checked"' : '') . ' /></td><td>' . $group['Name'] . '</td></tr>';
} }
$html .= '</table>'; $html .= '</table>';
$html .= "<input type=\"submit\" value=\"Speichern\">\n"; $html .= "<input type=\"submit\" value=\"Speichern\">\n";
$html .= "</form>"; $html .= "</form>";
$html .= "<hr />"; $html .= "<hr />";
} }
$html .= buttons([ $html .= buttons([
button(user_delete_link($user_source), glyph('lock') . _("delete"), 'btn-danger') button(user_delete_link($user_source), glyph('lock') . _("delete"), 'btn-danger')
]); ]);
$html .= "<hr />"; $html .= "<hr />";
} else { } else {
switch ($_REQUEST['action']) { switch ($_REQUEST['action']) {
case 'save_groups': case 'save_groups':
if ($user_id != $user['UID']) { if ($user_id != $user['UID']) {
$my_highest_group = sql_select("SELECT * FROM `UserGroups` WHERE `uid`='" . sql_escape($user['UID']) . "' ORDER BY `group_id`"); $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`"); $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']))) { 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_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 = []; $groups = [];
$grouplist = []; $grouplist = [];
foreach ($groups_source as $group) { foreach ($groups_source as $group) {
$groups[$group['UID']] = $group; $groups[$group['UID']] = $group;
$grouplist[] = $group['UID']; $grouplist[] = $group['UID'];
} }
if (! is_array($_REQUEST['groups'])) { if (! is_array($_REQUEST['groups'])) {
$_REQUEST['groups'] = []; $_REQUEST['groups'] = [];
} }
sql_query("DELETE FROM `UserGroups` WHERE `uid`='" . sql_escape($user_id) . "'"); sql_query("DELETE FROM `UserGroups` WHERE `uid`='" . sql_escape($user_id) . "'");
$user_groups_info = []; $user_groups_info = [];
foreach ($_REQUEST['groups'] as $group) { foreach ($_REQUEST['groups'] as $group) {
if (in_array($group, $grouplist)) { if (in_array($group, $grouplist)) {
sql_query("INSERT INTO `UserGroups` SET `uid`='" . sql_escape($user_id) . "', `group_id`='" . sql_escape($group) . "'"); sql_query("INSERT INTO `UserGroups` SET `uid`='" . sql_escape($user_id) . "', `group_id`='" . sql_escape($group) . "'");
$user_groups_info[] = $groups[$group]['Name']; $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);
} }
$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 { } else {
$html .= error("Du kannst Deine eigenen Rechte nicht bearbeiten.", true); $html .= error("Du kannst Deine eigenen Rechte nicht bearbeiten.", true);
} }
break; break;
case 'save': case 'save':
$force_active = $user['force_active']; $force_active = $user['force_active'];
if (in_array('admin_active', $privileges)) { if (in_array('admin_active', $privileges)) {
$force_active = $_REQUEST['force_active']; $force_active = $_REQUEST['force_active'];
} }
$SQL = "UPDATE `User` SET $SQL = "UPDATE `User` SET
`Nick` = '" . sql_escape($_POST["eNick"]) . "', `Nick` = '" . sql_escape($_POST["eNick"]) . "',
@ -190,19 +192,18 @@ function admin_user() {
case 'change_pw': case 'change_pw':
if ($_REQUEST['new_pw'] != "" && $_REQUEST['new_pw'] == $_REQUEST['new_pw2']) { if ($_REQUEST['new_pw'] != "" && $_REQUEST['new_pw'] == $_REQUEST['new_pw2']) {
set_password($user_id, $_REQUEST['new_pw']); set_password($user_id, $_REQUEST['new_pw']);
$user_source = User($user_id); $user_source = User($user_id);
engelsystem_log("Set new password for " . User_Nick_render($user_source)); engelsystem_log("Set new password for " . User_Nick_render($user_source));
$html .= success("Passwort neu gesetzt.", true); $html .= success("Passwort neu gesetzt.", true);
} else { } else {
$html .= error("Die Eingaben müssen übereinstimmen und dürfen nicht leer sein!", true); $html .= error("Die Eingaben müssen übereinstimmen und dürfen nicht leer sein!", true);
} }
break; break;
} }
} }
return page_with_title(_("Edit user"), [ return page_with_title(_("Edit user"), [
$html $html
]); ]);
} }
?>

View File

@ -1,9 +1,10 @@
<?php <?php
function credits_title() { function credits_title()
return _("Credits"); {
return _("Credits");
} }
function guest_credits() { function guest_credits()
return template_render(__DIR__ . '/../../templates/guest_credits.html', []); {
return template_render(__DIR__ . '/../../templates/guest_credits.html', []);
} }
?>

View File

@ -1,156 +1,160 @@
<?php <?php
function login_title() { function login_title()
return _("Login"); {
return _("Login");
} }
function register_title() { function register_title()
return _("Register"); {
return _("Register");
} }
function logout_title() { function logout_title()
return _("Logout"); {
return _("Logout");
} }
// Engel registrieren // Engel registrieren
function guest_register() { function guest_register()
global $tshirt_sizes, $enable_tshirt_size, $default_theme, $user, $min_password_length; {
global $tshirt_sizes, $enable_tshirt_size, $default_theme, $user, $min_password_length;
$event_config = EventConfig(); $event_config = EventConfig();
$msg = ""; $msg = "";
$nick = ""; $nick = "";
$lastname = ""; $lastname = "";
$prename = ""; $prename = "";
$age = ""; $age = "";
$tel = ""; $tel = "";
$dect = ""; $dect = "";
$mobile = ""; $mobile = "";
$mail = ""; $mail = "";
$email_shiftinfo = false; $email_shiftinfo = false;
$email_by_human_allowed = false; $email_by_human_allowed = false;
$jabber = ""; $jabber = "";
$hometown = ""; $hometown = "";
$comment = ""; $comment = "";
$tshirt_size = ''; $tshirt_size = '';
$password_hash = ""; $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 &quot;%s&quot; already exists."), $nick), true);
}
} else {
$valid = false;
$msg .= error(sprintf(_("Your nick &quot;%s&quot; 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 = []; $selected_angel_types = [];
foreach (array_keys($angel_types) as $angel_type_id) { $planned_arrival_date = null;
if (isset($_REQUEST['angel_types_' . $angel_type_id])) {
$selected_angel_types[] = $angel_type_id; $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 &quot;%s&quot; already exists."), $nick), true);
}
} else {
$valid = false;
$msg .= error(sprintf(_("Your nick &quot;%s&quot; 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 // Trivia
if (isset($_REQUEST['lastname'])) { if (isset($_REQUEST['lastname'])) {
$lastname = strip_request_item('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');
} }
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');
}
if ($valid) { if ($valid) {
sql_query(" sql_query("
INSERT INTO `User` SET INSERT INTO `User` SET
`color`='" . sql_escape($default_theme) . "', `color`='" . sql_escape($default_theme) . "',
`Nick`='" . sql_escape($nick) . "', `Nick`='" . sql_escape($nick) . "',
@ -175,45 +179,45 @@ function guest_register() {
// Assign user-group and set password // Assign user-group and set password
$user_id = sql_id(); $user_id = sql_id();
sql_query("INSERT INTO `UserGroups` SET `uid`='" . sql_escape($user_id) . "', `group_id`=-2"); sql_query("INSERT INTO `UserGroups` SET `uid`='" . sql_escape($user_id) . "', `group_id`=-2");
set_password($user_id, $_REQUEST['password']); set_password($user_id, $_REQUEST['password']);
// Assign angel-types // Assign angel-types
$user_angel_types_info = []; $user_angel_types_info = [];
foreach ($selected_angel_types as $selected_angel_type_id) { 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) . "'"); 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]; $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)); engelsystem_log("User " . User_Nick_render(User($user_id)) . " signed up as: " . join(", ", $user_angel_types_info));
success(_("Angel registration successful!")); success(_("Angel registration successful!"));
// User is already logged in - that means a supporter has registered an angel. Return to register page. // User is already logged in - that means a supporter has registered an angel. Return to register page.
if (isset($user)) { if (isset($user)) {
redirect(page_link_to('register')); redirect(page_link_to('register'));
} }
// If a welcome message is present, display registration success page. // If a welcome message is present, display registration success page.
if ($event_config != null && $event_config['event_welcome_msg'] != null) { if ($event_config != null && $event_config['event_welcome_msg'] != null) {
return User_registration_success_view($event_config['event_welcome_msg']); return User_registration_success_view($event_config['event_welcome_msg']);
} }
redirect('?'); redirect('?');
}
} }
}
$buildup_start_date = time(); $buildup_start_date = time();
$teardown_end_date = null; $teardown_end_date = null;
if ($event_config != null) { if ($event_config != null) {
if (isset($event_config['buildup_start_date'])) { if (isset($event_config['buildup_start_date'])) {
$buildup_start_date = $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'];
}
}
return page_with_title(register_title(), [ 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."), _("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,
msg(), msg(),
@ -222,131 +226,133 @@ function guest_register() {
div('col-md-6', [ div('col-md-6', [
div('row', [ div('row', [
div('col-sm-4', [ div('col-sm-4', [
form_text('nick', _("Nick") . ' ' . entry_required(), $nick) form_text('nick', _("Nick") . ' ' . entry_required(), $nick)
]), ]),
div('col-sm-8', [ div('col-sm-8', [
form_email('mail', _("E-Mail") . ' ' . entry_required(), $mail), 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_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) 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('row', [
div('col-sm-6', [ div('col-sm-6', [
form_date('planned_arrival_date', _("Planned date of arrival") . ' ' . entry_required(), $planned_arrival_date, $buildup_start_date, $teardown_end_date) form_date('planned_arrival_date', _("Planned date of arrival") . ' ' . entry_required(), $planned_arrival_date, $buildup_start_date, $teardown_end_date)
]), ]),
div('col-sm-6', [ div('col-sm-6', [
$enable_tshirt_size ? form_select('tshirt_size', _("Shirt size") . ' ' . entry_required(), $tshirt_sizes, $tshirt_size) : '' $enable_tshirt_size ? form_select('tshirt_size', _("Shirt size") . ' ' . entry_required(), $tshirt_sizes, $tshirt_size) : ''
]) ])
]), ]),
div('row', [ div('row', [
div('col-sm-6', [ div('col-sm-6', [
form_password('password', _("Password") . ' ' . entry_required()) form_password('password', _("Password") . ' ' . entry_required())
]), ]),
div('col-sm-6', [ div('col-sm-6', [
form_password('password2', _("Confirm password") . ' ' . entry_required()) 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_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.")) 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('col-md-6', [
div('row', [ div('row', [
div('col-sm-4', [ div('col-sm-4', [
form_text('dect', _("DECT"), $dect) form_text('dect', _("DECT"), $dect)
]), ]),
div('col-sm-4', [ div('col-sm-4', [
form_text('mobile', _("Mobile"), $mobile) form_text('mobile', _("Mobile"), $mobile)
]), ]),
div('col-sm-4', [ div('col-sm-4', [
form_text('tel', _("Phone"), $tel) form_text('tel', _("Phone"), $tel)
]) ])
]), ]),
form_text('jabber', _("Jabber"), $jabber), form_text('jabber', _("Jabber"), $jabber),
div('row', [ div('row', [
div('col-sm-6', [ div('col-sm-6', [
form_text('prename', _("First name"), $prename) form_text('prename', _("First name"), $prename)
]), ]),
div('col-sm-6', [ div('col-sm-6', [
form_text('lastname', _("Last name"), $lastname) form_text('lastname', _("Last name"), $lastname)
]) ])
]), ]),
div('row', [ div('row', [
div('col-sm-3', [ div('col-sm-3', [
form_text('age', _("Age"), $age) form_text('age', _("Age"), $age)
]), ]),
div('col-sm-9', [ div('col-sm-9', [
form_text('hometown', _("Hometown"), $hometown) form_text('hometown', _("Hometown"), $hometown)
]) ])
]), ]),
form_info(entry_required() . ' = ' . _("Entry required!")) 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_textarea('comment', _("Did you help at former CCC events and which tasks have you performed then?"), $comment),
form_submit('submit', _("Register")) form_submit('submit', _("Register"))
]) ])
]); ]);
} }
function entry_required() { function entry_required()
return '<span class="text-info glyphicon glyphicon-warning-sign"></span>'; {
return '<span class="text-info glyphicon glyphicon-warning-sign"></span>';
} }
function guest_logout() { function guest_logout()
session_destroy(); {
redirect(page_link_to("start")); session_destroy();
redirect(page_link_to("start"));
} }
function guest_login() { function guest_login()
$nick = ""; {
$nick = "";
unset($_SESSION['uid']); unset($_SESSION['uid']);
$valid = true; $valid = true;
if (isset($_REQUEST['submit'])) { if (isset($_REQUEST['submit'])) {
if (isset($_REQUEST['nick']) && strlen(User_validate_Nick($_REQUEST['nick'])) > 0) {
if (isset($_REQUEST['nick']) && strlen(User_validate_Nick($_REQUEST['nick'])) > 0) { $nick = User_validate_Nick($_REQUEST['nick']);
$nick = User_validate_Nick($_REQUEST['nick']); $login_user = sql_select("SELECT * FROM `User` WHERE `Nick`='" . sql_escape($nick) . "'");
$login_user = sql_select("SELECT * FROM `User` WHERE `Nick`='" . sql_escape($nick) . "'"); if (count($login_user) > 0) {
if (count($login_user) > 0) { $login_user = $login_user[0];
$login_user = $login_user[0]; if (isset($_REQUEST['password'])) {
if (isset($_REQUEST['password'])) { if (! verify_password($_REQUEST['password'], $login_user['Passwort'], $login_user['UID'])) {
if (! verify_password($_REQUEST['password'], $login_user['Passwort'], $login_user['UID'])) { $valid = false;
$valid = false; error(_("Your password is incorrect. Please try it again."));
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 { } else {
$valid = false; $valid = false;
error(_("Please enter a password.")); error(_("Please enter a nickname."));
} }
} 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) { if ($valid) {
$_SESSION['uid'] = $login_user['UID']; $_SESSION['uid'] = $login_user['UID'];
$_SESSION['locale'] = $login_user['Sprache']; $_SESSION['locale'] = $login_user['Sprache'];
redirect(page_link_to('news')); redirect(page_link_to('news'));
}
} }
}
$event_config = EventConfig(); $event_config = EventConfig();
return page([ return page([
div('col-md-12', [ div('col-md-12', [
div('row', [ div('row', [
EventConfig_countdown_page($event_config) EventConfig_countdown_page($event_config)
]), ]),
div('row', [ div('row', [
div('col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4', [ div('col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4', [
div('panel panel-primary first', [ div('panel panel-primary first', [
div('panel-heading', [ div('panel-heading', [
'<span class="icon-icon_angel"></span> ' . _("Login") '<span class="icon-icon_angel"></span> ' . _("Login")
]), ]),
div('panel-body', [ div('panel-body', [
msg(), msg(),
@ -355,46 +361,46 @@ function guest_login() {
form_password_placeholder('password', _("Password")), form_password_placeholder('password', _("Password")),
form_submit('submit', _("Login")), form_submit('submit', _("Login")),
! $valid ? buttons([ ! $valid ? buttons([
button(page_link_to('user_password_recovery'), _("I forgot my password")) button(page_link_to('user_password_recovery'), _("I forgot my password"))
]) : '' ]) : ''
]) ])
]), ]),
div('panel-footer', [ div('panel-footer', [
glyph('info-sign') . _("Please note: You have to activate cookies!") glyph('info-sign') . _("Please note: You have to activate cookies!")
]) ])
]) ])
]) ])
]), ]),
div('row', [ div('row', [
div('col-sm-6 text-center', [ div('col-sm-6 text-center', [
heading(register_title(), 2), heading(register_title(), 2),
get_register_hint() get_register_hint()
]), ]),
div('col-sm-6 text-center', [ div('col-sm-6 text-center', [
heading(_("What can I do?"), 2), heading(_("What can I do?"), 2),
'<p>' . _("Please read about the jobs you can do to help us.") . '</p>', '<p>' . _("Please read about the jobs you can do to help us.") . '</p>',
buttons([ buttons([
button(page_link_to('angeltypes') . '&action=about', _("Teams/Job description") . ' &raquo;') button(page_link_to('angeltypes') . '&action=about', _("Teams/Job description") . ' &raquo;')
]) ])
]) ])
]) ])
]) ])
]); ]);
} }
function get_register_hint() { function get_register_hint()
global $privileges; {
global $privileges;
if (in_array('register', $privileges)) { if (in_array('register', $privileges)) {
return join('', [ return join('', [
'<p>' . _("Please sign up, if you want to help us!") . '</p>', '<p>' . _("Please sign up, if you want to help us!") . '</p>',
buttons([ buttons([
button(page_link_to('register'), register_title() . ' &raquo;') button(page_link_to('register'), register_title() . ' &raquo;')
]) ])
]); ]);
} }
//FIXME: return error(_("Registration is disabled."), true); //FIXME: return error(_("Registration is disabled."), true);
return error("Registration is <a href='https://engelsystem.de/33c3/overwhelmed.html'>disabled</a>.", true); return error("Registration is <a href='https://engelsystem.de/33c3/overwhelmed.html'>disabled</a>.", true);
} }
?>

View File

@ -1,5 +1,5 @@
<?php <?php
function guest_start() { function guest_start()
redirect(page_link_to('login')); {
redirect(page_link_to('login'));
} }
?>

View File

@ -1,35 +1,34 @@
<?php <?php
function guest_stats() { function guest_stats()
global $api_key; {
global $api_key;
if (isset($_REQUEST['api_key'])) { if (isset($_REQUEST['api_key'])) {
if ($_REQUEST['api_key'] == $api_key) { if ($_REQUEST['api_key'] == $api_key) {
$stats = []; $stats = [];
list($user_count) = sql_select("SELECT count(*) as `user_count` FROM `User`"); list($user_count) = sql_select("SELECT count(*) as `user_count` FROM `User`");
$stats['user_count'] = $user_count['user_count']; $stats['user_count'] = $user_count['user_count'];
list($arrived_user_count) = sql_select("SELECT count(*) as `user_count` FROM `User` WHERE `Gekommen`=1"); 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']; $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()"); $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); $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`"); $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); $stats['users_in_action'] = count($users_in_action);
header("Content-Type: application/json"); header("Content-Type: application/json");
raw_output(json_encode($stats)); raw_output(json_encode($stats));
return; return;
}
raw_output(json_encode([
'error' => "Wrong api_key."
]));
} }
raw_output(json_encode([ raw_output(json_encode([
'error' => "Wrong api_key." 'error' => "Missing parameter api_key."
]));
}
raw_output(json_encode([
'error' => "Missing parameter api_key."
])); ]));
} }
?>

View File

@ -1,46 +1,49 @@
<?php <?php
// publically available page to feed the news to feedreaders // publically available page to feed the news to feedreaders
function user_atom() { function user_atom()
global $user, $DISPLAY_NEWS; {
global $user, $DISPLAY_NEWS;
if (! isset($_REQUEST['key']) || ! preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) { if (! isset($_REQUEST['key']) || ! preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) {
engelsystem_error("Missing key."); engelsystem_error("Missing key.");
} }
$key = $_REQUEST['key']; $key = $_REQUEST['key'];
$user = User_by_api_key($key); $user = User_by_api_key($key);
if ($user == null) { if ($user == null) {
engelsystem_error("Key invalid."); engelsystem_error("Key invalid.");
} }
if (! in_array('atom', privileges_for_user($user['UID']))) { if (! in_array('atom', privileges_for_user($user['UID']))) {
engelsystem_error("No privilege for atom."); 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)); $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); $output = make_atom_entries_from_news($news);
header('Content-Type: application/atom+xml; charset=utf-8'); header('Content-Type: application/atom+xml; charset=utf-8');
header("Content-Length: " . strlen($output)); header("Content-Length: " . strlen($output));
raw_output($output); raw_output($output);
} }
function make_atom_entries_from_news($news_entries) { function make_atom_entries_from_news($news_entries)
$html = '<?xml version="1.0" encoding="utf-8"?> {
$html = '<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"> <feed xmlns="http://www.w3.org/2005/Atom">
<title>Engelsystem</title> <title>Engelsystem</title>
<id>' . $_SERVER['HTTP_HOST'] . htmlspecialchars(preg_replace('#[&?]key=[a-f0-9]{32}#', '', $_SERVER['REQUEST_URI'])) . '</id> <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"; <updated>' . date('Y-m-d\TH:i:sP', $news_entries[0]['Datum']) . "</updated>\n";
foreach ($news_entries as $news_entry) { foreach ($news_entries as $news_entry) {
$html .= make_atom_entry_from_news($news_entry); $html .= make_atom_entry_from_news($news_entry);
} }
$html .= "</feed>"; $html .= "</feed>";
return $html; return $html;
} }
function make_atom_entry_from_news($news_entry) { function make_atom_entry_from_news($news_entry)
return " <entry> {
return " <entry>
<title>" . htmlspecialchars($news_entry['Betreff']) . "</title> <title>" . htmlspecialchars($news_entry['Betreff']) . "</title>
<link href=\"" . page_link_to_absolute("news_comments&amp;nid=") . "${news_entry['ID']}\"/> <link href=\"" . page_link_to_absolute("news_comments&amp;nid=") . "${news_entry['ID']}\"/>
<id>" . preg_replace('#^https?://#', '', page_link_to_absolute("news")) . "-${news_entry['ID']}</id> <id>" . preg_replace('#^https?://#', '', page_link_to_absolute("news")) . "-${news_entry['ID']}</id>
@ -48,4 +51,3 @@ function make_atom_entry_from_news($news_entry) {
<summary type=\"html\">" . htmlspecialchars($news_entry['Text']) . "</summary> <summary type=\"html\">" . htmlspecialchars($news_entry['Text']) . "</summary>
</entry>\n"; </entry>\n";
} }
?>

View File

@ -3,61 +3,63 @@
/** /**
* Controller for ical output of users own shifts or any user_shifts filter. * Controller for ical output of users own shifts or any user_shifts filter.
*/ */
function user_ical() { function user_ical()
global $user; {
global $user;
if (! isset($_REQUEST['key']) || ! preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) { if (! isset($_REQUEST['key']) || ! preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) {
engelsystem_error("Missing key."); engelsystem_error("Missing key.");
} }
$key = $_REQUEST['key']; $key = $_REQUEST['key'];
$user = User_by_api_key($key); $user = User_by_api_key($key);
if ($user == null) { if ($user == null) {
engelsystem_error("Key invalid."); engelsystem_error("Key invalid.");
} }
if (! in_array('ical', privileges_for_user($user['UID']))) { if (! in_array('ical', privileges_for_user($user['UID']))) {
engelsystem_error("No privilege for ical."); engelsystem_error("No privilege for ical.");
} }
$ical_shifts = load_ical_shifts(); $ical_shifts = load_ical_shifts();
send_ical_from_shifts($ical_shifts); send_ical_from_shifts($ical_shifts);
} }
/** /**
* Renders an ical calender from given shifts array. * Renders an ical calender from given shifts array.
* *
* @param array<Shift> $shifts * @param array<Shift> $shifts
*/ */
function send_ical_from_shifts($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"; header("Content-Type: text/calendar; charset=utf-8");
foreach ($shifts as $shift) { $output = "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//-//Engelsystem//DE\r\nCALSCALE:GREGORIAN\r\n";
$output .= make_ical_entry_from_shift($shift); foreach ($shifts as $shift) {
} $output .= make_ical_entry_from_shift($shift);
$output .= "END:VCALENDAR\r\n"; }
$output = trim($output, "\x0A"); $output .= "END:VCALENDAR\r\n";
header("Content-Length: " . strlen($output)); $output = trim($output, "\x0A");
raw_output($output); header("Content-Length: " . strlen($output));
raw_output($output);
} }
/** /**
* Renders an ical vevent from given shift. * Renders an ical vevent from given shift.
* *
* @param Shift $shift * @param Shift $shift
*/ */
function make_ical_entry_from_shift($shift) { function make_ical_entry_from_shift($shift)
$output = "BEGIN:VEVENT\r\n"; {
$output .= "UID:" . md5($shift['start'] . $shift['end'] . $shift['name']) . "\r\n"; $output = "BEGIN:VEVENT\r\n";
$output .= "SUMMARY:" . str_replace("\n", "\\n", $shift['name']) . " (" . str_replace("\n", "\\n", $shift['title']) . ")\r\n"; $output .= "UID:" . md5($shift['start'] . $shift['end'] . $shift['name']) . "\r\n";
if (isset($shift['Comment'])) { $output .= "SUMMARY:" . str_replace("\n", "\\n", $shift['name']) . " (" . str_replace("\n", "\\n", $shift['title']) . ")\r\n";
$output .= "DESCRIPTION:" . str_replace("\n", "\\n", $shift['Comment']) . "\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 .= "DTSTART;TZID=Europe/Berlin:" . date("Ymd\THis", $shift['start']) . "\r\n";
$output .= "LOCATION:" . $shift['Name'] . "\r\n"; $output .= "DTEND;TZID=Europe/Berlin:" . date("Ymd\THis", $shift['end']) . "\r\n";
$output .= "END:VEVENT\r\n"; $output .= "LOCATION:" . $shift['Name'] . "\r\n";
return $output; $output .= "END:VEVENT\r\n";
return $output;
} }
?>

View File

@ -1,73 +1,76 @@
<?php <?php
function messages_title() { function messages_title()
return _("Messages"); {
return _("Messages");
} }
function user_unread_messages() { function user_unread_messages()
global $user; {
global $user;
if (isset($user)) { if (isset($user)) {
$new_messages = sql_num_query("SELECT * FROM `Messages` WHERE isRead='N' AND `RUID`='" . sql_escape($user['UID']) . "'"); $new_messages = sql_num_query("SELECT * FROM `Messages` WHERE isRead='N' AND `RUID`='" . sql_escape($user['UID']) . "'");
if ($new_messages > 0) { if ($new_messages > 0) {
return ' <span class="badge danger">' . $new_messages . '</span>'; return ' <span class="badge danger">' . $new_messages . '</span>';
}
} }
} return '';
return '';
} }
function user_messages() { function user_messages()
global $user; {
global $user;
if (! isset($_REQUEST['action'])) { if (! isset($_REQUEST['action'])) {
$users = sql_select("SELECT * FROM `User` WHERE NOT `UID`='" . sql_escape($user['UID']) . "' ORDER BY `Nick`"); $users = sql_select("SELECT * FROM `User` WHERE NOT `UID`='" . sql_escape($user['UID']) . "' ORDER BY `Nick`");
$to_select_data = [ $to_select_data = [
"" => _("Select recipient...") "" => _("Select recipient...")
]; ];
foreach ($users as $u) { foreach ($users as $u) {
$to_select_data[$u['UID']] = $u['Nick']; $to_select_data[$u['UID']] = $u['Nick'];
} }
$to_select = html_select_key('to', 'to', $to_select_data, ''); $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 = sql_select("SELECT * FROM `Messages` WHERE `SUID`='" . sql_escape($user['UID']) . "' OR `RUID`='" . sql_escape($user['UID']) . "' ORDER BY `isRead`,`Datum` DESC");
$messages_table = [ $messages_table = [
[ [
'news' => '', 'news' => '',
'timestamp' => date("Y-m-d H:i"), 'timestamp' => date("Y-m-d H:i"),
'from' => User_Nick_render($user), 'from' => User_Nick_render($user),
'to' => $to_select, 'to' => $to_select,
'text' => form_textarea('text', '', ''), 'text' => form_textarea('text', '', ''),
'actions' => form_submit('submit', _("Save")) 'actions' => form_submit('submit', _("Save"))
] ]
]; ];
foreach ($messages as $message) { foreach ($messages as $message) {
$sender_user_source = User($message['SUID']); $sender_user_source = User($message['SUID']);
$receiver_user_source = User($message['RUID']); $receiver_user_source = User($message['RUID']);
$messages_table_entry = [ $messages_table_entry = [
'new' => $message['isRead'] == 'N' ? '<span class="glyphicon glyphicon-envelope"></span>' : '', 'new' => $message['isRead'] == 'N' ? '<span class="glyphicon glyphicon-envelope"></span>' : '',
'timestamp' => date("Y-m-d H:i", $message['Datum']), 'timestamp' => date("Y-m-d H:i", $message['Datum']),
'from' => User_Nick_render($sender_user_source), 'from' => User_Nick_render($sender_user_source),
'to' => User_Nick_render($receiver_user_source), 'to' => User_Nick_render($receiver_user_source),
'text' => str_replace("\n", '<br />', $message['Text']) 'text' => str_replace("\n", '<br />', $message['Text'])
]; ];
if ($message['RUID'] == $user['UID']) { if ($message['RUID'] == $user['UID']) {
if ($message['isRead'] == 'N') { if ($message['isRead'] == 'N') {
$messages_table_entry['actions'] = button(page_link_to("user_messages") . '&action=read&id=' . $message['id'], _("mark as read"), 'btn-xs'); $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;
} }
} 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(), [ return page_with_title(messages_title(), [
msg(), msg(),
sprintf(_("Hello %s, here can you leave messages for other angels"), User_Nick_render($user)), sprintf(_("Hello %s, here can you leave messages for other angels"), User_Nick_render($user)),
form([ form([
@ -77,55 +80,54 @@ function user_messages() {
'from' => _("Transmitted"), 'from' => _("Transmitted"),
'to' => _("Recipient"), 'to' => _("Recipient"),
'text' => _("Message"), 'text' => _("Message"),
'actions' => '' 'actions' => ''
], $messages_table) ], $messages_table)
], page_link_to('user_messages') . '&action=send') ], page_link_to('user_messages') . '&action=send')
]); ]);
} else { } else {
switch ($_REQUEST['action']) { switch ($_REQUEST['action']) {
case "read": case "read":
if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) {
$message_id = $_REQUEST['id']; $message_id = $_REQUEST['id'];
} else { } else {
return error(_("Incomplete call, missing Message ID."), true); return error(_("Incomplete call, missing Message ID."), true);
} }
$message = sql_select("SELECT * FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); $message = sql_select("SELECT * FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1");
if (count($message) > 0 && $message[0]['RUID'] == $user['UID']) { if (count($message) > 0 && $message[0]['RUID'] == $user['UID']) {
sql_query("UPDATE `Messages` SET `isRead`='Y' WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); sql_query("UPDATE `Messages` SET `isRead`='Y' WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1");
redirect(page_link_to("user_messages")); redirect(page_link_to("user_messages"));
} else { } else {
return error(_("No Message found."), true); return error(_("No Message found."), true);
} }
break; break;
case "delete": case "delete":
if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) {
$message_id = $_REQUEST['id']; $message_id = $_REQUEST['id'];
} else { } else {
return error(_("Incomplete call, missing Message ID."), true); return error(_("Incomplete call, missing Message ID."), true);
} }
$message = sql_select("SELECT * FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); $message = sql_select("SELECT * FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1");
if (count($message) > 0 && $message[0]['SUID'] == $user['UID']) { if (count($message) > 0 && $message[0]['SUID'] == $user['UID']) {
sql_query("DELETE FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); sql_query("DELETE FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1");
redirect(page_link_to("user_messages")); redirect(page_link_to("user_messages"));
} else { } else {
return error(_("No Message found."), true); return error(_("No Message found."), true);
} }
break; break;
case "send": case "send":
if (Message_send($_REQUEST['to'], $_REQUEST['text']) === true) { if (Message_send($_REQUEST['to'], $_REQUEST['text']) === true) {
redirect(page_link_to("user_messages")); redirect(page_link_to("user_messages"));
} else { } else {
return error(_("Transmitting was terminated with an Error."), true); return error(_("Transmitting was terminated with an Error."), true);
} }
break; break;
default: default:
return error(_("Wrong action."), true); return error(_("Wrong action."), true);
} }
} }
} }
?>

View File

@ -1,35 +1,37 @@
<?php <?php
function myshifts_title() { function myshifts_title()
return _("My shifts"); {
return _("My shifts");
} }
// Zeigt die Schichten an, die ein Benutzer belegt // Zeigt die Schichten an, die ein Benutzer belegt
function user_myshifts() { function user_myshifts()
global $LETZTES_AUSTRAGEN; {
global $user, $privileges; 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) { 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']; $user_id = $_REQUEST['id'];
} else { } else {
$user_id = $user['UID']; $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']);
} }
return page_with_title(_("Reset API key"), [
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']);
}
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), 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') button(page_link_to('user_myshifts') . '&reset=ack', _("Continue"), 'btn-danger')
]); ]);
} elseif (isset($_REQUEST['edit']) && preg_match("/^[0-9]*$/", $_REQUEST['edit'])) { } elseif (isset($_REQUEST['edit']) && preg_match("/^[0-9]*$/", $_REQUEST['edit'])) {
$user_id = $_REQUEST['edit']; $user_id = $_REQUEST['edit'];
$shift = sql_select("SELECT $shift = sql_select("SELECT
`ShiftEntry`.`freeloaded`, `ShiftEntry`.`freeloaded`,
`ShiftEntry`.`freeload_comment`, `ShiftEntry`.`freeload_comment`,
`ShiftEntry`.`Comment`, `ShiftEntry`.`Comment`,
@ -45,74 +47,73 @@ function user_myshifts() {
JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`)
WHERE `ShiftEntry`.`id`='" . sql_escape($user_id) . "' WHERE `ShiftEntry`.`id`='" . sql_escape($user_id) . "'
AND `UID`='" . sql_escape($shifts_user['UID']) . "' LIMIT 1"); AND `UID`='" . sql_escape($shifts_user['UID']) . "' LIMIT 1");
if (count($shift) > 0) { if (count($shift) > 0) {
$shift = $shift[0]; $shift = $shift[0];
$freeloaded = $shift['freeloaded']; $freeloaded = $shift['freeloaded'];
$freeload_comment = $shift['freeload_comment']; $freeload_comment = $shift['freeload_comment'];
if (isset($_REQUEST['submit'])) { if (isset($_REQUEST['submit'])) {
$valid = true; $valid = true;
if (in_array("user_shifts_admin", $privileges)) { if (in_array("user_shifts_admin", $privileges)) {
$freeloaded = isset($_REQUEST['freeloaded']); $freeloaded = isset($_REQUEST['freeloaded']);
$freeload_comment = strip_request_item_nl('freeload_comment'); $freeload_comment = strip_request_item_nl('freeload_comment');
if ($freeloaded && $freeload_comment == '') { if ($freeloaded && $freeload_comment == '') {
$valid = false; $valid = false;
error(_("Please enter a freeload comment!")); error(_("Please enter a freeload comment!"));
} }
} }
$comment = strip_request_item_nl('comment'); $comment = strip_request_item_nl('comment');
$user_source = User($shift['UID']); $user_source = User($shift['UID']);
if ($valid) { if ($valid) {
$result = ShiftEntry_update([ $result = ShiftEntry_update([
'id' => $user_id, 'id' => $user_id,
'Comment' => $comment, 'Comment' => $comment,
'freeloaded' => $freeloaded, 'freeloaded' => $freeloaded,
'freeload_comment' => $freeload_comment 'freeload_comment' => $freeload_comment
]); ]);
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to update shift entry.'); 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")); 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.")); success(_("Shift saved."));
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 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)); 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 { } else {
redirect(page_link_to('user_myshifts')); redirect(page_link_to('user_myshifts'));
} }
} elseif (isset($_REQUEST['cancel']) && preg_match("/^[0-9]*$/", $_REQUEST['cancel'])) { } elseif (isset($_REQUEST['cancel']) && preg_match("/^[0-9]*$/", $_REQUEST['cancel'])) {
$user_id = $_REQUEST['cancel']; $user_id = $_REQUEST['cancel'];
$shift = sql_select(" $shift = sql_select("
SELECT * SELECT *
FROM `Shifts` FROM `Shifts`
INNER JOIN `ShiftEntry` USING (`SID`) INNER JOIN `ShiftEntry` USING (`SID`)
WHERE `ShiftEntry`.`id`='" . sql_escape($user_id) . "' AND `UID`='" . sql_escape($shifts_user['UID']) . "'"); WHERE `ShiftEntry`.`id`='" . sql_escape($user_id) . "' AND `UID`='" . sql_escape($shifts_user['UID']) . "'");
if (count($shift) > 0) { if (count($shift) > 0) {
$shift = $shift[0]; $shift = $shift[0];
if (($shift['start'] > time() + $LETZTES_AUSTRAGEN * 3600) || in_array('user_shifts_admin', $privileges)) { if (($shift['start'] > time() + $LETZTES_AUSTRAGEN * 3600) || in_array('user_shifts_admin', $privileges)) {
$result = ShiftEntry_delete($user_id); $result = ShiftEntry_delete($user_id);
if ($result === false) { if ($result === false) {
engelsystem_error('Unable to delete shift entry.'); engelsystem_error('Unable to delete shift entry.');
} }
$room = Room($shift['RID']); $room = Room($shift['RID']);
$angeltype = AngelType($shift['TID']); $angeltype = AngelType($shift['TID']);
$shifttype = ShiftType($shift['shifttype_id']); $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']); 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.")); success(_("Shift canceled."));
} else { } else {
error(_("It's too late to sign yourself off the shift. If neccessary, ask the dispatcher to do so.")); error(_("It's too late to sign yourself off the shift. If neccessary, ask the dispatcher to do so."));
} }
} else { } else {
redirect(user_link($shifts_user)); 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']);
} }
?>

View File

@ -1,169 +1,175 @@
<?php <?php
function user_news_comments_title() { function user_news_comments_title()
return _("News comments"); {
return _("News comments");
} }
function news_title() { function news_title()
return _("News"); {
return _("News");
} }
function meetings_title() { function meetings_title()
return _("Meetings"); {
return _("Meetings");
} }
function user_meetings() { function user_meetings()
global $DISPLAY_NEWS; {
global $DISPLAY_NEWS;
$html = '<div class="col-md-12"><h1>' . meetings_title() . '</h1>' . msg(); $html = '<div class="col-md-12"><h1>' . meetings_title() . '</h1>' . msg();
if (isset($_REQUEST['page']) && preg_match("/^[0-9]{1,}$/", $_REQUEST['page'])) { if (isset($_REQUEST['page']) && preg_match("/^[0-9]{1,}$/", $_REQUEST['page'])) {
$page = $_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">';
} else { } 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; $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">';
} else {
$html .= '<li>';
}
$html .= '<a href="' . page_link_to("user_meetings") . '&page=' . $i . '">' . ($i + 1) . '</a></li>';
}
$html .= '</ul></div></div>';
return $html;
} }
function display_news($news) { function display_news($news)
global $privileges, $page; {
global $privileges, $page;
$html = ''; $html = '';
$html .= '<div class="panel' . ($news['Treffen'] == 1 ? ' panel-info' : ' panel-default') . '">'; $html .= '<div class="panel' . ($news['Treffen'] == 1 ? ' panel-info' : ' panel-default') . '">';
$html .= '<div class="panel-heading">'; $html .= '<div class="panel-heading">';
$html .= '<h3 class="panel-title">' . ($news['Treffen'] == 1 ? '[Meeting] ' : '') . ReplaceSmilies($news['Betreff']) . '</h3>'; $html .= '<h3 class="panel-title">' . ($news['Treffen'] == 1 ? '[Meeting] ' : '') . ReplaceSmilies($news['Betreff']) . '</h3>';
$html .= '</div>'; $html .= '</div>';
$html .= '<div class="panel-body">' . ReplaceSmilies(nl2br($news['Text'])) . '</div>'; $html .= '<div class="panel-body">' . ReplaceSmilies(nl2br($news['Text'])) . '</div>';
$html .= '<div class="panel-footer text-muted">'; $html .= '<div class="panel-footer text-muted">';
if (in_array("admin_news", $privileges)) { 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 .= '<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']) . '&emsp;'; $html .= '<span class="glyphicon glyphicon-time"></span> ' . date("Y-m-d H:i", $news['Datum']) . '&emsp;';
$user_source = User($news['UID']); $user_source = User($news['UID']);
$html .= User_Nick_render($user_source); $html .= User_Nick_render($user_source);
if ($page != "news_comments") { if ($page != "news_comments") {
$html .= '&emsp;<a href="' . page_link_to("news_comments") . '&nid=' . $news['ID'] . '"><span class="glyphicon glyphicon-comment"></span> ' . _("Comments") . ' &raquo;</a> <span class="badge">' . sql_num_query("SELECT * FROM `NewsComments` WHERE `Refid`='" . sql_escape($news['ID']) . "'") . '</span>'; $html .= '&emsp;<a href="' . page_link_to("news_comments") . '&nid=' . $news['ID'] . '"><span class="glyphicon glyphicon-comment"></span> ' . _("Comments") . ' &raquo;</a> <span class="badge">' . sql_num_query("SELECT * FROM `NewsComments` WHERE `Refid`='" . sql_escape($news['ID']) . "'") . '</span>';
} }
$html .= '</div>'; $html .= '</div>';
$html .= '</div>'; $html .= '</div>';
return $html; return $html;
} }
function user_news_comments() { function user_news_comments()
global $user; {
global $user;
$html = '<div class="col-md-12"><h1>' . user_news_comments_title() . '</h1>'; $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) { 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"]; $nid = $_REQUEST["nid"];
list($news) = sql_select("SELECT * FROM `News` WHERE `ID`='" . sql_escape($nid) . "' LIMIT 1"); list($news) = sql_select("SELECT * FROM `News` WHERE `ID`='" . sql_escape($nid) . "' LIMIT 1");
if (isset($_REQUEST["text"])) { if (isset($_REQUEST["text"])) {
$text = preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", '', strip_tags($_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"]) . "')"); 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); engelsystem_log("Created news_comment: " . $text);
$html .= success(_("Entry saved."), true); $html .= success(_("Entry saved."), true);
} }
$html .= display_news($news); $html .= display_news($news);
$comments = sql_select("SELECT * FROM `NewsComments` WHERE `Refid`='" . sql_escape($nid) . "' ORDER BY 'ID'"); $comments = sql_select("SELECT * FROM `NewsComments` WHERE `Refid`='" . sql_escape($nid) . "' ORDER BY 'ID'");
foreach ($comments as $comment) { foreach ($comments as $comment) {
$user_source = User($comment['UID']); $user_source = User($comment['UID']);
$html .= '<div class="panel panel-default">'; $html .= '<div class="panel panel-default">';
$html .= '<div class="panel-body">' . nl2br($comment['Text']) . '</div>'; $html .= '<div class="panel-body">' . nl2br($comment['Text']) . '</div>';
$html .= '<div class="panel-footer text-muted">'; $html .= '<div class="panel-footer text-muted">';
$html .= '<span class="glyphicon glyphicon-time"></span> ' . $comment['Datum'] . '&emsp;'; $html .= '<span class="glyphicon glyphicon-time"></span> ' . $comment['Datum'] . '&emsp;';
$html .= User_Nick_render($user_source); $html .= User_Nick_render($user_source);
$html .= '</div>'; $html .= '</div>';
$html .= '</div>'; $html .= '</div>';
} }
$html .= '<hr /><h2>' . _("New Comment:") . '</h2>'; $html .= '<hr /><h2>' . _("New Comment:") . '</h2>';
$html .= form([ $html .= form([
form_textarea('text', _("Message"), ''), form_textarea('text', _("Message"), ''),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
], page_link_to('news_comments') . '&nid=' . $news['ID']); ], page_link_to('news_comments') . '&nid=' . $news['ID']);
} else { } else {
$html .= _("Invalid request."); $html .= _("Invalid request.");
} }
return $html . '</div>'; return $html . '</div>';
} }
function user_news() { function user_news()
global $DISPLAY_NEWS, $privileges, $user; {
global $DISPLAY_NEWS, $privileges, $user;
$html = '<div class="col-md-12"><h1>' . news_title() . '</h1>' . msg(); $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["text"]) && isset($_POST["betreff"]) && in_array("admin_news", $privileges)) {
if (! isset($_POST["treffen"]) || ! in_array("admin_news", $privileges)) { if (! isset($_POST["treffen"]) || ! in_array("admin_news", $privileges)) {
$_POST["treffen"] = 0; $_POST["treffen"] = 0;
}
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'));
} }
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'])) { if (isset($_REQUEST['page']) && preg_match("/^[0-9]{1,}$/", $_REQUEST['page'])) {
$page = $_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">';
} else { } else {
$html .= '<li>'; $page = 0;
} }
$html .= '<a href="' . page_link_to("news") . '&page=' . $i . '">' . ($i + 1) . '</a></li>';
}
$html .= '</ul></div>';
if (in_array("admin_news", $privileges)) { $news = sql_select("SELECT * FROM `News` ORDER BY `Datum` DESC LIMIT " . sql_escape($page * $DISPLAY_NEWS) . ", " . sql_escape($DISPLAY_NEWS));
$html .= '<hr />'; foreach ($news as $entry) {
$html .= '<h2>' . _("Create news:") . '</h2>'; $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">';
} 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([ $html .= form([
form_text('betreff', _("Subject"), ''), form_text('betreff', _("Subject"), ''),
form_textarea('text', _("Message"), ''), form_textarea('text', _("Message"), ''),
form_checkbox('treffen', _("Meeting"), false, 1), form_checkbox('treffen', _("Meeting"), false, 1),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]); ]);
} }
return $html . '</div>'; return $html . '</div>';
} }
?>

View File

@ -1,57 +1,58 @@
<?php <?php
function questions_title() { function questions_title()
return _("Ask the Heaven"); {
return _("Ask the Heaven");
} }
function user_questions() { function user_questions()
global $user; {
global $user;
if (! isset($_REQUEST['action'])) { if (! isset($_REQUEST['action'])) {
$open_questions = sql_select("SELECT * FROM `Questions` WHERE `AID` IS NULL AND `UID`='" . sql_escape($user['UID']) . "'"); $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']) . "'"); $answered_questions = sql_select("SELECT * FROM `Questions` WHERE NOT `AID` IS NULL AND `UID`='" . sql_escape($user['UID']) . "'");
foreach ($answered_questions as &$question) { foreach ($answered_questions as &$question) {
$answer_user_source = User($question['AID']); $answer_user_source = User($question['AID']);
$question['answer_user'] = User_Nick_render($answer_user_source); $question['answer_user'] = User_Nick_render($answer_user_source);
} }
return Questions_view($open_questions, $answered_questions, page_link_to("user_questions") . '&action=ask'); return Questions_view($open_questions, $answered_questions, page_link_to("user_questions") . '&action=ask');
} else { } else {
switch ($_REQUEST['action']) { switch ($_REQUEST['action']) {
case 'ask': case 'ask':
$question = strip_request_item_nl('question'); $question = strip_request_item_nl('question');
if ($question != "") { if ($question != "") {
$result = sql_query("INSERT INTO `Questions` SET `UID`='" . sql_escape($user['UID']) . "', `Question`='" . sql_escape($question) . "'"); $result = sql_query("INSERT INTO `Questions` SET `UID`='" . sql_escape($user['UID']) . "', `Question`='" . sql_escape($question) . "'");
if ($result === false) { if ($result === false) {
engelsystem_error(_("Unable to save question.")); engelsystem_error(_("Unable to save question."));
} }
success(_("You question was saved.")); success(_("You question was saved."));
redirect(page_link_to("user_questions")); redirect(page_link_to("user_questions"));
} else { } else {
return page_with_title(questions_title(), [ return page_with_title(questions_title(), [
error(_("Please enter a question!"), true) error(_("Please enter a question!"), true)
]); ]);
} }
break; break;
case 'delete': case 'delete':
if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) {
$question_id = $_REQUEST['id']; $question_id = $_REQUEST['id'];
} else { } else {
return error(_("Incomplete call, missing Question ID."), true); return error(_("Incomplete call, missing Question ID."), true);
} }
$question = sql_select("SELECT * FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); $question = sql_select("SELECT * FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1");
if (count($question) > 0 && $question[0]['UID'] == $user['UID']) { if (count($question) > 0 && $question[0]['UID'] == $user['UID']) {
sql_query("DELETE FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); sql_query("DELETE FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1");
redirect(page_link_to("user_questions")); redirect(page_link_to("user_questions"));
} else { } else {
return page_with_title(questions_title(), [ return page_with_title(questions_title(), [
error(_("No question found."), true) error(_("No question found."), true)
]); ]);
} }
break; break;
} }
} }
} }
?>

View File

@ -1,7 +1,8 @@
<?php <?php
function settings_title() { function settings_title()
return _("Settings"); {
return _("Settings");
} }
/** /**
@ -10,75 +11,76 @@ function settings_title() {
* @param User $user_source * @param User $user_source
* The user * The user
*/ */
function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes) { function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
$valid = true; {
$valid = true;
if (isset($_REQUEST['mail'])) { if (isset($_REQUEST['mail'])) {
$result = User_validate_mail($_REQUEST['mail']); $result = User_validate_mail($_REQUEST['mail']);
$user_source['email'] = $result->getValue(); $user_source['email'] = $result->getValue();
if (! $result->isValid()) { if (! $result->isValid()) {
$valid = false; $valid = false;
error(_("E-mail address is not correct.")); 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_shiftinfo'] = isset($_REQUEST['email_shiftinfo']);
$user_source['email_by_human_allowed'] = isset($_REQUEST['email_by_human_allowed']); $user_source['email_by_human_allowed'] = isset($_REQUEST['email_by_human_allowed']);
if (isset($_REQUEST['jabber'])) { if (isset($_REQUEST['jabber'])) {
$result = User_validate_jabber($_REQUEST['jabber']); $result = User_validate_jabber($_REQUEST['jabber']);
$user_source['jabber'] = $result->getValue(); $user_source['jabber'] = $result->getValue();
if (! $result->isValid()) { if (! $result->isValid()) {
$valid = false; $valid = false;
error(_("Please check your jabber account information.")); error(_("Please check your jabber account information."));
}
} }
}
if (isset($_REQUEST['tshirt_size']) && isset($tshirt_sizes[$_REQUEST['tshirt_size']])) { if (isset($_REQUEST['tshirt_size']) && isset($tshirt_sizes[$_REQUEST['tshirt_size']])) {
$user_source['Size'] = $_REQUEST['tshirt_size']; $user_source['Size'] = $_REQUEST['tshirt_size'];
} elseif ($enable_tshirt_size) { } elseif ($enable_tshirt_size) {
$valid = false; $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['planned_departure_date'])) { if (isset($_REQUEST['planned_arrival_date'])) {
$tmp = parse_date("Y-m-d H:i", $_REQUEST['planned_departure_date'] . " 00:00"); $tmp = parse_date("Y-m-d H:i", $_REQUEST['planned_arrival_date'] . " 00:00");
$result = User_validate_planned_departure_date($user_source['planned_arrival_date'], $tmp); $result = User_validate_planned_arrival_date($tmp);
$user_source['planned_departure_date'] = $result->getValue(); $user_source['planned_arrival_date'] = $result->getValue();
if (! $result->isValid()) { if (! $result->isValid()) {
$valid = false; $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.")); error(_("Please enter your planned date of arrival. It should be after the buildup start date and before teardown end date."));
}
}
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 // Trivia
$user_source['Name'] = strip_request_item('lastname', $user_source['Name']); $user_source['Name'] = strip_request_item('lastname', $user_source['Name']);
$user_source['Vorname'] = strip_request_item('prename', $user_source['Vorname']); $user_source['Vorname'] = strip_request_item('prename', $user_source['Vorname']);
$user_source['Alter'] = strip_request_item('age', $user_source['Alter']); $user_source['Alter'] = strip_request_item('age', $user_source['Alter']);
$user_source['Telefon'] = strip_request_item('tel', $user_source['Telefon']); $user_source['Telefon'] = strip_request_item('tel', $user_source['Telefon']);
$user_source['DECT'] = strip_request_item('dect', $user_source['DECT']); $user_source['DECT'] = strip_request_item('dect', $user_source['DECT']);
$user_source['Handy'] = strip_request_item('mobile', $user_source['Handy']); $user_source['Handy'] = strip_request_item('mobile', $user_source['Handy']);
$user_source['Hometown'] = strip_request_item('hometown', $user_source['Hometown']); $user_source['Hometown'] = strip_request_item('hometown', $user_source['Hometown']);
if ($valid) { if ($valid) {
User_update($user_source); User_update($user_source);
success(_("Settings saved.")); success(_("Settings saved."));
redirect(page_link_to('user_settings')); redirect(page_link_to('user_settings'));
} }
return $user_source; return $user_source;
} }
/** /**
@ -87,20 +89,21 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes) {
* @param User $user_source * @param User $user_source
* The user * The user
*/ */
function user_settings_password($user_source) { function user_settings_password($user_source)
global $min_password_length; {
if (! isset($_REQUEST['password']) || ! verify_password($_REQUEST['password'], $user_source['Passwort'], $user_source['UID'])) { global $min_password_length;
error(_("-> not OK. Please try again.")); if (! isset($_REQUEST['password']) || ! verify_password($_REQUEST['password'], $user_source['Passwort'], $user_source['UID'])) {
} elseif (strlen($_REQUEST['new_password']) < $min_password_length) { error(_("-> not OK. Please try again."));
error(_("Your password is to short (please use at least 6 characters).")); } elseif (strlen($_REQUEST['new_password']) < $min_password_length) {
} elseif ($_REQUEST['new_password'] != $_REQUEST['new_password2']) { error(_("Your password is to short (please use at least 6 characters)."));
error(_("Your passwords don't match.")); } elseif ($_REQUEST['new_password'] != $_REQUEST['new_password2']) {
} elseif (set_password($user_source['UID'], $_REQUEST['new_password'])) { error(_("Your passwords don't match."));
success(_("Password saved.")); } elseif (set_password($user_source['UID'], $_REQUEST['new_password'])) {
} else { success(_("Password saved."));
error(_("Failed setting password.")); } else {
} error(_("Failed setting password."));
redirect(page_link_to('user_settings')); }
redirect(page_link_to('user_settings'));
} }
/** /**
@ -111,23 +114,24 @@ function user_settings_password($user_source) {
* @param array<String> $themes * @param array<String> $themes
* List of available themes * List of available themes
*/ */
function user_settings_theme($user_source, $themes) { function user_settings_theme($user_source, $themes)
$valid = true; {
$valid = true;
if (isset($_REQUEST['theme']) && isset($themes[$_REQUEST['theme']])) { if (isset($_REQUEST['theme']) && isset($themes[$_REQUEST['theme']])) {
$user_source['color'] = $_REQUEST['theme']; $user_source['color'] = $_REQUEST['theme'];
} else { } else {
$valid = false; $valid = false;
} }
if ($valid) { if ($valid) {
sql_query("UPDATE `User` SET `color`='" . sql_escape($user_source['color']) . "' WHERE `UID`='" . sql_escape($user_source['UID']) . "'"); sql_query("UPDATE `User` SET `color`='" . sql_escape($user_source['color']) . "' WHERE `UID`='" . sql_escape($user_source['UID']) . "'");
success(_("Theme changed.")); success(_("Theme changed."));
redirect(page_link_to('user_settings')); redirect(page_link_to('user_settings'));
} }
return $user_source; return $user_source;
} }
/** /**
@ -138,57 +142,58 @@ function user_settings_theme($user_source, $themes) {
* @param array<String> $locales * @param array<String> $locales
* List of available locales * List of available locales
*/ */
function user_settings_locale($user_source, $locales) { function user_settings_locale($user_source, $locales)
$valid = true; {
$valid = true;
if (isset($_REQUEST['language']) && isset($locales[$_REQUEST['language']])) { if (isset($_REQUEST['language']) && isset($locales[$_REQUEST['language']])) {
$user_source['Sprache'] = $_REQUEST['language']; $user_source['Sprache'] = $_REQUEST['language'];
} else { } else {
$valid = false; $valid = false;
} }
if ($valid) { if ($valid) {
sql_query("UPDATE `User` SET `Sprache`='" . sql_escape($user_source['Sprache']) . "' WHERE `UID`='" . sql_escape($user_source['UID']) . "'"); sql_query("UPDATE `User` SET `Sprache`='" . sql_escape($user_source['Sprache']) . "' WHERE `UID`='" . sql_escape($user_source['UID']) . "'");
$_SESSION['locale'] = $user_source['Sprache']; $_SESSION['locale'] = $user_source['Sprache'];
success("Language changed."); success("Language changed.");
redirect(page_link_to('user_settings')); redirect(page_link_to('user_settings'));
} }
return $user_source; return $user_source;
} }
/** /**
* Main user settings page/controller * Main user settings page/controller
*/ */
function user_settings() { function user_settings()
global $enable_tshirt_size, $tshirt_sizes, $themes, $locales; {
global $user; global $enable_tshirt_size, $tshirt_sizes, $themes, $locales;
global $user;
$buildup_start_date = null; $buildup_start_date = null;
$teardown_end_date = null; $teardown_end_date = null;
$event_config = EventConfig(); $event_config = EventConfig();
if ($event_config != null) { if ($event_config != null) {
if (isset($event_config['buildup_start_date'])) { if (isset($event_config['buildup_start_date'])) {
$buildup_start_date = $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']; $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);
} }
}
$user_source = $user; return User_settings_view($user_source, $locales, $themes, $buildup_start_date, $teardown_end_date, $enable_tshirt_size, $tshirt_sizes);
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);
} }
?>

View File

@ -1,8 +1,9 @@
<?php <?php
use Engelsystem\ShiftsFilter; use Engelsystem\ShiftsFilter;
function shifts_title() { function shifts_title()
return _("Shifts"); {
return _("Shifts");
} }
/** /**
@ -12,24 +13,25 @@ function shifts_title() {
* Split actions into shift edit, shift delete, shift entry edit, shift entry delete * 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 * Introduce simpler and beautiful actions for shift entry join/leave for users
*/ */
function user_shifts() { function user_shifts()
global $user; {
global $user;
if (User_is_freeloader($user)) { if (User_is_freeloader($user)) {
redirect(page_link_to('user_myshifts')); redirect(page_link_to('user_myshifts'));
} }
// Löschen einzelner Schicht-Einträge (Also Belegung einer Schicht von Engeln) durch Admins // Löschen einzelner Schicht-Einträge (Also Belegung einer Schicht von Engeln) durch Admins
if (isset($_REQUEST['entry_id'])) { if (isset($_REQUEST['entry_id'])) {
return shift_entry_delete_controller(); return shift_entry_delete_controller();
} elseif (isset($_REQUEST['edit_shift'])) { } elseif (isset($_REQUEST['edit_shift'])) {
return shift_edit_controller(); return shift_edit_controller();
} elseif (isset($_REQUEST['delete_shift'])) { } elseif (isset($_REQUEST['delete_shift'])) {
return shift_delete_controller(); return shift_delete_controller();
} elseif (isset($_REQUEST['shift_id'])) { } elseif (isset($_REQUEST['shift_id'])) {
return shift_entry_add_controller(); return shift_entry_add_controller();
} }
return view_user_shifts(); return view_user_shifts();
} }
/** /**
@ -39,23 +41,24 @@ function user_shifts() {
* @param ShiftsFilter $shiftsFilter * @param ShiftsFilter $shiftsFilter
* The shiftfilter to update. * The shiftfilter to update.
*/ */
function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days) { function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days)
$start_time = $shiftsFilter->getStartTime(); {
if ($start_time == null) { $start_time = $shiftsFilter->getStartTime();
$start_time = time(); if ($start_time == null) {
} $start_time = time();
}
$end_time = $shiftsFilter->getEndTime(); $end_time = $shiftsFilter->getEndTime();
if ($end_time == null) { if ($end_time == null) {
$end_time = $start_time + 24 * 60 * 60; $end_time = $start_time + 24 * 60 * 60;
} }
$shiftsFilter->setStartTime(check_request_datetime('start_day', 'start_time', $days, $start_time)); $shiftsFilter->setStartTime(check_request_datetime('start_day', 'start_time', $days, $start_time));
$shiftsFilter->setEndTime(check_request_datetime('end_day', 'end_time', $days, $end_time)); $shiftsFilter->setEndTime(check_request_datetime('end_day', 'end_time', $days, $end_time));
if ($shiftsFilter->getStartTime() > $shiftsFilter->getEndTime()) { if ($shiftsFilter->getStartTime() > $shiftsFilter->getEndTime()) {
$shiftsFilter->setEndTime($shiftsFilter->getStartTime() + 24 * 60 * 60); $shiftsFilter->setEndTime($shiftsFilter->getStartTime() + 24 * 60 * 60);
} }
} }
/** /**
@ -68,90 +71,95 @@ function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days) {
* @param string[] $days * @param string[] $days
* An array of available filter days * An array of available filter days
*/ */
function update_ShiftsFilter(ShiftsFilter $shiftsFilter, $user_shifts_admin, $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->setUserShiftsAdmin($user_shifts_admin);
$shiftsFilter->setRooms(check_request_int_array('rooms', $shiftsFilter->getRooms())); $shiftsFilter->setFilled(check_request_int_array('filled', $shiftsFilter->getFilled()));
$shiftsFilter->setTypes(check_request_int_array('types', $shiftsFilter->getTypes())); $shiftsFilter->setRooms(check_request_int_array('rooms', $shiftsFilter->getRooms()));
update_ShiftsFilter_timerange($shiftsFilter, $days); $shiftsFilter->setTypes(check_request_int_array('types', $shiftsFilter->getTypes()));
update_ShiftsFilter_timerange($shiftsFilter, $days);
} }
function load_rooms() { 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) { $rooms = sql_select("SELECT `RID` AS `id`, `Name` AS `name` FROM `Room` WHERE `show`='Y' ORDER BY `Name`");
error(_("The administration has not configured any rooms yet.")); if (count($rooms) == 0) {
redirect('?'); error(_("The administration has not configured any rooms yet."));
} redirect('?');
return $rooms; }
return $rooms;
} }
function load_days() { function load_days()
$days = sql_select_single_col(" {
$days = sql_select_single_col("
SELECT DISTINCT DATE(FROM_UNIXTIME(`start`)) AS `id`, DATE(FROM_UNIXTIME(`start`)) AS `name` SELECT DISTINCT DATE(FROM_UNIXTIME(`start`)) AS `id`, DATE(FROM_UNIXTIME(`start`)) AS `name`
FROM `Shifts` FROM `Shifts`
ORDER BY `start`"); ORDER BY `start`");
if (count($days) == 0) { if (count($days) == 0) {
error(_("The administration has not configured any shifts yet.")); error(_("The administration has not configured any shifts yet."));
redirect('?'); redirect('?');
} }
return $days; return $days;
} }
function load_types() { function load_types()
global $user; {
global $user;
if (sql_num_query("SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0") == 0) { 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.")); error(_("The administration has not configured any angeltypes yet - or you are not subscribed to any angeltype."));
redirect('?'); 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`"); $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)) { if (empty($types)) {
return sql_select("SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0"); return sql_select("SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0");
} }
return $types; return $types;
} }
function view_user_shifts() { function view_user_shifts()
global $user, $privileges; {
global $ical_shifts; global $user, $privileges;
global $ical_shifts;
$ical_shifts = []; $ical_shifts = [];
$days = load_days(); $days = load_days();
$rooms = load_rooms(); $rooms = load_rooms();
$types = load_types(); $types = load_types();
if (! isset($_SESSION['ShiftsFilter'])) { if (! isset($_SESSION['ShiftsFilter'])) {
$room_ids = [ $room_ids = [
$rooms[0]['id'] $rooms[0]['id']
]; ];
$type_ids = array_map('get_ids_from_array', $types); $type_ids = array_map('get_ids_from_array', $types);
$_SESSION['ShiftsFilter'] = new ShiftsFilter(in_array('user_shifts_admin', $privileges), $room_ids, $type_ids); $_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); update_ShiftsFilter($_SESSION['ShiftsFilter'], in_array('user_shifts_admin', $privileges), $days);
$shiftsFilter = $_SESSION['ShiftsFilter']; $shiftsFilter = $_SESSION['ShiftsFilter'];
$shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter); $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter);
if ($user['api_key'] == "") { if ($user['api_key'] == "") {
User_reset_api_key($user, false); User_reset_api_key($user, false);
} }
$filled = [ $filled = [
[ [
'id' => '1', 'id' => '1',
'name' => _("occupied") 'name' => _("occupied")
], ],
[ [
'id' => '0', 'id' => '0',
'name' => _("free") 'name' => _("free")
] ]
]; ];
$start_day = date("Y-m-d", $shiftsFilter->getStartTime()); $start_day = date("Y-m-d", $shiftsFilter->getStartTime());
$start_time = date("H:i", $shiftsFilter->getStartTime()); $start_time = date("H:i", $shiftsFilter->getStartTime());
$end_day = date("Y-m-d", $shiftsFilter->getEndTime()); $end_day = date("Y-m-d", $shiftsFilter->getEndTime());
$end_time = date("H:i", $shiftsFilter->getEndTime()); $end_time = date("H:i", $shiftsFilter->getEndTime());
return page([ return page([
div('col-md-12', [ div('col-md-12', [
msg(), msg(),
template_render(__DIR__ . '/../../templates/user_shifts.html', [ template_render(__DIR__ . '/../../templates/user_shifts.html', [
@ -166,32 +174,33 @@ function view_user_shifts() {
'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>", '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(), '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>', '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") 'filter' => _("Filter")
]) ])
]) ])
]); ]);
} }
function get_ids_from_array($array) { function get_ids_from_array($array)
return $array["id"]; {
return $array["id"];
} }
function make_select($items, $selected, $name, $title = null) { function make_select($items, $selected, $name, $title = null)
$html_items = []; {
if (isset($title)) { $html_items = [];
$html_items[] = '<h4>' . $title . '</h4>' . "\n"; if (isset($title)) {
} $html_items[] = '<h4>' . $title . '</h4>' . "\n";
}
foreach ($items as $i) { 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_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 = '<div id="selection_' . $name . '" class="selection ' . $name . '">' . "\n";
$html .= implode("\n", $html_items); $html .= implode("\n", $html_items);
$html .= buttons([ $html .= buttons([
button("javascript: checkAll('selection_" . $name . "', true)", _("All"), ""), button("javascript: checkAll('selection_" . $name . "', true)", _("All"), ""),
button("javascript: checkAll('selection_" . $name . "', false)", _("None"), "") button("javascript: checkAll('selection_" . $name . "', false)", _("None"), "")
]); ]);
$html .= '</div>' . "\n"; $html .= '</div>' . "\n";
return $html; return $html;
} }
?>

View File

@ -3,21 +3,22 @@
/** /**
* Testet ob ein User eingeloggt ist und lädt die entsprechenden Privilegien * Testet ob ein User eingeloggt ist und lädt die entsprechenden Privilegien
*/ */
function load_auth() { function load_auth()
global $user, $privileges; {
global $user, $privileges;
$user = null; $user = null;
if (isset($_SESSION['uid'])) { if (isset($_SESSION['uid'])) {
$user = sql_select("SELECT * FROM `User` WHERE `UID`='" . sql_escape($_SESSION['uid']) . "' LIMIT 1"); $user = sql_select("SELECT * FROM `User` WHERE `UID`='" . sql_escape($_SESSION['uid']) . "' LIMIT 1");
if (count($user) > 0) { if (count($user) > 0) {
// User ist eingeloggt, Datensatz zur Verfügung stellen und Timestamp updaten // User ist eingeloggt, Datensatz zur Verfügung stellen und Timestamp updaten
list($user) = $user; list($user) = $user;
sql_query("UPDATE `User` SET " . "`lastLogIn` = '" . time() . "'" . " WHERE `UID` = '" . sql_escape($_SESSION['uid']) . "' LIMIT 1;"); sql_query("UPDATE `User` SET " . "`lastLogIn` = '" . time() . "'" . " WHERE `UID` = '" . sql_escape($_SESSION['uid']) . "' LIMIT 1;");
$privileges = privileges_for_user($user['UID']); $privileges = privileges_for_user($user['UID']);
return; return;
}
unset($_SESSION['uid']);
} }
unset($_SESSION['uid']);
}
// guest privileges // guest privileges
$privileges = privileges_for_group(- 1); $privileges = privileges_for_group(- 1);
@ -26,66 +27,70 @@ function load_auth() {
/** /**
* generate a salt (random string) of arbitrary length suitable for the use with crypt() * generate a salt (random string) of arbitrary length suitable for the use with crypt()
*/ */
function generate_salt($length = 16) { function generate_salt($length = 16)
$alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; {
$salt = ""; $alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for ($i = 0; $i < $length; $i ++) { $salt = "";
$salt .= $alphabet[rand(0, strlen($alphabet) - 1)]; for ($i = 0; $i < $length; $i ++) {
} $salt .= $alphabet[rand(0, strlen($alphabet) - 1)];
return $salt; }
return $salt;
} }
/** /**
* set the password of a user * set the password of a user
*/ */
function set_password($uid, $password) { 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"); global $crypt_alg;
if ($result === false) { $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");
engelsystem_error('Unable to update password.'); if ($result === false) {
} engelsystem_error('Unable to update password.');
return $result; }
return $result;
} }
/** /**
* verify a password given a precomputed salt. * verify a password given a precomputed salt.
* if $uid is given and $salt is an old-style salt (plain md5), we convert it automatically * if $uid is given and $salt is an old-style salt (plain md5), we convert it automatically
*/ */
function verify_password($password, $salt, $uid = false) { function verify_password($password, $salt, $uid = false)
global $crypt_alg; {
$correct = false; global $crypt_alg;
if (substr($salt, 0, 1) == '$') { // new-style crypt() $correct = false;
if (substr($salt, 0, 1) == '$') { // new-style crypt()
$correct = crypt($password, $salt) == $salt; $correct = crypt($password, $salt) == $salt;
} elseif (substr($salt, 0, 7) == '{crypt}') { // old-style crypt() with DES and static salt - not used anymore } elseif (substr($salt, 0, 7) == '{crypt}') { // old-style crypt() with DES and static salt - not used anymore
$correct = crypt($password, '77') == $salt; $correct = crypt($password, '77') == $salt;
} elseif (strlen($salt) == 32) { // old-style md5 without salt - not used anymore } elseif (strlen($salt) == 32) { // old-style md5 without salt - not used anymore
$correct = md5($password) == $salt; $correct = md5($password) == $salt;
} }
if ($correct && substr($salt, 0, strlen($crypt_alg)) != $crypt_alg && $uid) { if ($correct && substr($salt, 0, strlen($crypt_alg)) != $crypt_alg && $uid) {
// this password is stored in another format than we want it to be. // this password is stored in another format than we want it to be.
// let's update it! // let's update it!
// we duplicate the query from the above set_password() function to have the extra safety of checking the old hash // 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"); 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; return $correct;
} }
function privileges_for_user($user_id) { 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) . "'"); $privileges = [];
foreach ($user_privs as $user_priv) { $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) . "'");
$privileges[] = $user_priv['name']; foreach ($user_privs as $user_priv) {
} $privileges[] = $user_priv['name'];
return $privileges; }
return $privileges;
} }
function privileges_for_group($group_id) { 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) . "'"); $privileges = [];
foreach ($groups_privs as $guest_priv) { $groups_privs = sql_select("SELECT * FROM `GroupPrivileges` JOIN `Privileges` ON (`GroupPrivileges`.`privilege_id` = `Privileges`.`id`) WHERE `group_id`='" . sql_escape($group_id) . "'");
$privileges[] = $guest_priv['name']; foreach ($groups_privs as $guest_priv) {
} $privileges[] = $guest_priv['name'];
return $privileges; }
return $privileges;
} }
?>

View File

@ -10,15 +10,17 @@
* The value * The value
* @return string rendered html * @return string rendered html
*/ */
function form_hidden($name, $value) { function form_hidden($name, $value)
return '<input type="hidden" name="' . $name . '" value="' . $value . '" />'; {
return '<input type="hidden" name="' . $name . '" value="' . $value . '" />';
} }
/** /**
* Rendert ein Zahlenfeld mit Buttons zum verstellen * Rendert ein Zahlenfeld mit Buttons zum verstellen
*/ */
function form_spinner($name, $label, $value) { function form_spinner($name, $label, $value)
return form_element($label, ' {
return form_element($label, '
<div class="input-group"> <div class="input-group">
<input id="spinner-' . $name . '" class="form-control" type="text" name="' . $name . '" value="' . $value . '" /> <input id="spinner-' . $name . '" class="form-control" type="text" name="' . $name . '" value="' . $value . '" />
<div class="input-group-btn"> <div class="input-group-btn">
@ -54,12 +56,13 @@ function form_spinner($name, $label, $value) {
* Earliest possible date * Earliest possible date
* @return HTML * @return HTML
*/ */
function form_date($name, $label, $value, $start_date = '', $end_date = '') { function form_date($name, $label, $value, $start_date = '', $end_date = '')
$dom_id = $name . '-date'; {
$value = is_numeric($value) ? date('Y-m-d', $value) : ''; $dom_id = $name . '-date';
$start_date = is_numeric($start_date) ? date('Y-m-d', $start_date) : ''; $value = is_numeric($value) ? date('Y-m-d', $value) : '';
$end_date = is_numeric($end_date) ? date('Y-m-d', $end_date) : ''; $start_date = is_numeric($start_date) ? date('Y-m-d', $start_date) : '';
return form_element($label, ' $end_date = is_numeric($end_date) ? date('Y-m-d', $end_date) : '';
return form_element($label, '
<div class="input-group date" id="' . $dom_id . '"> <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> <input type="text" name="' . $name . '" class="form-control" value="' . $value . '"><span class="input-group-addon">' . glyph('th') . '</span>
</div> </div>
@ -89,12 +92,13 @@ function form_date($name, $label, $value, $start_date = '', $end_date = '') {
* @param * @param
* selected Array mit den Keys, die ausgewählt sind * selected Array mit den Keys, die ausgewählt sind
*/ */
function form_checkboxes($name, $label, $items, $selected) { function form_checkboxes($name, $label, $items, $selected)
$html = form_element($label, ''); {
foreach ($items as $key => $item) { $html = form_element($label, '');
$html .= form_checkbox($name . '_' . $key, $item, array_search($key, $selected) !== false); foreach ($items as $key => $item) {
} $html .= form_checkbox($name . '_' . $key, $item, array_search($key, $selected) !== false);
return $html; }
return $html;
} }
/** /**
@ -111,68 +115,74 @@ function form_checkboxes($name, $label, $items, $selected) {
* @param * @param
* disabled Wie selected, nur dass die entsprechenden Checkboxen deaktiviert statt markiert sind * disabled Wie selected, nur dass die entsprechenden Checkboxen deaktiviert statt markiert sind
*/ */
function form_multi_checkboxes($names, $label, $items, $selected, $disabled = []) { function form_multi_checkboxes($names, $label, $items, $selected, $disabled = [])
$html = "<table><thead><tr>"; {
foreach ($names as $title) { $html = "<table><thead><tr>";
$html .= "<th>$title</th>"; 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>';
} }
$html .= '<td><label for="' . $dom_id . '">' . $item . '</label></td></tr>'; $html .= "</tr></thead><tbody>";
} foreach ($items as $key => $item) {
$html .= "</tbody></table>"; $html .= "<tr>";
return form_element($label, $html); 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 .= "</tbody></table>";
return form_element($label, $html);
} }
/** /**
* Rendert eine Checkbox * Rendert eine Checkbox
*/ */
function form_checkbox($name, $label, $selected, $value = 'checked') { 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>'; {
return '<div class="checkbox"><label><input type="checkbox" id="' . $name . '" name="' . $name . '" value="' . $value . '"' . ($selected ? ' checked="checked"' : '') . ' /> ' . $label . '</label></div>';
} }
/** /**
* Rendert einen Radio * Rendert einen Radio
*/ */
function form_radio($name, $label, $selected, $value) { 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>'; {
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 * Rendert einen Infotext in das Formular
*/ */
function form_info($label, $text = "") { function form_info($label, $text = "")
if ($label == "") { {
return '<span class="help-block">' . glyph('info-sign') . $text . '</span>'; if ($label == "") {
} return '<span class="help-block">' . glyph('info-sign') . $text . '</span>';
if ($text == "") { }
return '<h4>' . $label . '</h4>'; if ($text == "") {
} return '<h4>' . $label . '</h4>';
return form_element($label, '<p class="form-control-static">' . $text . '</p>', ''); }
return form_element($label, '<p class="form-control-static">' . $text . '</p>', '');
} }
/** /**
* Rendert den Absenden-Button eines Formulars * Rendert den Absenden-Button eines Formulars
*/ */
function form_submit($name, $label) { function form_submit($name, $label)
return form_element('<input class="btn btn-primary" type="submit" name="' . $name . '" value="' . $label . '" />', ""); {
return form_element('<input class="btn btn-primary" type="submit" name="' . $name . '" value="' . $label . '" />', "");
} }
/** /**
* Rendert ein Formular-Textfeld * Rendert ein Formular-Textfeld
*/ */
function form_text($name, $label, $value, $disabled = false) { 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); $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);
} }
/** /**
@ -187,95 +197,104 @@ function form_text($name, $label, $value, $disabled = false) {
* @param Boolean $disabled * @param Boolean $disabled
* Is the field enabled? * Is the field enabled?
*/ */
function form_text_placeholder($name, $placeholder, $value, $disabled = false) { 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 . '/>'); $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 * Rendert ein Formular-Emailfeld
*/ */
function form_email($name, $label, $value, $disabled = false) { 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); $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 * Rendert ein Formular-Dateifeld
*/ */
function form_file($name, $label) { function form_file($name, $label)
return form_element($label, '<input id="form_' . $name . '" type="file" name="' . $name . '" />', 'form_' . $name); {
return form_element($label, '<input id="form_' . $name . '" type="file" name="' . $name . '" />', 'form_' . $name);
} }
/** /**
* Rendert ein Formular-Passwortfeld * Rendert ein Formular-Passwortfeld
*/ */
function form_password($name, $label, $disabled = false) { 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); $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. * Renders a password input with placeholder instead of label.
*/ */
function form_password_placeholder($name, $placeholder, $disabled = false) { 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); $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 * Rendert ein Formular-Textfeld
*/ */
function form_textarea($name, $label, $value, $disabled = false) { 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); $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 * Rendert ein Formular-Auswahlfeld
*/ */
function form_select($name, $label, $values, $selected) { function form_select($name, $label, $values, $selected)
return form_element($label, html_select_key('form_' . $name, $name, $values, $selected), 'form_' . $name); {
return form_element($label, html_select_key('form_' . $name, $name, $values, $selected), 'form_' . $name);
} }
/** /**
* Rendert ein Formular-Element * Rendert ein Formular-Element
*/ */
function form_element($label, $input, $for = "") { function form_element($label, $input, $for = "")
if ($label == '') { {
return '<div class="form-group">' . $input . '</div>'; if ($label == '') {
} return '<div class="form-group">' . $input . '</div>';
}
return '<div class="form-group">' . '<label for="' . $for . '">' . $label . '</label>' . $input . '</div>'; return '<div class="form-group">' . '<label for="' . $for . '">' . $label . '</label>' . $input . '</div>';
} }
/** /**
* Rendert ein Formular * Rendert ein Formular
*/ */
function form($elements, $action = "") { function form($elements, $action = "")
return '<form role="form" action="' . $action . '" enctype="multipart/form-data" method="post">' . join($elements) . '</form>'; {
return '<form role="form" action="' . $action . '" enctype="multipart/form-data" method="post">' . join($elements) . '</form>';
} }
function html_options($name, $options, $selected = "") { function html_options($name, $options, $selected = "")
$html = ""; {
foreach ($options as $value => $label) { $html = "";
$html .= '<input type="radio"' . ($value == $selected ? ' checked="checked"' : '') . ' name="' . $name . '" value="' . $value . '"> ' . $label; 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>';
} }
}
$html .= '</select>'; return $html;
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>';
}
}
$html .= '</select>';
return $html;
}

View File

@ -7,24 +7,26 @@
* @param * @param
* $message * $message
*/ */
function engelsystem_log($message) { function engelsystem_log($message)
global $user; {
global $user;
$nick = "Guest"; $nick = "Guest";
if (isset($user)) { if (isset($user)) {
$nick = User_Nick_render($user); $nick = User_Nick_render($user);
} }
LogEntry_create($nick, $message); LogEntry_create($nick, $message);
} }
/** /**
* Generates a PHP Stacktrace. * Generates a PHP Stacktrace.
*/ */
function debug_string_backtrace() { function debug_string_backtrace()
ob_start(); {
debug_print_backtrace(); ob_start();
$trace = ob_get_contents(); debug_print_backtrace();
ob_end_clean(); $trace = ob_get_contents();
ob_end_clean();
// Remove first item from backtrace as it's this function which // Remove first item from backtrace as it's this function which
// is redundant. // is redundant.
@ -35,5 +37,3 @@ function debug_string_backtrace() {
return $trace; return $trace;
} }
?>

View File

@ -1,120 +1,126 @@
<?php <?php
use Engelsystem\UserHintsRenderer; use Engelsystem\UserHintsRenderer;
function page_link_to($page = "") { function page_link_to($page = "")
if ($page == "") { {
return '?'; if ($page == "") {
} return '?';
return '?p=' . $page; }
return '?p=' . $page;
} }
function page_link_to_absolute($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); {
return (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . preg_replace("/\?.*$/", '', $_SERVER['REQUEST_URI']) . page_link_to($page);
} }
/** /**
* Render the user hints * Render the user hints
*/ */
function header_render_hints() { function header_render_hints()
global $user; {
global $user;
$hints_renderer = new UserHintsRenderer(); $hints_renderer = new UserHintsRenderer();
if (isset($user)) { if (isset($user)) {
$hints_renderer->addHint(admin_new_questions()); $hints_renderer->addHint(admin_new_questions());
$hints_renderer->addHint(user_angeltypes_unconfirmed_hint()); $hints_renderer->addHint(user_angeltypes_unconfirmed_hint());
$hints_renderer->addHint(render_user_departure_date_hint()); $hints_renderer->addHint(render_user_departure_date_hint());
$hints_renderer->addHint(user_driver_license_required_hint()); $hints_renderer->addHint(user_driver_license_required_hint());
// Important hints: // Important hints:
$hints_renderer->addHint(render_user_freeloader_hint(), true); $hints_renderer->addHint(render_user_freeloader_hint(), true);
$hints_renderer->addHint(render_user_arrived_hint(), true); $hints_renderer->addHint(render_user_arrived_hint(), true);
$hints_renderer->addHint(render_user_tshirt_hint(), true); $hints_renderer->addHint(render_user_tshirt_hint(), true);
$hints_renderer->addHint(render_user_dect_hint(), true); $hints_renderer->addHint(render_user_dect_hint(), true);
} }
return $hints_renderer->render(); return $hints_renderer->render();
} }
/** /**
* Renders the header toolbar containing search, login/logout, user and settings links. * Renders the header toolbar containing search, login/logout, user and settings links.
*/ */
function header_toolbar() { function header_toolbar()
global $page, $privileges, $user; {
global $page, $privileges, $user;
$toolbar_items = []; $toolbar_items = [];
if (isset($user)) { if (isset($user)) {
$toolbar_items[] = toolbar_item_link(page_link_to('shifts') . '&amp;action=next', 'time', User_shift_state_render($user)); $toolbar_items[] = toolbar_item_link(page_link_to('shifts') . '&amp;action=next', 'time', User_shift_state_render($user));
} }
if (! isset($user) && in_array('register', $privileges)) { if (! isset($user) && in_array('register', $privileges)) {
$toolbar_items[] = toolbar_item_link(page_link_to('register'), 'plus', register_title(), $page == 'register'); $toolbar_items[] = toolbar_item_link(page_link_to('register'), 'plus', register_title(), $page == 'register');
} }
if (in_array('login', $privileges)) { if (in_array('login', $privileges)) {
$toolbar_items[] = toolbar_item_link(page_link_to('login'), 'log-in', login_title(), $page == 'login'); $toolbar_items[] = toolbar_item_link(page_link_to('login'), 'log-in', login_title(), $page == 'login');
} }
if (isset($user) && in_array('user_messages', $privileges)) { if (isset($user) && in_array('user_messages', $privileges)) {
$toolbar_items[] = toolbar_item_link(page_link_to('user_messages'), 'envelope', user_unread_messages()); $toolbar_items[] = toolbar_item_link(page_link_to('user_messages'), 'envelope', user_unread_messages());
} }
$toolbar_items[] = header_render_hints(); $toolbar_items[] = header_render_hints();
if (in_array('user_myshifts', $privileges)) { if (in_array('user_myshifts', $privileges)) {
$toolbar_items[] = toolbar_item_link(page_link_to('users') . '&amp;action=view', ' icon-icon_angel', $user['Nick'], $page == 'users'); $toolbar_items[] = toolbar_item_link(page_link_to('users') . '&amp;action=view', ' icon-icon_angel', $user['Nick'], $page == 'users');
} }
$user_submenu = make_user_submenu(); $user_submenu = make_user_submenu();
if (count($user_submenu) > 0) { if (count($user_submenu) > 0) {
$toolbar_items[] = toolbar_dropdown('', '', $user_submenu); $toolbar_items[] = toolbar_dropdown('', '', $user_submenu);
} }
return toolbar($toolbar_items, true); return toolbar($toolbar_items, true);
} }
function make_user_submenu() { function make_user_submenu()
global $privileges, $page; {
global $privileges, $page;
$user_submenu = make_langselect(); $user_submenu = make_langselect();
if (in_array('user_settings', $privileges) || in_array('logout', $privileges)) { if (in_array('user_settings', $privileges) || in_array('logout', $privileges)) {
$user_submenu[] = toolbar_item_divider(); $user_submenu[] = toolbar_item_divider();
} }
if (in_array('user_settings', $privileges)) { if (in_array('user_settings', $privileges)) {
$user_submenu[] = toolbar_item_link(page_link_to('user_settings'), 'list-alt', settings_title(), $page == 'user_settings'); $user_submenu[] = toolbar_item_link(page_link_to('user_settings'), 'list-alt', settings_title(), $page == 'user_settings');
} }
if (in_array('logout', $privileges)) { if (in_array('logout', $privileges)) {
$user_submenu[] = toolbar_item_link(page_link_to('logout'), 'log-out', logout_title(), $page == 'logout'); $user_submenu[] = toolbar_item_link(page_link_to('logout'), 'log-out', logout_title(), $page == 'logout');
} }
return $user_submenu; return $user_submenu;
} }
function make_navigation() { function make_navigation()
global $page, $privileges; {
global $page, $privileges;
$menu = []; $menu = [];
$pages = [ $pages = [
"news" => news_title(), "news" => news_title(),
"user_meetings" => meetings_title(), "user_meetings" => meetings_title(),
"user_shifts" => shifts_title(), "user_shifts" => shifts_title(),
"angeltypes" => angeltypes_title(), "angeltypes" => angeltypes_title(),
"user_questions" => questions_title() "user_questions" => questions_title()
]; ];
foreach ($pages as $menu_page => $title) { foreach ($pages as $menu_page => $title) {
if (in_array($menu_page, $privileges)) { if (in_array($menu_page, $privileges)) {
$menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page); $menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page);
}
} }
}
$menu = make_room_navigation($menu); $menu = make_room_navigation($menu);
$admin_menu = []; $admin_menu = [];
$admin_pages = [ $admin_pages = [
"admin_arrive" => admin_arrive_title(), "admin_arrive" => admin_arrive_title(),
"admin_active" => admin_active_title(), "admin_active" => admin_active_title(),
"admin_user" => admin_user_title(), "admin_user" => admin_user_title(),
@ -126,20 +132,20 @@ function make_navigation() {
"admin_groups" => admin_groups_title(), "admin_groups" => admin_groups_title(),
"admin_import" => admin_import_title(), "admin_import" => admin_import_title(),
"admin_log" => admin_log_title(), "admin_log" => admin_log_title(),
"admin_event_config" => event_config_title() "admin_event_config" => event_config_title()
]; ];
foreach ($admin_pages as $menu_page => $title) { foreach ($admin_pages as $menu_page => $title) {
if (in_array($menu_page, $privileges)) { if (in_array($menu_page, $privileges)) {
$admin_menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page); $admin_menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page);
}
} }
}
if (count($admin_menu) > 0) { if (count($admin_menu) > 0) {
$menu[] = toolbar_dropdown('', _("Admin"), $admin_menu); $menu[] = toolbar_dropdown('', _("Admin"), $admin_menu);
} }
return toolbar($menu); return toolbar($menu);
} }
/** /**
@ -148,32 +154,32 @@ function make_navigation() {
* @param string[] $menu * @param string[] $menu
* Rendered menu * Rendered menu
*/ */
function make_room_navigation($menu) { function make_room_navigation($menu)
global $privileges; {
global $privileges;
if (! in_array('view_rooms', $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; 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;
} }
function make_menu() { function make_menu()
return make_navigation(); {
return make_navigation();
} }
?>

View File

@ -17,18 +17,19 @@ use Engelsystem\ValidationResult;
* @param int $default_value * @param int $default_value
* Default value unix timestamp * Default value unix timestamp
*/ */
function check_request_datetime($date_name, $time_name, $allowed_days, $default_value) { 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); $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]))) { if (isset($_REQUEST[$time_name]) && preg_match('#^\d{1,2}:\d\d$#', trim($_REQUEST[$time_name]))) {
$time = trim($_REQUEST[$time_name]); $time = trim($_REQUEST[$time_name]);
} }
if (isset($_REQUEST[$date_name]) && in_array($_REQUEST[$date_name], $allowed_days)) { if (isset($_REQUEST[$date_name]) && in_array($_REQUEST[$date_name], $allowed_days)) {
$day = $_REQUEST[$date_name]; $day = $_REQUEST[$date_name];
} }
return parse_date("Y-m-d H:i", $day . " " . $time); return parse_date("Y-m-d H:i", $day . " " . $time);
} }
/** /**
@ -40,20 +41,22 @@ function check_request_datetime($date_name, $time_name, $allowed_days, $default_
* The string to parse * The string to parse
* @return The parsed unix timestamp * @return The parsed unix timestamp
*/ */
function parse_date($pattern, $value) { function parse_date($pattern, $value)
$datetime = DateTime::createFromFormat($pattern, trim($value)); {
if ($datetime == null) { $datetime = DateTime::createFromFormat($pattern, trim($value));
return null; if ($datetime == null) {
} return null;
return $datetime->getTimestamp(); }
return $datetime->getTimestamp();
} }
/** /**
* Leitet den Browser an die übergebene URL weiter und hält das Script an. * Leitet den Browser an die übergebene URL weiter und hält das Script an.
*/ */
function redirect($url) { function redirect($url)
header("Location: " . $url, true, 302); {
raw_output(""); header("Location: " . $url, true, 302);
raw_output("");
} }
/** /**
@ -62,9 +65,10 @@ function redirect($url) {
* @param String $output * @param String $output
* String to display * String to display
*/ */
function raw_output($output) { function raw_output($output)
echo $output; {
die(); echo $output;
die();
} }
/** /**
@ -77,12 +81,13 @@ function raw_output($output) {
* @param string $value_name * @param string $value_name
* name of the column to use as displayed value * name of the column to use as displayed value
*/ */
function select_array($data, $key_name, $value_name) { function select_array($data, $key_name, $value_name)
$ret = []; {
foreach ($data as $value) { $ret = [];
$ret[$value[$key_name]] = $value[$value_name]; foreach ($data as $value) {
} $ret[$value[$key_name]] = $value[$value_name];
return $ret; }
return $ret;
} }
/** /**
@ -93,11 +98,12 @@ function select_array($data, $key_name, $value_name) {
* @param array<int> $default * @param array<int> $default
* Default return value, if param is not set * Default return value, if param is not set
*/ */
function check_request_int_array($name, $default = []) { function check_request_int_array($name, $default = [])
if (isset($_REQUEST[$name]) && is_array($_REQUEST[$name])) { {
return array_filter($_REQUEST[$name], 'is_numeric'); if (isset($_REQUEST[$name]) && is_array($_REQUEST[$name])) {
} return array_filter($_REQUEST[$name], 'is_numeric');
return $default; }
return $default;
} }
/** /**
@ -112,11 +118,12 @@ function check_request_int_array($name, $default = []) {
* is a null value allowed? * is a null value allowed?
* @return ValidationResult containing the parsed date * @return ValidationResult containing the parsed date
*/ */
function check_request_date($name, $error_message = null, $null_allowed = false) { function check_request_date($name, $error_message = null, $null_allowed = false)
if (! isset($_REQUEST[$name])) { {
return new ValidationResult($null_allowed, null); if (! isset($_REQUEST[$name])) {
} return new ValidationResult($null_allowed, null);
return check_date($_REQUEST[$name], $error_message, $null_allowed); }
return check_date($_REQUEST[$name], $error_message, $null_allowed);
} }
/** /**
@ -131,61 +138,65 @@ function check_request_date($name, $error_message = null, $null_allowed = false)
* is a null value allowed? * is a null value allowed?
* @return ValidationResult containing the parsed date * @return ValidationResult containing the parsed date
*/ */
function check_date($input, $error_message = null, $null_allowed = false) { 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 ($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); if ($null_allowed) {
} return new ValidationResult(true, null);
}
error($error_message); error($error_message);
return new ValidationResult(false, null); return new ValidationResult(false, null);
} }
/** /**
* Returns REQUEST value filtered or default value (null) if not set. * Returns REQUEST value filtered or default value (null) if not set.
*/ */
function strip_request_item($name, $default_value = null) { function strip_request_item($name, $default_value = null)
if (isset($_REQUEST[$name])) { {
return strip_item($_REQUEST[$name]); if (isset($_REQUEST[$name])) {
} return strip_item($_REQUEST[$name]);
return $default_value; }
return $default_value;
} }
/** /**
* Testet, ob der angegebene REQUEST Wert ein Integer ist, bzw. * Testet, ob der angegebene REQUEST Wert ein Integer ist, bzw.
* eine ID sein könnte. * eine ID sein könnte.
*/ */
function test_request_int($name) { function test_request_int($name)
if (isset($_REQUEST[$name])) { {
return preg_match("/^[0-9]*$/", $_REQUEST[$name]); if (isset($_REQUEST[$name])) {
} return preg_match("/^[0-9]*$/", $_REQUEST[$name]);
return false; }
return false;
} }
/** /**
* Gibt den gefilterten REQUEST Wert mit Zeilenumbrüchen zurück * Gibt den gefilterten REQUEST Wert mit Zeilenumbrüchen zurück
*/ */
function strip_request_item_nl($name, $default_value = null) { 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])); 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; }
return $default_value;
} }
/** /**
* Entfernt unerwünschte Zeichen * Entfernt unerwünschte Zeichen
*/ */
function strip_item($item) { function strip_item($item)
return preg_replace("/([^\p{L}\p{S}\p{P}\p{Z}\p{N}+]{1,})/ui", '', strip_tags($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. * Überprüft eine E-Mail-Adresse.
*/ */
function check_email($email) { function check_email($email)
return (bool) filter_var($email, FILTER_VALIDATE_EMAIL); {
return (bool) filter_var($email, FILTER_VALIDATE_EMAIL);
} }
?>

View File

@ -8,16 +8,17 @@ $themes = [
'3' => "Engelsystem 32c3 (2015)", '3' => "Engelsystem 32c3 (2015)",
"2" => "Engelsystem cccamp15", "2" => "Engelsystem cccamp15",
"0" => "Engelsystem light", "0" => "Engelsystem light",
"1" => "Engelsystem dark" "1" => "Engelsystem dark"
]; ];
/** /**
* Display muted (grey) text. * Display muted (grey) text.
* *
* @param string $text * @param string $text
*/ */
function mute($text) { function mute($text)
return '<span class="text-muted">' . $text . '</span>'; {
return '<span class="text-muted">' . $text . '</span>';
} }
/** /**
@ -28,84 +29,96 @@ function mute($text) {
* @param string $class * @param string $class
* default, primary, info, success, warning, danger * default, primary, info, success, warning, danger
*/ */
function label($content, $class = 'default') { function label($content, $class = 'default')
return '<span class="label label-' . $class . '">' . $content . '</span>'; {
return '<span class="label label-' . $class . '">' . $content . '</span>';
} }
function progress_bar($valuemin, $valuemax, $valuenow, $class = '', $content = '') { 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>'; {
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 * Render glyphicon
* *
* @param string $glyph_name * @param string $glyph_name
*/ */
function glyph($glyph_name) { function glyph($glyph_name)
return ' <span class="glyphicon glyphicon-' . $glyph_name . '"></span> '; {
return ' <span class="glyphicon glyphicon-' . $glyph_name . '"></span> ';
} }
/** /**
* Renders a tick or a cross by given boolean * Renders a tick or a cross by given boolean
* *
* @param boolean $boolean * @param boolean $boolean
*/ */
function glyph_bool($boolean) { function glyph_bool($boolean)
return '<span class="text-' . ($boolean ? 'success' : 'danger') . '">' . glyph($boolean ? 'ok' : 'remove') . '</span>'; {
return '<span class="text-' . ($boolean ? 'success' : 'danger') . '">' . glyph($boolean ? 'ok' : 'remove') . '</span>';
} }
function div($class, $content = [], $dom_id = "") { function div($class, $content = [], $dom_id = "")
if (is_array($content)) { {
$content = join("\n", $content); if (is_array($content)) {
} $content = join("\n", $content);
$dom_id = $dom_id != '' ? ' id="' . $dom_id . '"' : ''; }
return '<div' . $dom_id . ' class="' . $class . '">' . $content . '</div>'; $dom_id = $dom_id != '' ? ' id="' . $dom_id . '"' : '';
return '<div' . $dom_id . ' class="' . $class . '">' . $content . '</div>';
} }
function heading($content, $number = 1) { function heading($content, $number = 1)
return "<h" . $number . ">" . $content . "</h" . $number . ">"; {
return "<h" . $number . ">" . $content . "</h" . $number . ">";
} }
/** /**
* Render a toolbar. * Render a toolbar.
* *
* @param array $items * @param array $items
* @return string * @return string
*/ */
function toolbar($items = [], $right = false) { function toolbar($items = [], $right = false)
return '<ul class="nav navbar-nav' . ($right ? ' navbar-right' : '') . '">' . join("\n", $items) . '</ul>'; {
return '<ul class="nav navbar-nav' . ($right ? ' navbar-right' : '') . '">' . join("\n", $items) . '</ul>';
} }
function toolbar_pills($items) { function toolbar_pills($items)
return '<ul class="nav nav-pills">' . join("\n", $items) . '</ul>'; {
return '<ul class="nav nav-pills">' . join("\n", $items) . '</ul>';
} }
/** /**
* Render a link for a toolbar. * Render a link for a toolbar.
* *
* @param string $href * @param string $href
* @param string $glyphicon * @param string $glyphicon
* @param string $label * @param string $label
* @param bool $selected * @param bool $selected
* @return string * @return string
*/ */
function toolbar_item_link($href, $glyphicon, $label, $selected = false) { 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>'; {
return '<li class="' . ($selected ? 'active' : '') . '"><a href="' . $href . '">' . ($glyphicon != '' ? '<span class="glyphicon glyphicon-' . $glyphicon . '"></span> ' : '') . $label . '</a></li>';
} }
function toolbar_item_divider() { function toolbar_item_divider()
return '<li class="divider"></li>'; {
return '<li class="divider"></li>';
} }
function toolbar_dropdown($glyphicon, $label, $submenu, $class = '') { function toolbar_dropdown($glyphicon, $label, $submenu, $class = '')
return '<li class="dropdown ' . $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> <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>'; <ul class="dropdown-menu" role="menu">' . join("\n", $submenu) . '</ul></li>';
} }
function toolbar_popover($glyphicon, $label, $content, $class = '') { function toolbar_popover($glyphicon, $label, $content, $class = '')
$dom_id = md5(microtime() . $glyphicon . $label); {
return '<li class="dropdown messages ' . $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> <a id="' . $dom_id . '" href="#" tabindex="0">' . ($glyphicon != '' ? '<span class="glyphicon glyphicon-' . $glyphicon . '"></span> ' : '') . $label . ' <span class="caret"></span></a>
<script type="text/javascript"> <script type="text/javascript">
$(function(){ $(function(){
@ -125,154 +138,165 @@ function toolbar_popover($glyphicon, $label, $content, $class = '') {
* Generiert HTML Code für eine "Seite". * Generiert HTML Code für eine "Seite".
* Fügt dazu die übergebenen Elemente zusammen. * Fügt dazu die übergebenen Elemente zusammen.
*/ */
function page($elements) { function page($elements)
return join($elements); {
return join($elements);
} }
/** /**
* Generiert HTML Code für eine "Seite" mit zentraler Überschrift * Generiert HTML Code für eine "Seite" mit zentraler Überschrift
* Fügt dazu die übergebenen Elemente zusammen. * Fügt dazu die übergebenen Elemente zusammen.
*/ */
function page_with_title($title, $elements) { function page_with_title($title, $elements)
return '<div class="col-md-12"><h1>' . $title . '</h1>' . join($elements) . '</div>'; {
return '<div class="col-md-12"><h1>' . $title . '</h1>' . join($elements) . '</div>';
} }
/** /**
* Rendert eine Datentabelle * Rendert eine Datentabelle
*/ */
function table($columns, $rows_raw, $data = true) { function table($columns, $rows_raw, $data = true)
// If only one column is given {
// If only one column is given
if (! is_array($columns)) { if (! is_array($columns)) {
$rows = []; $rows = [];
foreach ($rows_raw as $row) { foreach ($rows_raw as $row) {
$rows[] = [ $rows[] = [
'col' => $row 'col' => $row
]; ];
} }
return render_table([ return render_table([
'col' => $columns 'col' => $columns
], $rows, $data); ], $rows, $data);
} }
return render_table($columns, $rows_raw, $data); return render_table($columns, $rows_raw, $data);
} }
/** /**
* Helper for rendering a html-table. * Helper for rendering a html-table.
* use table() * use table()
*/ */
function render_table($columns, $rows, $data = true) { function render_table($columns, $rows, $data = true)
if (count($rows) == 0) { {
return info(_("No data found."), 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>';
foreach ($columns as $key => $column) {
$value = "&nbsp;";
if (isset($row[$key])) {
$value = $row[$key];
}
$html .= '<td class="column_' . $key . '">' . $value . '</td>';
} }
$html .= '</tr>';
} $html = '<table class="table table-striped' . ($data ? ' data' : '') . '">';
$html .= '</tbody>'; $html .= '<thead><tr>';
$html .= '</table>'; foreach ($columns as $key => $column) {
return $html; $html .= '<th class="column_' . $key . '">' . $column . '</th>';
}
$html .= '</tr></thead>';
$html .= '<tbody>';
foreach ($rows as $row) {
$html .= '<tr>';
foreach ($columns as $key => $column) {
$value = "&nbsp;";
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 * Rendert einen Knopf
*/ */
function button($href, $label, $class = "") { function button($href, $label, $class = "")
return '<a href="' . $href . '" class="btn btn-default ' . $class . '">' . $label . '</a>'; {
return '<a href="' . $href . '" class="btn btn-default ' . $class . '">' . $label . '</a>';
} }
/** /**
* Rendert einen Knopf mit Glyph * Rendert einen Knopf mit Glyph
*/ */
function button_glyph($href, $glyph, $class = "") { function button_glyph($href, $glyph, $class = "")
return button($href, glyph($glyph), $class); {
return button($href, glyph($glyph), $class);
} }
/** /**
* Rendert eine Toolbar mit Knöpfen * Rendert eine Toolbar mit Knöpfen
*/ */
function buttons($buttons = []) { function buttons($buttons = [])
return '<div class="form-group">' . table_buttons($buttons) . '</div>'; {
return '<div class="form-group">' . table_buttons($buttons) . '</div>';
} }
function table_buttons($buttons = []) { function table_buttons($buttons = [])
return '<div class="btn-group">' . join(' ', $buttons) . '</div>'; {
return '<div class="btn-group">' . join(' ', $buttons) . '</div>';
} }
// Load and render template // Load and render template
function template_render($file, $data) { function template_render($file, $data)
if (file_exists($file)) { {
$template = file_get_contents($file); if (file_exists($file)) {
if (is_array($data)) { $template = file_get_contents($file);
foreach ($data as $name => $content) { if (is_array($data)) {
$template = str_replace("%" . $name . "%", $content, $template); foreach ($data as $name => $content) {
} $template = str_replace("%" . $name . "%", $content, $template);
}
}
return $template;
} }
return $template; engelsystem_error("Cannot find template file &laquo;" . $file . "&raquo;.");
}
engelsystem_error("Cannot find template file &laquo;" . $file . "&raquo;.");
} }
function shorten($str, $length = 50) { function shorten($str, $length = 50)
if (strlen($str) < $length) { {
return $str; 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>";
} }
$html .= "</tr>"; return '<span title="' . htmlentities($str, ENT_COMPAT, 'UTF-8') . '">' . substr($str, 0, $length - 3) . '...</span>';
}
return $html;
} }
function ReplaceSmilies($neueckig) { function table_body($array)
$neueckig = str_replace(";o))", "<img src=\"pic/smiles/icon_redface.gif\">", $neueckig); {
$neueckig = str_replace(":-))", "<img src=\"pic/smiles/icon_redface.gif\">", $neueckig); $html = "";
$neueckig = str_replace(";o)", "<img src=\"pic/smiles/icon_wind.gif\">", $neueckig); foreach ($array as $line) {
$neueckig = str_replace(":)", "<img src=\"pic/smiles/icon_smile.gif\">", $neueckig); $html .= "<tr>";
$neueckig = str_replace(":-)", "<img src=\"pic/smiles/icon_smile.gif\">", $neueckig); if (is_array($line)) {
$neueckig = str_replace(":(", "<img src=\"pic/smiles/icon_sad.gif\">", $neueckig); foreach ($line as $td) {
$neueckig = str_replace(":-(", "<img src=\"pic/smiles/icon_sad.gif\">", $neueckig); $html .= "<td>" . $td . "</td>";
$neueckig = str_replace(":o(", "<img src=\"pic/smiles/icon_sad.gif\">", $neueckig); }
$neueckig = str_replace(":o)", "<img src=\"pic/smiles/icon_lol.gif\">", $neueckig); } else {
$neueckig = str_replace(";o(", "<img src=\"pic/smiles/icon_cry.gif\">", $neueckig); $html .= "<td>" . $line . "</td>";
$neueckig = str_replace(";(", "<img src=\"pic/smiles/icon_cry.gif\">", $neueckig); }
$neueckig = str_replace(";-(", "<img src=\"pic/smiles/icon_cry.gif\">", $neueckig); $html .= "</tr>";
$neueckig = str_replace("8)", "<img src=\"pic/smiles/icon_rolleyes.gif\">", $neueckig); }
$neueckig = str_replace("8o)", "<img src=\"pic/smiles/icon_rolleyes.gif\">", $neueckig); return $html;
$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); function ReplaceSmilies($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(";o))", "<img src=\"pic/smiles/icon_redface.gif\">", $neueckig);
$neueckig = str_replace("?)", "<img src=\"pic/smiles/icon_question.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; return $neueckig;
} }
?>

View File

@ -7,10 +7,11 @@
/** /**
* Renders the angeltypes name as link. * Renders the angeltypes name as link.
* *
* @param AngelType $angeltype * @param AngelType $angeltype
*/ */
function AngelType_name_render($angeltype) { function AngelType_name_render($angeltype)
return '<a href="' . angeltype_link($angeltype['id']) . '">' . ($angeltype['restricted'] ? glyph('lock') : '') . $angeltype['name'] . '</a>'; {
return '<a href="' . angeltype_link($angeltype['id']) . '">' . ($angeltype['restricted'] ? glyph('lock') : '') . $angeltype['name'] . '</a>';
} }
/** /**
@ -20,30 +21,32 @@ function AngelType_name_render($angeltype) {
* UserAngelType and AngelType * UserAngelType and AngelType
* @return string * @return string
*/ */
function AngelType_render_membership($user_angeltype) { function AngelType_render_membership($user_angeltype)
if ($user_angeltype['user_angeltype_id'] != null) { {
if ($user_angeltype['restricted']) { if ($user_angeltype['user_angeltype_id'] != null) {
if ($user_angeltype['confirm_user_id'] == null) { if ($user_angeltype['restricted']) {
return glyph('lock') . _("Unconfirmed"); if ($user_angeltype['confirm_user_id'] == null) {
} elseif ($user_angeltype['supporter']) { return glyph('lock') . _("Unconfirmed");
return glyph_bool(true) . _("supporter"); } elseif ($user_angeltype['supporter']) {
} return glyph_bool(true) . _("supporter");
return glyph_bool(true) . _("Member"); }
} elseif ($user_angeltype['supporter']) { return glyph_bool(true) . _("Member");
return glyph_bool(true) . _("supporter"); } 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) { function AngelType_delete_view($angeltype)
return page_with_title(sprintf(_("Delete angeltype %s"), $angeltype['name']), [ {
return page_with_title(sprintf(_("Delete angeltype %s"), $angeltype['name']), [
info(sprintf(_("Do you want to delete angeltype %s?"), $angeltype['name']), true), info(sprintf(_("Do you want to delete angeltype %s?"), $angeltype['name']), true),
buttons([ buttons([
button(page_link_to('angeltypes'), _("cancel"), 'cancel'), button(page_link_to('angeltypes'), _("cancel"), 'cancel'),
button(page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'] . '&confirmed', _("delete"), 'ok') button(page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'] . '&confirmed', _("delete"), 'ok')
]) ])
]); ]);
} }
@ -55,11 +58,12 @@ function AngelType_delete_view($angeltype) {
* @param boolean $supporter_mode * @param boolean $supporter_mode
* Is the user a supporter of this angeltype? * Is the user a supporter of this angeltype?
*/ */
function AngelType_edit_view($angeltype, $supporter_mode) { function AngelType_edit_view($angeltype, $supporter_mode)
$contact_info = AngelType_contact_info($angeltype); {
return page_with_title(sprintf(_("Edit %s"), $angeltype['name']), [ $contact_info = AngelType_contact_info($angeltype);
return page_with_title(sprintf(_("Edit %s"), $angeltype['name']), [
buttons([ buttons([
button(page_link_to('angeltypes'), _("Angeltypes"), 'back') button(page_link_to('angeltypes'), _("Angeltypes"), 'back')
]), ]),
msg(), msg(),
form([ form([
@ -73,44 +77,45 @@ function AngelType_edit_view($angeltype, $supporter_mode) {
form_info("", _("Restricted angel types can only be used by an angel if enabled by a supporter (double opt-in).")), 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_textarea('description', _("Description"), $angeltype['description']),
form_info("", _("Please use markdown for the description.")), form_info("", _("Please use markdown for the description.")),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]) ])
]); ]);
} }
/** /**
* Renders the buttons for the angeltype view. * Renders the buttons for the angeltype view.
*/ */
function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user) { function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user)
$buttons = [ {
button(page_link_to('angeltypes'), _("Angeltypes"), 'back') $buttons = [
button(page_link_to('angeltypes'), _("Angeltypes"), 'back')
]; ];
if ($angeltype['requires_driver_license']) { if ($angeltype['requires_driver_license']) {
$buttons[] = button(user_driver_license_edit_link($user), glyph("road") . _("my driving 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 ($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) { 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'])); 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');
} }
$buttons[] = button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $user_angeltype['id'], _("leave"), 'cancel');
}
if ($admin_angeltypes || $supporter) { if ($admin_angeltypes || $supporter) {
$buttons[] = button(page_link_to('angeltypes') . '&action=edit&angeltype_id=' . $angeltype['id'], _("edit"), 'edit'); $buttons[] = button(page_link_to('angeltypes') . '&action=edit&angeltype_id=' . $angeltype['id'], _("edit"), 'edit');
} }
if ($admin_angeltypes) { if ($admin_angeltypes) {
$buttons[] = button(page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'], _("delete"), 'delete'); $buttons[] = button(page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'], _("delete"), 'delete');
} }
return buttons($buttons); return buttons($buttons);
} }
/** /**
@ -118,62 +123,64 @@ function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes,
* *
* @return [supporters, members, unconfirmed members] * @return [supporters, members, unconfirmed members]
*/ */
function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $admin_angeltypes) { function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $admin_angeltypes)
$supporters = []; {
$members_confirmed = []; $supporters = [];
$members_unconfirmed = []; $members_confirmed = [];
foreach ($members as $member) { $members_unconfirmed = [];
$member['Nick'] = User_Nick_render($member); foreach ($members as $member) {
$member['Nick'] = User_Nick_render($member);
if ($angeltype['requires_driver_license']) { if ($angeltype['requires_driver_license']) {
$member['wants_to_drive'] = glyph_bool($member['user_id']); $member['wants_to_drive'] = glyph_bool($member['user_id']);
$member['has_car'] = glyph_bool($member['has_car']); $member['has_car'] = glyph_bool($member['has_car']);
$member['has_license_car'] = glyph_bool($member['has_license_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_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_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_12_5t_truck'] = glyph_bool($member['has_license_12_5t_truck']);
$member['has_license_forklift'] = glyph_bool($member['has_license_forklift']); $member['has_license_forklift'] = glyph_bool($member['has_license_forklift']);
} }
if ($angeltype['restricted'] && $member['confirm_user_id'] == null) { if ($angeltype['restricted'] && $member['confirm_user_id'] == null) {
$member['actions'] = table_buttons([ $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=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') button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $member['user_angeltype_id'], _("deny"), 'btn-xs')
]); ]);
$members_unconfirmed[] = $member; $members_unconfirmed[] = $member;
} elseif ($member['supporter']) { } elseif ($member['supporter']) {
if ($admin_angeltypes) { if ($admin_angeltypes) {
$member['actions'] = table_buttons([ $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') button(page_link_to('user_angeltypes') . '&action=update&user_angeltype_id=' . $member['user_angeltype_id'] . '&supporter=0', _("Remove supporter rights"), 'btn-xs')
]); ]);
} else { } else {
$member['actions'] = ''; $member['actions'] = '';
} }
$supporters[] = $member; $supporters[] = $member;
} else { } else {
if ($admin_user_angeltypes) { if ($admin_user_angeltypes) {
$member['actions'] = table_buttons([ $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') : '', $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') button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $member['user_angeltype_id'], _("remove"), 'btn-xs')
]); ]);
} }
$members_confirmed[] = $member; $members_confirmed[] = $member;
}
} }
}
return [ return [
$supporters, $supporters,
$members_confirmed, $members_confirmed,
$members_unconfirmed $members_unconfirmed
]; ];
} }
/** /**
* Creates the needed member table headers according to given rights and settings from the angeltype. * Creates the needed member table headers according to given rights and settings from the angeltype.
*/ */
function AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes) { function AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes)
if ($angeltype['requires_driver_license'] && ($supporter || $admin_angeltypes)) { {
return [ if ($angeltype['requires_driver_license'] && ($supporter || $admin_angeltypes)) {
return [
'Nick' => _("Nick"), 'Nick' => _("Nick"),
'DECT' => _("DECT"), 'DECT' => _("DECT"),
'wants_to_drive' => _("Driver"), 'wants_to_drive' => _("Driver"),
@ -183,147 +190,149 @@ function AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes)
'has_license_7_5t_truck' => _("7,5t Truck"), 'has_license_7_5t_truck' => _("7,5t Truck"),
'has_license_12_5t_truck' => _("12,5t Truck"), 'has_license_12_5t_truck' => _("12,5t Truck"),
'has_license_forklift' => _("Forklift"), 'has_license_forklift' => _("Forklift"),
'actions' => '' 'actions' => ''
]; ];
} }
return [ return [
'Nick' => _("Nick"), 'Nick' => _("Nick"),
'DECT' => _("DECT"), 'DECT' => _("DECT"),
'actions' => '' 'actions' => ''
]; ];
} }
/** /**
* Render an angeltype page containing the member lists. * Render an angeltype page containing the member lists.
*/ */
function AngelType_view($angeltype, $members, $user_angeltype, $admin_user_angeltypes, $admin_angeltypes, $supporter, $user_driver_license, $user) { function AngelType_view($angeltype, $members, $user_angeltype, $admin_user_angeltypes, $admin_angeltypes, $supporter, $user_driver_license, $user)
$page = [ {
$page = [
AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user), AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user),
msg() msg()
]; ];
$page[] = '<h3>' . _("Description") . '</h3>'; $page[] = '<h3>' . _("Description") . '</h3>';
$parsedown = new Parsedown(); $parsedown = new Parsedown();
if ($angeltype['description'] != "") { if ($angeltype['description'] != "") {
$page[] = '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>'; $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); 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); $table_headers = AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes);
if (count($supporters) > 0) { if (count($supporters) > 0) {
$page[] = '<h3>' . _("supporters") . '</h3>'; $page[] = '<h3>' . _("supporters") . '</h3>';
$page[] = table($table_headers, $supporters); $page[] = table($table_headers, $supporters);
} }
if (count($members_confirmed) > 0) { if (count($members_confirmed) > 0) {
$members_confirmed[] = [ $members_confirmed[] = [
'Nick' => _('Sum'), 'Nick' => _('Sum'),
'DECT' => count($members_confirmed), 'DECT' => count($members_confirmed),
'actions' => '' 'actions' => ''
]; ];
} }
if (count($members_unconfirmed) > 0) { if (count($members_unconfirmed) > 0) {
$members_unconfirmed[] = [ $members_unconfirmed[] = [
'Nick' => _('Sum'), 'Nick' => _('Sum'),
'DECT' => count($members_unconfirmed), 'DECT' => count($members_unconfirmed),
'actions' => '' 'actions' => ''
]; ];
} }
$page[] = '<h3>' . _("Members") . '</h3>'; $page[] = '<h3>' . _("Members") . '</h3>';
if ($admin_user_angeltypes) { if ($admin_user_angeltypes) {
$page[] = buttons([ $page[] = buttons([
button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("Add"), 'add') button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("Add"), 'add')
]); ]);
} }
$page[] = table($table_headers, $members_confirmed); $page[] = table($table_headers, $members_confirmed);
if ($admin_user_angeltypes && $angeltype['restricted'] && count($members_unconfirmed) > 0) { if ($admin_user_angeltypes && $angeltype['restricted'] && count($members_unconfirmed) > 0) {
$page[] = '<h3>' . _("Unconfirmed") . '</h3>'; $page[] = '<h3>' . _("Unconfirmed") . '</h3>';
$page[] = buttons([ $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=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') button(page_link_to('user_angeltypes') . '&action=delete_all&angeltype_id=' . $angeltype['id'], _("deny all"), 'cancel')
]); ]);
$page[] = table($table_headers, $members_unconfirmed); $page[] = table($table_headers, $members_unconfirmed);
} }
return page_with_title(sprintf(_("Team %s"), $angeltype['name']), $page); return page_with_title(sprintf(_("Team %s"), $angeltype['name']), $page);
} }
/** /**
* Display the list of angeltypes. * Display the list of angeltypes.
* *
* @param array $angeltypes * @param array $angeltypes
*/ */
function AngelTypes_list_view($angeltypes, $admin_angeltypes) { function AngelTypes_list_view($angeltypes, $admin_angeltypes)
return page_with_title(angeltypes_title(), [ {
return page_with_title(angeltypes_title(), [
msg(), msg(),
buttons([ buttons([
$admin_angeltypes ? button(page_link_to('angeltypes') . '&action=edit', _("New angeltype"), 'add') : '', $admin_angeltypes ? button(page_link_to('angeltypes') . '&action=edit', _("New angeltype"), 'add') : '',
button(page_link_to('angeltypes') . '&action=about', _("Teams/Job description")) button(page_link_to('angeltypes') . '&action=about', _("Teams/Job description"))
]), ]),
table([ table([
'name' => _("Name"), 'name' => _("Name"),
'restricted' => glyph('lock') . _("Restricted"), 'restricted' => glyph('lock') . _("Restricted"),
'no_self_signup' => glyph('share') . _("Self Sign Up Allowed"), 'no_self_signup' => glyph('share') . _("Self Sign Up Allowed"),
'membership' => _("Membership"), 'membership' => _("Membership"),
'actions' => "" 'actions' => ""
], $angeltypes) ], $angeltypes)
]); ]);
} }
/** /**
* Renders the about info for an angeltype. * Renders the about info for an angeltype.
*/ */
function AngelTypes_about_view_angeltype($angeltype) { function AngelTypes_about_view_angeltype($angeltype)
$parsedown = new Parsedown(); {
$parsedown = new Parsedown();
$html = '<h2>' . $angeltype['name'] . '</h2>'; $html = '<h2>' . $angeltype['name'] . '</h2>';
if (isset($angeltype['user_angeltype_id'])) { if (isset($angeltype['user_angeltype_id'])) {
$buttons = []; $buttons = [];
if ($angeltype['user_angeltype_id'] != null) { if ($angeltype['user_angeltype_id'] != null) {
$buttons[] = button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $angeltype['user_angeltype_id'], _("leave"), 'cancel'); $buttons[] = button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $angeltype['user_angeltype_id'], _("leave"), 'cancel');
} else { } else {
$buttons[] = button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("join"), 'add'); $buttons[] = button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("join"), 'add');
}
$html .= buttons($buttons);
} }
$html .= buttons($buttons);
}
if ($angeltype['restricted']) { 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 .= 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'] != "") { if ($angeltype['description'] != "") {
$html .= '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>'; $html .= '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>';
} }
$html .= '<hr />'; $html .= '<hr />';
return $html; return $html;
} }
/** /**
* Renders a site that contains every angeltype and its description, basically as an overview of the needed help types. * Renders a site that contains every angeltype and its description, basically as an overview of the needed help types.
*/ */
function AngelTypes_about_view($angeltypes, $user_logged_in) { function AngelTypes_about_view($angeltypes, $user_logged_in)
global $faq_url; {
global $faq_url;
$content = [ $content = [
buttons([ buttons([
! $user_logged_in ? button(page_link_to('register'), register_title()) : '', ! $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('login'), login_title()) : '',
$user_logged_in ? button(page_link_to('angeltypes'), angeltypes_title(), 'back') : '', $user_logged_in ? button(page_link_to('angeltypes'), angeltypes_title(), 'back') : '',
button($faq_url, _("FAQ"), "btn-primary") button($faq_url, _("FAQ"), "btn-primary")
]), ]),
'<p>' . _("Here is the list of teams and their tasks. If you have questions, read the FAQ.") . '</p>', '<p>' . _("Here is the list of teams and their tasks. If you have questions, read the FAQ.") . '</p>',
'<hr />' '<hr />'
]; ];
foreach ($angeltypes as $angeltype) { foreach ($angeltypes as $angeltype) {
$content[] = AngelTypes_about_view_angeltype($angeltype); $content[] = AngelTypes_about_view_angeltype($angeltype);
} }
return page_with_title(_("Teams/Job description"), $content); return page_with_title(_("Teams/Job description"), $content);
} }
?>

View File

@ -4,85 +4,87 @@
* Shows basic event infos and countdowns. * Shows basic event infos and countdowns.
* @param EventConfig $event_config The event configuration * @param EventConfig $event_config The event configuration
*/ */
function EventConfig_countdown_page($event_config) { function EventConfig_countdown_page($event_config)
if ($event_config == null) { {
return div('col-md-12 text-center', [ if ($event_config == null) {
heading(sprintf(_("Welcome to the %s!"), '<span class="icon-icon_angel"></span> ENGELSYSTEM'), 2) return div('col-md-12 text-center', [
heading(sprintf(_("Welcome to the %s!"), '<span class="icon-icon_angel"></span> ENGELSYSTEM'), 2)
]); ]);
} }
$elements = []; $elements = [];
if ($event_config['event_name'] != null) { if ($event_config['event_name'] != null) {
$elements[] = div('col-sm-12 text-center', [ $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) 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']) { if ($event_config['buildup_start_date'] != null && time() < $event_config['buildup_start_date']) {
$elements[] = div('col-sm-3 text-center hidden-xs', [ $elements[] = div('col-sm-3 text-center hidden-xs', [
heading(_("Buildup starts"), 4), heading(_("Buildup starts"), 4),
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['buildup_start_date'] . '">%c</span>', '<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>' '<small>' . date(_("Y-m-d"), $event_config['buildup_start_date']) . '</small>'
]); ]);
} }
if ($event_config['event_start_date'] != null && time() < $event_config['event_start_date']) { if ($event_config['event_start_date'] != null && time() < $event_config['event_start_date']) {
$elements[] = div('col-sm-3 text-center hidden-xs', [ $elements[] = div('col-sm-3 text-center hidden-xs', [
heading(_("Event starts"), 4), heading(_("Event starts"), 4),
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_start_date'] . '">%c</span>', '<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>' '<small>' . date(_("Y-m-d"), $event_config['event_start_date']) . '</small>'
]); ]);
} }
if ($event_config['event_end_date'] != null && time() < $event_config['event_end_date']) { if ($event_config['event_end_date'] != null && time() < $event_config['event_end_date']) {
$elements[] = div('col-sm-3 text-center hidden-xs', [ $elements[] = div('col-sm-3 text-center hidden-xs', [
heading(_("Event ends"), 4), heading(_("Event ends"), 4),
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_end_date'] . '">%c</span>', '<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>' '<small>' . date(_("Y-m-d"), $event_config['event_end_date']) . '</small>'
]); ]);
} }
if ($event_config['teardown_end_date'] != null && time() < $event_config['teardown_end_date']) { if ($event_config['teardown_end_date'] != null && time() < $event_config['teardown_end_date']) {
$elements[] = div('col-sm-3 text-center hidden-xs', [ $elements[] = div('col-sm-3 text-center hidden-xs', [
heading(_("Teardown ends"), 4), heading(_("Teardown ends"), 4),
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['teardown_end_date'] . '">%c</span>', '<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>' '<small>' . date(_("Y-m-d"), $event_config['teardown_end_date']) . '</small>'
]); ]);
} }
return join("", $elements); return join("", $elements);
} }
/** /**
* Converts event name and start+end date into a line of text. * Converts event name and start+end date into a line of text.
*/ */
function EventConfig_info($event_config) { function EventConfig_info($event_config)
if ($event_config == null) { {
return ""; if ($event_config == null) {
} return "";
}
// Event name, start+end date are set // 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) { 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'])); 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 // Event name, start date are set
if ($event_config['event_name'] != null && $event_config['event_start_date'] != null) { 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'])); return sprintf(_("%s, starting %s"), $event_config['event_name'], date(_("Y-m-d"), $event_config['event_start_date']));
} }
// Event start+end date are set // Event start+end date are set
if ($event_config['event_start_date'] != null && $event_config['event_end_date'] != null) { 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'])); 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 // Only event name is set
if ($event_config['event_name'] != null) { if ($event_config['event_name'] != null) {
return sprintf($event_config['event_name']); return sprintf($event_config['event_name']);
} }
return ""; return "";
} }
/** /**
@ -92,13 +94,14 @@ function EventConfig_info($event_config) {
* The event name * The event name
* @param string $event_welcome_msg * @param string $event_welcome_msg
* The welcome message * The welcome message
* @param date $buildup_start_date * @param date $buildup_start_date
* @param date $event_start_date * @param date $event_start_date
* @param date $event_end_date * @param date $event_end_date
* @param date $teardown_end_date * @param date $teardown_end_date
*/ */
function EventConfig_edit_view($event_name, $event_welcome_msg, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date) { 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(), [ {
return page_with_title(event_config_title(), [
msg(), msg(),
form([ form([
div('row', [ div('row', [
@ -106,24 +109,22 @@ function EventConfig_edit_view($event_name, $event_welcome_msg, $buildup_start_d
form_text('event_name', _("Event Name"), $event_name), form_text('event_name', _("Event Name"), $event_name),
form_info('', _("Event Name is shown on the start page.")), form_info('', _("Event Name is shown on the start page.")),
form_textarea('event_welcome_msg', _("Event Welcome Message"), $event_welcome_msg), form_textarea('event_welcome_msg', _("Event Welcome Message"), $event_welcome_msg),
form_info('', _("Welcome message is shown after successful registration. You can use markdown.")) form_info('', _("Welcome message is shown after successful registration. You can use markdown."))
]), ]),
div('col-md-3 col-xs-6', [ div('col-md-3 col-xs-6', [
form_date('buildup_start_date', _("Buildup date"), $buildup_start_date), form_date('buildup_start_date', _("Buildup date"), $buildup_start_date),
form_date('event_start_date', _("Event start date"), $event_start_date) form_date('event_start_date', _("Event start date"), $event_start_date)
]), ]),
div('col-md-3 col-xs-6', [ div('col-md-3 col-xs-6', [
form_date('teardown_end_date', _("Teardown end date"), $teardown_end_date), form_date('teardown_end_date', _("Teardown end date"), $teardown_end_date),
form_date('event_end_date', _("Event end date"), $event_end_date) form_date('event_end_date', _("Event end date"), $event_end_date)
]) ])
]), ]),
div('row', [ div('row', [
div('col-md-6', [ div('col-md-6', [
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]) ])
]) ])
]) ])
]); ]);
} }
?>

View File

@ -1,37 +1,36 @@
<?php <?php
function Questions_view($open_questions, $answered_questions, $ask_action) { 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>'; foreach ($open_questions as &$question) {
$question['Question'] = str_replace("\n", '<br />', $question['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) { foreach ($answered_questions as &$question) {
$question['Question'] = str_replace("\n", '<br />', $question['Question']); $question['Question'] = str_replace("\n", '<br />', $question['Question']);
$question['Answer'] = str_replace("\n", '<br />', $question['Answer']); $question['Answer'] = str_replace("\n", '<br />', $question['Answer']);
$question['actions'] = '<a href="' . page_link_to("user_questions") . '&action=delete&id=' . $question['QID'] . '">' . _("delete") . '</a>'; $question['actions'] = '<a href="' . page_link_to("user_questions") . '&action=delete&id=' . $question['QID'] . '">' . _("delete") . '</a>';
} }
return page_with_title(questions_title(), [ return page_with_title(questions_title(), [
msg(), msg(),
heading(_("Open questions"), 2), heading(_("Open questions"), 2),
table([ table([
'Question' => _("Question"), 'Question' => _("Question"),
'actions' => "" 'actions' => ""
], $open_questions), ], $open_questions),
heading(_("Answered questions"), 2), heading(_("Answered questions"), 2),
table([ table([
'Question' => _("Question"), 'Question' => _("Question"),
'answer_user' => _("Answered by"), 'answer_user' => _("Answered by"),
'Answer' => _("Answer"), 'Answer' => _("Answer"),
'actions' => "" 'actions' => ""
], $answered_questions), ], $answered_questions),
heading(_("Ask the Heaven"), 2), heading(_("Ask the Heaven"), 2),
form([ form([
form_textarea('question', _("Your Question:"), ""), form_textarea('question', _("Your Question:"), ""),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
], $ask_action) ], $ask_action)
]); ]);
} }
?>

View File

@ -2,19 +2,19 @@
use Engelsystem\ShiftsFilterRenderer; use Engelsystem\ShiftsFilterRenderer;
use Engelsystem\ShiftCalendarRenderer; use Engelsystem\ShiftCalendarRenderer;
function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer, ShiftCalendarRenderer $shiftCalendarRenderer) { function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer, ShiftCalendarRenderer $shiftCalendarRenderer)
return page_with_title(glyph('map-marker') . $room['Name'], [ {
return page_with_title(glyph('map-marker') . $room['Name'], [
$shiftsFilterRenderer->render(room_link($room)) , $shiftsFilterRenderer->render(room_link($room)) ,
$shiftCalendarRenderer->render() $shiftCalendarRenderer->render()
]); ]);
} }
function Room_name_render($room) { function Room_name_render($room)
global $privileges; {
if (in_array('view_rooms', $privileges)) { global $privileges;
return '<a href="' . room_link($room) . '">' . glyph('map-marker') . $room['Name'] . '</a>'; if (in_array('view_rooms', $privileges)) {
} return '<a href="' . room_link($room) . '">' . glyph('map-marker') . $room['Name'] . '</a>';
return glyph('map-marker') . $room['Name']; }
return glyph('map-marker') . $room['Name'];
} }
?>

View File

@ -5,21 +5,22 @@ namespace Engelsystem;
/** /**
* Represents a single lane in a shifts calendar. * Represents a single lane in a shifts calendar.
*/ */
class ShiftCalendarLane { class ShiftCalendarLane
{
private $firstBlockStartTime;
private $firstBlockStartTime; private $blockCount;
private $blockCount; private $header;
private $header; private $shifts = [];
private $shifts = []; public function __construct($header, $firstBlockStartTime, $blockCount)
{
public function __construct($header, $firstBlockStartTime, $blockCount) { $this->header = $header;
$this->header = $header; $this->firstBlockStartTime = $firstBlockStartTime;
$this->firstBlockStartTime = $firstBlockStartTime; $this->blockCount = $blockCount;
$this->blockCount = $blockCount; }
}
/** /**
* Adds a shift to the lane, but only if it fits. * Adds a shift to the lane, but only if it fits.
@ -29,12 +30,13 @@ class ShiftCalendarLane {
* The shift to add * The shift to add
* @return boolean true on success * @return boolean true on success
*/ */
public function addShift($shift) { public function addShift($shift)
if ($this->shiftFits($shift)) { {
$this->shifts[] = $shift; if ($this->shiftFits($shift)) {
return true; $this->shifts[] = $shift;
} return true;
return false; }
return false;
} }
/** /**
@ -43,21 +45,23 @@ class ShiftCalendarLane {
* @param Shift $shift * @param Shift $shift
* The shift to fit into this lane * The shift to fit into this lane
*/ */
public function shiftFits($newShift) { public function shiftFits($newShift)
foreach ($this->shifts as $laneShift) { {
if (! ($newShift['start'] >= $laneShift['end'] || $newShift['end'] <= $laneShift['start'])) { foreach ($this->shifts as $laneShift) {
return false; if (! ($newShift['start'] >= $laneShift['end'] || $newShift['end'] <= $laneShift['start'])) {
return false;
}
} }
return true;
}
public function getHeader()
{
return $this->header;
} }
return true;
}
public function getHeader() { public function getShifts()
return $this->header; {
} return $this->shifts;
}
public function getShifts() {
return $this->shifts;
}
} }
?>

View File

@ -2,7 +2,8 @@
namespace Engelsystem; namespace Engelsystem;
class ShiftCalendarRenderer { class ShiftCalendarRenderer
{
/** /**
* 15m * 60s/m = 900s * 15m * 60s/m = 900s
@ -25,116 +26,123 @@ class ShiftCalendarRenderer {
*/ */
const TIME_MARGIN = 1800; const TIME_MARGIN = 1800;
private $lanes; private $lanes;
private $shiftsFilter; private $shiftsFilter;
private $firstBlockStartTime = null; private $firstBlockStartTime = null;
private $lastBlockEndTime = null; private $lastBlockEndTime = null;
private $blocksPerSlot = null; private $blocksPerSlot = null;
private $needed_angeltypes = null; private $needed_angeltypes = null;
private $shift_entries = null; private $shift_entries = null;
public function __construct($shifts, $needed_angeltypes, $shift_entries, ShiftsFilter $shiftsFilter) { public function __construct($shifts, $needed_angeltypes, $shift_entries, ShiftsFilter $shiftsFilter)
$this->shiftsFilter = $shiftsFilter; {
$this->firstBlockStartTime = $this->calcFirstBlockStartTime($shifts); $this->shiftsFilter = $shiftsFilter;
$this->lastBlockEndTime = $this->calcLastBlockEndTime($shifts); $this->firstBlockStartTime = $this->calcFirstBlockStartTime($shifts);
$this->lanes = $this->assignShiftsToLanes($shifts); $this->lastBlockEndTime = $this->calcLastBlockEndTime($shifts);
$this->needed_angeltypes = $needed_angeltypes; $this->lanes = $this->assignShiftsToLanes($shifts);
$this->shift_entries = $shift_entries; $this->needed_angeltypes = $needed_angeltypes;
} $this->shift_entries = $shift_entries;
}
/** /**
* Assigns the shifts to different lanes per room if they collide * Assigns the shifts to different lanes per room if they collide
* *
* @param Shift[] $shifts * @param Shift[] $shifts
* The shifts to assign * The shifts to assign
* *
* @return Returns an array that assigns a room_id to an array of ShiftCalendarLane containing the shifts * @return Returns an array that assigns a room_id to an array of ShiftCalendarLane containing the shifts
*/ */
private function assignShiftsToLanes($shifts) { private function assignShiftsToLanes($shifts)
// array that assigns a room id to a list of lanes (per room) {
// array that assigns a room id to a list of lanes (per room)
$lanes = []; $lanes = [];
foreach ($shifts as $shift) { foreach ($shifts as $shift) {
$room_id = $shift['RID']; $room_id = $shift['RID'];
$header = Room_name_render([ $header = Room_name_render([
'RID' => $room_id, 'RID' => $room_id,
'Name' => $shift['room_name'] 'Name' => $shift['room_name']
]); ]);
if (! isset($lanes[$room_id])) { if (! isset($lanes[$room_id])) {
// initialize room with one lane // initialize room with one lane
$lanes[$room_id] = [ $lanes[$room_id] = [
new ShiftCalendarLane($header, $this->getFirstBlockStartTime(), $this->getBlocksPerSlot()) new ShiftCalendarLane($header, $this->getFirstBlockStartTime(), $this->getBlocksPerSlot())
]; ];
} }
// Try to add the shift to the existing lanes for this room // Try to add the shift to the existing lanes for this room
$shift_added = false; $shift_added = false;
foreach ($lanes[$room_id] as $lane) { foreach ($lanes[$room_id] as $lane) {
$shift_added = $lane->addShift($shift); $shift_added = $lane->addShift($shift);
if ($shift_added == true) { if ($shift_added == true) {
break; break;
} }
} }
// If all lanes for this room are busy, create a new lane and add shift to it // If all lanes for this room are busy, create a new lane and add shift to it
if ($shift_added == false) { if ($shift_added == false) {
$newLane = new ShiftCalendarLane($header, $this->getFirstBlockStartTime(), $this->getBlocksPerSlot()); $newLane = new ShiftCalendarLane($header, $this->getFirstBlockStartTime(), $this->getBlocksPerSlot());
if (! $newLane->addShift($shift)) { if (! $newLane->addShift($shift)) {
engelsystem_error("Unable to add shift to new lane."); engelsystem_error("Unable to add shift to new lane.");
} }
$lanes[$room_id][] = $newLane; $lanes[$room_id][] = $newLane;
}
} }
}
return $lanes; return $lanes;
} }
public function getFirstBlockStartTime() { public function getFirstBlockStartTime()
return $this->firstBlockStartTime; {
} return $this->firstBlockStartTime;
}
public function getLastBlockEndTime() {
return $this->lastBlockEndTime; public function getLastBlockEndTime()
} {
return $this->lastBlockEndTime;
public function getBlocksPerSlot() { }
if ($this->blocksPerSlot == null) {
$this->blocksPerSlot = $this->calcBlocksPerSlot(); public function getBlocksPerSlot()
{
if ($this->blocksPerSlot == null) {
$this->blocksPerSlot = $this->calcBlocksPerSlot();
}
return $this->blocksPerSlot;
} }
return $this->blocksPerSlot;
}
/** /**
* Renders the whole calendar * Renders the whole calendar
* *
* @return the generated html * @return the generated html
*/ */
public function render() { public function render()
if (count($this->lanes) == 0) { {
return ''; if (count($this->lanes) == 0) {
} return '';
return div('shift-calendar', [ }
return div('shift-calendar', [
$this->renderTimeLane(), $this->renderTimeLane(),
$this->renderShiftLanes() $this->renderShiftLanes()
]) . $this->renderLegend(); ]) . $this->renderLegend();
} }
/** /**
* Renders the lanes containing the shifts * Renders the lanes containing the shifts
*/ */
private function renderShiftLanes() { private function renderShiftLanes()
$html = ""; {
foreach ($this->lanes as $room_lanes) { $html = "";
foreach ($room_lanes as $lane) { foreach ($this->lanes as $room_lanes) {
$html .= $this->renderLane($lane); foreach ($room_lanes as $lane) {
$html .= $this->renderLane($lane);
}
} }
}
return $html; return $html;
} }
/** /**
@ -143,32 +151,33 @@ class ShiftCalendarRenderer {
* @param ShiftCalendarLane $lane * @param ShiftCalendarLane $lane
* The lane to render * The lane to render
*/ */
private function renderLane(ShiftCalendarLane $lane) { private function renderLane(ShiftCalendarLane $lane)
global $user; {
global $user;
$shift_renderer = new ShiftCalendarShiftRenderer(); $shift_renderer = new ShiftCalendarShiftRenderer();
$html = ""; $html = "";
$rendered_until = $this->getFirstBlockStartTime(); $rendered_until = $this->getFirstBlockStartTime();
foreach ($lane->getShifts() as $shift) { foreach ($lane->getShifts() as $shift) {
while ($rendered_until + ShiftCalendarRenderer::SECONDS_PER_ROW <= $shift['start']) { while ($rendered_until + ShiftCalendarRenderer::SECONDS_PER_ROW <= $shift['start']) {
$html .= $this->renderTick($rendered_until); $html .= $this->renderTick($rendered_until);
$rendered_until += ShiftCalendarRenderer::SECONDS_PER_ROW; $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); list($shift_height, $shift_html) = $shift_renderer->render($shift, $this->needed_angeltypes[$shift['SID']], $this->shift_entries[$shift['SID']], $user);
$html .= $shift_html; $html .= $shift_html;
$rendered_until += $shift_height * ShiftCalendarRenderer::SECONDS_PER_ROW; $rendered_until += $shift_height * ShiftCalendarRenderer::SECONDS_PER_ROW;
} }
while ($rendered_until < $this->getLastBlockEndTime()) { while ($rendered_until < $this->getLastBlockEndTime()) {
$html .= $this->renderTick($rendered_until); $html .= $this->renderTick($rendered_until);
$rendered_until += ShiftCalendarRenderer::SECONDS_PER_ROW; $rendered_until += ShiftCalendarRenderer::SECONDS_PER_ROW;
} }
return div('lane', [ return div('lane', [
div('header', $lane->getHeader()), div('header', $lane->getHeader()),
$html $html
]); ]);
} }
@ -181,77 +190,81 @@ class ShiftCalendarRenderer {
* Should time labels be generated? * Should time labels be generated?
* @return rendered tick html * @return rendered tick html
*/ */
private function renderTick($time, $label = false) { private function renderTick($time, $label = false)
if ($time % (24 * 60 * 60) == 23 * 60 * 60) { {
if (! $label) { if ($time % (24 * 60 * 60) == 23 * 60 * 60) {
return div('tick day'); if (! $label) {
} return div('tick day');
return div('tick day', [ }
date('m-d<b\r />H:i', $time) return div('tick day', [
date('m-d<b\r />H:i', $time)
]); ]);
} elseif ($time % (60 * 60) == 0) { } elseif ($time % (60 * 60) == 0) {
if (! $label) { if (! $label) {
return div('tick hour'); return div('tick hour');
} }
return div('tick hour', [ return div('tick hour', [
date('m-d<b\r />H:i', $time) date('m-d<b\r />H:i', $time)
]); ]);
} }
return div('tick'); return div('tick');
} }
/** /**
* Renders the left time lane including hour/day ticks * Renders the left time lane including hour/day ticks
*/ */
private function renderTimeLane() { private function renderTimeLane()
$time_slot = [ {
$time_slot = [
div('header', [ div('header', [
_("Time") _("Time")
]) ])
]; ];
for ($block = 0; $block < $this->getBlocksPerSlot(); $block ++) { for ($block = 0; $block < $this->getBlocksPerSlot(); $block ++) {
$thistime = $this->getFirstBlockStartTime() + ($block * ShiftCalendarRenderer::SECONDS_PER_ROW); $thistime = $this->getFirstBlockStartTime() + ($block * ShiftCalendarRenderer::SECONDS_PER_ROW);
$time_slot[] = $this->renderTick($thistime, true); $time_slot[] = $this->renderTick($thistime, true);
}
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 div('lane time', $time_slot);
return ShiftCalendarRenderer::SECONDS_PER_ROW * floor(($start_time - ShiftCalendarRenderer::TIME_MARGIN) / ShiftCalendarRenderer::SECONDS_PER_ROW);
} }
private function calcLastBlockEndTime($shifts) { private function calcFirstBlockStartTime($shifts)
$end_time = $this->shiftsFilter->getStartTime(); {
foreach ($shifts as $shift) { $start_time = $this->shiftsFilter->getEndTime();
if ($shift['end'] > $end_time) { foreach ($shifts as $shift) {
$end_time = $shift['end']; 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 ShiftCalendarRenderer::SECONDS_PER_ROW * ceil(($end_time + ShiftCalendarRenderer::TIME_MARGIN) / ShiftCalendarRenderer::SECONDS_PER_ROW);
}
private function calcBlocksPerSlot() { private function calcLastBlockEndTime($shifts)
return ceil(($this->getLastBlockEndTime() - $this->getFirstBlockStartTime()) / ShiftCalendarRenderer::SECONDS_PER_ROW); {
} $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);
}
private function calcBlocksPerSlot()
{
return ceil(($this->getLastBlockEndTime() - $this->getFirstBlockStartTime()) / ShiftCalendarRenderer::SECONDS_PER_ROW);
}
/** /**
* Renders a legend explaining the shift coloring * Renders a legend explaining the shift coloring
*/ */
private function renderLegend() { private function renderLegend()
return div('legend', [ {
return div('legend', [
label(_('Your shift'), 'primary'), label(_('Your shift'), 'primary'),
label(_('Help needed'), 'danger'), label(_('Help needed'), 'danger'),
label(_('Other angeltype needed / collides with my shifts'), 'warning'), label(_('Other angeltype needed / collides with my shifts'), 'warning'),
label(_('Shift is full'), 'success'), label(_('Shift is full'), 'success'),
label(_('Shift running/ended'), 'default') label(_('Shift running/ended'), 'default')
]); ]);
} }
} }
?>

View File

@ -5,7 +5,8 @@ namespace Engelsystem;
/** /**
* Renders a single shift for the shift calendar * Renders a single shift for the shift calendar
*/ */
class ShiftCalendarShiftRenderer { class ShiftCalendarShiftRenderer
{
/** /**
* Renders a shift * Renders a shift
@ -15,18 +16,19 @@ class ShiftCalendarShiftRenderer {
* @param User $user * @param User $user
* The user who is viewing the shift calendar * The user who is viewing the shift calendar
*/ */
public function render($shift, $needed_angeltypes, $shift_entries, $user) { public function render($shift, $needed_angeltypes, $shift_entries, $user)
$info_text = ""; {
if ($shift['title'] != '') { $info_text = "";
$info_text = glyph('info-sign') . $shift['title'] . '<br>'; 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); }
list($shift_signup_state, $shifts_row) = $this->renderShiftNeededAngeltypes($shift, $needed_angeltypes, $shift_entries, $user);
$class = $this->classForSignupState($shift_signup_state); $class = $this->classForSignupState($shift_signup_state);
$blocks = ceil(($shift["end"] - $shift["start"]) / ShiftCalendarRenderer::SECONDS_PER_ROW); $blocks = ceil(($shift["end"] - $shift["start"]) / ShiftCalendarRenderer::SECONDS_PER_ROW);
$blocks = max(1, $blocks); $blocks = max(1, $blocks);
return [ return [
$blocks, $blocks,
div('shift panel panel-' . $class . '" style="height: ' . ($blocks * ShiftCalendarRenderer::BLOCK_HEIGHT - ShiftCalendarRenderer::MARGIN) . 'px"', [ div('shift panel panel-' . $class . '" style="height: ' . ($blocks * ShiftCalendarRenderer::BLOCK_HEIGHT - ShiftCalendarRenderer::MARGIN) . 'px"', [
$this->renderShiftHead($shift), $this->renderShiftHead($shift),
@ -34,17 +36,18 @@ class ShiftCalendarShiftRenderer {
$info_text, $info_text,
Room_name_render([ Room_name_render([
'RID' => $shift['RID'], 'RID' => $shift['RID'],
'Name' => $shift['room_name'] 'Name' => $shift['room_name']
]) ])
]), ]),
$shifts_row, $shifts_row,
div('shift-spacer') div('shift-spacer')
]) ])
]; ];
} }
private function classForSignupState(ShiftSignupState $shiftSignupState) { private function classForSignupState(ShiftSignupState $shiftSignupState)
switch ($shiftSignupState->getState()) { {
switch ($shiftSignupState->getState()) {
case ShiftSignupState::ADMIN: case ShiftSignupState::ADMIN:
case ShiftSignupState::OCCUPIED: case ShiftSignupState::OCCUPIED:
return 'success'; return 'success';
@ -62,50 +65,51 @@ class ShiftCalendarShiftRenderer {
case ShiftSignupState::FREE: case ShiftSignupState::FREE:
return 'danger'; return 'danger';
} }
} }
private function renderShiftNeededAngeltypes($shift, $needed_angeltypes, $shift_entries, $user) { private function renderShiftNeededAngeltypes($shift, $needed_angeltypes, $shift_entries, $user)
global $privileges; {
global $privileges;
$shift_entries_filtered = []; $shift_entries_filtered = [];
foreach ($needed_angeltypes as $needed_angeltype) { foreach ($needed_angeltypes as $needed_angeltype) {
$shift_entries_filtered[$needed_angeltype['id']] = []; $shift_entries_filtered[$needed_angeltype['id']] = [];
} }
foreach ($shift_entries as $shift_entry) { foreach ($shift_entries as $shift_entry) {
$shift_entries_filtered[$shift_entry['TID']][] = $shift_entry; $shift_entries_filtered[$shift_entry['TID']][] = $shift_entry;
}
$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);
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 = new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, 0);
}
if (in_array('user_shifts_admin', $privileges)) { $html = "";
$html .= '<li class="list-group-item">' . button(page_link_to('user_shifts') . '&amp;shift_id=' . $shift['SID'], _("Add more angels"), 'btn-xs') . '</li>'; $shift_signup_state = null;
} foreach ($needed_angeltypes as $angeltype) {
if ($html != '') { if ($angeltype['count'] > 0 || count($shift_entries_filtered[$angeltype['id']]) > 0) {
return [ 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 = 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') . '&amp;shift_id=' . $shift['SID'], _("Add more angels"), 'btn-xs') . '</li>';
}
if ($html != '') {
return [
$shift_signup_state, $shift_signup_state,
'<ul class="list-group">' . $html . '</ul>' '<ul class="list-group">' . $html . '</ul>'
]; ];
} }
return [ return [
$shift_signup_state, $shift_signup_state,
"" ""
]; ];
} }
/** /**
* Renders a list entry containing the needed angels for an angeltype * Renders a list entry containing the needed angels for an angeltype
@ -117,15 +121,16 @@ class ShiftCalendarShiftRenderer {
* @param User $user * @param User $user
* The user who is viewing the shift calendar * The user who is viewing the shift calendar
*/ */
private function renderShiftNeededAngeltype($shift, $shift_entries, $angeltype, $user) { private function renderShiftNeededAngeltype($shift, $shift_entries, $angeltype, $user)
$entry_list = []; {
foreach ($shift_entries as $entry) { $entry_list = [];
$style = $entry['freeloaded'] ? " text-decoration: line-through;" : ''; foreach ($shift_entries as $entry) {
$entry_list[] = "<span style=\"$style\">" . User_Nick_render($entry) . "</span>"; $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()); $shift_signup_state = Shift_signup_allowed($user, $shift, $angeltype, null, null, $angeltype, $shift_entries);
switch ($shift_signup_state->getState()) { $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::ADMIN:
case ShiftSignupState::FREE: case ShiftSignupState::FREE:
// When admin or free display a link + button for sign up // When admin or free display a link + button for sign up
@ -139,10 +144,10 @@ class ShiftCalendarShiftRenderer {
case ShiftSignupState::ANGELTYPE: case ShiftSignupState::ANGELTYPE:
if ($angeltype['restricted'] == 1) { if ($angeltype['restricted'] == 1) {
// User has to be confirmed on the angeltype first // User has to be confirmed on the angeltype first
$entry_list[] = $inner_text . glyph('lock'); $entry_list[] = $inner_text . glyph('lock');
} else { } else {
// Add link to join the angeltype first // 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'); $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; break;
@ -158,13 +163,13 @@ class ShiftCalendarShiftRenderer {
break; break;
} }
$shifts_row = '<li class="list-group-item">'; $shifts_row = '<li class="list-group-item">';
$shifts_row .= '<strong>' . AngelType_name_render($angeltype) . ':</strong> '; $shifts_row .= '<strong>' . AngelType_name_render($angeltype) . ':</strong> ';
$shifts_row .= join(", ", $entry_list); $shifts_row .= join(", ", $entry_list);
$shifts_row .= '</li>'; $shifts_row .= '</li>';
return [ return [
$shift_signup_state, $shift_signup_state,
$shifts_row $shifts_row
]; ];
} }
@ -174,22 +179,21 @@ class ShiftCalendarShiftRenderer {
* @param Shift $shift * @param Shift $shift
* The shift * The shift
*/ */
private function renderShiftHead($shift) { private function renderShiftHead($shift)
global $privileges; {
global $privileges;
$header_buttons = ""; $header_buttons = "";
if (in_array('admin_shifts', $privileges)) { if (in_array('admin_shifts', $privileges)) {
$header_buttons = '<div class="pull-right">' . table_buttons([ $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') . '&edit_shift=' . $shift['SID'], glyph('edit'), 'btn-xs'),
button(page_link_to('user_shifts') . '&delete_shift=' . $shift['SID'], glyph('trash'), 'btn-xs') button(page_link_to('user_shifts') . '&delete_shift=' . $shift['SID'], glyph('trash'), 'btn-xs')
]) . '</div>'; ]) . '</div>';
} }
$shift_heading = date('H:i', $shift['start']) . ' &dash; ' . date('H:i', $shift['end']) . ' &mdash; ' . $shift['name']; $shift_heading = date('H:i', $shift['start']) . ' &dash; ' . date('H:i', $shift['end']) . ' &mdash; ' . $shift['name'];
return div('panel-heading', [ return div('panel-heading', [
'<a href="' . shift_link($shift) . '">' . $shift_heading . '</a>', '<a href="' . shift_link($shift) . '">' . $shift_heading . '</a>',
$header_buttons $header_buttons
]); ]);
} }
} }
?>

View File

@ -8,18 +8,19 @@
* @param string $title * @param string $title
* @param string $type * @param string $type
* @param string $comment * @param string $comment
* *
* @return string * @return string
*/ */
function ShiftEntry_edit_view($angel, $date, $location, $title, $type, $comment, $freeloaded, $freeload_comment, $user_admin_shifts = false) { 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 = [];
$freeload_form = [ if ($user_admin_shifts) {
$freeload_form = [
form_checkbox('freeloaded', _("Freeloaded"), $freeloaded), form_checkbox('freeloaded', _("Freeloaded"), $freeloaded),
form_textarea('freeload_comment', _("Freeload comment (Only for shift coordination):"), $freeload_comment) form_textarea('freeload_comment', _("Freeload comment (Only for shift coordination):"), $freeload_comment)
]; ];
} }
return page_with_title(_("Edit shift entry"), [ return page_with_title(_("Edit shift entry"), [
msg(), msg(),
form([ form([
form_info(_("Angel:"), $angel), form_info(_("Angel:"), $angel),
@ -29,9 +30,7 @@ function ShiftEntry_edit_view($angel, $date, $location, $title, $type, $comment,
form_info(_("Type:"), $type), form_info(_("Type:"), $type),
form_textarea('comment', _("Comment (for your eyes only):"), $comment), form_textarea('comment', _("Comment (for your eyes only):"), $comment),
join("", $freeload_form), join("", $freeload_form),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]) ])
]); ]);
} }
?>

View File

@ -1,84 +1,87 @@
<?php <?php
function ShiftType_name_render($shifttype) { function ShiftType_name_render($shifttype)
global $privileges; {
if (in_array('shifttypes', $privileges)) { global $privileges;
return '<a href="' . shifttype_link($shifttype) . '">' . $shifttype['name'] . '</a>'; if (in_array('shifttypes', $privileges)) {
} return '<a href="' . shifttype_link($shifttype) . '">' . $shifttype['name'] . '</a>';
return $shifttype['name']; }
return $shifttype['name'];
} }
function ShiftType_delete_view($shifttype) { function ShiftType_delete_view($shifttype)
return page_with_title(sprintf(_("Delete shifttype %s"), $shifttype['name']), [ {
return page_with_title(sprintf(_("Delete shifttype %s"), $shifttype['name']), [
info(sprintf(_("Do you want to delete shifttype %s?"), $shifttype['name']), true), info(sprintf(_("Do you want to delete shifttype %s?"), $shifttype['name']), true),
buttons([ buttons([
button(page_link_to('shifttypes'), _("cancel"), 'cancel'), button(page_link_to('shifttypes'), _("cancel"), 'cancel'),
button(page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'] . '&confirmed', _("delete"), 'ok') button(page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'] . '&confirmed', _("delete"), 'ok')
]) ])
]); ]);
} }
function ShiftType_edit_view($name, $angeltype_id, $angeltypes, $description, $shifttype_id) { function ShiftType_edit_view($name, $angeltype_id, $angeltypes, $description, $shifttype_id)
$angeltypes_select = [ {
'' => _('All') $angeltypes_select = [
'' => _('All')
]; ];
foreach ($angeltypes as $angeltype) { foreach ($angeltypes as $angeltype) {
$angeltypes_select[$angeltype['id']] = $angeltype['name']; $angeltypes_select[$angeltype['id']] = $angeltype['name'];
} }
return page_with_title($shifttype_id ? _('Edit shifttype') : _('Create shifttype'), [ return page_with_title($shifttype_id ? _('Edit shifttype') : _('Create shifttype'), [
msg(), msg(),
buttons([ buttons([
button(page_link_to('shifttypes'), shifttypes_title(), 'back') button(page_link_to('shifttypes'), shifttypes_title(), 'back')
]), ]),
form([ form([
form_text('name', _('Name'), $name), form_text('name', _('Name'), $name),
form_select('angeltype_id', _('Angeltype'), $angeltypes_select, $angeltype_id), form_select('angeltype_id', _('Angeltype'), $angeltypes_select, $angeltype_id),
form_textarea('description', _('Description'), $description), form_textarea('description', _('Description'), $description),
form_info('', _('Please use markdown for the description.')), form_info('', _('Please use markdown for the description.')),
form_submit('submit', _('Save')) form_submit('submit', _('Save'))
]) ])
]); ]);
} }
function ShiftType_view($shifttype, $angeltype) { function ShiftType_view($shifttype, $angeltype)
$parsedown = new Parsedown(); {
$title = $shifttype['name']; $parsedown = new Parsedown();
if ($angeltype) { $title = $shifttype['name'];
$title .= ' <small>' . sprintf(_('for team %s'), $angeltype['name']) . '</small>'; if ($angeltype) {
} $title .= ' <small>' . sprintf(_('for team %s'), $angeltype['name']) . '</small>';
return page_with_title($title, [ }
return page_with_title($title, [
msg(), msg(),
buttons([ buttons([
button(page_link_to('shifttypes'), shifttypes_title(), 'back'), button(page_link_to('shifttypes'), shifttypes_title(), 'back'),
$angeltype ? button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], $angeltype['name']) : '', $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=edit&shifttype_id=' . $shifttype['id'], _('edit'), 'edit'),
button(page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'], _('delete'), 'delete') button(page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'], _('delete'), 'delete')
]), ]),
heading(_("Description"), 2), heading(_("Description"), 2),
$parsedown->parse($shifttype['description']) $parsedown->parse($shifttype['description'])
]); ]);
} }
function ShiftTypes_list_view($shifttypes) { 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>'; foreach ($shifttypes as &$shifttype) {
$shifttype['actions'] = table_buttons([ $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=edit&shifttype_id=' . $shifttype['id'], _('edit'), 'btn-xs'),
button(page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'], _('delete'), 'btn-xs') button(page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'], _('delete'), 'btn-xs')
]); ]);
} }
return page_with_title(shifttypes_title(), [ return page_with_title(shifttypes_title(), [
msg(), msg(),
buttons([ buttons([
button(page_link_to('shifttypes') . '&action=edit', _('New shifttype'), 'add') button(page_link_to('shifttypes') . '&action=edit', _('New shifttype'), 'add')
]), ]),
table([ table([
'name' => _('Name'), 'name' => _('Name'),
'actions' => '' 'actions' => ''
], $shifttypes) ], $shifttypes)
]); ]);
} }
?>

View File

@ -2,7 +2,8 @@
namespace Engelsystem; namespace Engelsystem;
class ShiftsFilterRenderer { class ShiftsFilterRenderer
{
/** /**
* The shiftFilter to render. * The shiftFilter to render.
@ -26,44 +27,46 @@ class ShiftsFilterRenderer {
*/ */
private $days = []; private $days = [];
public function __construct(ShiftsFilter $shiftsFilter) { public function __construct(ShiftsFilter $shiftsFilter)
$this->shiftsFilter = $shiftsFilter; {
} $this->shiftsFilter = $shiftsFilter;
}
/** /**
* Renders the filter. * Renders the filter.
* *
* @return Generated HTML * @return Generated HTML
*/ */
public function render($link_base) { public function render($link_base)
$toolbar = []; {
if ($this->daySelectionEnabled && ! empty($this->days)) { $toolbar = [];
$selected_day = date("Y-m-d", $this->shiftsFilter->getStartTime()); if ($this->daySelectionEnabled && ! empty($this->days)) {
$day_dropdown_items = []; $selected_day = date("Y-m-d", $this->shiftsFilter->getStartTime());
foreach ($this->days as $day) { $day_dropdown_items = [];
$day_dropdown_items[] = toolbar_item_link($link_base . '&shifts_filter_day=' . $day, '', $day); 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');
} }
$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. * Should the filter display a day selection.
*/ */
public function enableDaySelection($days) { public function enableDaySelection($days)
$this->daySelectionEnabled = true; {
$this->days = $days; $this->daySelectionEnabled = true;
$this->days = $days;
} }
/** /**
* Should the filter display a day selection. * Should the filter display a day selection.
*/ */
public function isDaySelectionEnabled() { public function isDaySelectionEnabled()
return $this->daySelectionEnabled; {
return $this->daySelectionEnabled;
} }
} }
?>

View File

@ -1,53 +1,56 @@
<?php <?php
use Engelsystem\ShiftSignupState; use Engelsystem\ShiftSignupState;
function Shift_editor_info_render($shift) { function Shift_editor_info_render($shift)
$info = []; {
if ($shift['created_by_user_id'] != null) { $info = [];
$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['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']))); 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); }
return join('<br />', $info);
} }
function Shift_signup_button_render($shift, $angeltype, $user_angeltype = null) { function Shift_signup_button_render($shift, $angeltype, $user_angeltype = null)
global $user; {
global $user;
if ($user_angeltype == null) { if ($user_angeltype == null) {
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
} }
if ($angeltype['shift_signup_state']->isSignupAllowed()) { if ($angeltype['shift_signup_state']->isSignupAllowed()) {
return button(page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $angeltype['id'], _('Sign up')); return button(page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $angeltype['id'], _('Sign up'));
} elseif ($user_angeltype == null) { } elseif ($user_angeltype == null) {
return button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], sprintf(_('Become %s'), $angeltype['name'])); return button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], sprintf(_('Become %s'), $angeltype['name']));
} }
return ''; return '';
} }
function Shift_view($shift, $shifttype, $room, $angeltypes_source, ShiftSignupState $shift_signup_state) { function Shift_view($shift, $shifttype, $room, $angeltypes_source, ShiftSignupState $shift_signup_state)
global $privileges; {
global $privileges;
$shift_admin = in_array('admin_shifts', $privileges); $shift_admin = in_array('admin_shifts', $privileges);
$user_shift_admin = in_array('user_shifts_admin', $privileges); $user_shift_admin = in_array('user_shifts_admin', $privileges);
$admin_rooms = in_array('admin_rooms', $privileges); $admin_rooms = in_array('admin_rooms', $privileges);
$admin_shifttypes = in_array('shifttypes', $privileges); $admin_shifttypes = in_array('shifttypes', $privileges);
$parsedown = new Parsedown(); $parsedown = new Parsedown();
$angeltypes = []; $angeltypes = [];
foreach ($angeltypes_source as $angeltype) { foreach ($angeltypes_source as $angeltype) {
$angeltypes[$angeltype['id']] = $angeltype; $angeltypes[$angeltype['id']] = $angeltype;
} }
$needed_angels = ''; $needed_angels = '';
foreach ($shift['NeedAngels'] as $needed_angeltype) { foreach ($shift['NeedAngels'] as $needed_angeltype) {
$needed_angels .= Shift_view_render_needed_angeltype($needed_angeltype, $angeltypes, $shift, $user_shift_admin); $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>', [ return page_with_title($shift['name'] . ' <small class="moment-countdown" data-timestamp="' . $shift['start'] . '">%c</small>', [
msg(), msg(),
$shift_signup_state->getState() == ShiftSignupState::COLLIDES ? info(_('This shift collides with one of your shifts.'), true) : '', $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_signup_state->getState() == ShiftSignupState::SIGNED_UP ? info(_('You are signed up for this shift.'), true) : '',
@ -55,12 +58,12 @@ function Shift_view($shift, $shifttype, $room, $angeltypes_source, ShiftSignupSt
$shift_admin ? button(shift_edit_link($shift), glyph('pencil') . _('edit')) : '', $shift_admin ? button(shift_edit_link($shift), glyph('pencil') . _('edit')) : '',
$shift_admin ? button(shift_delete_link($shift), glyph('trash') . _('delete')) : '', $shift_admin ? button(shift_delete_link($shift), glyph('trash') . _('delete')) : '',
$admin_shifttypes ? button(shifttype_link($shifttype), $shifttype['name']) : '', $admin_shifttypes ? button(shifttype_link($shifttype), $shifttype['name']) : '',
$admin_rooms ? button(room_link($room), glyph('map-marker') . $room['Name']) : '' $admin_rooms ? button(room_link($room), glyph('map-marker') . $room['Name']) : ''
]) : '', ]) : '',
div('row', [ div('row', [
div('col-sm-3 col-xs-6', [ div('col-sm-3 col-xs-6', [
'<h4>' . _('Title') . '</h4>', '<h4>' . _('Title') . '</h4>',
'<p class="lead">' . ($shift['URL'] != '' ? '<a href="' . $shift['URL'] . '">' . $shift['title'] . '</a>' : $shift['title']) . '</p>' '<p class="lead">' . ($shift['URL'] != '' ? '<a href="' . $shift['URL'] . '">' . $shift['title'] . '</a>' : $shift['title']) . '</p>'
]), ]),
div('col-sm-3 col-xs-6', [ div('col-sm-3 col-xs-6', [
'<h4>' . _('Start') . '</h4>', '<h4>' . _('Start') . '</h4>',
@ -68,7 +71,7 @@ function Shift_view($shift, $shifttype, $room, $angeltypes_source, ShiftSignupSt
glyph('calendar') . date(_('Y-m-d'), $shift['start']), glyph('calendar') . date(_('Y-m-d'), $shift['start']),
'<br />', '<br />',
glyph('time') . date('H:i', $shift['start']), glyph('time') . date('H:i', $shift['start']),
'</p>' '</p>'
]), ]),
div('col-sm-3 col-xs-6', [ div('col-sm-3 col-xs-6', [
'<h4>' . _('End') . '</h4>', '<h4>' . _('End') . '</h4>',
@ -76,88 +79,90 @@ function Shift_view($shift, $shifttype, $room, $angeltypes_source, ShiftSignupSt
glyph('calendar') . date(_('Y-m-d'), $shift['end']), glyph('calendar') . date(_('Y-m-d'), $shift['end']),
'<br />', '<br />',
glyph('time') . date('H:i', $shift['end']), glyph('time') . date('H:i', $shift['end']),
'</p>' '</p>'
]), ]),
div('col-sm-3 col-xs-6', [ div('col-sm-3 col-xs-6', [
'<h4>' . _('Location') . '</h4>', '<h4>' . _('Location') . '</h4>',
'<p class="lead">' . Room_name_render($room) . '</p>' '<p class="lead">' . Room_name_render($room) . '</p>'
]) ])
]), ]),
div('row', [ div('row', [
div('col-sm-6', [ div('col-sm-6', [
'<h2>' . _('Needed angels') . '</h2>', '<h2>' . _('Needed angels') . '</h2>',
'<div class="list-group">' . $needed_angels . '</div>' '<div class="list-group">' . $needed_angels . '</div>'
]), ]),
div('col-sm-6', [ div('col-sm-6', [
'<h2>' . _('Description') . '</h2>', '<h2>' . _('Description') . '</h2>',
$parsedown->parse($shifttype['description']) $parsedown->parse($shifttype['description'])
]) ])
]), ]),
$shift_admin ? Shift_editor_info_render($shift) : '' $shift_admin ? Shift_editor_info_render($shift) : ''
]); ]);
} }
function Shift_view_render_needed_angeltype($needed_angeltype, $angeltypes, $shift, $user_shift_admin) { function Shift_view_render_needed_angeltype($needed_angeltype, $angeltypes, $shift, $user_shift_admin)
global $user; {
global $user;
$angeltype = $angeltypes[$needed_angeltype['TID']]; $angeltype = $angeltypes[$needed_angeltype['TID']];
$angeltype_supporter = User_is_AngelType_supporter($user, $angeltype); $angeltype_supporter = User_is_AngelType_supporter($user, $angeltype);
$needed_angels = ''; $needed_angels = '';
$class = 'progress-bar-warning'; $class = 'progress-bar-warning';
if ($needed_angeltype['taken'] == 0) { if ($needed_angeltype['taken'] == 0) {
$class = 'progress-bar-danger'; $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);
} }
} if ($needed_angeltype['taken'] >= $needed_angeltype['count']) {
$class = 'progress-bar-success';
}
$needed_angels .= '<div class="list-group-item">';
$needed_angels .= join(', ', $angels); $needed_angels .= '<div class="pull-right">' . Shift_signup_button_render($shift, $angeltype) . '</div>';
$needed_angels .= '</div>';
return $needed_angels; $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) { 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 = User_Nick_render(User($shift_entry['UID']));
$entry = '<strike>' . $entry . '</strike>'; 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');
} }
$entry .= button_glyph(page_link_to('user_shifts') . '&entry_id=' . $shift_entry['id'], 'trash', 'btn-xs'); if ($user_shift_admin || $angeltype_supporter) {
$entry .= '</div>'; $entry .= ' <div class="btn-group">';
} if ($user_shift_admin) {
return $entry; $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>';
}
return $entry;
} }
/** /**
* Calc shift length in format 12:23h. * Calc shift length in format 12:23h.
* *
* @param Shift $shift * @param Shift $shift
*/ */
function shift_length($shift) { 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"; $length = floor(($shift['end'] - $shift['start']) / (60 * 60)) . ":";
return $length; $length .= str_pad((($shift['end'] - $shift['start']) % (60 * 60)) / 60, 2, "0", STR_PAD_LEFT) . "h";
return $length;
} }
?>

View File

@ -1,88 +1,93 @@
<?php <?php
function UserAngelType_update_view($user_angeltype, $user, $angeltype, $supporter) { function UserAngelType_update_view($user_angeltype, $user, $angeltype, $supporter)
return page_with_title($supporter ? _("Add supporter rights") : _("Remove supporter rights"), [ {
return page_with_title($supporter ? _("Add supporter rights") : _("Remove supporter rights"), [
msg(), 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), 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([ buttons([
button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), 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') 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) { function UserAngelTypes_delete_all_view($angeltype)
return page_with_title(_("Deny all users"), [ {
return page_with_title(_("Deny all users"), [
msg(), msg(),
info(sprintf(_("Do you really want to deny all users for %s?"), $angeltype['name']), true), info(sprintf(_("Do you really want to deny all users for %s?"), $angeltype['name']), true),
buttons([ buttons([
button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), 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') button(page_link_to('user_angeltypes') . '&action=delete_all&angeltype_id=' . $angeltype['id'] . '&confirmed', _("yes"), 'ok')
]) ])
]); ]);
} }
function UserAngelTypes_confirm_all_view($angeltype) { function UserAngelTypes_confirm_all_view($angeltype)
return page_with_title(_("Confirm all users"), [ {
return page_with_title(_("Confirm all users"), [
msg(), msg(),
info(sprintf(_("Do you really want to confirm all users for %s?"), $angeltype['name']), true), info(sprintf(_("Do you really want to confirm all users for %s?"), $angeltype['name']), true),
buttons([ buttons([
button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), 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') button(page_link_to('user_angeltypes') . '&action=confirm_all&angeltype_id=' . $angeltype['id'] . '&confirmed', _("yes"), 'ok')
]) ])
]); ]);
} }
function UserAngelType_confirm_view($user_angeltype, $user, $angeltype) { function UserAngelType_confirm_view($user_angeltype, $user, $angeltype)
return page_with_title(_("Confirm angeltype for user"), [ {
return page_with_title(_("Confirm angeltype for user"), [
msg(), msg(),
info(sprintf(_("Do you really want to confirm %s for %s?"), User_Nick_render($user), $angeltype['name']), true), info(sprintf(_("Do you really want to confirm %s for %s?"), User_Nick_render($user), $angeltype['name']), true),
buttons([ buttons([
button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), 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') 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) { function UserAngelType_delete_view($user_angeltype, $user, $angeltype)
return page_with_title(_("Remove angeltype"), [ {
return page_with_title(_("Remove angeltype"), [
msg(), msg(),
info(sprintf(_("Do you really want to delete %s from %s?"), User_Nick_render($user), $angeltype['name']), true), info(sprintf(_("Do you really want to delete %s from %s?"), User_Nick_render($user), $angeltype['name']), true),
buttons([ buttons([
button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), 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') 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) { function UserAngelType_add_view($angeltype, $users_source, $user_id)
$users = []; {
foreach ($users_source as $user_source) { $users = [];
$users[$user_source['UID']] = User_Nick_render($user_source); foreach ($users_source as $user_source) {
} $users[$user_source['UID']] = User_Nick_render($user_source);
}
return page_with_title(_("Add user to angeltype"), [ return page_with_title(_("Add user to angeltype"), [
msg(), msg(),
buttons([ buttons([
button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("back"), 'back') button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("back"), 'back')
]), ]),
form([ form([
form_info(_("Angeltype"), $angeltype['name']), form_info(_("Angeltype"), $angeltype['name']),
form_select('user_id', _("User"), $users, $user_id), form_select('user_id', _("User"), $users, $user_id),
form_submit('submit', _("Add")) form_submit('submit', _("Add"))
]) ])
]); ]);
} }
function UserAngelType_join_view($user, $angeltype) { function UserAngelType_join_view($user, $angeltype)
return page_with_title(sprintf(_("Become a %s"), $angeltype['name']), [ {
return page_with_title(sprintf(_("Become a %s"), $angeltype['name']), [
msg(), msg(),
info(sprintf(_("Do you really want to add %s to %s?"), User_Nick_render($user), $angeltype['name']), true), info(sprintf(_("Do you really want to add %s to %s?"), User_Nick_render($user), $angeltype['name']), true),
buttons([ buttons([
button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), 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') button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'] . '&user_id=' . $user['UID'] . '&confirmed', _("save"), 'ok')
]) ])
]); ]);
} }
?>

View File

@ -11,10 +11,11 @@
* The user driver license * The user driver license
* @return string * @return string
*/ */
function UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver_license) { 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)), [ {
return page_with_title(sprintf(_("Edit %s driving license information"), User_Nick_render($user_source)), [
buttons([ buttons([
button(user_link($user_source), _("Back to profile"), 'back') button(user_link($user_source), _("Back to profile"), 'back')
]), ]),
msg(), msg(),
form([ form([
@ -28,10 +29,10 @@ function UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver
form_checkbox('has_license_3_5t_transporter', _("Transporter 3,5t"), $user_driver_license['has_license_3_5t_transporter']), 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_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_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']) form_checkbox('has_license_forklift', _("Forklift"), $user_driver_license['has_license_forklift'])
]) ])
], 'driving_license'), ], 'driving_license'),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]), ]),
'<script type="text/javascript"> '<script type="text/javascript">
$(function() { $(function() {
@ -49,8 +50,6 @@ function UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver
} }
); );
}); });
</script>' </script>'
]); ]);
} }
?>

View File

@ -2,24 +2,25 @@
namespace Engelsystem; namespace Engelsystem;
class UserHintsRenderer { class UserHintsRenderer
{
private $hints = [];
private $hints = []; private $important = false;
private $important = false;
/** /**
* Render the added hints to a popover for the toolbar. * Render the added hints to a popover for the toolbar.
*/ */
public function render() { public function render()
if (count($this->hints) > 0) { {
$hint_class = $this->important ? 'danger' : 'info'; if (count($this->hints) > 0) {
$glyphicon = $this->important ? 'warning-sign' : 'info-sign'; $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 '';
} }
/** /**
@ -30,30 +31,31 @@ class UserHintsRenderer {
* @param boolean $important * @param boolean $important
* Is the hint important? * Is the hint important?
*/ */
public function addHint($hint, $important = false) { public function addHint($hint, $important = false)
if ($hint != null && $hint != '') { {
if ($important) { if ($hint != null && $hint != '') {
$this->important = true; if ($important) {
$this->hints[] = error($hint, true); $this->important = true;
} else { $this->hints[] = error($hint, true);
$this->hints[] = info($hint, true); } else {
$this->hints[] = info($hint, true);
}
} }
}
} }
/** /**
* Get all hints. * Get all hints.
*/ */
public function getHints() { public function getHints()
return $this->hints; {
return $this->hints;
} }
/** /**
* Are there important hints? This leads to a more intensive icon. * Are there important hints? This leads to a more intensive icon.
*/ */
public function isImportant() { public function isImportant()
return $this->important; {
return $this->important;
} }
} }
?>

View File

@ -16,7 +16,7 @@ $tshirt_sizes = [
'S-G' => "S Girl", 'S-G' => "S Girl",
'M-G' => "M Girl", 'M-G' => "M Girl",
'L-G' => "L Girl", 'L-G' => "L Girl",
'XL-G' => "XL Girl" 'XL-G' => "XL Girl"
]; ];
/** /**
@ -29,8 +29,9 @@ $tshirt_sizes = [
* @param array<String> $themes * @param array<String> $themes
* Available themes * Available themes
*/ */
function User_settings_view($user_source, $locales, $themes, $buildup_start_date, $teardown_end_date, $enable_tshirt_size, $tshirt_sizes) { 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(), [ {
return page_with_title(settings_title(), [
msg(), msg(),
div('row', [ div('row', [
div('col-md-6', [ div('col-md-6', [
@ -53,8 +54,8 @@ function User_settings_view($user_source, $locales, $themes, $buildup_start_date
form_text('hometown', _("Hometown"), $user_source['Hometown']), form_text('hometown', _("Hometown"), $user_source['Hometown']),
$enable_tshirt_size ? form_select('tshirt_size', _("Shirt size"), $tshirt_sizes, $user_source['Size']) : '', $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_info('', _('Please visit the angeltypes page to manage your angeltypes.')),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]) ])
]), ]),
div('col-md-6', [ div('col-md-6', [
form([ form([
@ -62,34 +63,35 @@ function User_settings_view($user_source, $locales, $themes, $buildup_start_date
form_password('password', _("Old password:")), form_password('password', _("Old password:")),
form_password('new_password', _("New password:")), form_password('new_password', _("New password:")),
form_password('new_password2', _("Password confirmation:")), form_password('new_password2', _("Password confirmation:")),
form_submit('submit_password', _("Save")) form_submit('submit_password', _("Save"))
]), ]),
form([ form([
form_info(_("Here you can choose your color settings:")), form_info(_("Here you can choose your color settings:")),
form_select('theme', _("Color settings:"), $themes, $user_source['color']), form_select('theme', _("Color settings:"), $themes, $user_source['color']),
form_submit('submit_theme', _("Save")) form_submit('submit_theme', _("Save"))
]), ]),
form([ form([
form_info(_("Here you can choose your language:")), form_info(_("Here you can choose your language:")),
form_select('language', _("Language:"), $locales, $user_source['Sprache']), form_select('language', _("Language:"), $locales, $user_source['Sprache']),
form_submit('submit_language', _("Save")) form_submit('submit_language', _("Save"))
]) ])
]) ])
]) ])
]); ]);
} }
/** /**
* Displays the welcome message to the user and shows a login form. * Displays the welcome message to the user and shows a login form.
*/ */
function User_registration_success_view($event_welcome_message) { function User_registration_success_view($event_welcome_message)
$parsedown = new Parsedown(); {
$event_welcome_message = $parsedown->text($event_welcome_message); $parsedown = new Parsedown();
return page_with_title(_("Registration successful"), [ $event_welcome_message = $parsedown->text($event_welcome_message);
return page_with_title(_("Registration successful"), [
msg(), msg(),
div('row', [ div('row', [
div('col-md-4', [ div('col-md-4', [
$event_welcome_message $event_welcome_message
]), ]),
div('col-md-4', [ div('col-md-4', [
'<h2>' . _("Login") . '</h2>', '<h2>' . _("Login") . '</h2>',
@ -98,70 +100,73 @@ function User_registration_success_view($event_welcome_message) {
form_password('password', _("Password")), form_password('password', _("Password")),
form_submit('submit', _("Login")), form_submit('submit', _("Login")),
buttons([ buttons([
button(page_link_to('user_password_recovery'), _("I forgot my password")) button(page_link_to('user_password_recovery'), _("I forgot my password"))
]), ]),
info(_("Please note: You have to activate cookies!"), true) info(_("Please note: You have to activate cookies!"), true)
], page_link_to('login')) ], page_link_to('login'))
]), ]),
div('col-md-4', [ div('col-md-4', [
'<h2>' . _("What can I do?") . '</h2>', '<h2>' . _("What can I do?") . '</h2>',
'<p>' . _("Please read about the jobs you can do to help us.") . '</p>', '<p>' . _("Please read about the jobs you can do to help us.") . '</p>',
buttons([ buttons([
button(page_link_to('angeltypes') . '&action=about', _("Teams/Job description") . ' &raquo;') button(page_link_to('angeltypes') . '&action=about', _("Teams/Job description") . ' &raquo;')
]) ])
]) ])
]) ])
]); ]);
} }
/** /**
* Gui for deleting user with password field. * Gui for deleting user with password field.
*/ */
function User_delete_view($user) { function User_delete_view($user)
return page_with_title(sprintf(_("Delete %s"), User_Nick_render($user)), [ {
return page_with_title(sprintf(_("Delete %s"), User_Nick_render($user)), [
msg(), msg(),
buttons([ buttons([
button(user_edit_link($user), glyph('chevron-left') . _("back")) 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), error(_("Do you really want to delete the user including all his shifts and every other piece of his data?"), true),
form([ form([
form_password('password', _("Your password")), form_password('password', _("Your password")),
form_submit('submit', _("Delete")) form_submit('submit', _("Delete"))
]) ])
]); ]);
} }
/** /**
* View for editing the number of given vouchers * View for editing the number of given vouchers
*/ */
function User_edit_vouchers_view($user) { function User_edit_vouchers_view($user)
return page_with_title(sprintf(_("%s's vouchers"), User_Nick_render($user)), [ {
return page_with_title(sprintf(_("%s's vouchers"), User_Nick_render($user)), [
msg(), msg(),
buttons([ buttons([
button(user_link($user), glyph('chevron-left') . _("back")) button(user_link($user), glyph('chevron-left') . _("back"))
]), ]),
info(sprintf(_("Angel should receive at least %d vouchers."), User_get_eligable_voucher_count($user)), true), info(sprintf(_("Angel should receive at least %d vouchers."), User_get_eligable_voucher_count($user)), true),
form([ form([
form_spinner('vouchers', _("Number of vouchers given out"), $user['got_voucher']), form_spinner('vouchers', _("Number of vouchers given out"), $user['got_voucher']),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
], page_link_to('users') . '&action=edit_vouchers&user_id=' . $user['UID']) ], 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) { 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); foreach ($users as &$user) {
$user['Gekommen'] = glyph_bool($user['Gekommen']); $user['Nick'] = User_Nick_render($user);
$user['got_voucher'] = $user['got_voucher']; $user['Gekommen'] = glyph_bool($user['Gekommen']);
$user['Aktiv'] = glyph_bool($user['Aktiv']); $user['got_voucher'] = $user['got_voucher'];
$user['force_active'] = glyph_bool($user['force_active']); $user['Aktiv'] = glyph_bool($user['Aktiv']);
$user['Tshirt'] = glyph_bool($user['Tshirt']); $user['force_active'] = glyph_bool($user['force_active']);
$user['lastLogIn'] = date(_('m/d/Y h:i a'), $user['lastLogIn']); $user['Tshirt'] = glyph_bool($user['Tshirt']);
$user['actions'] = table_buttons([ $user['lastLogIn'] = date(_('m/d/Y h:i a'), $user['lastLogIn']);
button_glyph(page_link_to('admin_user') . '&id=' . $user['UID'], 'edit', 'btn-xs') $user['actions'] = table_buttons([
button_glyph(page_link_to('admin_user') . '&id=' . $user['UID'], 'edit', 'btn-xs')
]); ]);
} }
$users[] = [ $users[] = [
'Nick' => '<strong>' . _('Sum') . '</strong>', 'Nick' => '<strong>' . _('Sum') . '</strong>',
'Gekommen' => $arrived_count, 'Gekommen' => $arrived_count,
'got_voucher' => $voucher_count, 'got_voucher' => $voucher_count,
@ -169,13 +174,13 @@ function Users_view($users, $order_by, $arrived_count, $active_count, $force_act
'force_active' => $force_active_count, 'force_active' => $force_active_count,
'freeloads' => $freeloads_count, 'freeloads' => $freeloads_count,
'Tshirt' => $tshirts_count, 'Tshirt' => $tshirts_count,
'actions' => '<strong>' . count($users) . '</strong>' 'actions' => '<strong>' . count($users) . '</strong>'
]; ];
return page_with_title(_("All users"), [ return page_with_title(_("All users"), [
msg(), msg(),
buttons([ buttons([
button(page_link_to('register'), glyph('plus') . _("New user")) button(page_link_to('register'), glyph('plus') . _("New user"))
]), ]),
table([ table([
'Nick' => Users_table_header_link('Nick', _("Nick"), $order_by), 'Nick' => Users_table_header_link('Nick', _("Nick"), $order_by),
@ -190,137 +195,143 @@ function Users_view($users, $order_by, $arrived_count, $active_count, $force_act
'Tshirt' => Users_table_header_link('Tshirt', _("T-Shirt"), $order_by), 'Tshirt' => Users_table_header_link('Tshirt', _("T-Shirt"), $order_by),
'Size' => Users_table_header_link('Size', _("Size"), $order_by), 'Size' => Users_table_header_link('Size', _("Size"), $order_by),
'lastLogIn' => Users_table_header_link('lastLogIn', _("Last login"), $order_by), 'lastLogIn' => Users_table_header_link('lastLogIn', _("Last login"), $order_by),
'actions' => '' 'actions' => ''
], $users) ], $users)
]); ]);
} }
function Users_table_header_link($column, $label, $order_by) { 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>'; {
return '<a href="' . page_link_to('users') . '&OrderBy=' . $column . '">' . $label . ($order_by == $column ? ' <span class="caret"></span>' : '') . '</a>';
} }
function User_shift_state_render($user) { function User_shift_state_render($user)
$upcoming_shifts = ShiftEntries_upcoming_for_user($user); {
if ($upcoming_shifts === false) { $upcoming_shifts = ShiftEntries_upcoming_for_user($user);
return false; 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>';
} }
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) { if (count($upcoming_shifts) == 0) {
return '<span class="text-danger moment-countdown" data-timestamp="' . $upcoming_shifts[0]['start'] . '">' . _("Shift starts %c") . '</span>'; return '<span class="text-success">' . _("Free") . '</span>';
} }
return '<span class="text-danger moment-countdown" data-timestamp="' . $upcoming_shifts[0]['end'] . '">' . _("Shift ends %c") . '</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>';
}
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>';
} }
function User_view_shiftentries($needed_angel_type) { function User_view_shiftentries($needed_angel_type)
$shift_info = '<br><b>' . $needed_angel_type['name'] . ':</b> '; {
$shift_info = '<br><b>' . $needed_angel_type['name'] . ':</b> ';
$shift_entries = []; $shift_entries = [];
foreach ($needed_angel_type['users'] as $user_shift) { foreach ($needed_angel_type['users'] as $user_shift) {
$member = User_Nick_render($user_shift); $member = User_Nick_render($user_shift);
if ($user_shift['freeloaded']) { if ($user_shift['freeloaded']) {
$member = '<strike>' . $member . '</strike>'; $member = '<strike>' . $member . '</strike>';
} }
$shift_entries[] = $member; $shift_entries[] = $member;
} }
$shift_info .= join(", ", $shift_entries); $shift_info .= join(", ", $shift_entries);
return $shift_info; return $shift_info;
} }
/** /**
* Helper that renders a shift line for user view * Helper that renders a shift line for user view
*/ */
function User_view_myshift($shift, $user_source, $its_me) { function User_view_myshift($shift, $user_source, $its_me)
global $LETZTES_AUSTRAGEN, $privileges; {
global $LETZTES_AUSTRAGEN, $privileges;
$shift_info = '<a href="' . shift_link($shift) . '">' . $shift['name'] . '</a>'; $shift_info = '<a href="' . shift_link($shift) . '">' . $shift['name'] . '</a>';
if ($shift['title']) { if ($shift['title']) {
$shift_info .= '<br /><a href="' . shift_link($shift) . '">' . $shift['title'] . '</a>'; $shift_info .= '<br /><a href="' . shift_link($shift) . '">' . $shift['title'] . '</a>';
} }
foreach ($shift['needed_angeltypes'] as $needed_angel_type) { foreach ($shift['needed_angeltypes'] as $needed_angel_type) {
$shift_info .= User_view_shiftentries($needed_angel_type); $shift_info .= User_view_shiftentries($needed_angel_type);
} }
$myshift = [ $myshift = [
'date' => date("Y-m-d", $shift['start']), 'date' => date("Y-m-d", $shift['start']),
'time' => date("H:i", $shift['start']) . ' - ' . date("H:i", $shift['end']), 'time' => date("H:i", $shift['start']) . ' - ' . date("H:i", $shift['end']),
'room' => $shift['Name'], 'room' => $shift['Name'],
'shift_info' => $shift_info, 'shift_info' => $shift_info,
'comment' => $shift['Comment'] 'comment' => $shift['Comment']
]; ];
if ($shift['freeloaded']) { if ($shift['freeloaded']) {
if (in_array("user_shifts_admin", $privileges)) { if (in_array("user_shifts_admin", $privileges)) {
$myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . ': ' . $shift['freeload_comment'] . '</p>'; $myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . ': ' . $shift['freeload_comment'] . '</p>';
} else { } else {
$myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . '</p>'; $myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . '</p>';
}
} }
}
$myshift['actions'] = [ $myshift['actions'] = [
button(shift_link($shift), glyph('eye-open') . _('view'), 'btn-xs') button(shift_link($shift), glyph('eye-open') . _('view'), 'btn-xs')
]; ];
if ($its_me || in_array('user_shifts_admin', $privileges)) { 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'); $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)) { 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'][] = 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']); $myshift['actions'] = table_buttons($myshift['actions']);
return $myshift; return $myshift;
} }
/** /**
* Helper that prepares the shift table for user view * Helper that prepares the shift table for user view
*/ */
function User_view_myshifts($shifts, $user_source, $its_me) { function User_view_myshifts($shifts, $user_source, $its_me)
$myshifts_table = []; {
$timesum = 0; $myshifts_table = [];
foreach ($shifts as $shift) { $timesum = 0;
$myshifts_table[] = User_view_myshift($shift, $user_source, $its_me); foreach ($shifts as $shift) {
$myshifts_table[] = User_view_myshift($shift, $user_source, $its_me);
if ($shift['freeloaded']) { if ($shift['freeloaded']) {
$timesum += (- 2 * ($shift['end'] - $shift['start'])); $timesum += (- 2 * ($shift['end'] - $shift['start']));
} else { } else {
$timesum += ($shift['end'] - $shift['start']); $timesum += ($shift['end'] - $shift['start']);
}
} }
}
if (count($myshifts_table) > 0) { if (count($myshifts_table) > 0) {
$myshifts_table[] = [ $myshifts_table[] = [
'date' => '<b>' . _("Sum:") . '</b>', 'date' => '<b>' . _("Sum:") . '</b>',
'time' => "<b>" . round($timesum / 3600, 1) . " h</b>", 'time' => "<b>" . round($timesum / 3600, 1) . " h</b>",
'room' => "", 'room' => "",
'shift_info' => "", 'shift_info' => "",
'comment' => "", 'comment' => "",
'actions' => "" 'actions' => ""
]; ];
} }
return $myshifts_table; return $myshifts_table;
} }
/** /**
* Renders view for a single user * Renders view for a single user
*/ */
function User_view($user_source, $admin_user_privilege, $freeloader, $user_angeltypes, $user_groups, $shifts, $its_me) { 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); $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>', [ return page_with_title('<span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . ' <small>' . $user_name . '</small>', [
msg(), msg(),
div('row space-top', [ div('row space-top', [
div('col-md-12', [ div('col-md-12', [
@ -332,16 +343,16 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel
$its_me ? button(page_link_to('user_settings'), glyph('list-alt') . _("Settings")) : '', $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('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('shifts_json_export') . '&key=' . $user_source['api_key'], glyph('export') . _("JSON Export")) : '',
$its_me ? button(page_link_to('user_myshifts') . '&reset', glyph('repeat') . _('Reset API key')) : '' $its_me ? button(page_link_to('user_myshifts') . '&reset', glyph('repeat') . _('Reset API key')) : ''
]) ])
]) ])
]), ]),
div('row', [ div('row', [
div('col-md-3', [ div('col-md-3', [
'<h1>', '<h1>',
'<span class="glyphicon glyphicon-phone"></span>', '<span class="glyphicon glyphicon-phone"></span>',
$user_source['DECT'], $user_source['DECT'],
'</h1>' '</h1>'
]), ]),
div('col-md-3', [ div('col-md-3', [
'<h4>' . _("User state") . '</h4>', '<h4>' . _("User state") . '</h4>',
@ -350,16 +361,16 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel
$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 || $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 />') : '', $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['Aktiv']) ? ' <span class="text-success">' . _("Active") . '</span>' : '',
($user_source['Gekommen'] && $admin_user_privilege && $user_source['Tshirt']) ? ' <span class="text-success">' . _("T-Shirt") . '</span>' : '' ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Tshirt']) ? ' <span class="text-success">' . _("T-Shirt") . '</span>' : ''
]), ]),
div('col-md-3', [ div('col-md-3', [
'<h4>' . _("Angeltypes") . '</h4>', '<h4>' . _("Angeltypes") . '</h4>',
User_angeltypes_render($user_angeltypes) User_angeltypes_render($user_angeltypes)
]), ]),
div('col-md-3', [ div('col-md-3', [
'<h4>' . _("Rights") . '</h4>', '<h4>' . _("Rights") . '</h4>',
User_groups_render($user_groups) User_groups_render($user_groups)
]) ])
]), ]),
($its_me || $admin_user_privilege) ? '<h2>' . _("Shifts") . '</h2>' : '', ($its_me || $admin_user_privilege) ? '<h2>' . _("Shifts") . '</h2>' : '',
($its_me || $admin_user_privilege) ? table([ ($its_me || $admin_user_privilege) ? table([
@ -368,127 +379,135 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel
'room' => _("Location"), 'room' => _("Location"),
'shift_info' => _("Name &amp; workmates"), 'shift_info' => _("Name &amp; workmates"),
'comment' => _("Comment"), 'comment' => _("Comment"),
'actions' => _("Action") 'actions' => _("Action")
], $myshifts_table) : '', ], $myshifts_table) : '',
$its_me ? info(glyph('info-sign') . _("Your night shifts between 2 and 8 am count twice."), true) : '', $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) : '' $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 * View for password recovery step 1: E-Mail
*/ */
function User_password_recovery_view() { function User_password_recovery_view()
return page_with_title(user_password_recovery_title(), [ {
return page_with_title(user_password_recovery_title(), [
msg(), msg(),
_("We will send you an e-mail with a password recovery link. Please use the email address you used for registration."), _("We will send you an e-mail with a password recovery link. Please use the email address you used for registration."),
form([ form([
form_text('email', _("E-Mail"), ""), form_text('email', _("E-Mail"), ""),
form_submit('submit', _("Recover")) form_submit('submit', _("Recover"))
]) ])
]); ]);
} }
/** /**
* View for password recovery step 2: New password * View for password recovery step 2: New password
*/ */
function User_password_set_view() { function User_password_set_view()
return page_with_title(user_password_recovery_title(), [ {
return page_with_title(user_password_recovery_title(), [
msg(), msg(),
_("Please enter a new password."), _("Please enter a new password."),
form([ form([
form_password('password', _("Password")), form_password('password', _("Password")),
form_password('password2', _("Confirm password")), form_password('password2', _("Confirm password")),
form_submit('submit', _("Save")) form_submit('submit', _("Save"))
]) ])
]); ]);
} }
function User_angeltypes_render($user_angeltypes) { function User_angeltypes_render($user_angeltypes)
$output = []; {
foreach ($user_angeltypes as $angeltype) { $output = [];
$class = ""; foreach ($user_angeltypes as $angeltype) {
if ($angeltype['restricted'] == 1) { $class = "";
if ($angeltype['confirm_user_id'] != null) { if ($angeltype['restricted'] == 1) {
$class = 'text-success'; if ($angeltype['confirm_user_id'] != null) {
} else { $class = 'text-success';
$class = 'text-warning'; } else {
} $class = 'text-warning';
} else { }
$class = 'text-success'; } else {
$class = 'text-success';
}
$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) { function User_groups_render($user_groups)
$output = []; {
foreach ($user_groups as $group) { $output = [];
$output[] = substr($group['Name'], 2); foreach ($user_groups as $group) {
} $output[] = substr($group['Name'], 2);
return join('<br />', $output); }
return join('<br />', $output);
} }
/** /**
* Render a user nickname. * Render a user nickname.
* *
* @param User $user_source * @param User $user_source
* @return string * @return string
*/ */
function User_Nick_render($user_source) { function User_Nick_render($user_source)
return '<a class="' . ($user_source['Gekommen'] ? '' : 'text-muted') . '" href="' . page_link_to('users') . '&amp;action=view&amp;user_id=' . $user_source['UID'] . '"><span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . '</a>'; {
return '<a class="' . ($user_source['Gekommen'] ? '' : 'text-muted') . '" href="' . page_link_to('users') . '&amp;action=view&amp;user_id=' . $user_source['UID'] . '"><span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . '</a>';
} }
function render_user_departure_date_hint() { function render_user_departure_date_hint()
global $user; {
global $user;
if (! isset($user['planned_departure_date']) || $user['planned_departure_date'] == 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 _("Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities.");
} }
return null; return null;
} }
function render_user_freeloader_hint() { function render_user_freeloader_hint()
global $user, $max_freeloadable_shifts; {
global $user, $max_freeloadable_shifts;
if (User_is_freeloader($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."), $max_freeloadable_shifts); 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; return null;
} }
// Hinweis für Engel, die noch nicht angekommen sind // Hinweis für Engel, die noch nicht angekommen sind
function render_user_arrived_hint() { function render_user_arrived_hint()
global $user; {
global $user;
if ($user['Gekommen'] == 0) { 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 _("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 null;
} }
function render_user_tshirt_hint() { function render_user_tshirt_hint()
global $enable_tshirt_size, $user; {
global $enable_tshirt_size, $user;
if ($enable_tshirt_size && $user['Size'] == "") { if ($enable_tshirt_size && $user['Size'] == "") {
return _("You need to specify a tshirt size in your settings!"); return _("You need to specify a tshirt size in your settings!");
} }
return null; return null;
} }
function render_user_dect_hint() { function render_user_dect_hint()
global $user; {
global $user;
if ($user['DECT'] == "") { 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 _("You need to specify a DECT phone number in your settings! If you don't have a DECT phone, just enter \"-\".");
} }
return null; return null;
} }
?>

View File

@ -16,146 +16,146 @@ $free_pages = [
'stats', 'stats',
'users', 'users',
'user_driver_licenses', 'user_driver_licenses',
'user_password_recovery' 'user_password_recovery'
]; ];
// Gewünschte Seite/Funktion // Gewünschte Seite/Funktion
$page = ""; $page = "";
if (! isset($_REQUEST['p'])) { if (! isset($_REQUEST['p'])) {
$_REQUEST['p'] = isset($user) ? "news" : "login"; $_REQUEST['p'] = isset($user) ? "news" : "login";
} }
if (isset($_REQUEST['p']) && preg_match("/^[a-z0-9_]*$/i", $_REQUEST['p']) && (in_array($_REQUEST['p'], $free_pages) || in_array($_REQUEST['p'], $privileges))) { if (isset($_REQUEST['p']) && preg_match("/^[a-z0-9_]*$/i", $_REQUEST['p']) && (in_array($_REQUEST['p'], $free_pages) || in_array($_REQUEST['p'], $privileges))) {
$page = $_REQUEST['p']; $page = $_REQUEST['p'];
$title = $page; $title = $page;
$content = ""; $content = "";
if ($page == "api") { if ($page == "api") {
require_once realpath(__DIR__ . '/../includes/controller/api.php'); require_once realpath(__DIR__ . '/../includes/controller/api.php');
error("Api disabled temporily."); error("Api disabled temporily.");
redirect(page_link_to('login')); redirect(page_link_to('login'));
api_controller(); api_controller();
} elseif ($page == "ical") { } elseif ($page == "ical") {
require_once realpath(__DIR__ . '/../includes/pages/user_ical.php'); require_once realpath(__DIR__ . '/../includes/pages/user_ical.php');
user_ical(); user_ical();
} elseif ($page == "atom") { } elseif ($page == "atom") {
require_once realpath(__DIR__ . '/../includes/pages/user_atom.php'); require_once realpath(__DIR__ . '/../includes/pages/user_atom.php');
user_atom(); user_atom();
} elseif ($page == "shifts_json_export") { } elseif ($page == "shifts_json_export") {
require_once realpath(__DIR__ . '/../includes/controller/shifts_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/shifts_controller.php');
shifts_json_export_controller(); shifts_json_export_controller();
} elseif ($page == "shifts_json_export_all") { } elseif ($page == "shifts_json_export_all") {
require_once realpath(__DIR__ . '/../includes/controller/shifts_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/shifts_controller.php');
shifts_json_export_all_controller(); shifts_json_export_all_controller();
} elseif ($page == "stats") { } elseif ($page == "stats") {
require_once realpath(__DIR__ . '/../includes/pages/guest_stats.php'); require_once realpath(__DIR__ . '/../includes/pages/guest_stats.php');
guest_stats(); guest_stats();
} elseif ($page == "user_password_recovery") { } elseif ($page == "user_password_recovery") {
require_once realpath(__DIR__ . '/../includes/controller/users_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/users_controller.php');
$title = user_password_recovery_title(); $title = user_password_recovery_title();
$content = user_password_recovery_controller(); $content = user_password_recovery_controller();
} elseif ($page == "angeltypes") { } elseif ($page == "angeltypes") {
list($title, $content) = angeltypes_controller(); list($title, $content) = angeltypes_controller();
} elseif ($page == "shifts") { } elseif ($page == "shifts") {
list($title, $content) = shifts_controller(); list($title, $content) = shifts_controller();
} elseif ($page == "users") { } elseif ($page == "users") {
list($title, $content) = users_controller(); list($title, $content) = users_controller();
} elseif ($page == "user_angeltypes") { } elseif ($page == "user_angeltypes") {
list($title, $content) = user_angeltypes_controller(); list($title, $content) = user_angeltypes_controller();
} elseif ($page == "user_driver_licenses") { } elseif ($page == "user_driver_licenses") {
list($title, $content) = user_driver_licenses_controller(); list($title, $content) = user_driver_licenses_controller();
} elseif ($page == "shifttypes") { } elseif ($page == "shifttypes") {
list($title, $content) = shifttypes_controller(); list($title, $content) = shifttypes_controller();
} elseif ($page == "admin_event_config") { } elseif ($page == "admin_event_config") {
list($title, $content) = event_config_edit_controller(); list($title, $content) = event_config_edit_controller();
} elseif ($page == "rooms") { } elseif ($page == "rooms") {
list($title, $content) = rooms_controller(); list($title, $content) = rooms_controller();
} elseif ($page == "news") { } elseif ($page == "news") {
$title = news_title(); $title = news_title();
$content = user_news(); $content = user_news();
} elseif ($page == "news_comments") { } elseif ($page == "news_comments") {
require_once realpath(__DIR__ . '/../includes/pages/user_news.php'); require_once realpath(__DIR__ . '/../includes/pages/user_news.php');
$title = user_news_comments_title(); $title = user_news_comments_title();
$content = user_news_comments(); $content = user_news_comments();
} elseif ($page == "user_meetings") { } elseif ($page == "user_meetings") {
$title = meetings_title(); $title = meetings_title();
$content = user_meetings(); $content = user_meetings();
} elseif ($page == "user_myshifts") { } elseif ($page == "user_myshifts") {
$title = myshifts_title(); $title = myshifts_title();
$content = user_myshifts(); $content = user_myshifts();
} elseif ($page == "user_shifts") { } elseif ($page == "user_shifts") {
$title = shifts_title(); $title = shifts_title();
$content = user_shifts(); $content = user_shifts();
} elseif ($page == "user_messages") { } elseif ($page == "user_messages") {
$title = messages_title(); $title = messages_title();
$content = user_messages(); $content = user_messages();
} elseif ($page == "user_questions") { } elseif ($page == "user_questions") {
$title = questions_title(); $title = questions_title();
$content = user_questions(); $content = user_questions();
} elseif ($page == "user_settings") { } elseif ($page == "user_settings") {
$title = settings_title(); $title = settings_title();
$content = user_settings(); $content = user_settings();
} elseif ($page == "login") { } elseif ($page == "login") {
$title = login_title(); $title = login_title();
$content = guest_login(); $content = guest_login();
} elseif ($page == "register") { } elseif ($page == "register") {
$title = register_title(); $title = register_title();
$content = guest_register(); $content = guest_register();
} elseif ($page == "logout") { } elseif ($page == "logout") {
$title = logout_title(); $title = logout_title();
$content = guest_logout(); $content = guest_logout();
} elseif ($page == "admin_questions") { } elseif ($page == "admin_questions") {
$title = admin_questions_title(); $title = admin_questions_title();
$content = admin_questions(); $content = admin_questions();
} elseif ($page == "admin_user") { } elseif ($page == "admin_user") {
$title = admin_user_title(); $title = admin_user_title();
$content = admin_user(); $content = admin_user();
} elseif ($page == "admin_arrive") { } elseif ($page == "admin_arrive") {
$title = admin_arrive_title(); $title = admin_arrive_title();
$content = admin_arrive(); $content = admin_arrive();
} elseif ($page == "admin_active") { } elseif ($page == "admin_active") {
$title = admin_active_title(); $title = admin_active_title();
$content = admin_active(); $content = admin_active();
} elseif ($page == "admin_free") { } elseif ($page == "admin_free") {
$title = admin_free_title(); $title = admin_free_title();
$content = admin_free(); $content = admin_free();
} elseif ($page == "admin_news") { } elseif ($page == "admin_news") {
require_once realpath(__DIR__ . '/../includes/pages/admin_news.php'); require_once realpath(__DIR__ . '/../includes/pages/admin_news.php');
$content = admin_news(); $content = admin_news();
} elseif ($page == "admin_rooms") { } elseif ($page == "admin_rooms") {
$title = admin_rooms_title(); $title = admin_rooms_title();
$content = admin_rooms(); $content = admin_rooms();
} elseif ($page == "admin_groups") { } elseif ($page == "admin_groups") {
$title = admin_groups_title(); $title = admin_groups_title();
$content = admin_groups(); $content = admin_groups();
} elseif ($page == "admin_language") { } elseif ($page == "admin_language") {
require_once realpath(__DIR__ . '/../includes/pages/admin_language.php'); require_once realpath(__DIR__ . '/../includes/pages/admin_language.php');
$content = admin_language(); $content = admin_language();
} elseif ($page == "admin_import") { } elseif ($page == "admin_import") {
$title = admin_import_title(); $title = admin_import_title();
$content = admin_import(); $content = admin_import();
} elseif ($page == "admin_shifts") { } elseif ($page == "admin_shifts") {
$title = admin_shifts_title(); $title = admin_shifts_title();
$content = admin_shifts(); $content = admin_shifts();
} elseif ($page == "admin_log") { } elseif ($page == "admin_log") {
$title = admin_log_title(); $title = admin_log_title();
$content = admin_log(); $content = admin_log();
} elseif ($page == "credits") { } elseif ($page == "credits") {
require_once realpath(__DIR__ . '/../includes/pages/guest_credits.php'); require_once realpath(__DIR__ . '/../includes/pages/guest_credits.php');
$title = credits_title(); $title = credits_title();
$content = guest_credits(); $content = guest_credits();
} else { } else {
require_once realpath(__DIR__ . '/../includes/pages/guest_start.php'); require_once realpath(__DIR__ . '/../includes/pages/guest_start.php');
$content = guest_start(); $content = guest_start();
} }
} else { } else {
// Wenn schon eingeloggt, keine-Berechtigung-Seite anzeigen // Wenn schon eingeloggt, keine-Berechtigung-Seite anzeigen
if (isset($user)) { if (isset($user)) {
$title = _("No Access"); $title = _("No Access");
$content = _("You don't have permission to view this page. You probably have to sign in or register in order to gain access!"); $content = _("You don't have permission to view this page. You probably have to sign in or register in order to gain access!");
} else { } else {
// Sonst zur Loginseite leiten // Sonst zur Loginseite leiten
redirect(page_link_to("login")); redirect(page_link_to("login"));
} }
} }
@ -172,7 +172,5 @@ echo template_render(__DIR__ . '/../templates/layout.html', [
'faq_url' => $faq_url, 'faq_url' => $faq_url,
'contact_email' => $contact_email, 'contact_email' => $contact_email,
'locale' => locale(), 'locale' => locale(),
'event_info' => EventConfig_info($event_config) . '<br />' 'event_info' => EventConfig_info($event_config) . '<br />'
]); ]);
?>

View File

@ -2,33 +2,35 @@
namespace Engelsystem\Test; namespace Engelsystem\Test;
class LogEntriesModelTest extends \PHPUnit_Framework_TestCase { class LogEntriesModelTest extends \PHPUnit_Framework_TestCase
{
public function create_LogEntry()
{
LogEntry_create('test', 'test');
}
public function create_LogEntry() { public function test_LogEntry_create()
LogEntry_create('test', 'test'); {
} $count = count(LogEntries());
$this->assertNotFalse(LogEntry_create('test', 'test_LogEntry_create'));
public function test_LogEntry_create() {
$count = count(LogEntries());
$this->assertNotFalse(LogEntry_create('test', 'test_LogEntry_create'));
// There should be one more log entry now // There should be one more log entry now
$this->assertEquals(count(LogEntries()), $count + 1); $this->assertEquals(count(LogEntries()), $count + 1);
} }
public function test_LogEntries_clear_all() { public function test_LogEntries_clear_all()
$this->create_LogEntry(); {
$this->assertTrue(count(LogEntries()) > 0); $this->create_LogEntry();
$this->assertNotFalse(LogEntries_clear_all()); $this->assertTrue(count(LogEntries()) > 0);
$this->assertEquals(count(LogEntries()), 0); $this->assertNotFalse(LogEntries_clear_all());
} $this->assertEquals(count(LogEntries()), 0);
}
/** /**
* @after * @after
*/ */
public function teardown() { public function teardown()
LogEntries_clear_all(); {
LogEntries_clear_all();
} }
} }
?>

View File

@ -2,34 +2,35 @@
namespace Engelsystem\Test; namespace Engelsystem\Test;
class RoomModelTest extends \PHPUnit_Framework_TestCase { class RoomModelTest extends \PHPUnit_Framework_TestCase
{
private $room_id = null;
private $room_id = null; public function create_Room()
{
$this->room_id = Room_create('test', false, true, '');
}
public function create_Room() { public function test_Room()
$this->room_id = Room_create('test', false, true, ''); {
} $this->create_Room();
public function test_Room() {
$this->create_Room();
$room = Room($this->room_id); $room = Room($this->room_id);
$this->assertNotFalse($room); $this->assertNotFalse($room);
$this->assertNotNull($room); $this->assertNotNull($room);
$this->assertEquals($room['Name'], 'test'); $this->assertEquals($room['Name'], 'test');
$this->assertNull(Room(- 1)); $this->assertNull(Room(- 1));
} }
/** /**
* @after * @after
*/ */
public function teardown() { public function teardown()
if ($this->room_id != null) { {
Room_delete($this->room_id); if ($this->room_id != null) {
} Room_delete($this->room_id);
}
} }
} }
?>