From a3b6e39ef95b53105bf95cf3ccce7e372796ca9b Mon Sep 17 00:00:00 2001
From: Jared Hancock <gravydish@gmail.com>
Date: Fri, 6 Apr 2012 16:33:45 -0500
Subject: [PATCH] Track ticket owners at each tracked ticket event

Track assigned department, team, staff, and help topic when the ticket event
occurs. This will greatly help in correlation of various reports and queries

Also start plowing the way toward incremental database updates using a
patching technique. The hash of the main install SQL script for a respective
database will be used to track the signature of the database currently. The
signature will be stored in %config::schema_signature, and the main.inc.php
script can simply check the value in the schema against the value known to
the source code to be the signature the code expects. Should the two
signatures differ, patches in the setup/inc/sql/patches folder should exist
and be executed to assist in incrementally upgrading the database to the
new-current schema version.
---
 include/class.ticket.php                      | 33 ++++++++++++-------
 main.inc.php                                  |  2 +-
 setup/inc/sql/osticket-v1.7-mysql.sql         | 10 ++++--
 setup/inc/sql/osticket-v1.7-mysql.sql.md5     |  1 +
 .../sql/patches/02decaa2-60fcbee1.patch.sql   |  6 ++++
 .../sql/patches/522e5b78-02decaa2.patch.sql   |  7 ++++
 .../sql/patches/60fcbee1-f8856d56.patch.sql   | 10 ++++++
 .../sql/patches/7be60a84-522e5b78.patch.sql   |  6 ++++
 setup/inc/sql/v1.6st-1.7-upgrade-mysql.sql    | 10 ++++--
 9 files changed, 67 insertions(+), 18 deletions(-)
 create mode 100644 setup/inc/sql/osticket-v1.7-mysql.sql.md5
 create mode 100644 setup/inc/sql/patches/02decaa2-60fcbee1.patch.sql
 create mode 100644 setup/inc/sql/patches/522e5b78-02decaa2.patch.sql
 create mode 100644 setup/inc/sql/patches/60fcbee1-f8856d56.patch.sql
 create mode 100644 setup/inc/sql/patches/7be60a84-522e5b78.patch.sql

diff --git a/include/class.ticket.php b/include/class.ticket.php
index b0f54d2c7..a6bff31c4 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -653,10 +653,14 @@ class Ticket{
     //Set staff ID...assign/unassign/release (id can be 0)
     function setStaffId($staffId){
        
-      $sql='UPDATE '.TICKET_TABLE.' SET updated=NOW(), staff_id='.db_input($staffId)
-          .' WHERE ticket_id='.db_input($this->getId());
+        $sql='UPDATE '.TICKET_TABLE.' SET updated=NOW(), staff_id='.db_input($staffId)
+            .' WHERE ticket_id='.db_input($this->getId());
 
-      return (db_query($sql)  && db_affected_rows());
+        if (db_query($sql)  && db_affected_rows()) {
+            $this->staff_id = $staffId;
+            return true;
+        }
+        return false;
     }
 
     function setSLAId($slaId) {
@@ -768,7 +772,7 @@ class Ticket{
 
         $sql.=' WHERE ticket_id='.db_input($this->getId());
 
-        $this->track('closed');
+        $this->logEvent('closed');
         return (db_query($sql) && db_affected_rows());
     }
 
@@ -782,7 +786,7 @@ class Ticket{
 
         //TODO: log reopen event here 
 
-        $this->track('reopened');
+        $this->logEvent('reopened');
         return (db_query($sql) && db_affected_rows());
     }
 
@@ -1126,8 +1130,8 @@ class Ticket{
         if(!db_query($sql) || !db_affected_rows())
             return false;
 
+        $this->logEvent('overdue');
         $this->onOverdue($whine);
-        $this->track('overdue');
 
         return true;
     }
@@ -1148,6 +1152,7 @@ class Ticket{
              $this->reopen();
         
          $this->reload(); //reload - new dept!!
+         $this->logEvent('transferred');
 
          //Send out alerts if enabled AND requested
          if(!$alert || !$cfg->alertONTransfer() || !($dept=$this->getDept())) return true; //no alerts!!
@@ -1194,7 +1199,6 @@ class Ticket{
             }
          }
 
-         $this->track('transferred');
          return true;
     }
 
@@ -1207,8 +1211,8 @@ class Ticket{
             return false;
 
         $this->onAssign($note, $alert);
+        $this->logEvent('assigned');
 
-        $this->track('assigned');
         return true;
     }
 
@@ -1226,8 +1230,8 @@ class Ticket{
             $this->setStaffId(0);
 
         $this->onAssign($note, $alert);
+        $this->logEvent('assigned');
 
-        $this->track('assigned');
         return true;
     }
 
@@ -1432,7 +1436,7 @@ class Ticket{
     }
 
     // History log -- used for statistics generation (pretty reports)
-    function track($state, $staff=null) {
+    function logEvent($state, $staff=null) {
         global $thisstaff;
 
         if ($staff === null) {
@@ -1440,8 +1444,12 @@ class Ticket{
             else $staff='SYSTEM';               # XXX: Security Violation ?
         }
 
-        return db_query('INSERT INTO '.TICKET_HISTORY_TABLE
+        return db_query('INSERT INTO '.TICKET_EVENT_TABLE
             .' SET ticket_id='.db_input($this->getId())
+            .', staff_id='.db_input($this->getStaffId())
+            .', team_id='.db_input($this->getTeamId())
+            .', dept_id='.db_input($this->getDeptId())
+            .', topic_id='.db_input($this->getTopicId())
             .', timestamp=NOW(), state='.db_input($state)
             .', staff='.db_input($staff))
             && db_affected_rows() == 1;
@@ -1960,6 +1968,9 @@ class Ticket{
                     && ($client->getNumOpenTickets()==$cfg->getMaxOpenTickets())) {
             $ticket->onOpenLimit(($autorespond && strcasecmp($origin, 'staff')));
         }
+        
+        /* Start tracking ticket lifecycle events */
+        $ticket->logEvent('created');
 
         /* Phew! ... time for tea (KETEPA) */
 
diff --git a/main.inc.php b/main.inc.php
index bb997ebd6..7b10c018a 100644
--- a/main.inc.php
+++ b/main.inc.php
@@ -142,7 +142,7 @@
     define('TICKET_PRIORITY_TABLE',TABLE_PREFIX.'ticket_priority');
     define('PRIORITY_TABLE',TICKET_PRIORITY_TABLE);
     define('TICKET_LOCK_TABLE',TABLE_PREFIX.'ticket_lock');
-    define('TICKET_HISTORY_TABLE',TABLE_PREFIX.'ticket_history');
+    define('TICKET_EVENT_TABLE',TABLE_PREFIX.'ticket_event');
   
     define('EMAIL_TABLE',TABLE_PREFIX.'email');
     define('EMAIL_TEMPLATE_TABLE',TABLE_PREFIX.'email_template');
diff --git a/setup/inc/sql/osticket-v1.7-mysql.sql b/setup/inc/sql/osticket-v1.7-mysql.sql
index df11daf86..7a31d814e 100644
--- a/setup/inc/sql/osticket-v1.7-mysql.sql
+++ b/setup/inc/sql/osticket-v1.7-mysql.sql
@@ -598,10 +598,14 @@ CREATE TABLE `%TABLE_PREFIX%ticket_lock` (
   KEY `staff_id` (`staff_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_history`;
-CREATE TABLE `%TABLE_PREFIX%ticket_history` (
+DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_event`;
+CREATE TABLE `%TABLE_PREFIX%ticket_event` (
   `ticket_id` int(11) unsigned NOT NULL default '0',
-  `state` enum('opened','closed','assigned','transferred','overdue') NOT NULL,
+  `staff_id` int(11) unsigned NOT NULL,
+  `team_id` int(11) unsigned NOT NULL,
+  `dept_id` int(11) unsigned NOT NULL,
+  `topic_id` int(11) unsigned NOT NULL,
+  `state` enum('created','closed','reopened','assigned','transferred','overdue') NOT NULL,
   `staff` varchar(255) NOT NULL default 'SYSTEM',
   `timestamp` datetime NOT NULL,
   KEY `ticket_state` (`ticket_id`, `state`, `timestamp`),
diff --git a/setup/inc/sql/osticket-v1.7-mysql.sql.md5 b/setup/inc/sql/osticket-v1.7-mysql.sql.md5
new file mode 100644
index 000000000..73090636d
--- /dev/null
+++ b/setup/inc/sql/osticket-v1.7-mysql.sql.md5
@@ -0,0 +1 @@
+f8856d56e51c5cc3416389de78b54515
diff --git a/setup/inc/sql/patches/02decaa2-60fcbee1.patch.sql b/setup/inc/sql/patches/02decaa2-60fcbee1.patch.sql
new file mode 100644
index 000000000..351bea582
--- /dev/null
+++ b/setup/inc/sql/patches/02decaa2-60fcbee1.patch.sql
@@ -0,0 +1,6 @@
+UPDATE `%TABLE_PREFIX%email_template`
+    SET `overlimit_body` = '%name\r\n\r\nYou have reached the maximum number of open tickets allowed.\r\n\r\nTo be able to open another ticket, one of your pending tickets must be closed. To update or add comments to an open ticket simply login using the link below.\r\n\r\n%url/view.php?e=%email\r\n\r\nThank you.\r\n\r\nSupport Ticket System'
+    WHERE `tpl_id` = 1 AND `cfg_id` = 1;
+
+UPDATE `%TABLE_PREFIX%config`
+    SET `schema_signature`='60fcbee1da3180d1b690187aa5006c88';
diff --git a/setup/inc/sql/patches/522e5b78-02decaa2.patch.sql b/setup/inc/sql/patches/522e5b78-02decaa2.patch.sql
new file mode 100644
index 000000000..6dc1f3a8a
--- /dev/null
+++ b/setup/inc/sql/patches/522e5b78-02decaa2.patch.sql
@@ -0,0 +1,7 @@
+UPDATE `%TABLE_PREFIX%sla`
+    SET `created` = NOW(),
+        `updated` = NOW()
+    WHERE `created` IS NULL;
+
+UPDATE `%TABLE_PREFIX%config`
+    SET `schema_signature`='02decaa20c10c9615558762018e25507';
diff --git a/setup/inc/sql/patches/60fcbee1-f8856d56.patch.sql b/setup/inc/sql/patches/60fcbee1-f8856d56.patch.sql
new file mode 100644
index 000000000..dcdb18502
--- /dev/null
+++ b/setup/inc/sql/patches/60fcbee1-f8856d56.patch.sql
@@ -0,0 +1,10 @@
+ALTER TABLE `%TABLE_PREFIX%history`
+    ADD `staff_id` int(11) unsigned NOT NULL AFTER `ticket_id`,
+    ADD `team_id` int(11) unsigned NOT NULL AFTER `staff_id`,
+    ADD `dept_id` int(11) unsigned NOT NULL AFTER `team_id`,
+    ADD `topic_id` int(11) unsigned NOT NULL AFTER `dept_id`;
+
+RENAME TABLE `%TABLE_PREFIX%history` TO `%TABLE_PREFIX%event`;
+
+UPDATE `%TABLE_PREFIX%config`
+    SET `schema_signature`='f8856d56e51c5cc3416389de78b54515';
diff --git a/setup/inc/sql/patches/7be60a84-522e5b78.patch.sql b/setup/inc/sql/patches/7be60a84-522e5b78.patch.sql
new file mode 100644
index 000000000..17ab3e07b
--- /dev/null
+++ b/setup/inc/sql/patches/7be60a84-522e5b78.patch.sql
@@ -0,0 +1,6 @@
+UPDATE `%TABLE_PREFIX%email_template`
+    SET `ticket_overlimit_subj` = 'Open Tickets Limit Reached'
+    WHERE `tpl_id` = 1 AND `cfg_id` = 1;
+
+UPDATE `%TABLE_PREFIX%config`
+    SET `schema_signature`='522e5b783c2824c67222260ee22baa93';
diff --git a/setup/inc/sql/v1.6st-1.7-upgrade-mysql.sql b/setup/inc/sql/v1.6st-1.7-upgrade-mysql.sql
index efeb8de6f..3a2acf229 100644
--- a/setup/inc/sql/v1.6st-1.7-upgrade-mysql.sql
+++ b/setup/inc/sql/v1.6st-1.7-upgrade-mysql.sql
@@ -26,10 +26,14 @@ ALTER TABLE `%TABLE_PREFIX%ticket`
         'Web', 'Email', 'Phone', 'API', 'Other') NOT NULL DEFAULT 'Other';
 
 -- Add table for ticket history (statistics) tracking
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_history`;
-CREATE TABLE `%TABLE_PREFIX%ticket_history` (
+DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_event`;
+CREATE TABLE `%TABLE_PREFIX%ticket_event` (
   `ticket_id` int(11) unsigned NOT NULL default '0',
-  `state` enum('opened','closed','assigned','transferred','overdue') NOT NULL,
+  `staff_id` int(11) unsigned NOT NULL,
+  `team_id` int(11) unsigned NOT NULL,
+  `dept_id` int(11) unsigned NOT NULL,
+  `topic_id` int(11) unsigned NOT NULL,
+  `state` enum('created','closed','reopened','assigned','transferred','overdue') NOT NULL,
   `staff` varchar(255) NOT NULL default 'SYSTEM',
   `timestamp` datetime NOT NULL,
   KEY `ticket_state` (`ticket_id`, `state`, `timestamp`),
-- 
GitLab