/** * Check if an angel can sign up for given shift. * * @param Shift $shift * @param AngelType $angeltype * @param array<Shift> $user_shifts */ function Shift_signup_allowed($shift, $angeltype, $user_angeltype = null, $user_shifts = null) { global $user, $privileges; if ($user_shifts == null) { $user_shifts = Shifts_by_user($user); if ($user_shifts === false) { engelsystem_error('Unable to load users shifts.'); } } $collides = Shift_collides($shift, $user_shifts); if ($user_angeltype == null) { $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); if ($user_angeltype === false) { engelsystem_error('Unable to load user angeltype.'); } } $signed_up = false; foreach ($user_shifts as $user_shift) { if ($user_shift['SID'] == $shift['SID']) { $signed_up = true; break; } } $needed_angeltypes = NeededAngelTypes_by_shift($shift['SID']); if ($needed_angeltypes === false) { engelsystem_error('Unable to load needed angel types.'); } // is the shift still running or alternatively is the user shift admin? $user_may_join_shift = true; // you canot join if shift is full foreach ($needed_angeltypes as $needed_angeltype) { if ($needed_angeltype['angel_type_id'] == $angeltype['id']) { if ($needed_angeltype['taken'] >= $needed_angeltype['count']) { $user_may_join_shift = false; } break; } } // you cannot join if user alread joined a parallel or this shift $user_may_join_shift &= !$collides; // you cannot join if you already singed up for this shift $user_may_join_shift &= !$signed_up; // you cannot join if user is not of this angel type $user_may_join_shift &= $user_angeltype != null; // you cannot join if you are not confirmed if ($angeltype['restricted'] == 1 && $user_angeltype != null) { $user_may_join_shift &= isset($user_angeltype['confirm_user_id']); } // you can only join if the shift is in future $user_may_join_shift &= time() < $shift['start']; // User shift admins may join anybody in every shift $user_may_join_shift |= in_array('user_shifts_admin', $privileges); return $user_may_join_shift; }
function Shift_signup_button_render($shift, $angeltype, $user_angeltype = null, $user_shifts = null) { global $user; if ($user_angeltype == null) { $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); if ($user_angeltype === false) { engelsystem_error('Unable to load user angeltype.'); } } if (Shift_signup_allowed($shift, $angeltype, $user_angeltype, $user_shifts)) { return button(page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $angeltype['id'], _('Sign up')); } elseif ($user_angeltype == null) { return button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], sprintf(_('Become %s'), $angeltype['name'])); } else { return ''; } }
/** * User joining an Angeltype (Or Coordinator doing this for him). */ function user_angeltype_add_controller() { global $user, $privileges; if (!isset($_REQUEST['angeltype_id'])) { error(_("Angeltype doesn't exist.")); redirect(page_link_to('angeltypes')); } $angeltype = AngelType($_REQUEST['angeltype_id']); if ($angeltype === false) { engelsystem_error("Unable to load angeltype."); } if ($angeltype == null) { error(_("Angeltype doesn't exist.")); redirect(page_link_to('angeltypes')); } if (User_is_AngelType_coordinator($user, $angeltype)) { // Allow to add any user $user_id = $user['UID']; $users_source = Users_by_angeltype_inverted($angeltype); if ($users_source === false) { engelsystem_error("Unable to load users."); } if (isset($_REQUEST['submit'])) { $ok = true; if (isset($_REQUEST['user_id']) && in_array($_REQUEST['user_id'], array_map(function ($user) { return $user['UID']; }, $users_source))) { $user_id = $_REQUEST['user_id']; } else { $ok = false; error(_("Please select a user.")); } if ($ok) { foreach ($users_source as $user_source) { if ($user_source['UID'] == $user_id) { $user_angeltype_id = UserAngelType_create($user_source, $angeltype); if ($user_angeltype_id === false) { engelsystem_error("Unable to create user 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))); $result = UserAngelType_confirm($user_angeltype_id, $user_source); if ($result === false) { engelsystem_error("Unable to confirm user 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']); } } } } return array(_("Add user to angeltype"), UserAngelType_add_view($angeltype, $users_source, $user_id)); } else { // Allow only me $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); if ($user_angeltype === false) { engelsystem_error("Unable to load user angeltype."); } if ($user_angeltype != null) { error(sprintf(_("You are already a %s."), $angeltype['name'])); redirect(page_link_to('angeltypes')); } if (isset($_REQUEST['confirmed'])) { $user_angeltype_id = UserAngelType_create($user, $angeltype); if ($user_angeltype_id === false) { engelsystem_error("Unable to 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)) { $result = UserAngelType_confirm($user_angeltype_id, $user); if ($result === false) { engelsystem_error("Unable to confirm user 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']); } return array(sprintf(_("Become a %s"), $angeltype['name']), UserAngelType_join_view($user, $angeltype)); } }
/** * View details of a given angeltype. */ function angeltype_controller() { global $privileges, $user; if (!in_array('angeltypes', $privileges)) { redirect('?'); } if (!isset($_REQUEST['angeltype_id'])) { redirect(page_link_to('angeltypes')); } $angeltype = AngelType($_REQUEST['angeltype_id']); if ($angeltype === false) { engelsystem_error("Unable to load angeltype."); } if ($angeltype == null) { redirect(page_link_to('angeltypes')); } $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); if ($user_angeltype === false) { engelsystem_error("Unable to load user angeltype."); } $members = Users_by_angeltype($angeltype); if ($members === false) { engelsystem_error("Unable to load members."); } return array(sprintf(_("Team %s"), $angeltype['name']), AngelType_view($angeltype, $members, $user_angeltype, in_array('admin_user_angeltypes', $privileges) || $user_angeltype['coordinator'], in_array('admin_angel_types', $privileges), $user_angeltype['coordinator'])); }