Spade

Mini Shell

Directory:~$ /home/lmsyaran/www/administrator/components/com_rsticketspro/models/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ /home/lmsyaran/www/administrator/components/com_rsticketspro/models/tickets.php

<?php
/**
 * @package    RSTickets! Pro
 *
 * @copyright  (c) 2010 - 2016 RSJoomla!
 * @link       https://www.rsjoomla.com
 * @license    GNU General Public License
http://www.gnu.org/licenses/gpl-3.0.en.html
 */

defined('_JEXEC') or die('Restricted access');

class RsticketsproModelTickets extends JModelList
{
	protected $params = null;
	protected $_permissions = array();

	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'date', 'last_reply', 'flagged',
'code', 'subject', 'customer',
'priority', 'status', 'staff',
'department_id', 'priority_id', 'status_id'
			);

			if (RSTicketsProHelper::getConfig('enable_time_spent'))
			{
				$config['filter_fields'][] = 'time_spent';
			}
		}

		parent::__construct($config);

		$app = JFactory::getApplication();
		$this->params = $app->isClient('site') ?
$app->getParams('com_rsticketspro') : new JRegistry();
		$this->setPermissions();
	}

	public function getBulkForm()
	{
		// Get the form.
		$form = $this->loadForm('com_rsticketspro.tickets',
'tickets', array('control' => null,
'load_data' => false));
		if (empty($form))
		{
			return false;
		}

		return $form;
	}

	public function getFilterForm($data = array(), $loadData = true)
	{
		$form = parent::getFilterForm($data, $loadData);

		foreach (array('department_id', 'priority_id',
'status_id') as $key)
		{
			$$key = $this->getState('filter.' . $key, array());

			if (is_array($$key) && count($$key) > 1)
			{
				$form->setFieldAttribute($key, 'multiple',
'true', 'filter');
				$form->setFieldAttribute($key, 'class',
'advancedSelect', 'filter');
			}
		}

		return $form;
	}

	protected function setPermissions()
	{
		$this->is_staff 	= RSTicketsProHelper::isStaff();
		$this->_permissions = RSTicketsProHelper::getCurrentPermissions();
	}

	public function getIsSearching() {
		// get filtering states
		$search  	 	= $this->getState('filter.search');
		$flagged 	 	= $this->getState('filter.flagged', 0);
		$priority_id 	= $this->getState('filter.priority_id',
array());
		$status_id 	 	= $this->getState('filter.status_id',
array());
		$department_id 	= $this->getState('filter.department_id',
array());
		$customer 	 	= $this->getState('filter.customer',
'');
		$staff 	 	 	= $this->getState('filter.staff',
'');

		return $search != '' || $flagged || $priority_id || $status_id
|| $department_id || $customer != '' || $staff != '';
	}

	protected function setSearch($values=array()) {
		$app = JFactory::getApplication();

		if (isset($values['search'])) {
			$app->setUserState($this->context.'.filter.search',
$values['search']);
		}
		if (isset($values['flagged'])) {
			$app->setUserState($this->context.'.filter.flagged',
$values['flagged']);
		}
		if (isset($values['priority_id'])) {
			$app->setUserState($this->context.'.filter.priority_id',
$values['priority_id']);
		}
		if (isset($values['status_id'])) {
			$app->setUserState($this->context.'.filter.status_id',
$values['status_id']);
		}
		if (isset($values['department_id'])) {
			$app->setUserState($this->context.'.filter.department_id',
$values['department_id']);
		}
		if (isset($values['customer'])) {
			$app->setUserState($this->context.'.filter.customer',
$values['customer']);
		}
		if (isset($values['staff'])) {
			$app->setUserState($this->context.'.filter.staff',
$values['staff']);
		}
		if (!empty($values['ordering'])) {
			$app->setUserState($this->context.'.ordercol',
$values['ordering']);
		}
		if (!empty($values['direction'])) {
			$app->setUserState($this->context.'.orderdirn',
$values['direction']);
		}
		// performing a predefined search?
		if (isset($values['predefined_search'])) {
			$app->setUserState($this->context.'.filter.predefined_search',
$values['predefined_search']);
		}
	}

	public function getPredefinedSearch()
	{
		return
JFactory::getApplication()->getUserState($this->context.'.filter.predefined_search',
0);
	}

	public function resetSearch() {
		$values = array(
			'search' => '',
			'flagged' => 0,
			'priority_id' => array(),
			'status_id' => array(),
			'department_id' => array(),
			'customer' => '',
			'staff' => '',
			'predefined_search' => 0,
			'ordering' => 'date',
			'direction' => 'desc'
		);
		JFactory::getApplication()->setUserState($this->context.'.limitstart',
0);
		$this->setSearch($values);
	}

	public function performSearch($table) {
		$values = array(
			'search' => '',
			'flagged' => 0,
			'priority_id' => array(),
			'status_id' => array(),
			'department_id' => array(),
			'customer' => '',
			'staff' => '',
			'predefined_search' => $table->id,
			'ordering' => 'date',
			'direction' => 'desc'
		);

		if (is_array($table->params)) {
			$values = array_merge($values, $table->params);
			// legacy
			if (isset($values['filter_word'])) {
				$values['search'] = $values['filter_word'];
			}
		}
		$this->setSearch($values);
	}

	public function getSearches() {
		$db 	= $this->getDbo();
		$query	= $db->getQuery(true);
		$user 	= JFactory::getUser();

		$query->select('*')
			->from($db->qn('#__rsticketspro_searches'))
			->where($db->qn('user_id').'='.$db->q($user->get('id')))
			->where($db->qn('published').'='.$db->q(1))
			->order($db->qn('ordering').'
'.$db->escape('asc'));
		$db->setQuery($query);
		$list = $db->loadObjectList();

		$current = $this->getPredefinedSearch();
		foreach ($list as $k => $item) {
			$item->current = $current == $item->id;
			$list[$k] = $item;
		}

		return $list;
	}

	public function getPermissions() {
		$mainframe = JFactory::getApplication();
		if ($mainframe->isClient('administrator') &&
empty($this->_permissions))
		{
			$mainframe->enqueueMessage(JText::_('RST_PERMISSIONS_ERROR'),
'warning');
			$mainframe->redirect(RSTicketsProHelper::route('index.php?option=com_rsticketspro',
false));
		}

		return @$this->_permissions;
	}

	public function writeCSV($from, $fileHash = '')
	{
		if (empty($this->_permissions->export_tickets))
		{
			throw new
Exception(JText::_('RST_STAFF_CANNOT_EXPORT_TICKETS'));
		}

		require_once
JPATH_COMPONENT_ADMINISTRATOR.'/helpers/export.php';

		// setting the function arguments
		$query  		= $this->getListQuery();
		$totalItems  	= (int) $this->getTotalItems();

		$filename 		= JText::_('COM_RSTICKETSPRO_TICKETS');

		return RsticketsExport::writeCSV($query, $totalItems, $from, $fileHash,
$filename);
	}

	protected function getListQuery() {
		$db 	= JFactory::getDbo();
		$app	= JFactory::getApplication();
		$query 	= $db->getQuery(true);
		$user   = JFactory::getUser();

		// get filtering states
		$search  	 	= $this->getState('filter.search');
		$flagged 	 	= $this->getState('filter.flagged', 0);
		$priority_id 	= $this->getState('filter.priority_id',
array());
		$status_id 	 	= $this->getState('filter.status_id',
array());
		$department_id 	= $this->getState('filter.department_id',
array());
		$customer 	 	= $this->getState('filter.customer',
'');
		$staff 	 	 	= $this->getState('filter.staff',
'');

		// Workarounds to accept integers and arrays
		foreach (array('department_id', 'priority_id',
'status_id') as $key)
		{
			if (!is_array($$key))
			{
				$$key = array($$key);
			}
			$$key = array_filter($$key);
		}

		$userInfo = RSTicketsProHelper::getConfig('show_user_info');
		$query->select($db->qn('c.' . $userInfo,
'customer'))
			->select($db->qn('s.' . $userInfo, 'staff'));

		$query->select($db->qn('t').'.*')
			->select($db->qn('st.name', 'status'))
			->select($db->qn('pr.name', 'priority'))
			->from($db->qn('#__rsticketspro_tickets',
't'))
			->join('left', $db->qn('#__users',
'c').' ON
('.$db->qn('t.customer_id').'='.$db->qn('c.id').')')
			->join('left', $db->qn('#__users',
's').' ON
('.$db->qn('t.staff_id').'='.$db->qn('s.id').')')
			->join('left',
$db->qn('#__rsticketspro_statuses', 'st').' ON
('.$db->qn('t.status_id').'='.$db->qn('st.id').')')
			->join('left',
$db->qn('#__rsticketspro_priorities', 'pr').'
ON
('.$db->qn('t.priority_id').'='.$db->qn('pr.id').')');

		if ($this->is_staff) {
			$departments = RSTicketsProHelper::getCurrentDepartments();
			$show_filter =
$this->params->get('show_filter','');

			if (!empty($departments)) {
				if ($show_filter != 'show_assigned' && $show_filter
!= 'show_unassigned') {
					$query->where('('.$db->qn('department_id').'
IN ('.$this->quoteImplode($departments).') OR
'.$db->qn('customer_id').'='.$db->q($user->get('id')).')');
				} else {
					$query->where($db->qn('department_id').' IN
('.$this->quoteImplode($departments).')');
				}
			}

			// do we have a filter set ?
			if ($app->isClient('site')) {
				if ($show_filter) {
					switch ($show_filter)
					{
						case 'show_assigned':
							$query->where($db->qn('staff_id').'='.$db->q($user->get('id')));
							break;

						case 'show_submitted':
							$query->where($db->qn('customer_id').'='.$db->q($user->get('id')));
							break;

						case 'show_both':
							$query->where('('.$db->qn('staff_id').'='.$db->q($user->get('id')).'
OR
'.$db->qn('customer_id').'='.$db->q($user->get('id')).')');
							break;

						case 'show_unassigned':
							$query->where($db->qn('staff_id').'='.$db->q(0));
							break;
					}
				}
			}

			// can't see unassigned tickets
			if (!$this->_permissions->see_unassigned_tickets) {
				$query->where($db->qn('staff_id').'>'.$db->q(0));
			}
			// can't see other (assigned) tickets
			if (!$this->_permissions->see_other_tickets) {
				$staffIds = array(
					$db->q(0),
					$db->q($user->get('id'))
				);

				$query->where($db->qn('staff_id').' IN
('.implode(', ', $staffIds).')');
			}

			// searching for flagged?
			if ($flagged) {
				$query->where($db->qn('flagged').'='.$db->q(1));
			}
		} else {
			$query->where($db->qn('customer_id').'='.$db->q($user->get('id')));
		}

		if ($app->isClient('site')) {
			// showing a specific priority?
			if ($this->params->get('default_priority') &&
empty($priority_id)) {
				$default_priority =
$this->params->get('default_priority');

				if (is_array($default_priority)) {
					$query->where($db->qn('priority_id').' IN
('.$this->quoteImplode($default_priority).')');
				}
			}
			// showing a specific status?
			if ($this->params->get('default_status') &&
empty($status_id)) {
				$default_status =
$this->params->get('default_status');
				if (is_array($default_status)) {
					$query->where($db->qn('status_id').' IN
('.$this->quoteImplode($default_status).')');
				}
			}
		}

		// priority search
		if (!empty($priority_id)) {
			$query->where($db->qn('priority_id').' IN
('.$this->quoteImplode($priority_id).')');
		}

		// status search
		if (!empty($status_id)) {
			$query->where($db->qn('status_id').' IN
('.$this->quoteImplode($status_id).')');
		}

		// are we searching?
		if ($search != '') {
			$search = $db->q('%'.str_replace(' ',
'%', $db->escape($search, true)).'%', false);

			$subquery = $db->getQuery(true);
			$subquery->select($db->qn('ticket_id'))
				->from($db->qn('#__rsticketspro_ticket_messages'))
				->where($db->qn('user_id').'!='.$db->q('-1'))
				->where($db->qn('message').' LIKE
'.$search);

			$query->where('('.$db->qn('code').' LIKE
'.$search.' OR '.$db->qn('subject').' LIKE
'.$search.' OR '.$db->qn('t.id').' IN
('.(string) $subquery.'))');
		}

		// specific customer?
		if ($customer) {
			// let's see if it's ID:number
			if (substr($customer, 0, strlen('ID:')) == 'ID:') {
				$parts = explode(':', $customer, 2);
				$id = (int) $parts[1];

				$query->where($db->qn('customer_id').'='.$db->q($id));
			} else {
				$customer = $db->q('%'.str_replace(' ',
'%', $db->escape($customer, true)).'%', false);

				$query->where('('.$db->qn('c.username').'
LIKE '.$customer.' OR
'.$db->qn('c.name').' LIKE '.$customer.'
OR '.$db->qn('c.email').' LIKE
'.$customer.')');
			}
		}

		// specific staff member?
		if ($staff || $staff === '0') {
			// legacy
			if ($staff === '0') {
				$staff = 'ID:0';
			}
			// let's see if it's ID:number
			if (substr($staff, 0, strlen('ID:')) == 'ID:') {
				$parts = explode(':', $staff, 2);
				$id = (int) $parts[1];

				$query->where($db->qn('staff_id').'='.$db->q($id));
			} else {
				$staff = $db->q('%'.str_replace(' ',
'%', $db->escape($staff, true)).'%', false);

				$query->where('('.$db->qn('s.username').'
LIKE '.$staff.' OR '.$db->qn('s.name').'
LIKE '.$staff.' OR '.$db->qn('s.email').'
LIKE '.$staff.')');
			}
		}

		if ($department_id) {
			$query->where($db->qn('department_id').' IN
('.$this->quoteImplode($department_id).')');
		}

		$ordering = $this->getState('list.ordering',
'date');
		$dir	  = $this->getState('list.direction',
'desc');

		// order by
		switch ($ordering)
		{
			case 'priority':
				$values = array();
				$priorities = $this->getPriorities($dir);
				foreach ($priorities as $priority)
				{
					$values[] = $priority->name;
				}
				$query->order('FIELD(' . $db->qn($ordering) . ',
' . $this->quoteImplode($values) . ')');
				break;

			case 'status':
				$values = array();
				$statuses = $this->getStatuses($dir);
				foreach ($statuses as $status)
				{
					$values[] = $status->name;
				}
				$query->order('FIELD(' . $db->qn($ordering) . ',
' . $this->quoteImplode($values) . ')');
				break;

			default:
				$query->order($db->qn($ordering).'
'.$db->escape($dir));
				break;
		}

		return $query;
	}

	protected function quoteImplode($array) {
		$db = JFactory::getDbo();
		foreach ($array as $k => $v) {
			$array[$k] = $db->q($v);
		}

		return implode(',', $array);
	}

	protected function populateState($ordering = null, $direction = null)
	{
		// Status ID
		$this->setState('filter.status_id',
$this->getUserStateFromRequest($this->context.'.filter.status_id',
'status_id', array(), 'array', false));

		// Department ID
		$this->setState('filter.department_id',
$this->getUserStateFromRequest($this->context.'.filter.department_id',
'department_id', array(), 'array', false));

		// Priority ID
		$this->setState('filter.priority_id',
$this->getUserStateFromRequest($this->context.'.filter.priority_id',	'priority_id',
array(), 'array', false));

		// Flagged fix
		$flagged =
JFactory::getApplication()->input->get('flagged', null,
'none');
		if (!$flagged)
		{
			JFactory::getApplication()->input->set('flagged', 0);
		}
		$this->setState('filter.flagged',
$this->getUserStateFromRequest($this->context.'.filter.flagged',
'flagged', 0, 'none', true));

		// Search keyword
		$this->setState('filter.search',
$this->getUserStateFromRequest($this->context.'.filter.search',
'filter_search', '', 'none', true));

		// Customer
		$this->setState('filter.customer',
$this->getUserStateFromRequest($this->context.'.filter.customer',
'customer', '', 'none', true));

		// Staff
		$this->setState('filter.staff',
$this->getUserStateFromRequest($this->context.'.filter.staff',
'staff', '', 'none', true));

		// List state information.
		$column = $this->params->get('orderby',
'date');
		$dir	= $this->params->get('direction',
'desc');

		parent::populateState($column, $dir);
	}

	public function getPriorities($dir = 'asc') {
		$db 	= $this->getDbo();
		$query 	= $db->getQuery(true);

		$query->select('*')
			->from($db->qn('#__rsticketspro_priorities'))
			->where($db->qn('published').'='.$db->q(1))
			->order($db->qn('ordering').'
'.$db->escape($dir));
		$db->setQuery($query);
		return $db->loadObjectList();
	}

	public function getStatuses($dir = 'asc') {
		$db 	= $this->getDbo();
		$query 	= $db->getQuery(true);

		$query->select('*')
			->from($db->qn('#__rsticketspro_statuses'))
			->where($db->qn('published').'='.$db->q(1))
			->order($db->qn('ordering').'
'.$db->escape($dir));
		$db->setQuery($query);
		return $db->loadObjectList();
	}

	public function getStart() {
		$app = JFactory::getApplication();
		if ($app->isClient('site')) {
			return $app->input->get('limitstart', 0,
'uint');
		} else {
			return parent::getStart();
		}
	}

	public function getTotalItems() {
		$query  = $this->getListQuery();
		$db     = JFactory::getDbo();

		$query->clear('select')
			->clear('order')
			->select('COUNT('.$db->qn('t.id').')');

		return (int) $db->setQuery($query)->loadResult();
	}
}