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