diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php index fd4c6b1cae6aa0f0148ad12274a9b46d287fb7cd..5fa62c3465e86fb11c657d1a02c2c3cb61d5df77 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 0f74f4cf8e0f02f1fcff3491ba4455ab7a0e0b7c..5e916a8167cafdf8e8a7c8e8e4bbe273bd5d2bfc 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 39f44a5df3c580ccf7410fc4b3eaefbce29b8a05..bacd0dd799683209bcb890780cf29d923b7cd919 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 64e275559d71616a3182b5366d3b9ea0d7f21f36..b8e6b55828ccc48744fd19a67688b57a40c64d5c 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 1247affaeec2de653dba27af260f163e50379b11..29a2d1fc1e490e094a7bfe27dd9fb4559ff0dc3d 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