From cf38f6536e15d907a7cf47d656147b9ea0d3a4ce Mon Sep 17 00:00:00 2001
From: Jared Hancock <gravydish@gmail.com>
Date: Mon, 26 Mar 2012 18:05:17 -0500
Subject: [PATCH] (Re)Add tracking of ticket history

Add a %ticket_history table to track ticket states over time, correlated to
the user account changing the ticket. Then, tickets are tracked to the table
when (re)opened, closed, overdue, transferred and assigned.
---
 include/class.ticket.php | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/include/class.ticket.php b/include/class.ticket.php
index 4801f1625..65d8caf9b 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -723,6 +723,7 @@ class Ticket{
 
         $sql.=' WHERE ticket_id='.db_input($this->getId());
 
+        $this->track('closed');
         return (db_query($sql) && db_affected_rows());
     }
 
@@ -736,6 +737,7 @@ class Ticket{
 
         //TODO: log reopen event here 
 
+        $this->track('reopened');
         return (db_query($sql) && db_affected_rows());
     }
 
@@ -1044,6 +1046,7 @@ class Ticket{
 
         $this->onOverdue($whine);
 
+        $this->track('overdue');
         return true;
     }
 
@@ -1109,6 +1112,7 @@ class Ticket{
             }
          }
 
+         $this->track('transferred');
          return true;
     }
 
@@ -1122,6 +1126,7 @@ class Ticket{
 
         $this->onAssign($note, $alert);
 
+        $this->track('assigned');
         return true;
     }
 
@@ -1140,6 +1145,7 @@ class Ticket{
 
         $this->onAssign($note, $alert);
 
+        $this->track('assigned');
         return true;
     }
 
@@ -1343,6 +1349,22 @@ class Ticket{
         return $this->postNote($title,$note,false,'system');
     }
 
+    // History log -- used for statistics generation (pretty reports)
+    function track($state, $staff=null) {
+        global $thisstaff;
+
+        if ($staff === null) {
+            if ($thisstaff) $staff=$thisstaff->getUserName();
+            else $staff='SYSTEM';               # XXX: Security Violation ?
+        }
+
+        return db_query('INSERT INTO '.TICKET_HISTORY_TABLE
+            .' SET ticket_id='.db_input($this->getId())
+            .', timestamp=NOW(), state='.db_input($state)
+            .', staff='.db_input($staff))
+            && db_affected_rows() == 1;
+    }
+
     //Insert Internal Notes 
     function postNote($title,$note,$alert=true,$poster='') {        
         global $thisstaff,$cfg;
-- 
GitLab