Skip to content
Snippets Groups Projects
tasks.php 7.49 KiB
Newer Older
  • Learn to ignore specific revisions
  • Peter Rotich's avatar
    Peter Rotich committed
    <?php
    /*************************************************************************
        tasks.php
    
        Copyright (c)  2006-2013 osTicket
        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:
    **********************************************************************/
    
    require('staff.inc.php');
    require_once(INCLUDE_DIR.'class.task.php');
    
    $page = '';
    $task = null; //clean start.
    if ($_REQUEST['id']) {
        if (!($task=Task::lookup($_REQUEST['id'])))
             $errors['err'] = sprintf(__('%s: Unknown or invalid ID.'), __('task'));
        elseif (!$task->checkStaffPerm($thisstaff)) {
            $errors['err'] = __('Access denied. Contact admin if you believe this is in error');
            $task = null;
        }
    }
    
    // Configure form for file uploads
    
    $note_form = new SimpleForm(array(
    
    Peter Rotich's avatar
    Peter Rotich committed
        'attachments' => new FileUploadField(array('id'=>'attach',
            'name'=>'attach:note',
            'configuration' => array('extensions'=>'')))
    ));
    
    //At this stage we know the access status. we can process the post.
    if($_POST && !$errors):
    
        if ($task) {
            //More coffee please.
            $errors=array();
            $role = $thisstaff->getRole($task->getDeptId());
            switch(strtolower($_POST['a'])):
            case 'postnote': /* Post Internal Note */
                $vars = $_POST;
                $attachments = $note_form->getField('attachments')->getClean();
                $vars['cannedattachments'] = array_merge(
                    $vars['cannedattachments'] ?: array(), $attachments);
    
                $wasOpen = ($task->isOpen());
                if(($note=$task->postNote($vars, $errors, $thisstaff))) {
    
                    $msg=__('Internal note posted successfully');
                    // Clear attachment list
                    $note_form->setSource(array());
                    $note_form->getField('attachments')->reset();
    
                    if($wasOpen && $task->isClosed())
                        $task = null; //Going back to main listing.
                    else
                        // Ticket is still open -- clear draft for the note
                        Draft::deleteForNamespace('task.note.'.$task->getId(),
                            $thisstaff->getId());
    
                } else {
    
                    if(!$errors['err'])
                        $errors['err'] = __('Unable to post internal note - missing or invalid data.');
    
                    $errors['postnote'] = __('Unable to post the note. Correct the error(s) below and try again!');
                }
                break;
            default:
                $errors['err']=__('Unknown action');
            endswitch;
        }
        if(!$errors)
            $thisstaff->resetStats(); //We'll need to reflect any changes just made!
    endif;
    
    /*... Quick stats ...*/
    $stats= $thisstaff->getTasksStats();
    
    // Clear advanced search upon request
    if (isset($_GET['clear_filter']))
        unset($_SESSION['advsearch']);
    
    //Navigation
    $nav->setTabActive('tasks');
    $open_name = _P('queue-name',
        /* This is the name of the open tasks queue */
        'Open');
    
    $nav->addSubMenu(array('desc'=>$open_name.' ('.number_format($stats['open']).')',
                           'title'=>__('Open Tasks'),
                           'href'=>'tasks.php?status=open',
                           'iconclass'=>'Ticket'),
                        ((!$_REQUEST['status'] && !isset($_SESSION['advsearch'])) || $_REQUEST['status']=='open'));
    
    if ($stats['assigned']) {
    
        $nav->addSubMenu(array('desc'=>__('My Tasks').' ('.number_format($stats['assigned']).')',
                               'title'=>__('Assigned Tasks'),
                               'href'=>'tasks.php?status=assigned',
                               'iconclass'=>'assignedTickets'),
                            ($_REQUEST['status']=='assigned'));
    }
    
    if ($stats['overdue']) {
        $nav->addSubMenu(array('desc'=>__('Overdue').' ('.number_format($stats['overdue']).')',
                               'title'=>__('Stale Tasks'),
                               'href'=>'tasks.php?status=overdue',
                               'iconclass'=>'overdueTickets'),
                            ($_REQUEST['status']=='overdue'));
    
        if(!$sysnotice && $stats['overdue']>10)
            $sysnotice=sprintf(__('%d overdue tasks!'), $stats['overdue']);
    }
    
    if ($stats['closed']) {
        $nav->addSubMenu(array('desc' => __('Closed').' ('.number_format($stats['closed']).')',
                               'title'=>__('Closed Tasks'),
                               'href'=>'tasks.php?status=closed',
                               'iconclass'=>'closedTickets'),
                            ($_REQUEST['status']=='closed'));
    }
    
    if (isset($_SESSION['advsearch'])) {
        // XXX: De-duplicate and simplify this code
        $search = SavedSearch::create();
        $form = $search->getFormFromSession('advsearch');
        $form->loadState($_SESSION['advsearch']);
        $tickets = TicketModel::objects();
        $tickets = $search->mangleQuerySet($tickets, $form);
        $count = $tickets->count();
        $nav->addSubMenu(array('desc' => __('Search').' ('.number_format($count).')',
                               'title'=>__('Advanced Ticket Search'),
                               'href'=>'tickets.php?status=search',
                               'iconclass'=>'Ticket'),
                            (!$_REQUEST['status'] || $_REQUEST['status']=='search'));
    }
    
    if ($thisstaff->hasPerm(TaskModel::PERM_CREATE)) {
        $nav->addSubMenu(array('desc'=>__('New Task'),
                               'title'=> __('Open a New Task'),
                               'href'=>'tasks.php?a=open',
                               'iconclass'=>'newTicket',
                               'id' => 'new-task'),
                            ($_REQUEST['a']=='open'));
    }
    
    
    $ost->addExtraHeader('<script type="text/javascript" src="js/ticket.js"></script>');
    $ost->addExtraHeader('<meta name="tip-namespace" content="tasks.queue" />',
        "$('#content').data('tipNamespace', 'tasks.queue');");
    
    if($task) {
        $ost->setPageTitle(sprintf(__('Task #%s'),$task->getNumber()));
        $nav->setActiveSubMenu(-1);
        $inc = 'templates/task-view.tmpl.php';
        if ($_REQUEST['a']=='edit'
                && $task->checkStaffPerm($thisstaff, TaskModel::PERM_EDIT)) {
            $inc = 'task-edit.inc.php';
            if (!$forms) $forms=DynamicFormEntry::forObject($task->getId(), 'A');
            // Auto add new fields to the entries
            foreach ($forms as $f) $f->addMissingFields();
        } elseif($_REQUEST['a'] == 'print' && !$task->pdfExport($_REQUEST['psize']))
            $errors['err'] = __('Internal error: Unable to export the task to PDF for print.');
    } else {
    	$inc = 'tasks.inc.php';
        if ($_REQUEST['a']=='open' &&
                $thisstaff->hasPerm(Task::PERM_CREATE))
            $inc = 'task-open.inc.php';
        elseif($_REQUEST['a'] == 'export') {
            $ts = strftime('%Y%m%d');
            if (!($query=$_SESSION[':Q:tasks']))
                $errors['err'] = __('Query token not found');
            elseif (!Export::saveTasks($query, "tasks-$ts.csv", 'csv'))
                $errors['err'] = __('Internal error: Unable to dump query results');
        }
    
        //Clear active submenu on search with no status
        if($_REQUEST['a']=='search' && !$_REQUEST['status'])
            $nav->setActiveSubMenu(-1);
    
        //set refresh rate if the user has it configured
        if(!$_POST && !$_REQUEST['a'] && ($min=$thisstaff->getRefreshRate())) {
            $js = "clearTimeout(window.task_refresh);
                   window.task_refresh = setTimeout($.refreshTaskView,"
                .($min*60000).");";
            $ost->addExtraHeader('<script type="text/javascript">'.$js.'</script>',
                $js);
        }
    }
    
    require_once(STAFFINC_DIR.'header.inc.php');
    require_once(STAFFINC_DIR.$inc);
    require_once(STAFFINC_DIR.'footer.inc.php');