diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php index 5722a76a78dac30cb36667808fc32e47c8fc8924..755c9336c3b8df7c6b2d9c9042a83644d573d2c1 100644 --- a/include/ajax.tickets.php +++ b/include/ajax.tickets.php @@ -102,14 +102,16 @@ class TicketsAjaxAPI extends AjaxController { $result=array(); $select = 'SELECT ticket.ticket_id'; - $from = ' FROM '.TICKET_TABLE.' ticket '; + $from = ' FROM '.TICKET_TABLE.' ticket + LEFT JOIN '.TICKET_STATUS_TABLE.' status + ON (status.id = ticket.status_id) '; //Access control. $where = ' WHERE ( (ticket.staff_id='.db_input($thisstaff->getId()) - .' AND ticket.status="open" )'; + .' AND status.state="open" )'; if(($teams=$thisstaff->getTeams()) && count(array_filter($teams))) $where.=' OR (ticket.team_id IN ('.implode(',', db_input(array_filter($teams))) - .' ) AND ticket.status="open")'; + .' ) AND status.state="open" )'; if(!$thisstaff->showAssignedOnly() && ($depts=$thisstaff->getDepts())) $where.=' OR ticket.dept_id IN ('.implode(',', db_input($depts)).')'; @@ -127,16 +129,19 @@ class TicketsAjaxAPI extends AjaxController { //Status switch(strtolower($req['status'])) { case 'open': - $where.=' AND ticket.status="open" '; + $where.=' AND status.state="open" '; break; case 'answered': - $where.=' AND ticket.status="open" AND ticket.isanswered=1 '; + $where.=' AND status.state="open" AND ticket.isanswered=1 '; break; case 'overdue': - $where.=' AND ticket.status="open" AND ticket.isoverdue=1 '; + $where.=' AND status.state="open" AND ticket.isoverdue=1 '; + break; + case 'resolved': + $where.=' AND status.state="resolved" '; break; case 'closed': - $where.=' AND ticket.status="closed" '; + $where.=' AND status.state="closed" '; break; } @@ -144,7 +149,7 @@ class TicketsAjaxAPI extends AjaxController { if(isset($req['assignee']) && strcasecmp($req['status'], 'closed')) { $id=preg_replace("/[^0-9]/", "", $req['assignee']); $assignee = $req['assignee']; - $where.= ' AND ( ( ticket.status="open" '; + $where.= ' AND ( ( status.state="open" '; if($assignee[0]=='t') $where.=' AND ticket.team_id='.db_input($id); elseif($assignee[0]=='s') @@ -155,13 +160,15 @@ class TicketsAjaxAPI extends AjaxController { $where.=')'; if($req['staffId'] && !$req['status']) //Assigned TO + Closed By - $where.= ' OR (ticket.staff_id='.db_input($req['staffId']). ' AND ticket.status="closed") '; + $where.= ' OR (ticket.staff_id='.db_input($req['staffId']). + ' AND status.state IN("resolved", "closed")) '; elseif(isset($req['staffId'])) // closed by any - $where.= ' OR ticket.status="closed" '; + $where.= ' OR status.state IN("resolved", "closed") '; $where.= ' ) '; } elseif($req['staffId']) { - $where.=' AND (ticket.staff_id='.db_input($req['staffId']).' AND ticket.status="closed") '; + $where.=' AND (ticket.staff_id='.db_input($req['staffId']).' AND + status.state IN("resolved", "closed")) '; } //dates @@ -210,7 +217,8 @@ class TicketsAjaxAPI extends AjaxController { $cdata_search = false; foreach (TicketForm::getInstance()->getFields() as $f) { if (isset($req[$f->getFormName()]) - && ($val = $req[$f->getFormName()])) { + && ($val = $req[$f->getFormName()]) + && strlen(trim($val))) { $name = $f->get('name') ? $f->get('name') : 'field_'.$f->get('id'); if ($f->getImpl()->hasIdValue() && is_numeric($val)) diff --git a/include/class.client.php b/include/class.client.php index 9f29b0e10ee6118b9ba19ff860e447ec85c0bcd0..3b9e09674152510815ff23e3c39e36cb558ed2f2 100644 --- a/include/class.client.php +++ b/include/class.client.php @@ -248,13 +248,20 @@ class EndUser extends AuthenticatedUser { } function getNumTickets() { - return ($stats=$this->getTicketStats())?($stats['open']+$stats['closed']):0; + if (!($stats=$this->getTicketStats())) + return 0; + + return $stats['open']+$stats['resolved']+ $stats['closed']; } function getNumOpenTickets() { return ($stats=$this->getTicketStats())?$stats['open']:0; } + function getNumResolvedTickets() { + return ($stats=$this->getTicketStats())?$stats['resolved']:0; + } + function getNumClosedTickets() { return ($stats=$this->getTicketStats())?$stats['closed']:0; } @@ -269,19 +276,44 @@ class EndUser extends AuthenticatedUser { private function getStats() { - $sql='SELECT count(open.ticket_id) as open, count(closed.ticket_id) as closed ' - .' FROM '.TICKET_TABLE.' ticket ' - .' LEFT JOIN '.TICKET_TABLE.' open - ON (open.ticket_id=ticket.ticket_id AND open.status=\'open\') ' - .' LEFT JOIN '.TICKET_TABLE.' closed - ON (closed.ticket_id=ticket.ticket_id AND closed.status=\'closed\')' - .' LEFT JOIN '.TICKET_COLLABORATOR_TABLE.' collab - ON (collab.ticket_id=ticket.ticket_id - AND collab.user_id = '.db_input($this->getId()).' )' - .' WHERE ticket.user_id = '.db_input($this->getId()) - .' OR collab.user_id = '.db_input($this->getId()); - - return db_fetch_array(db_query($sql)); + $where = ' WHERE ticket.user_id = '.db_input($this->getId()) + .' OR collab.user_id = '.db_input($this->getId()).' '; + + $join = 'LEFT JOIN '.TICKET_COLLABORATOR_TABLE.' collab + ON (collab.ticket_id=ticket.ticket_id + AND collab.user_id = '.db_input($this->getId()).' ) '; + + $sql = 'SELECT \'open\', count( ticket.ticket_id ) AS tickets ' + .'FROM ' . TICKET_TABLE . ' ticket ' + .'INNER JOIN '.TICKET_STATUS_TABLE. ' status + ON (ticket.status_id=status.id + AND status.state=\'open\') ' + . $join + . $where + + .'UNION SELECT \'resolved\', count( ticket.ticket_id ) AS tickets ' + .'FROM ' . TICKET_TABLE . ' ticket ' + .'INNER JOIN '.TICKET_STATUS_TABLE. ' status + ON (ticket.status_id=status.id + AND status.state=\'resolved\') ' + . $join + . $where + + .'UNION SELECT \'closed\', count( ticket.ticket_id ) AS tickets ' + .'FROM ' . TICKET_TABLE . ' ticket ' + .'INNER JOIN '.TICKET_STATUS_TABLE. ' status + ON (ticket.status_id=status.id + AND status.state=\'closed\' ) ' + . $join + . $where; + + $res = db_query($sql); + $stats = array(); + while($row = db_fetch_row($res)) { + $stats[$row[0]] = $row[1]; + } + + return $stats; } } diff --git a/include/class.ticket.php b/include/class.ticket.php index 2535f16be9f8dfa81297559ecc4422b43b8e6c12..b2676b7f2c8f4af97635a7f8d8ab0f838bc07b6b 100644 --- a/include/class.ticket.php +++ b/include/class.ticket.php @@ -2162,12 +2162,13 @@ class Ticket { if(!$staff || (!is_object($staff) && !($staff=Staff::lookup($staff))) || !$staff->isStaff()) return null; - $where = array('(ticket.staff_id='.db_input($staff->getId()) .' AND ticket.status="open")'); + $where = array('(ticket.staff_id='.db_input($staff->getId()) .' AND + status.state="open")'); $where2 = ''; if(($teams=$staff->getTeams())) $where[] = ' ( ticket.team_id IN('.implode(',', db_input(array_filter($teams))) - .') AND ticket.status="open")'; + .') AND status.state="open")'; if(!$staff->showAssignedOnly() && ($depts=$staff->getDepts())) //Staff with limited access just see Assigned tickets. $where[] = 'ticket.dept_id IN('.implode(',', db_input($depts)).') '; @@ -2179,31 +2180,50 @@ class Ticket { $sql = 'SELECT \'open\', count( ticket.ticket_id ) AS tickets ' .'FROM ' . TICKET_TABLE . ' ticket ' - .'WHERE ticket.status = \'open\' ' - .'AND ticket.isanswered =0 ' + .'INNER JOIN '.TICKET_STATUS_TABLE. ' status + ON (ticket.status_id=status.id + AND status.state=\'open\') ' + .'WHERE ticket.isanswered = 0 ' . $where . $where2 .'UNION SELECT \'answered\', count( ticket.ticket_id ) AS tickets ' .'FROM ' . TICKET_TABLE . ' ticket ' - .'WHERE ticket.status = \'open\' ' - .'AND ticket.isanswered =1 ' + .'INNER JOIN '.TICKET_STATUS_TABLE. ' status + ON (ticket.status_id=status.id + AND status.state=\'open\') ' + .'WHERE ticket.isanswered = 1 ' . $where .'UNION SELECT \'overdue\', count( ticket.ticket_id ) AS tickets ' .'FROM ' . TICKET_TABLE . ' ticket ' - .'WHERE ticket.status = \'open\' ' - .'AND ticket.isoverdue =1 ' + .'INNER JOIN '.TICKET_STATUS_TABLE. ' status + ON (ticket.status_id=status.id + AND status.state=\'open\') ' + .'WHERE ticket.isoverdue =1 ' . $where .'UNION SELECT \'assigned\', count( ticket.ticket_id ) AS tickets ' .'FROM ' . TICKET_TABLE . ' ticket ' - .'WHERE ticket.status = \'open\' ' - .'AND ticket.staff_id = ' . db_input($staff->getId()) . ' ' + .'INNER JOIN '.TICKET_STATUS_TABLE. ' status + ON (ticket.status_id=status.id + AND status.state=\'open\') ' + .'WHERE ticket.staff_id = ' . db_input($staff->getId()) . ' ' + . $where + + .'UNION SELECT \'resolved\', count( ticket.ticket_id ) AS tickets ' + .'FROM ' . TICKET_TABLE . ' ticket ' + .'INNER JOIN '.TICKET_STATUS_TABLE. ' status + ON (ticket.status_id=status.id + AND status.state=\'resolved\') ' + .'WHERE 1 ' . $where .'UNION SELECT \'closed\', count( ticket.ticket_id ) AS tickets ' .'FROM ' . TICKET_TABLE . ' ticket ' - .'WHERE ticket.status = \'closed\' ' + .'INNER JOIN '.TICKET_STATUS_TABLE. ' status + ON (ticket.status_id=status.id + AND status.state=\'closed\' ) ' + .'WHERE 1 ' . $where; $res = db_query($sql); diff --git a/include/client/tickets.inc.php b/include/client/tickets.inc.php index 2c7a9f2317743e6ff170236a06ec39ce2355df23..bfc9d38933a80dd8e3955f9ff11a57e799829f5d 100644 --- a/include/client/tickets.inc.php +++ b/include/client/tickets.inc.php @@ -19,7 +19,7 @@ if(isset($_REQUEST['status'])) { //Query string status has nothing to do with th } $sortOptions=array('id'=>'`number`', 'subject'=>'subject.value', - 'status'=>'ticket.status', 'dept'=>'dept_name','date'=>'ticket.created'); + 'status'=>'status.name', 'dept'=>'dept_name','date'=>'ticket.created'); $orderWays=array('DESC'=>'DESC','ASC'=>'ASC'); //Sorting options... $order_by=$order=null; @@ -40,7 +40,7 @@ $$x=' class="'.strtolower($order).'" '; $qselect='SELECT ticket.ticket_id,ticket.`number`,ticket.dept_id,isanswered, ' .'dept.ispublic, subject.value as subject,' - .'dept_name,ticket. status, ticket.source, ticket.created '; + .'dept_name,status.name as status, ticket.source, ticket.created '; $dynfields='(SELECT entry.object_id, value FROM '.FORM_ANSWER_TABLE.' ans '. 'LEFT JOIN '.FORM_ENTRY_TABLE.' entry ON entry.id=ans.entry_id '. @@ -49,6 +49,8 @@ $dynfields='(SELECT entry.object_id, value FROM '.FORM_ANSWER_TABLE.' ans '. $subject_sql = sprintf($dynfields, 'subject'); $qfrom='FROM '.TICKET_TABLE.' ticket ' + .' LEFT JOIN '.TICKET_STATUS_TABLE.' status + ON (status.id = ticket.status_id) ' .' LEFT JOIN '.DEPT_TABLE.' dept ON (ticket.dept_id=dept.dept_id) ' .' LEFT JOIN '.TICKET_COLLABORATOR_TABLE.' collab ON (collab.ticket_id = ticket.ticket_id @@ -58,8 +60,12 @@ $qfrom='FROM '.TICKET_TABLE.' ticket ' $qwhere = sprintf(' WHERE ( ticket.user_id=%d OR collab.user_id=%d )', $thisclient->getId(), $thisclient->getId()); -if($status){ - $qwhere.=' AND ticket.status='.db_input($status); +$states = array( + 'open' => 'open', + 'resolved' => 'resolved', + 'closed' => 'closed'); +if($status && isset($states[$status])){ + $qwhere.=' AND status.state='.db_input($states[$status]); } $search=($_REQUEST['a']=='search' && $_REQUEST['q']); @@ -110,6 +116,14 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting <option value="">— Any Status —</option> <option value="open" <?php echo ($status=='open')?'selected="selected"':'';?>>Open (<?php echo $thisclient->getNumOpenTickets(); ?>)</option> + <?php + if($thisclient->getNumResolvedTickets()) { + ?> + <option value="resolved" + <?php echo ($status=='resolved')?'selected="selected"':'';?>> Resolved (<?php echo $thisclient->getNumResolvedTickets(); ?>)</option> + <?php + } ?> + <?php if($thisclient->getNumClosedTickets()) { ?> diff --git a/include/staff/templates/tickets.tmpl.php b/include/staff/templates/tickets.tmpl.php index abf3314ef753f97742d97d7a2398a8f9ef73d919..703a78135ffe27dd0a22f2558846c107dd0ac678 100644 --- a/include/staff/templates/tickets.tmpl.php +++ b/include/staff/templates/tickets.tmpl.php @@ -1,7 +1,7 @@ <?php $select ='SELECT ticket.ticket_id,ticket.`number`,ticket.dept_id,ticket.staff_id,ticket.team_id, ticket.user_id ' - .' ,dept.dept_name,ticket.status,ticket.source,ticket.isoverdue,ticket.isanswered,ticket.created ' + .' ,dept.dept_name,status.name as status,ticket.source,ticket.isoverdue,ticket.isanswered,ticket.created ' .' ,CAST(GREATEST(IFNULL(ticket.lastmessage, 0), IFNULL(ticket.reopened, 0), ticket.created) as datetime) as effective_date ' .' ,CONCAT_WS(" ", staff.firstname, staff.lastname) as staff, team.name as team ' .' ,IF(staff.staff_id IS NULL,team.name,CONCAT_WS(" ", staff.lastname, staff.firstname)) as assigned ' @@ -9,6 +9,8 @@ $select ='SELECT ticket.ticket_id,ticket.`number`,ticket.dept_id,ticket.staff_id .' ,cdata.priority_id, cdata.subject, user.name, email.address as email'; $from =' FROM '.TICKET_TABLE.' ticket ' + .' LEFT JOIN '.TICKET_STATUS_TABLE.' status + ON status.id = ticket.status_id ' .' LEFT JOIN '.USER_TABLE.' user ON user.id = ticket.user_id ' .' LEFT JOIN '.USER_EMAIL_TABLE.' email ON user.id = email.user_id ' .' LEFT JOIN '.USER_ACCOUNT_TABLE.' account ON (ticket.user_id=account.user_id) ' @@ -119,9 +121,6 @@ if ($results) { ?> $assigned=' '; $status = ucfirst($row['status']); - if(!strcasecmp($row['status'], 'open')) - $status = "<b>$status</b>"; - $tid=$row['number']; $subject = Format::htmlchars(Format::truncate($row['subject'],40)); $threadcount=$row['thread_count']; diff --git a/include/staff/ticket-view.inc.php b/include/staff/ticket-view.inc.php index e8a78540f68aa5c0b4c9d532eaa6b51913666c4d..0e8159f3f2229509aac33f775ac86755618f10e4 100644 --- a/include/staff/ticket-view.inc.php +++ b/include/staff/ticket-view.inc.php @@ -191,8 +191,17 @@ if($ticket->isOverdue()) if(($open=$user->getNumOpenTickets())) echo sprintf('<li><a href="tickets.php?a=search&status=open&uid=%s"><i class="icon-folder-open-alt icon-fixed-width"></i> %d Open Tickets</a></li>', $user->getId(), $open); + + if(($resolved=$user->getNumResolvedTickets())) + echo sprintf('<li><a href="tickets.php?a=search&status=resolved&uid=%d"><i + class="icon-folder-close-alt icon-fixed-width"></i> %d Resolved Tickets</a></li>', + $user->getId(), $resolved); + + + if(($closed=$user->getNumClosedTickets())) - echo sprintf('<li><a href="tickets.php?a=search&status=closed&uid=%d"><i class="icon-folder-close-alt icon-fixed-width"></i> %d Closed Tickets</a></li>', + echo sprintf('<li><a href="tickets.php?a=search&status=closed&uid=%d"><i + class="icon-folder-close-alt icon-fixed-width"></i> %d Closed Tickets</a></li>', $user->getId(), $closed); ?> <li><a href="tickets.php?a=search&uid=<?php echo $ticket->getOwnerId(); ?>"><i class="icon-double-angle-right icon-fixed-width"></i> All Tickets</a></li> diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php index ce2728dd2adc70580a663146a02de4aa8e476920..83b97b62c541ea28284c3b3a0e6a865913d0cd3b 100644 --- a/include/staff/tickets.inc.php +++ b/include/staff/tickets.inc.php @@ -33,6 +33,10 @@ switch(strtolower($_REQUEST['status'])){ //Status is overloaded $status='closed'; $showassigned=true; //closed by. break; + case 'resolved': + $status='resolved'; + $showassigned=true; + break; case 'overdue': $status='open'; $showoverdue=true; @@ -62,20 +66,26 @@ $qwhere =''; $depts=$thisstaff->getDepts(); $qwhere =' WHERE ( ' .' ( ticket.staff_id='.db_input($thisstaff->getId()) - .' AND ticket.status="open")'; + .' AND status.state="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")'; + .') AND status.state="open") '; $qwhere .= ' )'; -//STATUS -if($status) { - $qwhere.=' AND ticket.status='.db_input(strtolower($status)); +//STATUS to states +$states = array( + 'open' => array('open'), + 'resolved' => array('resolved'), + 'closed' => array('closed')); + +if($status && isset($states[$status])) { + $qwhere.=' AND status.state IN ( + '.implode(',', db_input($states[$status])).' ) '; } if (isset($_REQUEST['uid']) && $_REQUEST['uid']) { @@ -148,7 +158,7 @@ if ($_REQUEST['advsid'] && isset($_SESSION['adv_'.$_REQUEST['advsid']])) { $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', + 'status'=>'status.name','assignee'=>'assigned','staff'=>'staff', 'dept'=>'dept.dept_name'); $orderWays=array('DESC'=>'DESC','ASC'=>'ASC'); @@ -201,9 +211,11 @@ if($_GET['limit']) $qselect ='SELECT ticket.ticket_id,tlock.lock_id,ticket.`number`,ticket.dept_id,ticket.staff_id,ticket.team_id ' .' ,user.name' .' ,email.address as email, dept.dept_name ' - .' ,ticket.status,ticket.source,ticket.isoverdue,ticket.isanswered,ticket.created '; + .' ,status.name as status,ticket.source,ticket.isoverdue,ticket.isanswered,ticket.created '; $qfrom=' FROM '.TICKET_TABLE.' ticket '. + ' LEFT JOIN '.TICKET_STATUS_TABLE. ' status + ON (status.id = ticket.status_id) '. ' LEFT JOIN '.USER_TABLE.' user ON user.id = ticket.user_id'. ' LEFT JOIN '.USER_EMAIL_TABLE.' email ON user.id = email.user_id'. ' LEFT JOIN '.DEPT_TABLE.' dept ON ticket.dept_id=dept.dept_id '; diff --git a/include/upgrader/streams/core.sig b/include/upgrader/streams/core.sig index 38957a6f8ddce35874167253151dc6df18d48120..60006234be056b68a04d03386e06f8a0309358a3 100644 --- a/include/upgrader/streams/core.sig +++ b/include/upgrader/streams/core.sig @@ -1 +1 @@ -cbf8c933d6d2eaaa971042eb2efce247 +e50ba63f5256e82517670e066b654978 diff --git a/scp/tickets.php b/scp/tickets.php index 16b9d4cde3518968d6fe70a1b345c83c539d5d37..4f3930aef75a424ae3510912145a43ebc878b42d 100644 --- a/scp/tickets.php +++ b/scp/tickets.php @@ -163,22 +163,12 @@ if($_POST && !$errors): } break; case 'postnote': /* Post Internal Note */ - //Make sure the staff can set desired state - if($_POST['state']) { - if($_POST['state']=='closed' && !$thisstaff->canCloseTickets()) - $errors['state'] = "You don't have permission to close tickets"; - elseif(in_array($_POST['state'], array('overdue', 'notdue', 'unassigned')) - && (!($dept=$ticket->getDept()) || !$dept->isManager($thisstaff))) - $errors['state'] = "You don't have permission to set the state"; - } - $vars = $_POST; if($_FILES['attachments']) $vars['files'] = AttachmentFile::format($_FILES['attachments']); $wasOpen = ($ticket->isOpen()); if(($note=$ticket->postNote($vars, $errors, $thisstaff))) { - $msg='Internal note posted successfully'; if($wasOpen && $ticket->isClosed()) $ticket = null; //Going back to main listing. @@ -235,40 +225,43 @@ if($_POST && !$errors): $errors['err'] = 'Permission Denied. You are not allowed to close tickets.'; } elseif($ticket->isClosed()) { $errors['err'] = 'Ticket is already closed!'; - } elseif($ticket->close()) { + } elseif (!($status=TicketStatus::lookup($_POST['status_id']))) { + $errors['err'] = 'Unknown status'; + } elseif (!in_array($status->getState(), array('resolved', 'closed'))) { + $errors['err'] = 'Invalid status'; + } elseif ($ticket->setStatus($status)) { $msg='Ticket #'.$ticket->getNumber().' status set to CLOSED'; - //Log internal note - if($_POST['ticket_status_notes']) - $note = $_POST['ticket_status_notes']; - else - $note='Ticket closed (without comments)'; - - $ticket->logNote('Ticket Closed', $note, $thisstaff); - + if($_POST['ticket_status_notes']) { + $ticket->logNote( + 'Ticket Closed', + $_POST['ticket_status_notes'], + $thisstaff); + } //Going back to main listing. TicketLock::removeStaffLocks($thisstaff->getId(), $ticket->getId()); $page=$ticket=null; - } else { $errors['err']='Problems closing the ticket. Try again'; } break; case 'reopen': //if staff can close or create tickets ...then assume they can reopen. - if(!$thisstaff->canCloseTickets() && !$thisstaff->canCreateTickets()) { + if (!$thisstaff->canCloseTickets() && !$thisstaff->canCreateTickets()) { $errors['err']='Permission Denied. You are not allowed to reopen tickets.'; - } elseif($ticket->isOpen()) { + } elseif ($ticket->isOpen()) { $errors['err'] = 'Ticket is already open!'; - } elseif($ticket->reopen()) { + } elseif (!($status=TicketStatus::lookup($_POST['status_id']))) { + $errors['err'] = 'Unknown status'; + } elseif (strcasecmp($status->getState(), 'open')) { + $errors['err'] = 'Invalid status'; + } elseif ($ticket->setStatus($status)) { $msg='Ticket REOPENED'; - - if($_POST['ticket_status_notes']) - $note = $_POST['ticket_status_notes']; - else - $note='Ticket reopened (without comments)'; - - $ticket->logNote('Ticket Reopened', $note, $thisstaff); - + if($_POST['ticket_status_notes']) { + $ticket->logNote( + 'Ticket Reopened', + $_POST['ticket_status_notes'], + $thisstaff); + } } else { $errors['err']='Problems reopening the ticket. Try again'; } @@ -419,24 +412,7 @@ if($_POST && !$errors): } break; case 'close': - if($thisstaff->canCloseTickets()) { - $note='Ticket closed without response by '.$thisstaff->getName(); - foreach($_POST['tids'] as $k=>$v) { - if(($t=Ticket::lookup($v)) && $t->isOpen() && @$t->close()) { - $i++; - $t->logNote('Ticket Closed', $note, $thisstaff); - } - } - - if($i==$count) - $msg ="Selected tickets ($i) closed succesfully"; - elseif($i) - $warn = "$i of $count selected tickets closed"; - else - $errors['err'] = 'Unable to close selected tickets'; - } else { - $errors['err'] = 'You do not have permission to close tickets'; - } + $errors['err'] = 'Support coming soon!'; break; case 'mark_overdue': $note='Ticket flagged as overdue by '.$thisstaff->getName(); @@ -567,7 +543,13 @@ if($thisstaff->showAssignedOnly() && $stats['closed']) { ($_REQUEST['status']=='closed')); } else { - $nav->addSubMenu(array('desc'=>'Closed Tickets ('.number_format($stats['closed']).')', + $nav->addSubMenu(array('desc'=>'Resolved ('.number_format($stats['resolved']).')', + 'title'=>'Resolved Tickets', + 'href'=>'tickets.php?status=resolved', + 'iconclass'=>'closedTickets'), + ($_REQUEST['status']=='resolved')); + + $nav->addSubMenu(array('desc'=>'Closed ('.number_format($stats['closed']).')', 'title'=>'Closed Tickets', 'href'=>'tickets.php?status=closed', 'iconclass'=>'closedTickets'),