From 06e425145df51a88ab10d118d6d3075265e4f184 Mon Sep 17 00:00:00 2001 From: Peter Rotich <peter@osticket.com> Date: Thu, 29 Oct 2015 05:29:08 +0000 Subject: [PATCH] Only show members eligible for assignment Filter members based on department's assignment restriction when building a list of assignees. --- include/ajax.tickets.php | 13 +++++++++--- include/class.dept.php | 11 ++++++++++ include/class.forms.php | 34 +++++++++++++++++++++---------- include/class.ticket.php | 14 ++++++------- include/staff/ticket-view.inc.php | 5 ++++- 5 files changed, 55 insertions(+), 22 deletions(-) diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php index fd4c6b1ca..5fa62c346 100644 --- a/include/ajax.tickets.php +++ b/include/ajax.tickets.php @@ -572,22 +572,29 @@ class TicketsAjaxAPI extends AjaxController { $form = AssignmentForm::instantiate($_POST); - $assignCB = function($t, $f, $e) { return $t->assign($f, $e); }; - $assignees = array(); + $assignees = null; switch ($w) { case 'agents': $prompt = __('Select an Agent'); + $assignees = array(); foreach (Staff::getAvailableStaffMembers() as $id => $name) $assignees['s'.$id] = $name; + + if (!$assignees) + $info['warn'] = __('No agents available for assignment'); break; case 'teams': + $assignees = array(); $prompt = __('Select a Team'); foreach (Team::getActiveTeams() as $id => $name) $assignees['t'.$id] = $name; + + if (!$assignees) + $info['warn'] = __('No teams available for assignment'); break; case 'me': $info[':action'] = '#tickets/mass/claim'; @@ -606,7 +613,7 @@ class TicketsAjaxAPI extends AjaxController { break; } - if ($assignees) + if ($assignees != null) $form->setAssignees($assignees); if ($prompt && ($f=$form->getField('assignee'))) diff --git a/include/class.dept.php b/include/class.dept.php index 0f74f4cf8..5e916a816 100644 --- a/include/class.dept.php +++ b/include/class.dept.php @@ -205,6 +205,17 @@ implements TemplateVariable { return $this->getMembers(array('available'=>1)); } + // Get members eligible members only + function getAssignees() { + + $members = clone $this->getAvailableMembers(); + // If restricted then filter to primary members ONLY! + if ($this->assignMembersOnly()) + $members->filter(array('dept_id' => $this->getId())); + + return $members; + } + function getMembersForAlerts() { if ($this->isGroupMembershipEnabled() == self::ALERTS_DISABLED) { // Disabled for this department diff --git a/include/class.forms.php b/include/class.forms.php index 39f44a5df..bacd0dd79 100644 --- a/include/class.forms.php +++ b/include/class.forms.php @@ -2240,7 +2240,7 @@ class AssigneeField extends ChoiceField { function getChoices() { global $cfg; - if (!$this->_choices) { + if (!isset($this->_choices)) { $config = $this->getConfiguration(); $choices = array( __('Agents') => new ArrayObject(), @@ -2261,7 +2261,7 @@ class AssigneeField extends ChoiceField { next($choices); $T = current($choices); - if (($teams = Team::getTeams())) + if (($teams = Team::getActiveTeams())) foreach ($teams as $id => $name) $T['t'.$id] = $name; @@ -3243,7 +3243,9 @@ class ChoicesWidget extends Widget { } function emitComplexChoices($choices, $values=array(), $have_def=false, $def_key=null) { - foreach ($choices as $label => $group) { ?> + foreach ($choices as $label => $group) { + if (!count($group)) continue; + ?> <optgroup label="<?php echo $label; ?>"><?php foreach ($group as $key => $name) { if (!$have_def && $key == $def_key) @@ -3956,7 +3958,7 @@ class AssignmentForm extends Form { static $id = 'assign'; var $_assignee = null; - var $_assignees = array(); + var $_assignees = null; function getFields() { @@ -3993,7 +3995,7 @@ class AssignmentForm extends Form { ); - if ($this->_assignees) + if (isset($this->_assignees)) $fields['assignee']->setChoices($this->_assignees); @@ -4002,21 +4004,31 @@ class AssignmentForm extends Form { return $this->fields; } + function getField($name) { + + if (($fields = $this->getFields()) + && isset($fields[$name])) + return $fields[$name]; + } + function isValid() { - if (!parent::isValid()) + if (!parent::isValid() || !($f=$this->getField('assignee'))) return false; // Do additional assignment validation if (!($assignee = $this->getAssignee())) { - $this->getField('assignee')->addError( - __('Unknown assignee')); + $f->addError(__('Unknown assignee')); } elseif ($assignee instanceof Staff) { // Make sure the agent is available if (!$assignee->isAvailable()) - $this->getField('assignee')->addError( - __('Agent is unavailable for assignment') - ); + $f->addError(__('Agent is unavailable for assignment')); + } elseif ($assignee instanceof Team) { + // Make sure the team is active and has members + if (!$assignee->isActive()) + $f->addError(__('Team is disabled')); + elseif (!$assignee->getNumMembers()) + $f->addError(__('Team does not have members')); } return !$this->errors(); diff --git a/include/class.ticket.php b/include/class.ticket.php index 64e275559..b8e6b5582 100644 --- a/include/class.ticket.php +++ b/include/class.ticket.php @@ -858,18 +858,15 @@ implements RestrictedAccess, Threadable { switch (strtolower($options['target'])) { case 'agents': $dept = $this->getDept(); - $criteria = array('available' => true); - if (($members = $dept->getMembers($criteria))) { - foreach ($members as $member) - $assignees['s'.$member->getId()] = $member; - } + foreach ($dept->getAssignees() as $member) + $assignees['s'.$member->getId()] = $member; if (!$source && $this->isOpen() && $this->staff) $assignee = sprintf('s%d', $this->staff->getId()); $prompt = __('Select an Agent'); break; case 'teams': - if (($teams = Team::getTeams())) + if (($teams = Team::getActiveTeams())) foreach ($teams as $id => $name) $assignees['t'.$id] = $name; @@ -2142,6 +2139,7 @@ implements RestrictedAccess, Threadable { $evd = array(); $assignee = $form->getAssignee(); if ($assignee instanceof Staff) { + $dept = $this->getDept(); if ($this->getStaffId() == $assignee->getId()) { $errors['assignee'] = sprintf(__('%s already assigned to %s'), __('Ticket'), @@ -2149,6 +2147,8 @@ implements RestrictedAccess, Threadable { ); } elseif(!$assignee->isAvailable()) { $errors['assignee'] = __('Agent is unavailable for assignment'); + } elseif ($dept->assignMembersOnly() && !$dept->isMember($assignee)) { + $errors['err'] = __('Permission denied'); } else { $this->staff_id = $assignee->getId(); if ($thisstaff && $thisstaff->getId() == $assignee->getId()) @@ -3358,7 +3358,7 @@ implements RestrictedAccess, Threadable { // Assign ticket to staff or team (new ticket by staff) if ($vars['assignId']) { - $asnform = new AssignmentForm(array('assignee' => $vars['assignId'])); + $asnform = $ticket->AssignmentForm(array('assignee' => $vars['assignId'])); $ticket->assign($asnform, $vars['note']); } else { diff --git a/include/staff/ticket-view.inc.php b/include/staff/ticket-view.inc.php index 1247affae..29a2d1fc1 100644 --- a/include/staff/ticket-view.inc.php +++ b/include/staff/ticket-view.inc.php @@ -112,7 +112,10 @@ if($ticket->isOverdue()) <ul> <?php // Agent can claim team assigned ticket - if (!$ticket->getStaff()) { ?> + if (!$ticket->getStaff() + && (!$dept->assignMembersOnly() + || $dept->isMember($thisstaff)) + ) { ?> <li><a class="no-pjax ticket-action" data-redirect="tickets.php" href="#tickets/<?php echo $ticket->getId(); ?>/claim"><i -- GitLab