/** * Handles the actual assignment form, validates it and carries it out. * * Primarily this is just about receiving the form, making the same checks that {@link shd_assign()} does and then * logging the action before passing over to {@link shd_commit_assignment()} to actually assign the ticket. * * @see shd_assign() * @see shd_commit_assignment() * @since 1.0 */ function shd_assign2() { global $context, $smcFunc, $user_info, $sourcedir; checkSession(); checkSubmitOnce('check'); if (empty($context['ticket_id'])) { fatal_lang_error('shd_no_ticket'); } $context['shd_return_to'] = isset($_REQUEST['home']) ? 'home' : 'ticket'; $assignee = isset($_REQUEST['to_user']) ? (int) $_REQUEST['to_user'] : 0; // Get ticket details - and kick it out if they shouldn't be able to see it. $query = shd_db_query('', ' SELECT id_member_started, id_member_assigned, private, subject, status, id_dept FROM {db_prefix}helpdesk_tickets AS hdt WHERE {query_see_ticket} AND id_ticket = {int:ticket}', array('ticket' => $context['ticket_id'])); $log_params = array(); if ($row = $smcFunc['db_fetch_row']($query)) { list($ticket_starter, $ticket_owner, $private, $subject, $status, $dept) = $row; // The core details that we'll be logging $log_params = array('subject' => $subject, 'ticket' => $context['ticket_id']); } else { $smcFunc['db_free_result']($query); fatal_lang_error('shd_no_ticket'); } // Just in case, are they cancelling? if (isset($_REQUEST['cancel'])) { redirectexit('action=helpdesk;sa=ticket;ticket=' . $context['ticket_id']); } if ($status == TICKET_STATUS_CLOSED || $status == TICKET_STATUS_DELETED) { fatal_lang_error('shd_cannot_assign', false); } if (shd_allowed_to('shd_assign_ticket_any', $dept)) { if ($assignee == 0) { shd_log_action('unassign', $log_params); shd_commit_assignment($context['ticket_id'], 0); } else { $members = shd_get_possible_assignees($private, $ticket_starter, $dept); if (in_array($assignee, $members)) { global $user_profile; loadMemberData($assignee, false, 'minimal'); $log_params += array('user_id' => $assignee, 'user_name' => $user_profile[$assignee]['real_name']); shd_log_action('assign', $log_params); shd_commit_assignment($context['ticket_id'], $assignee); } else { fatal_lang_error('shd_assigned_not_permitted', false); } } } elseif (shd_allowed_to('shd_assign_ticket_own', $dept) && shd_allowed_to('shd_staff', $dept)) { if ($ticket_owner == 0) { $log_params += array('user_id' => $user_info['id'], 'user_name' => $user_info['name']); shd_log_action('assign', $log_params); shd_commit_assignment($context['ticket_id'], $user_info['id']); } elseif ($ticket_starter == $user_info['id']) { shd_log_action('unassign', $log_params); shd_commit_assignment($context['ticket_id'], 0); } else { // oops, assigned to somebody else fatal_lang_error('shd_cannot_assign_other', false); } } else { fatal_lang_error('shd_cannot_assign', false); } }
/** * Action a new assignment via AJAX. * * Operations: * - Session check * - Permissions check (that you can assign a ticket to someone else); if you can't assign a ticket to someone else, bail. * - Get the list of information for a ticket (which implicitly checks ticket access); if you can't see the ticket, bail. * - Get the list of who can be assigned a ticket; if requested user not on that list, bail. * - Update and build return status, and return via AJAX. */ function shd_ajax_assign2() { global $context, $smcFunc, $txt, $sourcedir, $user_profile; checkSession('get'); if (!empty($context['ticket_id'])) { $query = shd_db_query('', ' SELECT hdt.private, hdt.id_member_started, id_member_assigned, subject, id_dept, hdt.status, 1 AS valid FROM {db_prefix}helpdesk_tickets AS hdt WHERE {query_see_ticket} AND hdt.id_ticket = {int:ticket}', array('ticket' => $context['ticket_id'])); if ($smcFunc['db_num_rows']($query) != 0) { list($private, $ticket_starter, $ticket_assigned, $subject, $dept, $status, $valid) = $smcFunc['db_fetch_row']($query); } $smcFunc['db_free_result']($query); } if (empty($valid)) { return $context['ajax_return'] = array('error' => $txt['shd_no_ticket']); } if (!isset($_GET['to_user']) || !is_numeric($_GET['to_user'])) { return $context['ajax_return'] = array('error' => $txt['shd_assigned_not_permitted'] . 'line459'); } if (!shd_allowed_to('shd_assign_ticket_any', $dept) || $status == TICKET_STATUS_CLOSED || $status == TICKET_STATUS_DELETED) { return $context['ajax_return'] = array('error' => $txt['shd_cannot_assign']); } $_GET['to_user'] = isset($_GET['to_user']) ? (int) $_GET['to_user'] : 0; require_once $sourcedir . '/sd_source/SimpleDesk-Assign.php'; $assignees = shd_get_possible_assignees($private, $ticket_starter, $dept); array_unshift($assignees, 0); // add the unassigned option in at the start if (!in_array($_GET['to_user'], $assignees)) { return $context['ajax_return'] = array('error' => $txt['shd_assigned_not_permitted']); } if (!empty($_GET['to_user'])) { loadMemberData($_GET['to_user']); } $user_name = shd_profile_link(empty($_GET['to_user']) ? '<span class="error">' . $txt['shd_unassigned'] . '</span>' : $user_profile[$_GET['to_user']]['member_name'], $_GET['to_user']); // If it's being assigned to the current assignee, don't bother actually requesting the change. if ($_GET['to_user'] != $ticket_assigned) { $log_params = array('subject' => $subject, 'ticket' => $context['ticket_id'], 'user_id' => $_GET['to_user'], 'user_name' => $user_name); shd_log_action('assign', $log_params); shd_commit_assignment($context['ticket_id'], $_GET['to_user'], true); } return $context['ajax_return'] = array('assigned' => $user_name); }