Based on the Pending and Autoclose mod posted by GooseMoose on the OSTicket forums, here are my re-written directions on how to do it, as well as a bug fix.
What:
This MOD is for OSTicket 1.6 ST and will add in a new ticket status type of “pending”. If any ticket is left pending for 5 days it will close the ticket. It also adds a new section at the top [see image] that displays how many pending tickets there are and lets you click the link to look at them.
UPDATE: Please note that today Sept 14th, 2011 I noticed that I forgot to include part of step 1 in my directions. This step has been updated accordingly, sorry for any confusion it may have caused.
Directions:
Step 1 –
Copy the two files [preLogin.pgp and autoClose.php] in the attached zip to /include/staff
In /scp/login.php at circa line 54 after
require_once('index.php'); //Just incase header is messed up.
add the following code:
define("OMEGAPVTLTD",TRUE); //Make includes happy // do tasks prior to redirecting include_once(INCLUDE_DIR.'staff/preLogin.php');
Step 2 –
update the database [please edit this to fit your installation] with the following MySQL Query
ALTER TABLE ost_ticket CHANGE status status ENUM('open','closed','pending') DEFAULT 'open';
Step 3 –
Make the following code changes
3A: In [document root]/scp/tickets.php
at circa line 56
Change
$statusKeys=array('open'=>'Open','Reopen'=>'Open','Close'=>'Closed');
to
$statusKeys=array('open'=>'Open','Reopen'=>'Open','Close'=>'Closed','Pending'=>'Pending');
at circa line 96 after
}
and before
//Finally upload attachment if any
Add the following
$wasPending=$ticket->isPending(); if(isset($_POST['pending_status']) && $_POST['pending_status']) { if($ticket->setStatus($_POST['pending_status']) && $ticket->reload()) { $note=sprintf('%s %s the ticket on reply',$thisuser->getName(),($ticket->isPending()?'Pending': $ticket->isOpen() ? 'Open' : 'Closed')); $ticket->logActivity('Ticket status changed to '.($ticket->isPending()?'Pending': $ticket->isOpen() ? 'Open' : 'Closed'),$note); } } if($wasPending && !isset($_POST['pending_status'])) { $ticket->setStatus('open'); $note=sprintf('%s %s the ticket on reply',$thisuser->getName(),$ticket->isOpen()?'reopened':'closed'); $ticket->logActivity('Ticket status changed to '.($ticket->isOpen()?'Open':'Closed'),$note); }
at circa line 432 change
$sql='SELECT count(open.ticket_id) as open, count(answered.ticket_id) as answered '. ',count(overdue.ticket_id) as overdue, count(assigned.ticket_id) as assigned '. ' FROM '.TICKET_TABLE.' ticket '. 'LEFT JOIN '.TICKET_TABLE.' open ON open.ticket_id=ticket.ticket_id AND open.status=\'open\' AND open.isanswered=0 '. 'LEFT JOIN '.TICKET_TABLE.' answered ON answered.ticket_id=ticket.ticket_id AND answered.status=\'open\' AND answered.isanswered=1 '. 'LEFT JOIN '.TICKET_TABLE.' overdue ON overdue.ticket_id=ticket.ticket_id AND overdue.status=\'open\' AND overdue.isoverdue=1 '. 'LEFT JOIN '.TICKET_TABLE.' assigned ON assigned.ticket_id=ticket.ticket_id AND assigned.staff_id='.db_input($thisuser->getId());
to
$sql='SELECT count(open.ticket_id) as open, count(answered.ticket_id) as answered '. ',count(overdue.ticket_id) as overdue, count(assigned.ticket_id) as assigned, count(pending.ticket_id) as pending '. ' FROM '.TICKET_TABLE.' ticket '. 'LEFT JOIN '.TICKET_TABLE.' open ON open.ticket_id=ticket.ticket_id AND open.status=\'open\' AND open.isanswered=0 '. 'LEFT JOIN '.TICKET_TABLE.' answered ON answered.ticket_id=ticket.ticket_id AND answered.status=\'open\' AND answered.isanswered=1 '. 'LEFT JOIN '.TICKET_TABLE.' pending ON pending.ticket_id=ticket.ticket_id AND pending.status=\'pending\' '. 'LEFT JOIN '.TICKET_TABLE.' overdue ON overdue.ticket_id=ticket.ticket_id AND overdue.status=\'open\' AND overdue.isoverdue=1 '. 'LEFT JOIN '.TICKET_TABLE.' assigned ON assigned.ticket_id=ticket.ticket_id AND assigned.staff_id='.db_input($thisuser->getId());
at circa line 463 after
if($stats['overdue']) { $nav->addSubMenu(array('desc'=>'Overdue ('.$stats['overdue'].')','title'=>'Stale Tickets', 'href'=>'tickets.php?status=overdue','iconclass'=>'overdueTickets')); if(!$sysnotice && $stats['overdue']>10) $sysnotice=$stats['overdue'] .' overdue tickets!'; }
add the following
$nav->addSubMenu(array('desc'=>'Pending Tickets ('.$stats['pending'].')','title'=>'Pending Tickets', 'href'=>'tickets.php?status=pending', 'iconclass'=>'closedTickets'));
3B: In [document root]/include/staff/viewticket.inc.php
circa line 333 change
$checked=isset($info['ticket_status'])?'checked':''; //Staff must explicitly check the box to change status.. if($ticket->isOpen()){?> <label><input type="checkbox" name="ticket_status" id="l_ticket_status" value="Close" =$checked?> > Close on Reply }else{ ?> <label><input type="checkbox" name="ticket_status" id="l_ticket_status" value="Reopen" =$checked?> > Reopen on Reply }?>
to
if($ticket->isPending()) { ?> isOpen()){?> <label><input type="checkbox" name="ticket_status" id="l_ticket_status" value="Close" =$checked?> > Close on Reply }else{ ?> <label><input type="checkbox" name="ticket_status" id="l_ticket_status" value="Reopen" =$checked?> > Reopen on Reply } } $checked=isset($info['pending_status'])?'checked':''; //Staff must explicitly check the box to change status.. if(!$ticket->isClosed()) { if($ticket->isPending()){ ?> <label><input type="checkbox" name="pending_status" id="l_pending_status" value="Pending" checked="checked" > Ticket is pending (Untick to mark not pending) }else{ ?> <label><input type="checkbox" name="pending_status" id="l_pending_status" value="Pending" =$checked?> > Mark As Pending } } ?>
3C: In [document root]/include/class.ticket.php
circa line 107 add
note: I added this after the isOpen function and before the isClosed function.
function isPending(){ return (strcasecmp($this->getStatus(),'Pending')==0)?true:false; }
Locate function setStatus circa line 378 and add:
case 'pending': return $this->pending(); break;
circa line 397 add
function pending(){ $sql= 'UPDATE '.TICKET_TABLE.' SET status='.db_input('pending').',updated=NOW() '. ' WHERE ticket_id='.db_input($this->getId()); return (db_query($sql) && db_affected_rows())?true:false; }
3D: In [document root]/include/staff/tickets.inc.php
circa line 32 add
case 'pending': $status='pending'; break;
*** Update 05 Mar 2013 ***
For some reason Drupal hosed some of my file attachments. Here is a link to the pending mod files that you need to complete this modification.
Pending Mod files: pending-mod-files.zip