diff --git a/include/ajax.users.php b/include/ajax.users.php index 8d1327ddde459d547e63fc619471f6d74315c80e..d42349924e89430df12309c7159b1c7eba839fa6 100644 --- a/include/ajax.users.php +++ b/include/ajax.users.php @@ -84,7 +84,7 @@ class UsersAjaxAPI extends AjaxController { // Omit already-imported remote users if ($emails = array_filter($emails)) { $users->union(User::objects() - ->values_flat('id', 'name', 'default_email__address') + ->values_flat('id', 'name', 'default_email__address') ->filter(array( 'emails__address__in' => $emails ))); diff --git a/include/class.dept.php b/include/class.dept.php index 9c0b9564b55c499fba0399ac65b2f75295939171..a1a87164f924da3965f1ff77be5e31cbaf4fc4ed 100644 --- a/include/class.dept.php +++ b/include/class.dept.php @@ -741,8 +741,7 @@ implements TemplateVariable, Searchable { else FilterAction::setFilterFlag($filter_actions, 'dept', true); - switch ($vars['status']) - { + switch ($vars['status']) { case __('Active'): $this->setFlag(self::FLAG_ACTIVE, true); $this->setFlag(self::FLAG_ARCHIVED, false); diff --git a/include/class.filter.php b/include/class.filter.php index 0ea5c4ab4036e4ad4b8ea21e0c0b4a8fe9ecf029..d54bc8fd80a9df8dffaa1cdfc4bd6882f54bf643 100644 --- a/include/class.filter.php +++ b/include/class.filter.php @@ -142,6 +142,8 @@ class Filter { } public function setFlag($flag, $val) { + $vars = array(); + $errors = array(); if ($val) $this->ht['flags'] |= $flag; else @@ -547,7 +549,7 @@ class Filter { } function validate_actions($action) { - + $errors = array(); $config = json_decode($action->ht['configuration'], true); if ($action->ht['type'] == 'dept') { $dept = Dept::lookup($config['dept_id']); diff --git a/include/class.filter_action.php b/include/class.filter_action.php index 081e6d251e30901b3920ec053061483cd4e9aaae..c963e355c1ab0905f49d10dcf6926718851a8c71 100644 --- a/include/class.filter_action.php +++ b/include/class.filter_action.php @@ -79,11 +79,12 @@ class FilterAction extends VerySimpleModel { } function setFilterFlag($actions, $flag, $bool) { - $errors = array(); foreach ($actions as $action) { $filter = Filter::lookup($action->filter_id); - if ($flag == 'dept') $filter->setFlag(Filter::FLAG_INACTIVE_DEPT, $bool); - if ($flag == 'topic') $filter->setFlag(Filter::FLAG_INACTIVE_HT, $bool); + if ($filter) { + if ($flag == 'dept') $filter->setFlag(Filter::FLAG_INACTIVE_DEPT, $bool); + if ($flag == 'topic') $filter->setFlag(Filter::FLAG_INACTIVE_HT, $bool); + } } } diff --git a/include/class.nav.php b/include/class.nav.php index 448b3553942ff8e6d0f904556b45f8ec5ada6cce..02abcc028adbbe9ba3f486b149c14c99021e53a3 100644 --- a/include/class.nav.php +++ b/include/class.nav.php @@ -157,24 +157,6 @@ class StaffNav { case 'tasks': $subnav[]=array('desc'=>__('Tasks'), 'href'=>'tasks.php', 'iconclass'=>'Ticket', 'droponly'=>true); break; - case 'tickets': - $subnav[]=array('desc'=>__('Tickets'),'href'=>'tickets.php','iconclass'=>'Ticket', 'droponly'=>true); - if($staff) { - if(($assigned=$staff->getNumAssignedTickets())) - $subnav[]=array('desc'=>__('My Tickets')." ($assigned)", - 'href'=>'tickets.php?status=assigned', - 'iconclass'=>'assignedTickets', - 'droponly'=>true); - - if ($staff->hasPerm(Ticket::PERM_CREATE, false)) - $subnav[]=array('desc'=>__('New Ticket'), - 'title' => __('Open a New Ticket'), - 'href'=>'tickets.php?a=open', - 'iconclass'=>'newTicket', - 'id' => 'new-ticket', - 'droponly'=>true); - } - break; case 'dashboard': $subnav[]=array('desc'=>__('Dashboard'),'href'=>'dashboard.php','iconclass'=>'logs'); $subnav[]=array('desc'=>__('Agent Directory'),'href'=>'directory.php','iconclass'=>'teams'); diff --git a/include/class.staff.php b/include/class.staff.php index 05260871121adb619a70f23a6e86668061751ea7..965b7d429910614015045bf49ead08db9e616237 100644 --- a/include/class.staff.php +++ b/include/class.staff.php @@ -580,23 +580,6 @@ implements AuthenticatedUser, EmailContact, TemplateVariable, Searchable { $this->stats = array(); } - /* returns staff's quick stats - used on nav menu...etc && warnings */ - function getTicketsStats() { - - if(!$this->stats['tickets']) - $this->stats['tickets'] = Ticket::getStaffStats($this); - - return $this->stats['tickets']; - } - - function getNumAssignedTickets() { - return ($stats=$this->getTicketsStats())?$stats['assigned']:0; - } - - function getNumClosedTickets() { - return ($stats=$this->getTicketsStats())?$stats['closed']:0; - } - function getTasksStats() { if (!$this->stats['tasks']) diff --git a/include/class.thread.php b/include/class.thread.php index e9f079f2359b4468a93becb01fb99776adaf12ad..069b87c33ed7ec74584d7f1821d3e8120cba6b5c 100644 --- a/include/class.thread.php +++ b/include/class.thread.php @@ -134,7 +134,7 @@ implements Searchable { $collaborators = $this->getCollaborators(); $active = array(); foreach ($collaborators as $c) { - if ($c->isactive()) + if ($c->isActive()) $active[] = $c; } return $active; @@ -360,8 +360,8 @@ implements Searchable { if ($type && is_array($type)) { $visibility = Q::all(array('type__in' => $type)); - if ($type['poster']) { - $visibility->add(array('poster__exact' => $type['poster'])); + if ($type['user_id']) { + $visibility->add(array('user_id' => $type['user_id'])); $visibility->ored = true; } @@ -2019,7 +2019,7 @@ class ThreadEvent extends VerySimpleModel { $staff = $thisstaff->getId(); else $staff = $ticket->getStaffId(); - + $inst = self::create(array( 'staff_id' => $staff, 'team_id' => $ticket->getTeamId(), diff --git a/include/class.ticket.php b/include/class.ticket.php index 02b4f805bd3446ad3839e50910d8e7d6da3f62be..a6ed0915df61141e13fd89f210f7a69805cf785e 100644 --- a/include/class.ticket.php +++ b/include/class.ticket.php @@ -985,7 +985,9 @@ implements RestrictedAccess, Threadable, Searchable { 'label' => __('Due Date'), 'hint' => $hint, 'configuration' => array( + 'min' => Misc::gmtime(), 'time' => true, + 'gmt' => false, 'future' => true, ) )); @@ -3284,11 +3286,11 @@ implements RestrictedAccess, Threadable, Searchable { // Make sure the due date is valid if (Misc::user2gmtime($val) <= Misc::user2gmtime()) $errors['field']=__('Due date must be in the future'); - $dt->setTimezone(new DateTimeZone($cfg->getDbTimezone())); - $val = $dt->format('Y-m-d H:i:s'); + else { + $dt->setTimezone(new DateTimeZone($cfg->getDbTimezone())); + $val = $dt->format('Y-m-d H:i:s'); + } } - elseif ($fid == 'duedate' && !$val) - $errors['field']=__('Invalid due date'); $changes = array(); $this->{$fid} = $val; @@ -3372,46 +3374,6 @@ implements RestrictedAccess, Threadable, Searchable { return ($num === 0); } - /* Quick staff's tickets stats */ - function getStaffStats($staff) { - global $cfg; - - /* Unknown or invalid staff */ - if(!$staff || (!is_object($staff) && !($staff=Staff::lookup($staff))) || !$staff->isStaff()) - return null; - - $visibility = $staff->getTicketsVisibility(); - - $blocks = Ticket::objects() - ->filter(Q::any($visibility)) - ->filter(array('status__state' => 'open')) - ->aggregate(array('count' => SqlAggregate::COUNT('ticket_id'))) - ->values('status__state', 'isanswered', 'isoverdue','staff_id', 'team_id'); - - $stats = array(); - $id = $staff->getId(); - foreach ($blocks as $S) { - if ($showanswered || !$S['isanswered']) { - if (!($hideassigned && ($S['staff_id'] || $S['team_id']))) - $stats['open'] += $S['count']; - } - else { - $stats['answered'] += $S['count']; - } - if ($S['isoverdue']) - $stats['overdue'] += $S['count']; - if ($S['staff_id'] == $id) - $stats['assigned'] += $S['count']; - elseif ($S['team_id'] - && $S['staff_id'] == 0 - && $teams - && in_array($S['team_id'], $teams)) - // Assigned to my team but uassigned to an agent - $stats['assigned'] += $S['count']; - } - return $stats; - } - /* Quick client's tickets stats @email - valid email. */ diff --git a/include/class.topic.php b/include/class.topic.php index ffff7049b6e70603d27228f0b65646f5cccac2ab..84a1c9d47d85892d62ef4c44976ade79c33afcee 100644 --- a/include/class.topic.php +++ b/include/class.topic.php @@ -477,8 +477,7 @@ implements TemplateVariable, Searchable { else FilterAction::setFilterFlag($filter_actions, 'topic', true); - switch ($vars['status']) - { + switch ($vars['status']) { case __('Active'): $this->setFlag(self::FLAG_ACTIVE, true); $this->setFlag(self::FLAG_ARCHIVED, false); diff --git a/include/client/view.inc.php b/include/client/view.inc.php index 42ef768311eb746dff3f52c229fd1dbf401cabce..bc39255ab0e02367b43f151e1e1b9a05c5c41bd7 100644 --- a/include/client/view.inc.php +++ b/include/client/view.inc.php @@ -145,9 +145,9 @@ echo $v; <br> <?php $email = $thisclient->getUserName(); - $clientName = TicketUser::lookupByEmail($email)->getName()->name; + $clientId = TicketUser::lookupByEmail($email)->getId(); - $ticket->getThread()->render(array('M', 'R', 'poster' => $clientName), array( + $ticket->getThread()->render(array('M', 'R', 'user_id' => $clientId), array( 'mode' => Thread::MODE_CLIENT, 'html-id' => 'ticketThread') ); diff --git a/include/i18n/en_US/templates/email/ticket.reply.yaml b/include/i18n/en_US/templates/email/ticket.reply.yaml index 1996f6f73075d11e72f5e8830185e0145bfed8d9..c4d9dd793a38c82f9fedd656135bfa165c67ecd1 100644 --- a/include/i18n/en_US/templates/email/ticket.reply.yaml +++ b/include/i18n/en_US/templates/email/ticket.reply.yaml @@ -12,7 +12,7 @@ notes: | subject: | Re: %{ticket.subject} [#%{ticket.number}] body: | - <h3><strong>Dear %{recipient.name},</strong></h3> + <h3><strong>Dear %{recipient.name.first},</strong></h3> %{response} <br> <br> diff --git a/include/staff/tasks.inc.php b/include/staff/tasks.inc.php index a67a6dc7968ce000998476b44bb7f23ed4b7b7ae..c8983aca53190d4b300f0894590ae3978c51d224 100644 --- a/include/staff/tasks.inc.php +++ b/include/staff/tasks.inc.php @@ -94,14 +94,6 @@ case 'search': ))); unset($_SESSION[$queue_key]); break; - } elseif (isset($_SESSION['advsearch:tasks'])) { - // XXX: De-duplicate and simplify this code - $form = $search->getFormFromSession('advsearch:tasks'); - $form->loadState($_SESSION['advsearch:tasks']); - $tasks = $search->mangleQuerySet($tasks, $form); - $results_type=__('Advanced Search') - . '<a class="action-button" href="?clear_filter"><i class="icon-ban-circle"></i> <em>' . __('clear') . '</em></a>'; - break; } // Fall-through and show open tickets case 'open': diff --git a/include/upgrader/streams/core/526c601b-cce1ba43.patch.sql b/include/upgrader/streams/core/526c601b-cce1ba43.patch.sql index a624a52493c4f57dc74f4ee1f3bbd05397f406e1..215e5c5bec67e83fb03de679dd634e424b2cf1ec 100644 --- a/include/upgrader/streams/core/526c601b-cce1ba43.patch.sql +++ b/include/upgrader/streams/core/526c601b-cce1ba43.patch.sql @@ -9,7 +9,7 @@ * * Finally, a flag field is added to the filter table */ -Help Topics +-- Help Topics UPDATE `%TABLE_PREFIX%help_topic` SET `flags` = `flags` + 2 WHERE `isactive` = 1; @@ -23,8 +23,8 @@ UPDATE `%TABLE_PREFIX%department` WHERE `ispublic` = 1; -- Ticket Filters -ALTER TABLE `%TABLE_PREFIX%filter` - ADD `flags` int(10) unsigned DEFAULT '0' AFTER `isactive`; +ALTER TABLE `%TABLE_PREFIX%filter` + ADD `flags` int(10) unsigned DEFAULT '0' AFTER `isactive`; -- Finished with patch UPDATE `%TABLE_PREFIX%config` diff --git a/scp/departments.php b/scp/departments.php index 9c34f7f94af4b2857646d7d40a3ee6c3b78711df..cb07697370fdefc681839ed7a59f81da10ab2daa 100644 --- a/scp/departments.php +++ b/scp/departments.php @@ -102,6 +102,8 @@ if($_REQUEST['id'] && !($dept=Dept::lookup($_REQUEST['id']))) foreach ($depts as $d) { $d->setFlag(Dept::FLAG_ARCHIVED, false); $d->setFlag(Dept::FLAG_ACTIVE, true); + $filter_actions = FilterAction::objects()->filter(array('type' => 'dept', 'configuration' => '{"dept_id":'. $d->getId().'}')); + FilterAction::setFilterFlag($filter_actions, 'dept', false); if($d->save()) $num++; } @@ -127,6 +129,8 @@ if($_REQUEST['id'] && !($dept=Dept::lookup($_REQUEST['id']))) foreach ($depts as $d) { $d->setFlag(Dept::FLAG_ARCHIVED, false); $d->setFlag(Dept::FLAG_ACTIVE, false); + $filter_actions = FilterAction::objects()->filter(array('type' => 'dept', 'configuration' => '{"dept_id":'. $d->getId().'}')); + FilterAction::setFilterFlag($filter_actions, 'dept', true); if($d->save()) { $num++; //set dept_id to default for topics/emails using disabled dept @@ -154,6 +158,8 @@ if($_REQUEST['id'] && !($dept=Dept::lookup($_REQUEST['id']))) foreach ($depts as $d) { $d->setFlag(Dept::FLAG_ARCHIVED, true); $d->setFlag(Dept::FLAG_ACTIVE, false); + $filter_actions = FilterAction::objects()->filter(array('type' => 'dept', 'configuration' => '{"dept_id":'. $d->getId().'}')); + FilterAction::setFilterFlag($filter_actions, 'dept', true); if($d->save()) { $num++; //set dept_id to default for topics/emails using archived dept @@ -216,7 +222,7 @@ if ($_REQUEST['a'] && $_REQUEST['a'] == 'export') { } elseif ($dept || ($_REQUEST['a'] && !strcasecmp($_REQUEST['a'],'add'))) { if ($dept && ($pid=$dept->getParent()) && !$pid->isActive()) $warn = sprintf(__('%s is assigned a %s that is not active.'), __('Department'), __('Parent Department')); - + $page='department.inc.php'; } diff --git a/scp/helptopics.php b/scp/helptopics.php index 281b1c7f15391288944210d31464e4c8ceafc45b..ea1d7b8bd147812bec28021627c3399db9a71cd6 100644 --- a/scp/helptopics.php +++ b/scp/helptopics.php @@ -72,6 +72,8 @@ if($_POST){ foreach ($topics as $t) { $t->setFlag(Topic::FLAG_ARCHIVED, false); $t->setFlag(Topic::FLAG_ACTIVE, true); + $filter_actions = FilterAction::objects()->filter(array('type' => 'topic', 'configuration' => '{"topic_id":'. $t->getId().'}')); + FilterAction::setFilterFlag($filter_actions, 'topic', false); if($t->save()) $num++; } @@ -97,6 +99,8 @@ if($_POST){ foreach ($topics as $t) { $t->setFlag(Topic::FLAG_ARCHIVED, false); $t->setFlag(Topic::FLAG_ACTIVE, false); + $filter_actions = FilterAction::objects()->filter(array('type' => 'topic', 'configuration' => '{"topic_id":'. $t->getId().'}')); + FilterAction::setFilterFlag($filter_actions, 'topic', true); if($t->save()) { $num++; //remove topic_id for emails using disabled topic @@ -124,6 +128,8 @@ if($_POST){ foreach ($topics as $t) { $t->setFlag(Topic::FLAG_ARCHIVED, true); $t->setFlag(Topic::FLAG_ACTIVE, false); + $filter_actions = FilterAction::objects()->filter(array('type' => 'topic', 'configuration' => '{"topic_id":'. $t->getId().'}')); + FilterAction::setFilterFlag($filter_actions, 'topic', true); if($t->save()) { $num++; //remove topic_id for emails using disabled topic diff --git a/scp/staff.inc.php b/scp/staff.inc.php index a91b15a2f370bfcb5481f537a3bb3010d6657908..8acf73ceabfe35f2e2f054eb019230ebbd5821c0 100644 --- a/scp/staff.inc.php +++ b/scp/staff.inc.php @@ -78,7 +78,7 @@ if (!$thisstaff || !$thisstaff->getId() || !$thisstaff->isValid()) { //2) if not super admin..check system status and group status if(!$thisstaff->isAdmin()) { //Check for disabled staff or group! - if (!$thisstaff->isactive()) { + if (!$thisstaff->isActive()) { staffLoginPage(__('Access Denied. Contact Admin')); exit; } diff --git a/scp/tasks.php b/scp/tasks.php index a918d0ecb90ab79603466577b5f14179b918e4b3..5cd77777f3714b6ff592878ab25ca6ee35a212a1 100644 --- a/scp/tasks.php +++ b/scp/tasks.php @@ -197,21 +197,6 @@ if ($stats['closed']) { ($_REQUEST['status']=='closed')); } -if (isset($_SESSION['advsearch:tasks'])) { - // XXX: De-duplicate and simplify this code - $search = SavedSearch::create(); - $form = $search->getFormFromSession('advsearch:tasks'); - $form->loadState($_SESSION['advsearch:tasks']); - $tasks = Task::objects(); - $tasks = $search->mangleQuerySet($tasks, $form); - $count = $tasks->count(); - $nav->addSubMenu(array('desc' => __('Search').' ('.number_format($count).')', - 'title'=>__('Advanced Task Search'), - 'href'=>'tasks.php?status=search', - 'iconclass'=>'Ticket'), - (!$_REQUEST['status'] || $_REQUEST['status']=='search')); -} - if ($thisstaff->hasPerm(TaskModel::PERM_CREATE, false)) { $nav->addSubMenu(array('desc'=>__('New Task'), 'title'=> __('Open a New Task'), diff --git a/scp/tickets.php b/scp/tickets.php index 18a7e0721dd267eb96fd17e00132ffe1a7155127..9c847b83d504f65b049ee978e8cfe17ae2b83421 100644 --- a/scp/tickets.php +++ b/scp/tickets.php @@ -452,9 +452,6 @@ if ($redirect) { Http::redirect($redirect); } -/*... Quick stats ...*/ -$stats = $thisstaff->getTicketsStats(); - // Clear advanced search upon request if (isset($_GET['clear_filter'])) unset($_SESSION['advsearch']); @@ -541,7 +538,7 @@ if($ticket) { $inc = 'ticket-open.inc.php'; elseif ($_REQUEST['a'] == 'export' && $queue) { // XXX: Check staff access? - $filename = sprintf('%s Tickets-%s', $queue->getName(), + $filename = sprintf('%s Tickets-%s.csv', $queue->getName(), strftime('%Y%m%d')); if (!$queue->export($filename, 'csv')) $errors['err'] = __('Unable to export results.') diff --git a/setup/test/tests/stubs.php b/setup/test/tests/stubs.php index 0b7c423fa6adc0f784ad6b1d3bdf7e3129dd7054..052f97d3ac61235cbcb7123cd6e8160ab9ee5234 100644 --- a/setup/test/tests/stubs.php +++ b/setup/test/tests/stubs.php @@ -132,6 +132,7 @@ class SqlFunction { static function LENGTH() {} static function COALESCE() {} static function DATEDIFF() {} + static function timestampdiff() {} } class SqlExpression {