Skip to content
Snippets Groups Projects
class.task.php 40.8 KiB
Newer Older
  • Learn to ignore specific revisions
  •         }
    
        }
    
        /*
         * Notify collaborators on response or new message
         *
         */
        function  notifyCollaborators($entry, $vars = array()) {
            global $cfg;
    
            if (!$entry instanceof ThreadEntry
                || !($recipients=$this->getThread()->getParticipants())
                || !($dept=$this->getDept())
                || !($tpl=$dept->getTemplate())
                || !($msg=$tpl->getTaskActivityNoticeMsgTemplate())
                || !($email=$dept->getEmail())
            ) {
                return;
            }
    
            // Who posted the entry?
            $skip = array();
            if ($entry instanceof Message) {
                $poster = $entry->getUser();
                // Skip the person who sent in the message
                $skip[$entry->getUserId()] = 1;
                // Skip all the other recipients of the message
                foreach ($entry->getAllEmailRecipients() as $R) {
                    foreach ($recipients as $R2) {
                        if (0 === strcasecmp($R2->getEmail(), $R->mailbox.'@'.$R->host)) {
                            $skip[$R2->getUserId()] = true;
                            break;
                        }
                    }
                }
            } else {
                $poster = $entry->getStaff();
            }
    
            $vars = array_merge($vars, array(
                'message' => (string) $entry,
                'poster' => $poster ?: _S('A collaborator'),
                )
            );
    
            $msg = $this->replaceVars($msg->asArray(), $vars);
    
            $attachments = $cfg->emailAttachments()?$entry->getAttachments():array();
            $options = array('inreplyto' => $entry->getEmailMessageId(),
                             'thread' => $entry);
    
            foreach ($recipients as $recipient) {
                // Skip folks who have already been included on this part of
                // the conversation
                if (isset($skip[$recipient->getUserId()]))
                    continue;
                $notice = $this->replaceVars($msg, array('recipient' => $recipient));
                $email->send($recipient, $notice['subj'], $notice['body'], $attachments,
                    $options);
            }
        }
    
        /* static routines */
    
    Peter Rotich's avatar
    Peter Rotich committed
        static function lookupIdByNumber($number) {
            $sql = 'SELECT id FROM '.TASK_TABLE
                  .' WHERE `number`='.db_input($number);
            list($id) = db_fetch_row(db_query($sql));
    
            return $id;
        }
    
        static function isNumberUnique($number) {
            return !self::lookupIdByNumber($number);
        }
    
    
        static function create($vars=false) {
    
            global $cfg;
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
            if (!is_array($vars))
                return null;
    
    
            $task = parent::create(array(
                'flags' => self::ISOPEN,
                'object_id' => $vars['object_id'],
                'object_type' => $vars['object_type'],
                'number' => $cfg->getNewTaskNumber(),
                'created' => new SqlFunction('NOW'),
                'updated' => new SqlFunction('NOW'),
            ));
            // Save internal fields.
            if ($vars['internal_formdata']['staff_id'])
                $task->staff_id = $vars['internal_formdata']['staff_id'];
            if ($vars['internal_formdata']['dept_id'])
                $task->dept_id = $vars['internal_formdata']['dept_id'];
            if ($vars['internal_formdata']['duedate'])
                $task->duedate = $vars['internal_formdata']['duedate'];
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
            $task->save(true);
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
            // Add dynamic data
            $task->addDynamicData($vars['default_formdata']);
    
    Peter Rotich's avatar
    Peter Rotich committed
    
            // Create a thread + message.
            $thread = TaskThread::create($task);
            $thread->addDescription($vars);
    
            Signal::send('task.created', $task);
    
    Peter Rotich's avatar
    Peter Rotich committed
    
            return $task;
        }
    
    
        function delete($comments='') {
            global $ost, $thisstaff;
    
            $thread = $this->getThread();
    
            if (!parent::delete())
                return false;
    
            $thread->delete();
    
            Draft::deleteForNamespace('task.%.' . $this->getId());
    
            foreach (DynamicFormEntry::forObject($this->getId(), ObjectModel::OBJECT_TYPE_TASK) as $form)
                $form->delete();
    
            // Log delete
            $log = sprintf(__('Task #%1$s deleted by %2$s'),
                    $this->getNumber(),
                    $thisstaff ? $thisstaff->getName() : __('SYSTEM'));
    
            if ($comments)
                $log .= sprintf('<hr>%s', $comments);
    
            $ost->logDebug(
                    sprintf( __('Task #%s deleted'), $this->getNumber()),
                    $log);
    
            return true;
    
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        static function __loadDefaultForm() {
    
            require_once INCLUDE_DIR.'class.i18n.php';
    
            $i18n = new Internationalization();
            $tpl = $i18n->getTemplate('form.yaml');
            foreach ($tpl->getData() as $f) {
                if ($f['type'] == ObjectModel::OBJECT_TYPE_TASK) {
                    $form = DynamicForm::create($f);
                    $form->save();
                    break;
                }
            }
        }
    
    Peter Rotich's avatar
    Peter Rotich committed
    
        /* Quick staff's stats */
        static function getStaffStats($staff) {
            global $cfg;
    
            /* Unknown or invalid staff */
            if (!$staff
                    || (!is_object($staff) && !($staff=Staff::lookup($staff)))
                    || !$staff->isStaff())
                return null;
    
            $where = array('(task.staff_id='.db_input($staff->getId())
                        .sprintf(' AND task.flags & %d != 0 ', TaskModel::ISOPEN)
                        .') ');
            $where2 = '';
    
            if(($teams=$staff->getTeams()))
    
    Peter Rotich's avatar
    Peter Rotich committed
                $where[] = ' ( task.team_id IN('.implode(',', db_input(array_filter($teams)))
    
    Peter Rotich's avatar
    Peter Rotich committed
                            .') AND '
                            .sprintf('task.flags & %d != 0 ', TaskModel::ISOPEN)
                            .')';
    
    
            if(!$staff->showAssignedOnly() && ($depts=$staff->getDepts())) //Staff with limited access just see Assigned tasks.
    
    Peter Rotich's avatar
    Peter Rotich committed
                $where[] = 'task.dept_id IN('.implode(',', db_input($depts)).') ';
    
            $where = implode(' OR ', $where);
            if ($where) $where = 'AND ( '.$where.' ) ';
    
            $sql =  'SELECT \'open\', count(task.id ) AS tasks '
                    .'FROM ' . TASK_TABLE . ' task '
                    . sprintf(' WHERE task.flags & %d != 0 ', TaskModel::ISOPEN)
                    . $where . $where2
    
                    .'UNION SELECT \'overdue\', count( task.id ) AS tasks '
                    .'FROM ' . TASK_TABLE . ' task '
                    . sprintf(' WHERE task.flags & %d != 0 ', TaskModel::ISOPEN)
                    . sprintf(' AND task.flags & %d != 0 ', TaskModel::ISOVERDUE)
                    . $where
    
                    .'UNION SELECT \'assigned\', count( task.id ) AS tasks '
                    .'FROM ' . TASK_TABLE . ' task '
                    . sprintf(' WHERE task.flags & %d != 0 ', TaskModel::ISOPEN)
                    .'AND task.staff_id = ' . db_input($staff->getId()) . ' '
                    . $where
    
                    .'UNION SELECT \'closed\', count( task.id ) AS tasks '
                    .'FROM ' . TASK_TABLE . ' task '
                    . sprintf(' WHERE task.flags & %d = 0 ', TaskModel::ISOPEN)
                    . $where;
    
            $res = db_query($sql);
            $stats = array();
            while ($row = db_fetch_row($res))
                $stats[$row[0]] = $row[1];
    
            return $stats;
        }
    
    Peter Rotich's avatar
    Peter Rotich committed
    
        static function getAgentActions($agent, $options=array()) {
            if (!$agent)
                return;
    
            require STAFFINC_DIR.'templates/tasks-actions.tmpl.php';
        }
    
    Peter Rotich's avatar
    Peter Rotich committed
    }
    
    
    class TaskCData extends VerySimpleModel {
        static $meta = array(
            'pk' => array('task_id'),
            'table' => TASK_CDATA_TABLE,
            'joins' => array(
                'task' => array(
                    'constraint' => array('task_id' => 'TaskModel.task_id'),
                ),
            ),
        );
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
    Peter Rotich's avatar
    Peter Rotich committed
    class TaskForm extends DynamicForm {
        static $instance;
    
        static $defaultForm;
        static $internalForm;
    
        static $forms;
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        static $cdata = array(
                'table' => TASK_CDATA_TABLE,
                'object_id' => 'task_id',
                'object_type' => 'A',
            );
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        static function objects() {
            $os = parent::objects();
            return $os->filter(array('type'=>ObjectModel::OBJECT_TYPE_TASK));
        }
    
        static function getDefaultForm() {
    
            if (!isset(static::$defaultForm)) {
    
    Peter Rotich's avatar
    Peter Rotich committed
                if (($o = static::objects()) && $o[0])
    
                    static::$defaultForm = $o[0];
    
            return static::$defaultForm;
    
    Peter Rotich's avatar
    Peter Rotich committed
        }
    
        static function getInstance($object_id=0, $new=false) {
            if ($new || !isset(static::$instance))
                static::$instance = static::getDefaultForm()->instanciate();
    
            static::$instance->object_type = ObjectModel::OBJECT_TYPE_TASK;
    
            if ($object_id)
                static::$instance->object_id = $object_id;
    
            return static::$instance;
        }
    
    
        static function getInternalForm($source=null) {
            if (!isset(static::$internalForm))
    
                static::$internalForm = new SimpleForm(self::getInternalFields(), $source);
    
    
            return static::$internalForm;
        }
    
        static function getInternalFields() {
            return array(
                    'dept_id' => new DepartmentField(array(
                        'id'=>1,
                        'label' => __('Department'),
                        'flags' => hexdec(0X450F3),
                        'required' => true,
    
    Peter Rotich's avatar
    Peter Rotich committed
                        'layout' => new GridFluidCell(6),
    
                        )),
                    'staff_id' => new AssigneeField(array(
                        'id'=>2,
                        'label' => __('Assignee'),
                        'flags' => hexdec(0X450F3),
                        'required' => false,
    
    Peter Rotich's avatar
    Peter Rotich committed
                        'layout' => new GridFluidCell(6),
    
                        )),
                    'duedate'  =>  new DatetimeField(array(
                        'id' => 3,
                        'label' => __('Due Date'),
                        'flags' => hexdec(0X450B3),
                        'required' => false,
                        'configuration' => array(
                            'min' => Misc::gmtime(),
                            'time' => true,
                            'gmt' => true,
                            'future' => true,
                            ),
                        )),
    
                );
        }
    
    Peter Rotich's avatar
    Peter Rotich committed
    }
    
    // Task thread class
    class TaskThread extends ObjectThread {
    
        function addDescription($vars, &$errors=array()) {
    
            $vars['threadId'] = $this->getId();
            $vars['message'] = $vars['description'];
            unset($vars['description']);
    
            return MessageThreadEntry::create($vars, $errors);
        }
    
        static function create($task) {
            $id = is_object($task) ? $task->getId() : $task;
    
            $thread = parent::create(array(
    
    Peter Rotich's avatar
    Peter Rotich committed
                        'object_id' => $id,
                        'object_type' => ObjectModel::OBJECT_TYPE_TASK
                        ));
    
            if ($thread->save())
                return $thread;