Example #1
0
/**
 * 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;
}
Example #2
0
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']));
}