Skip to content
Snippets Groups Projects
class.sla.php 6.02 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jared Hancock's avatar
    Jared Hancock committed
    <?php
    /*********************************************************************
        class.sla.php
    
        SLA
        Peter Rotich <peter@osticket.com>
    
        Copyright (c)  2006-2013 osTicket
    
    Jared Hancock's avatar
    Jared Hancock committed
        http://www.osticket.com
    
        Released under the GNU General Public License WITHOUT ANY WARRANTY.
        See LICENSE.TXT for details.
    
        vim: expandtab sw=4 ts=4 sts=4:
    **********************************************************************/
    
    class SLA extends VerySimpleModel
    implements TemplateVariable {
    
        static $meta = array(
            'table' => SLA_TABLE,
    
    Peter Rotich's avatar
    Peter Rotich committed
            'pk' => array('id'),
    
        const FLAG_ACTIVE       = 0x0001;
        const FLAG_ESCALATE     = 0x0002;
        const FLAG_NOALERTS     = 0x0004;
        const FLAG_TRANSIENT    = 0x0008;
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        var $_config;
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getId() {
    
    Jared Hancock's avatar
    Jared Hancock committed
            return $this->id;
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getName() {
    
            return $this->getLocal('name');
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getGracePeriod() {
    
    Peter Rotich's avatar
    Peter Rotich committed
            return $this->grace_period;
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getInfo() {
    
            $base = $this->ht;
            $base['isactive'] = $this->flags & self::FLAG_ACTIVE;
            $base['disable_overdue_alerts'] = $this->flags & self::FLAG_NOALERTS;
            $base['enable_priority_escalation'] = $this->flags & self::FLAG_ESCALATE;
            $base['transient'] = $this->flags & self::FLAG_TRANSIENT;
            return $base;
    
    Peter Rotich's avatar
    Peter Rotich committed
        }
    
        function getCreateDate() {
            return $this->created;
        }
    
        function getUpdateDate() {
            return $this->updated;
    
    Peter Rotich's avatar
    Peter Rotich committed
        function isActive() {
    
            return $this->flags & self::FLAG_ACTIVE;
    
    Jared Hancock's avatar
    Jared Hancock committed
        function isTransient() {
    
            return $this->flags & self::FLAG_TRANSIENT;
    
    Peter Rotich's avatar
    Peter Rotich committed
        function sendAlerts() {
    
            return 0 === ($this->flags & self::FLAG_NOALERTS);
    
        function alertOnOverdue() {
            return $this->sendAlerts();
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        function priorityEscalation() {
    
            return $this->flags && self::FLAG_ESCALATE;
    
    Peter Rotich's avatar
    Peter Rotich committed
        }
    
    
        function getTranslateTag($subtag) {
    
    Peter Rotich's avatar
    Peter Rotich committed
            return _H(sprintf('sla.%s.%s', $subtag, $this->getId()));
    
        function getLocal($subtag) {
            $tag = $this->getTranslateTag($subtag);
            $T = CustomDataTranslation::translate($tag);
            return $T != $tag ? $T : $this->ht[$subtag];
        }
    
        static function getLocalById($id, $subtag, $default) {
            $tag = _H(sprintf('sla.%s.%s', $subtag, $id));
            $T = CustomDataTranslation::translate($tag);
            return $T != $tag ? $T : $default;
        }
    
    
        // TemplateVariable interface
        function asVar() {
            return $this->getName();
        }
    
        static function getVarScope() {
            return array(
    
                'name' => __('SLA Plan'),
                'graceperiod' => __("Grace Period (hrs)"),
    
    Peter Rotich's avatar
    Peter Rotich committed
        function update($vars, &$errors) {
    
            if (!$vars['grace_period'])
                $errors['grace_period'] = __('Grace period required');
            elseif (!is_numeric($vars['grace_period']))
                $errors['grace_period'] = __('Numeric value required (in hours)');
    
    Peter Rotich's avatar
    Peter Rotich committed
            if (!$vars['name'])
                $errors['name'] = __('Name is required');
            elseif (($sid=SLA::getIdByName($vars['name'])) && $sid!=$vars['id'])
                $errors['name'] = __('Name already exists');
    
            if ($errors)
    
    Peter Rotich's avatar
    Peter Rotich committed
                return false;
    
    
    Peter Rotich's avatar
    Peter Rotich committed
            $this->name = $vars['name'];
            $this->grace_period = $vars['grace_period'];
            $this->notes = Format::sanitize($vars['notes']);
    
            $this->flags =
                  ($vars['isactive'] ? self::FLAG_ACTIVE : 0)
                | (isset($vars['disable_overdue_alerts']) ? self::FLAG_NOALERTS : 0)
                | (isset($vars['enable_priority_escalation']) ? self::FLAG_ESCALATE : 0)
                | (isset($vars['transient']) ? self::FLAG_TRANSIENT : 0);
    
    Peter Rotich's avatar
    Peter Rotich committed
                return true;
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
    Peter Rotich's avatar
    Peter Rotich committed
            if (isset($this->id)) {
                $errors['err']=sprintf(__('Unable to update %s.'), __('this SLA plan'))
                   .' '.__('Internal error occurred');
            } else {
                $errors['err']=sprintf(__('Unable to add %s.'), __('this SLA plan'))
                   .' '.__('Internal error occurred');
            }
    
            return false;
        }
    
        function save($refetch=false) {
            if ($this->dirty)
                $this->updated = SqlFunction::NOW();
    
            return parent::save($refetch || $this->dirty);
    
    Peter Rotich's avatar
    Peter Rotich committed
        function delete() {
    
    Jared Hancock's avatar
    Jared Hancock committed
            global $cfg;
    
    
    Peter Rotich's avatar
    Peter Rotich committed
            if(!$cfg || $cfg->getDefaultSLAId()==$this->getId())
    
    Jared Hancock's avatar
    Jared Hancock committed
                return false;
    
    
    Peter Rotich's avatar
    Peter Rotich committed
            //TODO: Use ORM to delete & update
    
    Jared Hancock's avatar
    Jared Hancock committed
            $id=$this->getId();
            $sql='DELETE FROM '.SLA_TABLE.' WHERE id='.db_input($id).' LIMIT 1';
    
    Peter Rotich's avatar
    Peter Rotich committed
            if(db_query($sql) && ($num=db_affected_rows())) {
    
    Jared Hancock's avatar
    Jared Hancock committed
                db_query('UPDATE '.DEPT_TABLE.' SET sla_id=0 WHERE sla_id='.db_input($id));
                db_query('UPDATE '.TOPIC_TABLE.' SET sla_id=0 WHERE sla_id='.db_input($id));
    
    Peter Rotich's avatar
    Peter Rotich committed
                db_query('UPDATE '.TICKET_TABLE.' SET sla_id='.db_input($cfg->getDefaultSLAId()).' WHERE sla_id='.db_input($id));
    
    Jared Hancock's avatar
    Jared Hancock committed
            }
    
            return $num;
        }
    
        /** static functions **/
    
    Peter Rotich's avatar
    Peter Rotich committed
        static function getSLAs($criteria=array()) {
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
    Peter Rotich's avatar
    Peter Rotich committed
           $slas = self::objects()
               ->order_by('name')
    
               ->values_flat('id', 'name', 'flags', 'grace_period');
    
    Peter Rotich's avatar
    Peter Rotich committed
            $entries = array();
            foreach ($slas as $row) {
    
                $row[2] = $row[2] & self::FLAG_ACTIVE;
    
    Peter Rotich's avatar
    Peter Rotich committed
                $entries[$row[0]] = sprintf(__('%s (%d hours - %s)'
    
                            /* Tokens are <name> (<#> hours - <Active|Disabled>) */),
    
    Peter Rotich's avatar
    Peter Rotich committed
                            self::getLocalById($row[0], 'name', $row[1]),
                            $row[3],
                            $row[2] ? __('Active') : __('Disabled'));
    
    Peter Rotich's avatar
    Peter Rotich committed
            }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
            return $entries;
    
    Peter Rotich's avatar
    Peter Rotich committed
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        static function getIdByName($name) {
            $row = static::objects()
                ->filter(array('name'=>$name))
                ->values_flat('id')
                ->first();
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
    Peter Rotich's avatar
    Peter Rotich committed
            return $row ? $row[0] : 0;
    
    Peter Rotich's avatar
    Peter Rotich committed
        static function create($vars=false, &$errors=array()) {
            $sla = parent::create($vars);
            $sla->created = SqlFunction::NOW();
            return $sla;
    
    Peter Rotich's avatar
    Peter Rotich committed
        static function __create($vars, &$errors=array()) {
            $sla = self::create($vars);
            $sla->save();
            return $sla;