Spade
Mini Shell
| Directory:~$ /home/lmsyaran/www/administrator/components/com_rsticketspro/models/ |
| [Home] [System Details] [Kill Me] |
<?php
/**
* @version 2.0.0
* @package RSTickets! Pro 2.0.0
* @copyright (C) 2010 www.rsjoomla.com
* @license GPL, http://www.gnu.org/licenses/gpl-2.0.html
*/
defined('_JEXEC') or die('Restricted access');
class RsticketsproModelReports extends JModelAdmin
{
protected $_db;
protected $_departments;
protected $_department_names;
protected $_staff_names;
public $min = 0;
public $avg = 0;
public $max = 0;
public $count = 0;
public $total = 0;
public $viewin = '';
public function __construct() {
parent::__construct();
// large databases need lots of memory
if ($limit = ini_get('memory_limit')) {
if (substr($limit, -1) == 'M') {
if ((int) $limit < 192) {
ini_set('memory_limit', '192M');
}
}
}
$this->_db = JFactory::getDbo();
$this->_db->setQuery("SET SQL_BIG_SELECTS=1");
$this->_db->execute();
JFactory::getLanguage()->load('plg_system_rsticketsproreports',
JPATH_ADMINISTRATOR);
$this->_getDepartments();
$this->_getStaff();
}
protected function _getDepartments() {
$this->_db->setQuery('SELECT * FROM
'.$this->_db->qn('#__rsticketspro_departments').'
ORDER BY '.$this->_db->qn('ordering').'
ASC');
$this->_departments = $this->_db->loadObjectList();
$this->_department_names = array();
foreach ($this->_departments as $department)
$this->_department_names[$department->id] =
JText::_($department->name);
}
protected function _getStaff() {
$what = RSTicketsProHelper::getConfig('show_user_info');
$this->_db->setQuery('SELECT
'.$this->_db->qn('s.user_id').',
'.$this->_db->qn('u.'.$what).' FROM
'.$this->_db->qn('#__rsticketspro_staff','s').'
LEFT JOIN
'.$this->_db->qn('#__users','u').' ON
'.$this->_db->qn('s.user_id').' =
'.$this->_db->qn('u.id').'');
$staff_names = $this->_db->loadObjectList();
foreach ($staff_names as $staff)
$this->_staff_names[$staff->user_id] = $staff->{$what};
$this->_staff_names[0] = JText::_('RST_UNASSIGNED');
}
public function getCountDepartments() {
return count($this->_departments);
}
public function getCountStaff() {
return count($this->_staff_names);
}
public function getDepartments() {
return $this->_departments;
}
public function getStaff() {
$what = RSTicketsProHelper::getConfig('show_user_info');
$this->_db->setQuery('SELECT
'.$this->_db->qn('s').'.*,
'.$this->_db->qn('u.'.$what,'thealias').'
FROM
'.$this->_db->qn('#__rsticketspro_staff','s').'
LEFT JOIN
'.$this->_db->qn('#__users','u').' ON
'.$this->_db->qn('u.id').' =
'.$this->_db->qn('s.user_id').' ');
$staff = $this->_db->loadObjectList();
$unassigned = new stdClass();
$unassigned->thealias = $unassigned->username =
$unassigned->name = $unassigned->email =
JText::_('RST_UNASSIGNED');
$unassigned->user_id = '00'; // say hurray to Joomla!
changing how everything works for the millionth time!
$staff[] = $unassigned;
return $staff;
}
public function getPriority() {
$this->_db->setQuery('SELECT * FROM
'.$this->_db->qn('#__rsticketspro_priorities').'
ORDER BY '.$this->_db->qn('ordering').'
ASC');
return $this->_db->loadObjectList();
}
public function getReportData() {
$input = JFactory::getApplication()->input;
$db = JFactory::getDbo();
$from = $input->getString('from','');
$to = $input->getString('to','');
$report = $input->getString('report','');
$filter = array();
$where = '';
$return = array();
// Unit
$unit = $input->getString('unit','');
switch ($unit) {
default:
case 'day':
$format = 'Y-m-d';
$step = 86400;
break;
case 'month':
$format = 'Y-m';
$step = 86400*30;
break;
case 'year':
$format = 'Y';
$step = 86400*30*12;
break;
case 'quarter':
$format = 'Y-m';
break;
}
// From and To
if ($from || $to) {
$startDate = JFactory::getDate($from)->toSql();
$stopDate = JFactory::getDate($to)->toSql();
if ($from && $to) {
$filter['date'] = ' AND
('.$this->_db->qn('date').' >
'.$this->_db->q($startDate).' AND
'.$this->_db->qn('date').' <
'.$this->_db->q($stopDate).')';
$where .= $filter['date'];
} elseif ($from) {
$filter['date'] = ' AND
'.$this->_db->qn('date').' >
'.$this->_db->q($startDate).'';
$where .= $filter['date'];
} elseif ($to) {
$filter['date'] = ' AND
'.$this->_db->qn('date').' <
'.$this->_db->q($stopDate).'';
$where .= $filter['date'];
}
}
$departments =
$input->get('departments',array(),'array');
$departments = array_map('intval', $departments);
if (!empty($departments)) {
$filter['department_id'] = ' AND
'.$this->_db->qn('department_id').' IN
('.implode(',', $departments).')';
$where .= $filter['department_id'];
}
$staff = $input->get('staff',array(),'array');
$staff = array_map('intval', $staff);
if (!empty($staff)) {
$filter['staff_id'] = ' AND
'.$this->_db->qn('staff_id').' IN
('.implode(',', $staff).')';
$where .= $filter['staff_id'];
}
$priority =
$input->get('priority',array(),'array');
$priority = array_map('intval', $priority);
if (!empty($priority)) {
$filter['priority_id'] = ' AND
'.$this->_db->qn('priority_id').' IN
('.implode(',', $priority).')';
$where .= $filter['priority_id'];
}
$user_id = $input->getInt('user_id',0);
if (!empty($user_id)) {
$filter['customer_id'] = ' AND
'.$this->_db->qn('customer_id').' = '.(int)
$user_id;
$where .= $filter['customer_id'];
}
// Fill the graph with dates
if (!$from) {
$query = $db->getQuery(true)
->select('MAX('.$db->qn('date').')')
->from($db->qn('#__rsticketspro_tickets'))
->where('1 '.$where);
$from = $db->setQuery($query)->loadResult();
}
if (!$to) {
$query = $db->getQuery(true)
->select('MIN('.$db->qn('date').')')
->from($db->qn('#__rsticketspro_tickets'))
->where('1 '.$where);
$to = $db->setQuery($query)->loadResult();
}
if ($unit != 'quarter') {
$startDate = JFactory::getDate($from)->toUnix();
$stopDate = JFactory::getDate($to)->toUnix();
for ($date = $startDate; $date < $stopDate; $date = $date + $step) {
if ($unit == 'quarter') {
$format =
$this->getQuarter(JFactory::getDate($date)->format('m'));
echo JFactory::getDate($date)->format('Y-m-d').'
=> '.$format.'<br />';
}
$return['units'][JFactory::getDate($date)->format($format)]
= JFactory::getDate($date)->format($format);
}
} else {
$startDate =
JFactory::getDate($from)->format($this->getQuarter(JFactory::getDate($from)->format('m')));
$stopDate =
JFactory::getDate($to)->format($this->getQuarter(JFactory::getDate($to)->format('m')));
list($startYear, $startQuarter) = explode(' Q', $startDate);
list($stopYear, $stopQuarter) = explode(' Q', $stopDate);
for ($year = $startYear; $year <= $stopYear; $year++) {
for ($quarter = 1; $quarter <= 4; $quarter++) {
if (($year == $startYear && $quarter >= $startQuarter) ||
($year > $startYear && $year < $stopYear) || ($year ==
$stopYear && $quarter <= $stopQuarter)) {
$return['units']["$year Q$quarter"] = "$year
Q$quarter";
}
}
}
}
// ordering
$orderby = ' ORDER BY
'.$this->_db->qn('date').' ASC';
$viewby = $this->getViewBy();
switch ($report)
{
// number of submitted tickets
case 'report_1':
// query
$query = 'SELECT
'.$this->_db->qn('department_id').',
'.$this->_db->qn('date').' FROM
'.$this->_db->qn('#__rsticketspro_tickets').'
WHERE 1';
$query = $query.$where.$orderby;
$this->_db->setQuery($query);
$tickets = $this->_db->loadObjectList();
if (empty($departments)) {
foreach ($departments as $department) {
$departments[] = $id;
}
}
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
$return['departments'][$department] = array();
}
foreach ($tickets as $ticket) {
if ($unit == 'quarter')
$format =
$this->getQuarter(JFactory::getDate($ticket->date)->format('m'));
$date = JFactory::getDate($ticket->date)->format($format);
$department = $this->getDepartmentName($ticket->department_id);
@$return['units'][$date] = $date;
@$return['departments'][$department][$date] += 1;
@$return['totals'][$date] += 1;
unset($ticket);
}
if (!empty($return['totals'])) {
$this->min = $this->max = max($return['totals']);
foreach ($return['units'] as $date) {
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
if (empty($return['departments'][$department][$date])) {
$return['departments'][$department][$date] = 0;
if (empty($return['totals'][$date])) {
$return['totals'][$date] = 0;
}
}
}
// min
if (!empty($return['totals'][$date]))
$this->min = min($this->min,
$return['totals'][$date]);
}
foreach ($return['departments'] as $return_department =>
$return_values)
ksort($return['departments'][$return_department]);
// total
$this->total = array_sum($return['totals']);
// avg
$this->avg =
floor(array_sum($return['totals'])/count($return['totals']));
}
break;
// ticket solving time
case 'report_2':
// select
$select = $viewby == 'department' ? 'department_id'
: 'staff_id';
// query
$query = 'SELECT
UNIX_TIMESTAMP('.$this->_db->qn('last_reply').')
- UNIX_TIMESTAMP('.$this->_db->qn('date').') AS
diff, '.$this->_db->qn($select).',
'.$this->_db->qn('date').' FROM
'.$this->_db->qn('#__rsticketspro_tickets').'
WHERE '.$this->_db->qn('status_id').' = 2';
$query = $query.$where.$orderby;
$this->_db->setQuery($query);
$tickets = $this->_db->loadObjectList();
$this->viewin = $input->getInt('viewin');
if (!$this->viewin)
$this->viewin = 60;
if ($viewby == 'department') {
if (empty($departments)) {
foreach ($this->_department_names as $id => $name) {
$departments[] = $id;
}
}
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
$return['viewby'][$department] = array();
}
}
if ($viewby == 'staff') {
if (empty($staff) && $viewby == 'staff') {
foreach ($this->_staff_names as $id => $name) {
$staff[] = $id;
}
}
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
$return['viewby'][$staff_id] = array();
}
}
foreach ($tickets as $ticket) {
$ticket->diff = $ticket->diff / $this->viewin;
if ($unit == 'quarter')
$format =
$this->getQuarter(JFactory::getDate($ticket->date)->format('m'));
$date = JFactory::getDate($ticket->date)->format($format);
$viewby_unit = $viewby == 'department' ?
$this->getDepartmentName($ticket->department_id) :
$this->getStaffName($ticket->staff_id);
@$return['units'][$date] = $date;
if (empty($return['viewby'][$viewby_unit][$date]))
$return['viewby'][$viewby_unit][$date] = $ticket->diff;
else
$return['viewby'][$viewby_unit][$date] =
($return['viewby'][$viewby_unit][$date] + $ticket->diff) / 2;
if (empty($return['totals'][$date]))
$return['totals'][$date] = $ticket->diff / 2;
else
$return['totals'][$date] =
($return['totals'][$date] + $ticket->diff) / 2;
unset($ticket);
}
if (!empty($return['totals'])) {
// max
$this->min = $this->max = max($return['totals']);
foreach ($return['units'] as $date) {
if ($viewby == 'department')
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
if (empty($return['viewby'][$department][$date])) {
$return['viewby'][$department][$date] = 0;
if (empty($return['totals'][$date]))
$return['totals'][$date] = 0;
}
}
if ($viewby == 'staff')
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
if (empty($return['viewby'][$staff_id][$date])) {
$return['viewby'][$staff_id][$date] = 0;
if (empty($return['totals'][$date]))
$return['totals'][$date] = 0;
}
}
// min
if (!empty($return['totals'][$date]))
$this->min = min($this->min,
$return['totals'][$date]);
}
foreach ($return['viewby'] as $return_viewby =>
$return_values)
ksort($return['viewby'][$return_viewby]);
// total
$this->total = count($return['totals']);
// avg
$this->avg =
floor(array_sum($return['totals'])/count($return['totals']));
}
break;
// number of replies
case 'report_3':
// select
$select = $viewby == 'department' ? 'department_id'
: 'staff_id';
// query
$query = 'SELECT
'.$this->_db->qn('t.'.$select).',
'.$this->_db->qn('m.date').' FROM
'.$this->_db->qn('#__rsticketspro_ticket_messages','m').'
LEFT JOIN
'.$this->_db->qn('#__rsticketspro_tickets','t').'
ON '.$this->_db->qn('m.ticket_id').' =
'.$this->_db->qn('t.id').' WHERE 1';
if (!empty($filter['date'])) {
$filter['date'] =
str_replace($this->_db->qn('date'),
$this->_db->qn('m.date'), $filter['date']);
$where = " ".implode(" ", $filter);
}
$orderby = str_replace($this->_db->qn('date'),
$this->_db->qn('m.date'), $orderby);
$query = $query.$where.$orderby;
$this->_db->setQuery($query);
$tickets = $this->_db->loadObjectList();
if ($viewby == 'department') {
if (empty($departments))
foreach ($this->_department_names as $id => $name)
$departments[] = $id;
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
$return['viewby'][$department] = array();
}
}
if ($viewby == 'staff') {
if (empty($staff) && $viewby == 'staff')
foreach ($this->_staff_names as $id => $name)
$staff[] = $id;
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
$return['viewby'][$staff_id] = array();
}
}
foreach ($tickets as $ticket) {
if ($unit == 'quarter')
$format =
$this->getQuarter(JFactory::getDate($ticket->date)->format('m'));
$date = JFactory::getDate($ticket->date)->format($format);
$viewby_unit = $viewby == 'department' ?
$this->getDepartmentName($ticket->department_id) :
$this->getStaffName($ticket->staff_id);
@$return['units'][$date] = $date;
@$return['viewby'][$viewby_unit][$date] += 1;
@$return['totals'][$date] += 1;
unset($ticket);
}
if (!empty($return['totals'])) {
// max
$this->min = $this->max = max($return['totals']);
foreach ($return['units'] as $date) {
if ($viewby == 'department')
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
if (empty($return['viewby'][$department][$date])) {
$return['viewby'][$department][$date] = 0;
if (empty($return['totals'][$date]))
$return['totals'][$date] = 0;
}
}
if ($viewby == 'staff')
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
if (empty($return['viewby'][$staff_id][$date])) {
$return['viewby'][$staff_id][$date] = 0;
if (empty($return['totals'][$date]))
$return['totals'][$date] = 0;
}
}
// min
if (!empty($return['totals'][$date]))
$this->min = min($this->min,
$return['totals'][$date]);
}
foreach ($return['viewby'] as $return_viewby =>
$return_values)
ksort($return['viewby'][$return_viewby]);
// total
$this->total = array_sum($return['totals']);
// avg
$this->avg =
floor(array_sum($return['totals'])/count($return['totals']));
}
break;
// feedback
case 'report_4':
// select
$select = $viewby == 'department' ? 'department_id'
: 'staff_id';
// query
$query = 'SELECT '.$this->_db->qn($select).',
'.$this->_db->qn('feedback').',
'.$this->_db->qn('date').' FROM
'.$this->_db->qn('#__rsticketspro_tickets').'
WHERE '.$this->_db->qn('status_id').' = 2';
$query = $query.$where.$orderby;
$this->_db->setQuery($query);
$tickets = $this->_db->loadObjectList();
if ($viewby == 'department') {
if (empty($departments))
foreach ($this->_department_names as $id => $name)
$departments[] = $id;
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
$return['viewby'][$department] = array();
}
}
if ($viewby == 'staff') {
if (empty($staff) && $viewby == 'staff')
foreach ($this->_staff_names as $id => $name)
$staff[] = $id;
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
$return['viewby'][$staff_id] = array();
}
}
foreach ($tickets as $ticket) {
if ($unit == 'quarter')
$format =
$this->getQuarter(JFactory::getDate($ticket->date)->format('m'));
$date = JFactory::getDate($ticket->date)->format($format);
$viewby_unit = $viewby == 'department' ?
$this->getDepartmentName($ticket->department_id) :
$this->getStaffName($ticket->staff_id);
@$return['units'][$date] = $date;
if (empty($return['viewby'][$viewby_unit][$date]))
$return['viewby'][$viewby_unit][$date] =
$ticket->feedback;
else
$return['viewby'][$viewby_unit][$date] =
($return['viewby'][$viewby_unit][$date] + $ticket->feedback) /
2;
if (empty($return['totals'][$date]))
$return['totals'][$date] = $ticket->feedback / 2;
else
$return['totals'][$date] =
($return['totals'][$date] + $ticket->feedback) / 2;
unset($ticket);
}
if (!empty($return['totals'])) {
// max
$this->min = $this->max = max($return['totals']);
foreach ($return['units'] as $date) {
if ($viewby == 'department')
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
if (empty($return['viewby'][$department][$date])) {
$return['viewby'][$department][$date] = 0;
if (empty($return['totals'][$date]))
$return['totals'][$date] = 0;
}
}
if ($viewby == 'staff')
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
if (empty($return['viewby'][$staff_id][$date])) {
$return['viewby'][$staff_id][$date] = 0;
if (empty($return['totals'][$date]))
$return['totals'][$date] = 0;
}
}
// min
if (!empty($return['totals'][$date]))
$this->min = min($this->min,
$return['totals'][$date]);
}
foreach ($return['viewby'] as $return_viewby =>
$return_values)
ksort($return['viewby'][$return_viewby]);
// total
$this->total = count($return['totals']);
// avg
$this->avg =
floor(array_sum($return['totals'])/count($return['totals']));
}
break;
// response time
case 'report_5':
// select
$select = $viewby == 'department' ? 'department_id'
: 'staff_id';
// query
$query = 'SELECT
'.$this->_db->qn('t.'.$select).',
UNIX_TIMESTAMP('.$this->_db->qn('m2.date').') -
UNIX_TIMESTAMP('.$this->_db->qn('m.date').') AS
diff, '.$this->_db->qn('m.id').',
'.$this->_db->qn('m2.id').',
'.$this->_db->qn('m.date').' FROM
'.$this->_db->qn('#__rsticketspro_ticket_messages','m').',
'.$this->_db->qn('#__rsticketspro_ticket_messages','m2').'
LEFT JOIN
'.$this->_db->qn('#__rsticketspro_tickets','t').'
ON '.$this->_db->qn('ticket_id').' =
'.$this->_db->qn('t.id').' WHERE
'.$this->_db->qn('m.ticket_id').' =
'.$this->_db->qn('m2.ticket_id').' AND
'.$this->_db->qn('m2.date').' >
'.$this->_db->qn('m.date').' AND
'.$this->_db->qn('m.user_id').' !=
'.$this->_db->qn('m2.user_id').'';
if (!empty($filter['date'])) {
$filter['date'] =
str_replace($this->_db->qn('date'),
$this->_db->qn('m.date'), $filter['date']);
$where = " ".implode(" ", $filter);
}
$orderby = str_replace($this->_db->qn('date'),
$this->_db->qn('m.date'), $orderby);
$groupby = ' GROUP BY
'.$this->_db->qn('m.ticket_id').' ';
$query = $query.$where.$groupby.$orderby;
$this->_db->setQuery($query);
$tickets = $this->_db->loadObjectList();
$this->viewin = $input->getInt('viewin');
if (!$this->viewin)
$this->viewin = 60;
if ($viewby == 'department') {
if (empty($departments))
foreach ($this->_department_names as $id => $name)
$departments[] = $id;
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
$return['viewby'][$department] = array();
}
}
if ($viewby == 'staff') {
if (empty($staff) && $viewby == 'staff')
foreach ($this->_staff_names as $id => $name)
$staff[] = $id;
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
$return['viewby'][$staff_id] = array();
}
}
foreach ($tickets as $ticket) {
$ticket->diff = $ticket->diff / $this->viewin;
if ($unit == 'quarter')
$format =
$this->getQuarter(JFactory::getDate($ticket->date)->format('m'));
$date = JFactory::getDate($ticket->date)->format($format);
$viewby_unit = $viewby == 'department' ?
$this->getDepartmentName($ticket->department_id) :
$this->getStaffName($ticket->staff_id);
@$return['units'][$date] = $date;
if (empty($return['viewby'][$viewby_unit][$date]))
$return['viewby'][$viewby_unit][$date] = $ticket->diff;
else
$return['viewby'][$viewby_unit][$date] =
($return['viewby'][$viewby_unit][$date] + $ticket->diff) / 2;
if (empty($return['totals'][$date]))
$return['totals'][$date] = $ticket->diff / 2;
else
$return['totals'][$date] =
($return['totals'][$date] + $ticket->diff) / 2;
unset($ticket);
}
if (!empty($return['totals'])) {
// max
$this->min = $this->max = max($return['totals']);
foreach ($return['units'] as $date) {
if ($viewby == 'department')
foreach ($departments as $department) {
$department = $this->getDepartmentName($department);
if (empty($return['viewby'][$department][$date])) {
$return['viewby'][$department][$date] = 0;
if (empty($return['totals'][$date]))
$return['totals'][$date] = 0;
}
}
if ($viewby == 'staff')
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
if (empty($return['viewby'][$staff_id][$date])) {
$return['viewby'][$staff_id][$date] = 0;
if (empty($return['totals'][$date]))
$return['totals'][$date] = 0;
}
}
// min
if (!empty($return['totals'][$date]))
$this->min = min($this->min,
$return['totals'][$date]);
}
foreach ($return['viewby'] as $return_viewby =>
$return_values)
ksort($return['viewby'][$return_viewby]);
// total
$this->total = array_sum($return['totals']);
// avg
$this->avg =
floor(array_sum($return['totals'])/count($return['totals']));
}
break;
// assigned tickets
case 'report_6':
// query
$query = 'SELECT
'.$this->_db->qn('staff_id').',
'.$this->_db->qn('date').' FROM
'.$this->_db->qn('#__rsticketspro_tickets').'
WHERE 1';
$query = $query.$where.$orderby;
$this->_db->setQuery($query);
$tickets = $this->_db->loadObjectList();
if (empty($staff))
foreach ($this->_staff_names as $id => $name)
$staff[] = $id;
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
$return['staff'][$staff_id] = array();
}
foreach ($tickets as $ticket) {
if ($unit == 'quarter')
$format =
$this->getQuarter(JFactory::getDate($ticket->date)->format('m'));
$date = JFactory::getDate($ticket->date)->format($format);
$staff_name = $this->getStaffName($ticket->staff_id);
@$return['units'][$date] = $date;
@$return['staff'][$staff_name][$date] += 1;
@$return['totals'][$date] += 1;
unset($ticket);
}
if (!empty($return['totals'])) {
// max
$this->min = $this->max = max($return['totals']);
foreach ($return['units'] as $date) {
foreach ($staff as $staff_id) {
$staff_id = $this->getStaffName($staff_id);
if (empty($return['staff'][$staff_id][$date])) {
$return['staff'][$staff_id][$date] = 0;
if (empty($return['totals'][$date]))
$return['totals'][$date] = 0;
}
}
// min
if (!empty($return['totals'][$date]))
$this->min = min($this->min,
$return['totals'][$date]);
}
foreach ($return['staff'] as $return_staff =>
$return_values)
ksort($return['staff'][$return_staff]);
// total
$this->total = array_sum($return['totals']);
// avg
$this->avg =
floor(array_sum($return['totals'])/count($return['totals']));
}
break;
}
unset($return['totals']);
return $return;
}
public function getDepartmentName($id) {
return @$this->_department_names[$id];
}
public function getStaffName($id) {
return @$this->_staff_names[$id];
}
public function getQuarter($m) {
$q = (int)floor($m / 3.1) + 1;
return "Y Q$q";
}
public function getMin() {
$unit =
JFactory::getApplication()->input->getString('unit','');
return $this->getNumberFormat($this->min).'
'.$this->getViewIn().' '.' /
'.JText::_('RST_'.$unit);
}
public function getAvg() {
$unit =
JFactory::getApplication()->input->getString('unit','');
return $this->getNumberFormat($this->avg).'
'.$this->getViewIn().' '.' /
'.JText::_('RST_'.$unit);
}
public function getMax() {
$unit =
JFactory::getApplication()->input->getString('unit','');
return $this->getNumberFormat($this->max).'
'.$this->getViewIn().' '.' /
'.JText::_('RST_'.$unit);
}
public function getTotal() {
return $this->getNumberFormat($this->total);
}
public function getNumberFormat($number) {
return number_format($number, 2, '.', '');
}
public function getViewIn() {
$report =
JFactory::getApplication()->input->getString('report','');
switch ($report) {
case 'report_1':
case 'report_6':
return JText::_('RST_TICKETS');
break;
case 'report_2':
case 'report_5':
switch ($this->viewin) {
default:
case 60:
return JText::_('RST_MINUTES');
break;
case 3600:
return JText::_('RST_HOURS');
break;
case 86400:
return JText::_('RST_DAYS');
break;
}
break;
case 'report_3':
return JText::_('RST_TICKET_REPLIES');
break;
case 'report_4':
return JText::_('RST_STARS');
break;
}
}
public function getViewBy() {
return
JFactory::getApplication()->input->getString('viewby','');
}
public function getIE() {
if (preg_match("#MSIE#i",
$_SERVER['HTTP_USER_AGENT']) && !preg_match("#MSIE
9#", $_SERVER['HTTP_USER_AGENT']))
return true;
return false;
}
protected function getColor($i) {
$colors = array('#3366FF', '#6633FF',
'#CC33FF', '#FF33CC', '#33CCFF',
'#003DF5', '#002EB8', '#FF3366',
'#33FFCC', '#B88A00', '#F5B800',
'#FF6633', '#33FF66', '#66FF33',
'#CCFF33', '#FFCC33', '#002080',
'#200080', '#600080', '#800060',
'#006080', '#002FBD', '#003EFA',
'#800020', '#008060', '#FABB00',
'#BD8E00', '#802000', '#008020',
'#208000', '#608000', '#806000');
if ($i > count($colors) - 1) {
$t = floor($i / (count($colors) - 1));
$i = floor($i - $t);
}
return $colors[$i];
}
public function getRSPlain()
{
return new
RsticketsproAdapterPlain('com-rsticketspro-reports');
}
public function getOptions()
{
return array('time_period' =>
JText::_('RST_REPORTS_TIME_PERIOD'),
'department' =>
JText::_('RST_REPORTS_DEPARTMENT'),
'staff' => JText::_('RST_REPORTS_STAFF'),
'customer' => JText::_('RST_REPORTS_CUSTOMER'),
'priority' => JText::_('RST_REPORTS_PRIORITY')
);
}
protected function escape($value)
{
return htmlspecialchars($value, ENT_COMPAT, 'utf-8');
}
public function getForm($data = array(), $loadData = true)
{
// Get the form.
$form = $this->loadForm('com_rsticketspro.reports',
'reports', array('control' => '',
'load_data' => $loadData));
if (empty($form))
{
return false;
}
// Departments
$departments = $this->getDepartments();
$xmlDepartments = '<fieldset name="departments"
label="'.JText::_('RST_REPORTS_DEPARTMENT').'">';
foreach ($departments as $i => $department) {
// add the department field
$xmlDepartments .= '<field
name="departments[]" id="departments'.$i.'"
type="checkbox"
label="'.$this->escape($department->name).'"
description="" class="checkbox inline"
labelclass="checkbox inline"
value="'.$department->id.'"
default="'.$department->id.'"
checked="true" />';
// add the proper color field
$default = $this->getColor($i);
$xmlDepartments .= '<field
name="color_department_'.$i.'" type="color"
description="" label=""
default="'.$this->escape($default).'" />';
}
$xmlDepartments .= '</fieldset>';
$xmlDepartments = new SimpleXMLElement($xmlDepartments);
$form->setField($xmlDepartments);
// Staff
$staff = $this->getStaff();
$xmlStaff = '<fieldset name="staff"
label="'.JText::_('RST_REPORTS_STAFF').'">';
foreach ($staff as $i => $person) {
// add the staff field
$xmlStaff .= '<field name="staff[]"
id="staff'.$i.'" type="checkbox"
label="'.$this->escape($person->thealias).'"
description="" class="checkbox inline"
labelclass="checkbox inline"
value="'.$person->user_id.'"
default="'.$person->user_id.'"
checked="true" />';
// add the proper color field
$default = $this->getColor($i);
$xmlStaff .= '<field
name="color_staff_'.$i.'" type="color"
description="" label=""
default="'.$this->escape($default).'" />';
}
$xmlStaff .= '</fieldset>';
$xmlStaff = new SimpleXMLElement($xmlStaff);
$form->setField($xmlStaff);
// Priority
$priorites = $this->getPriority();
$options = '';
$checked = array();
foreach ($priorites as $priority) {
$options .= '<option
value="'.$priority->id.'">'.$this->escape($priority->name).'</option>';
$checked[] = $priority->id;
}
$element = new SimpleXMLElement('<fieldset
name="priority"
label="'.JText::_('RST_REPORTS_PRIORITY').'"><field
name="priority" type="checkboxes" label=""
description="" class="checkbox inline"
checked="'.implode(',',
$checked).'">'.$options.'</field></fieldset>');
$form->setField($element);
return $form;
}
protected function loadFormData()
{
return array();
}
}