Skip to content
Snippets Groups Projects
class.group.php 8.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jared Hancock's avatar
    Jared Hancock committed
    <?php
    /*********************************************************************
        class.group.php
    
        User Group - Everything about a group!
    
        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:
    **********************************************************************/
    
    
    Jared Hancock's avatar
    Jared Hancock committed
    class Group extends VerySimpleModel {
    
    Jared Hancock's avatar
    Jared Hancock committed
        static $meta = array(
            'table' => GROUP_TABLE,
    
            'pk' => array('id'),
            'joins' => array(
                'members' => array(
                    'null' => true,
                    'list' => true,
                    'reverse' => 'Staff.group',
                ),
                'depts' => array(
                    'null' => true,
                    'list' => true,
                    'reverse' => 'GroupDeptAccess.group',
                ),
                'role' => array(
                    'constraint' => array('role_id' => 'Role.id')
                ),
            ),
    
        const FLAG_ENABLED = 0X0001;
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        var $departments;
    
    
    Jared Hancock's avatar
    Jared Hancock committed
        function getHashtable() {
    
    Jared Hancock's avatar
    Jared Hancock committed
            $base = $this->ht;
    
            $base['name'] = $base['name'];
            $base['isactive'] = $base['flags'];
    
    Jared Hancock's avatar
    Jared Hancock committed
            return $base;
    
        function getInfo() {
    
    Jared Hancock's avatar
    Jared Hancock committed
            return $this->getHashtable();
    
        function getId() {
            return $this->id;
        }
    
        function getRoleId() {
            return $this->role_id;
    
        function getRole($deptId=0) {
    
            if ($deptId // Department specific role.
                    && ($roles=$this->getDepartmentsAccess())
                    && isset($roles[$deptId])
                    && $roles[$deptId]
                    && ($role=Role::lookup($roles[$deptId]))
                    && $role->isEnabled())
                return $role;
    
            // Default role for this group.
            return $this->role;
    
        function getName() {
            return $this->name;
    
        function getCreateDate() {
            return $this->created;
        }
    
        function getUpdateDate() {
            return $this->updated;
        }
    
        function getNumMembers() {
            return $this->members ? $this->members->count() : 0;
         }
    
        function isEnabled() {
    
            return ($this->get('flags') & self::FLAG_ENABLED !== 0);
    
    Jared Hancock's avatar
    Jared Hancock committed
        }
    
        function isActive(){
            return $this->isEnabled();
        }
    
    
        function getTranslateTag($subtag) {
    
    Jared Hancock's avatar
    Jared Hancock committed
            return _H(sprintf('group.%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('group.%s.%s', $subtag, $id));
            $T = CustomDataTranslation::translate($tag);
            return $T != $tag ? $T : $default;
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        //Get members of the group.
        function getMembers() {
    
    
    Jared Hancock's avatar
    Jared Hancock committed
            if (!$this->members) {
    
    Jared Hancock's avatar
    Jared Hancock committed
                $this->members = Staff::objects()
    
    Jared Hancock's avatar
    Jared Hancock committed
                    ->filter(array('group_id'=>$this->getId()))
                    ->order_by('lastname', 'firstname')
                    ->all();
    
    Peter Rotich's avatar
    Peter Rotich committed
            }
            return $this->members;
        }
    
        //Get departments & roles the group is allowed to access.
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getDepartments() {
    
            return array_keys($this->getDepartmentsAccess());
        }
    
        function getDepartmentsAccess() {
    
    Jared Hancock's avatar
    Jared Hancock committed
            if (!isset($this->departments)) {
                $this->departments = array();
                foreach (GroupDeptAccess::objects()
                    ->filter(array('group_id'=>$this->getId()))
    
                    ->values_flat('dept_id', 'role_id') as $gda
    
    Jared Hancock's avatar
    Jared Hancock committed
                ) {
    
                    $this->departments[$gda[0]] = $gda[1];
    
    Peter Rotich's avatar
    Peter Rotich committed
            return $this->departments;
        }
    
    
        function updateDeptAccess($dept_ids, $vars=array()) {
    
            if (is_array($dept_ids)) {
    
    Jared Hancock's avatar
    Jared Hancock committed
                $groups = GroupDeptAccess::objects()
                    ->filter(array('group_id' => $this->getId()));
                foreach ($groups as $group) {
    
                    if ($idx = array_search($group->dept_id, $dept_ids)) {
    
    Jared Hancock's avatar
    Jared Hancock committed
                        unset($dept_ids[$idx]);
    
                        $roleId = $vars['dept'.$group->dept_id.'_role_id'];
                        if ($roleId != $group->role_id) {
                            $group->set('role_id', $roleId ?: 0);
                            $group->save();
                        }
                    } else {
    
    Jared Hancock's avatar
    Jared Hancock committed
                        $group->delete();
    
    Jared Hancock's avatar
    Jared Hancock committed
                foreach ($dept_ids as $id) {
    
                    $roleId = $vars['dept'.$id.'_role_id'];
    
    Jared Hancock's avatar
    Jared Hancock committed
                    GroupDeptAccess::create(array(
    
                        'group_id' => $this->getId(),
                        'dept_id' => $id,
                        'role_id' => $roleId ?: 0
    
    Jared Hancock's avatar
    Jared Hancock committed
                    ))->save();
                }
    
    Peter Rotich's avatar
    Peter Rotich committed
        }
    
        function delete() {
    
    
    Jared Hancock's avatar
    Jared Hancock committed
            // Can't delete with members
    
            if ($this->getNumMembers())
    
    Peter Rotich's avatar
    Peter Rotich committed
                return false;
    
    
    Jared Hancock's avatar
    Jared Hancock committed
            if (!parent::delete())
    
    Peter Rotich's avatar
    Peter Rotich committed
                return false;
    
    
    Jared Hancock's avatar
    Jared Hancock committed
            // Remove dept access entries
            GroupDeptAccess::objects()
                ->filter(array('group_id'=>$this->getId()))
                ->delete();
    
    Peter Rotich's avatar
    Peter Rotich committed
    
            return true;
    
        function __toString() {
            return $this->getName();
    
    Jared Hancock's avatar
    Jared Hancock committed
        function save($refetch=false) {
            if ($this->dirty) {
                $this->updated = SqlFunction::NOW();
            }
            return parent::save($refetch || $this->dirty);
    
    Jared Hancock's avatar
    Jared Hancock committed
        function update($vars,&$errors) {
    
            if (isset($this->id) && $this->getId() != $vars['id'])
                $errors['err'] = __('Missing or invalid group ID');
    
    Jared Hancock's avatar
    Jared Hancock committed
    
            if (!$vars['name']) {
    
                $errors['name'] = __('Group name required');
    
    Jared Hancock's avatar
    Jared Hancock committed
            } elseif(strlen($vars['name'])<3) {
    
                $errors['name'] = __('Group name must be at least 3 chars.');
    
    Jared Hancock's avatar
    Jared Hancock committed
            } elseif (($gid=static::getIdByName($vars['name']))
    
                    && (!isset($this->id) || $gid!=$this->getId())) {
                $errors['name'] = __('Group name already exists');
    
            if (!$vars['role_id'])
                $errors['role_id'] = __('Role selection required');
    
    
    Jared Hancock's avatar
    Jared Hancock committed
            if ($errors)
                return false;
    
    
            $this->name = Format::striptags($vars['name']);
            $this->role_id = $vars['role_id'];
            $this->notes = Format::sanitize($vars['notes']);
    
            if ($vars['isactive'])
                $this->flags = ($this->flags | self::FLAG_ENABLED);
            else
                $this->flags =  ($this->flags & ~self::FLAG_ENABLED);
    
    Jared Hancock's avatar
    Jared Hancock committed
    
            if ($this->save())
    
                return $this->updateDeptAccess($vars['depts'] ?: array(), $vars);
    
            if (isset($this->id)) {
    
                $errors['err']=sprintf(__('Unable to update %s.'), __('this group'))
                   .' '.__('Internal error occurred');
    
    Jared Hancock's avatar
    Jared Hancock committed
            }
            else {
    
                $errors['err']=sprintf(__('Unable to create %s.'), __('this group'))
    
                   .' '.__('Internal error occurred');
    
    Jared Hancock's avatar
    Jared Hancock committed
            }
            return false;
        }
    
    
        /*** Static functions ***/
        static function getIdByName($name){
            $id = static::objects()->filter(array('name'=>trim($name)))
                ->values_flat('id')->first();
    
            return $id ? $id[0] : 0;
        }
    
        static function create($vars=false) {
    
    
            if (!isset($vars['flags']))
                $vars['flags'] = 0;
    
    
            $group = parent::create($vars);
            $group->created = SqlFunction::NOW();
            return $group;
        }
    
        static function __create($vars, &$errors) {
            $g = self::create($vars);
            $g->save();
            if ($vars['depts'])
                $g->updateDeptAccess($vars['depts'], $vars);
    
            return $g;
        }
    
        static function getGroups($criteria=array()) {
            static $groups = null;
            if (!isset($groups) || $criteria) {
                $groups = array();
                $query = static::objects()
                    ->values_flat('id', 'name', 'flags')
                    ->order_by('name');
    
                $filters = array();
                if (isset($criteria['active']))
                    $filters += array(
                            'isactive' => $criteria['active'] ? 1 : 0);
    
                if ($filters)
                    $query->filter($filters);
    
                $names = array();
                foreach ($query as $row) {
                    list($id, $name, $flags) = $row;
                    $names[$id] = sprintf('%s%s',
                        self::getLocalById($id, 'name', $name),
                        $flags ? '' : ' ' . __('(disabled)'));
                }
    
                //TODO: sort if $criteria['localize'];
                if ($criteria)
                    return $names;
    
                $groups = $names;
            }
    
            return $groups;
        }
    
        static function getActiveGroups() {
            static $groups = null;
    
            if (!isset($groups))
                $groups = self::getGroups(array('active'=>true));
    
            return $groups;
        }