function getUserTickets($thisstaff, $status = 'open', $limit = 10, $userId = 0){ $showoverdue=$showanswered=false; $staffId=0; //Nothing for now...TODO: Allow admin and manager to limit tickets to single staff level. $showassigned= true; //show Assigned To column - defaults to true //Get status we are actually going to use on the query...making sure it is clean! switch(strtolower($status)){ //Status is overloaded case 'open': $status='open'; break; case 'closed': $status='closed'; $showassigned=true; //closed by. break; case 'overdue': $status='open'; $showoverdue=true; $results_type='Overdue Tickets'; break; case 'assigned': $status='open'; $staffId=$thisstaff->getId(); $results_type='My Tickets'; break; case 'answered': $status='open'; $showanswered=true; $results_type='Answered Tickets'; break; default: $status='open'; } $qwhere =''; /* STRICT DEPARTMENTS BASED PERMISSION! User can also see tickets assigned to them regardless of the ticket's dept. */ $depts=$thisstaff->getDepts(); $qwhere =' WHERE ( ' .' ( ticket.staff_id='.db_input($thisstaff->getId()) .' AND ticket.status="open")'; if(!$thisstaff->showAssignedOnly()) $qwhere.=' OR ticket.dept_id IN ('.($depts?implode(',', db_input($depts)):0).')'; if(($teams=$thisstaff->getTeams()) && count(array_filter($teams))) $qwhere.=' OR (ticket.team_id IN ('.implode(',', db_input(array_filter($teams))) .') AND ticket.status="open")'; $qwhere .= ' )'; //STATUS if($status) { $qwhere.=' AND ticket.status='.db_input(strtolower($status)); } if (uid) { $qwhere .= ' AND (ticket.user_id='.db_input($userId) .' OR collab.user_id='.db_input($userId).') '; $qstr .= '&uid='.urlencode($userId); } //Queues: Overloaded sub-statuses - you've got to just have faith! if($staffId && ($staffId==$thisstaff->getId())) { //My tickets $results_type='Assigned Tickets'; $qwhere.=' AND ticket.staff_id='.db_input($staffId); $showassigned=false; //My tickets...already assigned to the staff. }elseif($showoverdue) { //overdue $qwhere.=' AND ticket.isoverdue=1 '; }elseif($showanswered) { ////Answered $qwhere.=' AND ticket.isanswered=1 '; } $sortOptions=array('date'=>'effective_date','ID'=>'ticket.`number`', 'pri'=>'pri.priority_urgency','name'=>'user.name','subj'=>'cdata.subject', 'status'=>'ticket.status','assignee'=>'assigned','staff'=>'staff', 'dept'=>'dept.dept_name','topic'=>'topic.topic'); $orderWays=array('DESC'=>'DESC','ASC'=>'ASC'); //Sorting options... $queue = isset($_REQUEST['status'])?strtolower($_REQUEST['status']):$status; $order_by=$order=null; if($_REQUEST['sort'] && $sortOptions[$_REQUEST['sort']]) $order_by =$sortOptions[$_REQUEST['sort']]; elseif($sortOptions[$_SESSION[$queue.'_tickets']['sort']]) { $_REQUEST['sort'] = $_SESSION[$queue.'_tickets']['sort']; $_REQUEST['order'] = $_SESSION[$queue.'_tickets']['order']; $order_by = $sortOptions[$_SESSION[$queue.'_tickets']['sort']]; $order = $_SESSION[$queue.'_tickets']['order']; } if($_REQUEST['order'] && $orderWays[strtoupper($_REQUEST['order'])]) $order=$orderWays[strtoupper($_REQUEST['order'])]; //Save sort order for sticky sorting. if($_REQUEST['sort'] && $queue) { $_SESSION[$queue.'_tickets']['sort'] = $_REQUEST['sort']; $_SESSION[$queue.'_tickets']['order'] = $_REQUEST['order']; } //Set default sort by columns. if(!$order_by ) { if($showanswered) $order_by='ticket.lastresponse, ticket.created'; //No priority sorting for answered tickets. elseif(!strcasecmp($status,'closed')) $order_by='ticket.closed, ticket.created'; //No priority sorting for closed tickets. elseif($showoverdue) //priority> duedate > age in ASC order. $order_by='pri.priority_urgency ASC, ISNULL(ticket.duedate) ASC, ticket.duedate ASC, effective_date ASC, ticket.created'; else //XXX: Add due date here?? No - $order_by='pri.priority_urgency ASC, effective_date DESC, ticket.created'; } $order=$order?$order:'DESC'; if($order_by && strpos($order_by,',') && $order) $order_by=preg_replace('/(?NOW() AND tlock.staff_id!='.db_input($thisstaff->getId()).') ' .' LEFT JOIN '.STAFF_TABLE.' staff ON (ticket.staff_id=staff.staff_id) ' .' LEFT JOIN '.TEAM_TABLE.' team ON (ticket.team_id=team.team_id) ' .' LEFT JOIN '.SLA_TABLE.' sla ON (ticket.sla_id=sla.id AND sla.isactive=1) ' .' LEFT JOIN '.TOPIC_TABLE.' topic ON (ticket.topic_id=topic.topic_id) ' .' LEFT JOIN '.TOPIC_TABLE.' ptopic ON (ptopic.topic_id=topic.topic_pid) ' .' LEFT JOIN '.TABLE_PREFIX.'ticket__cdata cdata ON (cdata.ticket_id = ticket.ticket_id) ' .' LEFT JOIN '.PRIORITY_TABLE.' pri ON (pri.priority_id = cdata.priority_id)'; TicketForm::ensureDynamicDataView(); $query="$qselect $qfrom $qwhere ORDER BY $order_by $order LIMIT $limit"; //echo $query; $hash = md5($query); $_SESSION['search_'.$hash] = $query; $res = db_query($query); $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. // Fetch the results $results = array(); while ($row = db_fetch_array($res)) { $results[$row['ticket_id']] = $row; } // Fetch attachment and thread entry counts if ($results) { $counts_sql = 'SELECT ticket.ticket_id, count(DISTINCT attach.attach_id) as attachments, count(DISTINCT thread.id) as thread_count, count(DISTINCT collab.id) as collaborators FROM '.TICKET_TABLE.' ticket LEFT JOIN '.TICKET_ATTACHMENT_TABLE.' attach ON (ticket.ticket_id=attach.ticket_id) ' .' LEFT JOIN '.TICKET_THREAD_TABLE.' thread ON ( ticket.ticket_id=thread.ticket_id) ' .' LEFT JOIN '.TICKET_COLLABORATOR_TABLE.' collab ON ( ticket.ticket_id=collab.ticket_id) ' .' WHERE ticket.ticket_id IN ('.implode(',', db_input(array_keys($results))).') GROUP BY ticket.ticket_id'; $ids_res = db_query($counts_sql); while ($row = db_fetch_array($ids_res)) { $results[$row['ticket_id']] += $row; } } return $results; }