| Current Path : /var/www/html/administrator/components/com_jssupportticket/models/ |
| Current File : /var/www/html/administrator/components/com_jssupportticket/models/ticket.php |
<?php
/**
* @Copyright Copyright (C) 2015 ... Ahmad Bilal
* @license GNU/GPL http://www.gnu.org/copyleft/gpl.html
* Company: Buruj Solutions
+ Contact: www.burujsolutions.com , info@burujsolutions.com
* Created on: May 22, 2015
^
+ Project: JS Tickets
^
*/
defined('_JEXEC') or die('Not Allowed');
jimport('joomla.application.component.model');
jimport('joomla.html.html');
class JSSupportticketModelTicket extends JSSupportTicketModel {
var $activity_log;
var $_jinput = null;
function __construct() {
parent::__construct();
$this->activity_log = $this->getJSModel('activitylog');
$this->_jinput = JFactory::getApplication()->input;
}
function getTicketNameById($id){
if(!is_numeric($id))
return $id;
$db = $this->getDbo();
$query = "SELECT subject FROM `#__js_ticket_tickets` WHERE id='".$id."'";
$db->setQuery($query);
$subject = $db->loadResult();
return $subject;
}
function getRandomFolderName() {
$foldername = "";
$length = 7;
$possible = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
// we refer to the length of $possible a few times, so let's grab it now
$maxlength = strlen($possible);
if ($length > $maxlength) { // check for length overflow and truncate if necessary
$length = $maxlength;
}
// set up a counter for how many characters are in the ticketid so far
$i = 0;
// add random characters to $password until $length is reached
while ($i < $length) {
// pick a random character from the possible ones
$char = substr($possible, mt_rand(0, $maxlength - 1), 1);
if ($i == 0) {
if (ctype_alpha($char)) {
$foldername .= $char;
$i++;
}
} else {
$foldername .= $char;
$i++;
}
}
return $foldername;
}
function storeTicket($data){
// JPluginHelper::importPlugin('jssupportticket');
// $dispatcher = JDispatcher::getInstance();
// $dispatcher->trigger( 'onSaveForm', array(&$data));
//to check hash
if($data['id'] != ''){
$db = $this->getDbo();
$query = "SELECT hash,uid FROM `#__js_ticket_tickets` WHERE ticketid='".$data['ticketid']."'";
$db->setQuery($query);
$row = $db->loadObject();
$data['uid'] = $row->uid;
if( $row->hash != $this->generateHash($data['id']) ){
return false;
}//end
}
$config = $this->getJSModel('config')->getConfigByFor('default');
$user = JSSupportticketCurrentUser::getInstance();
if(isset($data['ticketviaemail']) && $data['ticketviaemail'] == 1){
$eventtype = JText::_('New Ticket via email');
}else{
$eventtype = JText::_('New Ticket');
}
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
if($data['id'] == ''){
$canadd = $this->checkCanAddTicket($data['email']);
if(!$canadd){
return LIMIT_EXCEED;
}
$canadd = $this->checkMaxOpenTickets($data['email']);
if(!$canadd){
return LIMIT_EXCEED_OPEN;
}
$checkduplicatetk = $this->checkIsTicketDuplicate($data['subject'],$data['email']);
if(!$checkduplicatetk){
return TICKET_DUPLICATE;
}
}
$isBaned = $this->getJSModel('emailbanlist')->checkIsBaned($data['email']);
if ($isBaned) {
$this->getJSModel('emailbanlistlog')->updateBanlistLog($data['name'], $data['email']);
return BANNED_EMAIL;
}
if($user->getIsStaff()){
$per = $user->checkUserPermission('Add Ticket');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}else{
if(!isset($data['ticketviaemail'])){
$data = JFactory::getApplication()->input->post->getArray();
$msg1 = JText::_('User');
if ($user->getIsGuest()) {
if($config['visitor_can_create_ticket'] == 1){
if ($config['show_captcha_visitor_form_ticket'] == 1) {
if($config['captcha_selection'] == 1){
JPluginHelper::importPlugin('captcha');
if (JVERSION < 3)
$dispatcher = JDispatcher::getInstance();
else{
$dispatcher = JEventDispatcher::getInstance();
}
$joomla_captcha = JFactory::getConfig()->get('captcha');
if ( $joomla_captcha == 'recaptcha') { // 2.0
$res = $dispatcher->trigger('onCheckAnswer', $data['recaptcha_response_field']);
$isValidated = $res[0];
}elseif ( $joomla_captcha == 'recaptcha_invisible') {
$captcha = JCaptcha::getInstance(JFactory::getConfig()->get('captcha'));
$isValidated = $captcha->checkAnswer('recaptchainvb');
}
if (!$isValidated == 1) {
return INVALID_CAPTCHA;
}
}else{
if (!$this->performChecks()) {
return INVALID_CAPTCHA;
}
}
}
$msg1 = JText::_('Guest');
}else{
return PERMISSION_ERROR;
}
}
}
}
}
if(isset($data['duedate']) && !empty($data['duedate'])){
$dateformat = $config['date_format'];
if ($dateformat == 'm-d-Y') {
$arr = explode('-', $data['duedate']);
$data['duedate'] = $arr[2] . '-' . $arr[0] . '-' . $arr[1];
} elseif ($dateformat == 'd-m-Y' OR $dateformat == 'Y-m-d') {
$arr = explode('-', $data['duedate']);
$data['duedate'] = $arr[2] . '-' . $arr[1] . '-' . $arr[0];
}
$data['duedate'] = JHTML::_('date',strtotime($data['duedate']),"Y-m-d H:i:s" );
}
//for new ticket case
if (($data['id']) == ''){
$data['ticketid'] = $this->getTicketId();
$data['attachmentdir'] = $this->getRandomFolderName();
$data['created'] = date('Y-m-d H:i:s');
}
if ($data['id'] <> '' AND $data['isoverdue'] == 1) {// for edit case to change the overdue if criteria is passed
$curdate = date('Y-m-d H:i:s');
if (date('Y-m-d',strtotime($data['duedate'])) > date('Y-m-d',strtotime($curdate))){
$data['isoverdue'] = 0;
}else{
$db = JFactory::getDbo();
$query = "SELECT ticket.duedate FROM `#__js_ticket_tickets` AS ticket WHERE ticket.id = ".$data['id'];
$db->setQuery($query);
$duedate = $db->loadResult();
if(date('Y-m-d',strtotime($data['duedate'])) != date('Y-m-d',strtotime($duedate))){
return DUE_DATE_ERROR; //Due Date must be greater then current date
}
}
}
//custom field code start
$customflagforadd = false;
$customflagfordelete = false;
$custom_field_namesforadd = array();
$custom_field_namesfordelete = array();
$userfield = $this->getJSModel('userfields')->getUserfieldsfor(1);
$params = array();
foreach ($userfield AS $ufobj) {
$vardata = '';
if($ufobj->userfieldtype == 'file'){
if(isset($data[$ufobj->field.'_1']) && $data[$ufobj->field.'_1']== 0){
$vardata = $data[$ufobj->field.'_2'];
}else{
$vardata = $_FILES[$ufobj->field]['name'];
}
$config = $this->getJSModel('config')->getConfigByFor('default');
$model_attachment = $this->getJSModel('attachments');
$file_size = $config['filesize'];
if($_FILES[$ufobj->field]['size'] > ($file_size * 1024)){
$vardata = '';
}else{
if ($_FILES[$ufobj->field]['name'] != "") {
$is_allow = $model_attachment->checkExtension($_FILES[$ufobj->field]['name']);
if($is_allow == 'N'){
$vardata = '';
}else{
$vardata = $_FILES[$ufobj->field]['name'];
$customflagforadd=true;
$custom_field_namesforadd[]=$ufobj->field;
}
}
}
}elseif($ufobj->userfieldtype == 'date'){
if(isset($data[$ufobj->field]) && !empty($data[$ufobj->field])){
$tempdate = $data[$ufobj->field];
$dateformat = JSSupportTicketModel::getJSModel('config')->getConfigurationByName("date_format");
if ($dateformat == 'm-d-Y') {
$arr = explode('-', $tempdate);
$tempdate = $arr[2] . '-' . $arr[0] . '-' . $arr[1];
} elseif ($dateformat == 'd-m-Y' OR $dateformat == 'Y-m-d') {
$arr = explode('-', $tempdate);
$tempdate = $arr[2] . '-' . $arr[1] . '-' . $arr[0];
}
$vardata = JHTML::_('date',strtotime($tempdate),"Y-m-d" );
}else{
$vardata = '';
}
}
else{
$vardata = isset($data[$ufobj->field]) ? $data[$ufobj->field] : '';
}
if(isset($data[$ufobj->field.'_1']) && $data[$ufobj->field.'_1'] == 1){
$customflagfordelete = true;
$custom_field_namesfordelete[]= $data[$ufobj->field.'_2'];
}
if($vardata != ''){
//had to comment this so that multpli field should work properly
// if($ufobj->userfieldtype == 'multiple'){
// $vardata = explode(',', $vardata[0]); // fixed index
// }
if(is_array($vardata)){
$vardata = implode(', ', $vardata);
}
$params[$ufobj->field] = htmlspecialchars($vardata);
}
}
if($data['id'] != ''){
if(is_numeric($data['id'])){
$db = $this->getDbo();
$query = "SELECT params FROM `#__js_ticket_tickets` WHERE id = " . $data['id'];
$db->setQuery($query);
$oParams = $db->loadResult();
if(!empty($oParams)){
$oParams = json_decode($oParams,true);
$unpublihsedFields = $this->getJSModel('userfields')->getUserUnpublishFieldsfor(1);
foreach($unpublihsedFields AS $field){
if(isset($oParams[$field->field])){
$params[$field->field] = $oParams[$field->field];
}
}
}
}
}
if (!empty($params)) {
$params = json_encode($params);
}
$data['params'] = $params;
$row = $this->getTable('tickets');
if(!isset($data['ticketviaemail'])){
$data['message'] = JFactory::getApplication()->input->get('message', '', 'raw');
//$data['message'] = $this->getJSModel('jssupportticket')->getHtmlInput('message');
if(!$user->getIsStaff() && !$user->getIsAdmin())
$data['uid'] = $user->getId();
}
if (!$row->bind($data)) {
$this->setError($row->getError());
echo $row->getError();
$return_value = false;
}
if(!$data['id'])
if (!$row->check()) {
$this->setError($row->getError());
return MESSAGE_EMPTY;
}
if (trim($row->staffid) == "") { $row->staffid = NULL; }
if (trim($row->helptopicid) == "") { $row->helptopicid = NULL; }
if (trim($row->isoverdue) == "") { $row->isoverdue = NULL; }
if (trim($row->duedate) == "") { $row->duedate = NULL; }
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($row->id, 1, $eventtype, $message, 'Error');
return SAVE_ERROR;
}
$ticketid = $row->id;
if($data['id'] == ''){
$db = JFactory::getDbo();
$hash = $this->generateHash($ticketid);
$query = "UPDATE `#__js_ticket_tickets` SET attachmentdir = CONCAT(attachmentdir,id),hash='$hash' WHERE id = ".$ticketid;
$db->setQuery($query);
$db->execute();
}
$filesize = $config['filesize'];
$total = isset($_FILES['filename']['name']) ? count($_FILES['filename']['name']) : 0;
$model_attachment = $this->getJSModel('attachments');
for ($i = 0; $i < $total; $i++) {
if ($_FILES['filename']['name'][$i] != '') {
if ($_FILES['filename']['size'][$i] > 0) {
$uploadfilesize = $_FILES['filename']['size'][$i];
$uploadfilesize = $uploadfilesize / 1024; //kb
if ($uploadfilesize > $filesize) {
return FILE_SIZE_ERROR;
}
$file_name = str_replace(' ', '_', $_FILES['filename']['name'][$i]);
$result = $model_attachment->checkExtension($file_name);
if ($result == 'N') {
return FILE_EXTENTION_ERROR;
}
$res = $model_attachment->uploadAttchments($i, $ticketid, 1, 0, 'ticket');
if ($res) {
$result = $this->storeTicketAttachment($ticketid, $uploadfilesize, $file_name);
}else{
return FILE_RW_ERROR;
}
}
}
}
// new
//removing custom field attachments
if($customflagfordelete == true){
foreach ($custom_field_namesfordelete as $key) {
$res = $this->removeFileCustom($ticketid,$key);
}
}
//storing custom field attachments
if($customflagforadd == true){
foreach ($custom_field_namesforadd as $key) {
if ($_FILES[$key]['size'] > 0) { // logo
$res = $this->uploadFileCustom($ticketid,$key);
}
}
}
/*
if (isset($data['issuesummary']) AND ! empty($data['issuesummary'])) {
$result = $this->storeTicketIssueSummary($ticketid, $user->getId(), $user->getName(), $data['issuesummary'], $data['created']);
}
*/
if (isset($data['id']) && $data['id'] <> '') {//for edit case
if (isset($data['internalnote']) AND ! empty($data['internalnote'])){
$staffid=$user->getStaffid();
if($user->getIsAdmin()){
$staffid=0;
}
$result = $this->storeTicketInternalNote($ticketid, $staffid, $data['internalnote'], $data['created'], $data['internalnotetitle']);
}
}elseif (isset($data['internalnote']) AND ! empty($data['internalnote'])) {
$result = $this->storeTicketInternalNote($ticketid, $user->getStaffid(), $data['internalnote'], $data['created'], $data['internalnotetitle']);
}
//$this->getJSModel('userfields')->storeUserFieldData($data, $ticketid);
if ($data['id'] == "") {
if(isset($data['ticketviaemail']) && $data['ticketviaemail'] == 1){
$msg = JText::_('Ticket is created via email');
$maildata = $this->getJSModel('ticketviaemail')->getTicketEmailById($data['ticketviaemail_id']);
$msg1 = $maildata->emailaddress;
}else{
$msg = JText::_('Ticket is created by');
}
}else{
if(isset($data['ticketviaemail']) && $data['ticketviaemail'] == 1){
$msg = JText::_('Ticket is updated via email');
$maildata = $this->getJSModel('ticketviaemail')->getTicketEmailById($data['ticketviaemail_id']);
$msg1 = $maildata->emailaddress;
}else{
$msg = JText::_('Ticket is updated by');
}
}
if(isset($data['ticketviaemail']) && $data['ticketviaemail'] == 1){
$message = $msg . " (" . $msg1 . ") ";
}else{
$message = $msg . " " . $user->getName() ." (" . $msg1 . ") ";
}
$this->activity_log->storeActivityLog($row->id, 1, $eventtype, $message, 'Sucessfull');
if ($data['id'] == '') // only for new ticket
$this->getJSModel('email')->sendMail(1,1,$row->id); // Mailfor,Create Ticket,Ticketid
JSSupportticketMessage::$recordid = $ticketid;
if(!isset($data['ticketviaemail']))
return SAVED;
else
return $ticketid;
}
private function ticketMultiSearch($searchkeys){
$db = JFactory::getDbo();
$inquery = "";
$flag = true;
if(!empty($searchkeys))
if(isset($searchkeys['filter_ticketsearchkeys']) && !empty($searchkeys['filter_ticketsearchkeys'])){
$keys = $searchkeys['filter_ticketsearchkeys'];
$db = JFactory::getDbo();
$keys = trim($keys);
if (strlen($keys) == 11 || is_numeric($keys))
$inquery = " AND ticket.ticketid = ".$db->quote($keys);
else if (strpos($keys, '@') && strpos($keys, '.'))
$inquery = " AND ticket.email LIKE ".$db->quote('%'.$keys.'%');
else
$inquery = " AND ticket.subject LIKE ".$db->quote('%'.$keys.'%');
$result['searchkeys'] = $keys;
$flag = false;
}else{
if(isset($searchkeys['filter_ticketid']) && !empty($searchkeys['filter_ticketid'])){
$searchkeys['filter_ticketid'] = trim($searchkeys['filter_ticketid']);
$inquery =" AND ticket.ticketid = ".$db->quote($searchkeys['filter_ticketid']);
$result['ticketid'] = $searchkeys['filter_ticketid'];
}
if(isset($searchkeys['filter_from']) && !empty($searchkeys['filter_from'])){
$searchkeys['filter_from'] = trim($searchkeys['filter_from']);
$inquery .=" AND ticket.name LIKE ".$db->quote('%'.$searchkeys['filter_from'].'%');
$result['from'] = $searchkeys['filter_from'];
}
if(isset($searchkeys['filter_email']) && !empty($searchkeys['filter_email'])){
$searchkeys['filter_email'] = trim($searchkeys['filter_email']);
$inquery .=" AND ticket.email LIKE ".$db->quote('%'.$searchkeys['filter_email'].'%');
$result['email'] = $searchkeys['filter_email'];
}
if(isset($searchkeys['filter_department']) && !empty($searchkeys['filter_department'])){
$inquery .=" AND ticket.departmentid =".$searchkeys['filter_department'];
$result['department'] = $searchkeys['filter_department'];
}
if(isset($searchkeys['filter_priority']) && !empty($searchkeys['filter_priority'])){
$inquery .=" AND ticket.priorityid = ".$searchkeys['filter_priority'];
$result['priority'] = $searchkeys['filter_priority'];
}
if(isset($searchkeys['filter_subject']) && !empty($searchkeys['filter_subject'])){
$searchkeys['filter_subject'] = trim($searchkeys['filter_subject']);
$inquery .=" AND ticket.subject LIKE ".$db->quote('%'.$searchkeys['filter_subject'].'%');
$result['subject'] = $searchkeys['filter_subject'];
}
$config = $this->getJSModel('config')->getConfigs();
if(isset($searchkeys['filter_dateend']) && !empty($searchkeys['filter_dateend'])){
$dateformat = $config['date_format'];
if ($dateformat == 'm-d-Y') {
$arr = explode('-', $searchkeys['filter_dateend']);
$searchkeys['filter_dateend'] = $arr[2] . '-' . $arr[0] . '-' . $arr[1];
} elseif ($dateformat == 'd-m-Y' OR $dateformat == 'Y-m-d') {
$arr = explode('-', $searchkeys['filter_dateend']);
$searchkeys['filter_dateend'] = $arr[2] . '-' . $arr[1] . '-' . $arr[0];
}
$searchkeys['filter_dateend'] = JHTML::_('date',strtotime($searchkeys['filter_dateend']),"Y-m-d H:i:s" );
}
if(isset($searchkeys['filter_datestart']) && !empty($searchkeys['filter_datestart']) ){
$dateformat = $config['date_format'];
if ($dateformat == 'm-d-Y') {
$arr = explode('-', $searchkeys['filter_datestart']);
$searchkeys['filter_datestart'] = $arr[2] . '-' . $arr[0] . '-' . $arr[1];
} elseif ($dateformat == 'd-m-Y' OR $dateformat == 'Y-m-d') {
$arr = explode('-', $searchkeys['filter_datestart']);
$searchkeys['filter_datestart'] = $arr[2] . '-' . $arr[1] . '-' . $arr[0];
}
$searchkeys['filter_datestart'] = JHTML::_('date',strtotime($searchkeys['filter_datestart']),"Y-m-d H:i:s" );
}
if(isset($searchkeys['filter_datestart']) && !empty($searchkeys['filter_datestart'])){
$inquery .=" AND DATE(ticket.created) >= ".$db->quote($searchkeys['filter_datestart']);
$result['datestart'] = $searchkeys['filter_datestart'];
}
if(isset($searchkeys['filter_dateend']) && !empty($searchkeys['filter_dateend'])){
$inquery .=" AND DATE(ticket.created) <= ".$db->quote($searchkeys['filter_dateend']);
$result['dateend'] = $searchkeys['filter_dateend'];
}
if(isset($searchkeys['filter_staffmember']) && !empty($searchkeys['filter_staffmember']) && is_numeric($searchkeys['filter_staffmember'])){
$inquery .=" AND ticket.staffid = ".$searchkeys['filter_staffmember'];
$result['staffmember'] = $searchkeys['filter_staffmember'];
}
if(isset($searchkeys['filter_assignedtome']) && $searchkeys['filter_assignedtome']==1){
$user = JSSupportticketCurrentUser::getInstance();
$inquery .=" AND ticket.staffid = ".$user->getStaffId();
$result['assignedtome'] = $searchkeys['filter_assignedtome'];
}
if($inquery=="")
$result['iscombinesearch'] = false;
else
$result['iscombinesearch'] = true;
}
//Custom field search
//start
$mainframe = JFactory::getApplication();
$option = 'com_jssupportticket';
$data = getCustomFieldClass()->userFieldsForSearch(1);
$valarray = array();
$jsresetbutton = JFactory::getApplication()->input->get('jsresetbutton', NULL , 'post');
if (!empty($data)) {
foreach ($data as $uf) {
$valarray[$uf->field] = $mainframe->getUserStateFromRequest($option . $uf->field , $uf->field , '','string');
if($jsresetbutton == 1){//to reset date fields
$mainframe->setUserState($option.$uf->field,null);
$valarray[$uf->field] = null;
}
if (isset($valarray[$uf->field]) && $valarray[$uf->field] != null) {
switch ($uf->userfieldtype) {
case 'text':
case 'file':
case 'email':
$check_string = json_encode($valarray[$uf->field]);
$check_string = trim($check_string,'"');
$check_string = str_replace('\\', '\\\\\\\\', $check_string);
$inquery .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*' . htmlspecialchars($check_string) . '.*"\' ';
break;
case 'combo':
$inquery .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
break;
case 'depandant_field':
$inquery .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
break;
case 'radio':
if(isset($jsresetbutton)){
$mainframe->setUserState($option.$uf->field,'');
$valarray[$uf->field] = '';
}else{
$inquery .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
}
break;
case 'checkbox':
if(isset($jsresetbutton)){
$mainframe->setUserState($option.$uf->field,array());
$valarray[$uf->field] = array();
}else{
$finalvalue = '';
if(isset($valarray)){
foreach($valarray[$uf->field] AS $value){
$finalvalue .= $value.'.*';
}
}
$inquery .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*' . htmlspecialchars($finalvalue) . '.*"\' ';
}
break;
case 'date':
$tempdate = htmlspecialchars($valarray[$uf->field]);
$dateformat = JSSupportTicketModel::getJSModel('config')->getConfigurationByName("date_format");
if ($dateformat == 'm-d-Y') {
$arr = explode('-', $tempdate);
$tempdate = $arr[2] . '-' . $arr[0] . '-' . $arr[1];
} elseif ($dateformat == 'd-m-Y' OR $dateformat == 'Y-m-d') {
$arr = explode('-', $tempdate);
$tempdate = $arr[2] . '-' . $arr[1] . '-' . $arr[0];
}
$tempdate = JHTML::_('date',strtotime($tempdate),"Y-m-d" );
$valarray[$uf->field] = $tempdate;
$inquery .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
break;
case 'textarea':
$inquery .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*' . htmlspecialchars($valarray[$uf->field]) . '.*"\' ';
break;
case 'multiple':
$finalvalue = '';
foreach($valarray[$uf->field] AS $value){
if($value != null){
$finalvalue .= $value.'.*';
}
}
if($finalvalue !=''){
$inquery .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*'.htmlspecialchars($finalvalue).'"\'';
}
break;
}
$result['params'] = $valarray;
}
}
}
if($flag){
if($inquery=="")
$result['iscombinesearch'] = false;
else
$result['iscombinesearch'] = true;
}
//end
$result['inquery'] = $inquery;
return $result;
}
function getStaffMyTickets($searchkeys, $listtype,$sortby, $limitstart, $limit){
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsGuest()) return false;
$staffid = $user->getStaffid();
$db = $this->getDBO();
$clause = " AND ";
$wherequery = "";
switch ($listtype) {
case 1:
$wherequery.= $clause . " ticket.status != 4 AND ticket.status != 5 ";
$clause = " AND ";
break;
case 2:
$wherequery .= $clause . " ticket.isanswered = 1 AND ticket.status = 3 ";//ticket.status != 4
$clause = " AND ";
break;
case 3:
$wherequery .= $clause . " ticket.isoverdue = 1 AND ticket.status != 4 ";
$clause = " AND ";
break;
case 4:
// case 5: // For merge status
$wherequery .= $clause . " (ticket.status = 4 OR ticket.status = 5)";
$clause = " AND ";
break;
case 6:
$wherequery .= " ";
break;
}
$multisearchquery = $this->ticketMultiSearch($searchkeys);
$all_ticket = $user->checkUserPermission('All Tickets');
if($all_ticket){
$allticket_query = ' 1 = 1 ';
}else{
$allticket_query = " (ticket.staffid = $staffid OR ticket.departmentid IN (SELECT dept.departmentid FROM `#__js_ticket_acl_user_access_departments` AS dept WHERE dept.staffid = $staffid)) ";
}
$query = "SELECT COUNT(ticket.id)
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
WHERE $allticket_query ";
$query .= $wherequery;
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$total = $db->loadResult(); //tickets Count
if($total <= $limitstart)
$limitstart = 0;
$staffmembers = $this->getJSModel('staff')->getStaffMembers();
$departments = $this->getJSModel('department')->getDepartments();
$priorities = $this->getPriorities();
$staffmemberid = isset($multisearchquery['staffmember']) ? $multisearchquery['staffmember'] : '';
$departmentid = isset($multisearchquery['department']) ? $multisearchquery['department'] : '';
$priorityid = isset($multisearchquery['priority']) ? $multisearchquery['priority'] : '';
$lists['staffmembers'] = JHTML::_('select.genericList', $staffmembers, 'filter_staffmember','', 'value', 'text',$staffmemberid);
$lists['departments'] = JHTML::_('select.genericList', $departments, 'filter_department', '', 'value', 'text',$departmentid);
$lists['priorities'] = JHTML::_('select.genericList', $priorities, 'filter_priority', '', 'value', 'text',$priorityid);
$query = "SELECT DISTINCT ticket.*,department.departmentname AS departmentname ,priority.priority AS priority,priority.prioritycolour AS prioritycolour,staff.photo AS staffphoto,staff.id AS staffid, concat(assignstaff.firstname,' ',assignstaff.lastname) AS staffname, (SELECT name FROM `#__js_ticket_replies` AS reply WHERE ticket.id = reply.ticketid and reply.status = 1 ORDER BY reply.created DESC LIMIT 1) AS lastreplyby
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
LEFT JOIN `#__js_ticket_staff` AS staff ON staff.uid = ticket.uid
LEFT JOIN `#__js_ticket_staff` AS assignstaff ON assignstaff.id = ticket.staffid
WHERE $allticket_query ";
$query .= $wherequery;
$query .= $multisearchquery['inquery'];
$query .= " ORDER BY ".$sortby;
$db->setQuery($query, $limitstart, $limit);
$tickets = $db->loadObjectList(); //tickets
$ticketinfo = array();
$config = $this->getJSModel('config')->getConfigs();
if($config['show_count_tickets'] == 1){
$query = "SELECT COUNT(ticket.id)
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
WHERE $allticket_query AND ticket.status != 4 AND ticket.status != 5";
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$ticketinfo['open'] = $db->loadResult(); //Open Tickets
$query = "SELECT COUNT(ticket.id)
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
WHERE $allticket_query AND (ticket.status = 4 OR ticket.status = 5)";
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$ticketinfo['close'] = $db->loadResult(); //Closed Tickets
$query = "SELECT COUNT(ticket.id)
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
WHERE $allticket_query AND ticket.status = 3";
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$ticketinfo['isanswered'] = $db->loadResult(); //Is Answered Tickets
$query = "SELECT COUNT(ticket.id)
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
WHERE $allticket_query AND ticket.isoverdue = 1 AND (ticket.status != 4 OR ticket.status != 5)";
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$ticketinfo['isoverdue'] = $db->loadResult(); //OverDue Tickets
$query = "SELECT COUNT(ticket.id)
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
WHERE $allticket_query ";
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$ticketinfo['mytickets'] = $db->loadResult(); //My Tickets
}
$multisearchquery['inquery'] = ""; //empty the key
$result[0] = $tickets;
$result[1] = $total;
$result[2] = $lists;
$result[3] = $ticketinfo;
$result[4] = $multisearchquery;
return $result;
}
function getAdminMyTickets($searchdepartmentid, $searchpriorityid, $searchstaffmember, $searchsubject, $searchfrom, $searchfromemail, $searchticketid, $listtype, $sortby,$datestart, $dateend, $limitstart, $limit) {
$db = $this->getDBO();
// Ticket Default Status
// 0 -> New Ticket
// 1 -> Waiting admin/staff reply
// 2 -> in progress
// 3 -> waiting for customer reply
// 4 -> close ticket
// $listtype == 1 - open
// $listtype == 2 - answerd
// $listtype == 3 - overdue
// $listtype == 4 - close
// $listtype == 5 - my tickets
$totalquery = "SELECT COUNT(ticket.id) FROM `#__js_ticket_tickets` AS ticket WHERE 1 = 1 ";
$query = "SELECT ticket.*, dep.departmentname AS departmentname, dep.id AS departmentid, priority.priority AS priority, priority.prioritycolour AS prioritycolour,staff.photo AS staffphoto,staff.id AS staffid, staff.firstname as stafffirstname, staff.lastname as stafflastname
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS dep ON ticket.departmentid = dep.id
LEFT JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
LEFT JOIN `#__js_ticket_staff` AS staff ON staff.id = ticket.staffid
WHERE 1=1 ";
$userquery = '';
$uid = trim(JFactory::getApplication()->input->get('uid'));
if($uid != null && is_numeric($uid) && $uid > 0){
$userquery = ' AND ticket.uid = '.$uid;
}
$data = getCustomFieldClass()->userFieldsForSearch(1);
$valarray = array();
if (!empty($data)) {
foreach ($data as $uf) {
$valarray[$uf->field] = JFactory::getApplication()->input->get($uf->field,NULL, 'post');
$jsresetbutton = JFactory::getApplication()->input->get('jsresetbutton',0);
if($jsresetbutton == 1){
$valarray[$uf->field] = null;
}
if (isset($valarray[$uf->field]) && $valarray[$uf->field] != null) {
switch ($uf->userfieldtype) {
case 'text':
case 'file':
case 'email':
$query .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*' . htmlspecialchars($valarray[$uf->field]) . '.*"\' ';
$totalquery .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*' . htmlspecialchars($valarray[$uf->field]) . '.*"\' ';
break;
case 'combo':
$query .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
$totalquery .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
break;
case 'depandant_field':
$query .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
$totalquery .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
break;
case 'radio':
$query .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
$totalquery .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
break;
case 'checkbox':
$finalvalue = '';
foreach($valarray[$uf->field] AS $value){
$finalvalue .= $value.'.*';
}
$query .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*' . htmlspecialchars($finalvalue) . '.*"\' ';
$totalquery .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*' . htmlspecialchars($finalvalue) . '.*"\' ';
break;
case 'date':
$tempdate = htmlspecialchars($valarray[$uf->field]);
$dateformat = JSSupportTicketModel::getJSModel('config')->getConfigurationByName("date_format");
if ($dateformat == 'm-d-Y') {
$arr = explode('-', $tempdate);
$tempdate = $arr[2] . '-' . $arr[0] . '-' . $arr[1];
} elseif ($dateformat == 'd-m-Y' OR $dateformat == 'Y-m-d') {
$arr = explode('-', $tempdate);
$tempdate = $arr[2] . '-' . $arr[1] . '-' . $arr[0];
}
$tempdate = JHTML::_('date',strtotime($tempdate),"Y-m-d" );
$valarray[$uf->field] = $tempdate;
$query .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
$totalquery .= ' AND ticket.params LIKE \'%"' . $uf->field . '":"' . htmlspecialchars($valarray[$uf->field]) . '"%\' ';
break;
case 'textarea':
$query .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*' . htmlspecialchars($valarray[$uf->field]) . '.*"\' ';
$totalquery .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*' . htmlspecialchars($valarray[$uf->field]) . '.*"\' ';
break;
case 'multiple':
$finalvalue = '';
foreach($valarray[$uf->field] AS $value){
if($value != null){
$finalvalue .= $value.'.*';
}
}
if($finalvalue !=''){
$query .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*'.htmlspecialchars($finalvalue).'"\'';
$totalquery .= ' AND ticket.params REGEXP \'"' . $uf->field . '":"[^"]*'.htmlspecialchars($finalvalue).'"\'';
}
break;
}
$params_filter = $valarray;
}
}
}
if ($searchsubject <> ''){
$searchsubject = trim($searchsubject);
$query .= " AND ticket.subject LIKE " . $db->quote('%' . $searchsubject . '%');
$totalquery .= " AND ticket.subject LIKE " . $db->quote('%' . $searchsubject . '%');
}
if ($searchfrom <> ''){
$searchfrom = trim($searchfrom);
$query .= " AND ticket.name LIKE " . $db->quote('%' . $searchfrom . '%');
$totalquery .= " AND ticket.name LIKE " . $db->quote('%' . $searchfrom . '%');
}
if ($searchfromemail <> ''){
$searchfromemail = trim($searchfromemail);
$query .= " AND ticket.email LIKE " . $db->quote('%' . $searchfromemail . '%');
$totalquery .= " AND ticket.email LIKE " . $db->quote('%' . $searchfromemail . '%');
}
if ($searchticketid <> ''){
$searchticketid = trim($searchticketid);
$query .= " AND ticket.ticketid LIKE " . $db->quote('%' . $searchticketid . '%');
$totalquery .= " AND ticket.ticketid LIKE " . $db->quote('%' . $searchticketid . '%');
}
if ($searchdepartmentid <> ''){
if(!is_numeric($searchdepartmentid)) return false;
$query .= " AND ticket.departmentid = " . $searchdepartmentid;
$totalquery .= " AND ticket.departmentid = " . $searchdepartmentid;
}
if ($searchpriorityid <> ''){
if(!is_numeric($searchpriorityid)) return false;
$query .= " AND ticket.priorityid = " . $searchpriorityid;
$totalquery .= " AND ticket.priorityid = " . $searchpriorityid;
}
if ($searchstaffmember <> ''){
if(!is_numeric($searchstaffmember)) return false;
$query .= " AND ticket.staffid = " . $searchstaffmember;
$totalquery .= " AND ticket.staffid = " . $searchstaffmember;
}
$config = $this->getJSModel('config')->getConfigs();
$dateformat = $config['date_format'];
if(isset($dateend) && !empty($dateend)){
$dateformat = $config['date_format'];
if ($dateformat == 'm-d-Y') {
$arr = explode('-', $dateend);
$dateend = $arr[2] . '-' . $arr[0] . '-' . $arr[1];
} elseif ($dateformat == 'd-m-Y' OR $dateformat == 'Y-m-d') {
$arr = explode('-', $dateend);
$dateend = $arr[2] . '-' . $arr[1] . '-' . $arr[0];
}
$dateend = JHTML::_('date',strtotime($dateend),"Y-m-d H:i:s" );
}
if(isset($datestart) && !empty($datestart) ){
$dateformat = $config['date_format'];
if ($dateformat == 'm-d-Y') {
$arr = explode('-', $datestart);
$datestart = $arr[2] . '-' . $arr[0] . '-' . $arr[1];
} elseif ($dateformat == 'd-m-Y' OR $dateformat == 'Y-m-d') {
$arr = explode('-', $datestart);
$datestart = $arr[2] . '-' . $arr[1] . '-' . $arr[0];
}
$datestart = JHTML::_('date',strtotime($datestart),"Y-m-d H:i:s" );
}
if(isset($datestart) && !empty($datestart)){
$query .=" AND DATE(ticket.created) >= ".$db->quote($datestart);
$totalquery .=" AND DATE(ticket.created) >= ".$db->quote($datestart);
}
if(isset($dateend) && !empty($dateend)){
$query .=" AND DATE(ticket.created) <= ".$db->quote($dateend);
$totalquery .=" AND DATE(ticket.created) <= ".$db->quote($dateend);
}
switch ($listtype) {
case 1:
$query .= " AND ticket.status != 4 AND ticket.isanswered = 0 AND ticket.status != 5";
$totalquery .= " AND ticket.status != 4 AND ticket.isanswered = 0 AND ticket.status != 5";
break;
case 2:
/*$query .= " AND ticket.status != 4 AND ticket.isanswered = 1 ";
$totalquery .= " AND ticket.status != 4 AND ticket.isanswered = 1 ";*/
$query .= " AND ticket.status = 3 AND ticket.isanswered = 1 ";
$totalquery .= " AND ticket.status = 3 AND ticket.isanswered = 1 ";
break;
case 3:
$query .= " AND ticket.isoverdue = 1 AND (ticket.status != 4 OR ticket.status != 5) ";
$totalquery .= " AND ticket.isoverdue = 1 AND (ticket.status != 4 OR ticket.status != 5) ";
break;
case 4:
$query .= " AND (ticket.status = 4 OR ticket.status = 5)";
$totalquery .= " AND (ticket.status = 4 OR ticket.status = 5)";
break;
case 5:
$query .= " ";
break;
}
$totalquery .= $userquery;
$db = JFactory::getDbo();
$db->setQuery($totalquery);
$total = $db->loadResult();
if ($total <= $limitstart)
$limitstart = 0;
$query .= $userquery;
$query .= ' ORDER BY '.$sortby;
$db->setQuery($query, $limitstart, $limit);
$tickets = $db->loadObjectList(); // Tickets
$ticketinfo = array();
$config = $this->getJSModel('config')->getConfigs();
if($config['show_count_tickets'] == 1){
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` as ticket
WHERE ticket.status != 4 AND ticket.isanswered = 0 AND ticket.status != 5";
$query .= $userquery;
$db->setQuery($query);
$ticketinfo['open'] = $db->loadResult(); // Open Tickets
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` AS ticket
WHERE (ticket.status = 4 OR ticket.status = 5)";
$query .= $userquery;
$db->setQuery($query);
$ticketinfo['close'] = $db->loadResult(); // Closed Tickets
//$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE status != 4 AND isanswered = 1";
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` AS ticket WHERE status = 3 AND isanswered = 1";
$query .= $userquery;
$db->setQuery($query);
$ticketinfo['isanswered'] = $db->loadResult(); // IsAnswered Tickets
$query = "SELECT COUNT(ticket.id) FROM `#__js_ticket_tickets` AS ticket WHERE ticket.isoverdue = 1 AND ticket.status != 4";
$query .= $userquery;
$db->setQuery($query);
$ticketinfo['isoverdue'] = $db->loadResult(); //IsOverDue Tickets
$inquery = "";
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` AS ticket WHERE 1=1 ";
$query .= $inquery;
$query .= $userquery;
$db->setQuery($query);
$ticketinfo['mytickets'] = $db->loadResult(); // My Tickets
}
$departments = $this->getJSModel('department')->getDepartments();
$priorities = $this->getPriorities();
$lists['params'] = isset($params_filter) ? $params_filter : '';
$lists['searchsubject'] = $searchsubject;
$lists['searchfrom'] = $searchfrom;
$lists['searchfromemail'] = $searchfromemail;
$lists['datestart'] = $datestart;
$lists['dateend'] = $dateend;
$lists['searchticket'] = $searchticketid;
$lists['staffmembers'] = JHTML::_('select.genericList', $this->getJSModel('staff')->getStaffMembers(), 'filter_staffmember', 'class="js-form-select-field "' . '', 'value', 'text', $searchstaffmember);
$lists['departments'] = JHTML::_('select.genericList', $departments, 'filter_department', '', 'value', 'text',$searchdepartmentid);
$lists['priorities'] = JHTML::_('select.genericList', $priorities, 'filter_priority', '', 'value', 'text',$searchpriorityid);
$result[0] = $tickets;
$result[1] = $total;
$result[2] = $lists;
$result[3] = $ticketinfo;
return $result;
}
function getUserMyTickets($email,$listtype,$searchkeys,$sortby,$limitstart,$limit) {
if(!$email) return false;
$db = $this->getDBO();
$user = JSSupportticketCurrentUser::getInstance();
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` AS ticket WHERE ";
if(!$user->getIsGuest()){
$query .= ' (ticket.email = '.$db->quote($email).' OR ticket.uid = '.$user->getId().')';
}else{
$query .= "ticket.email = ".$db->quote($email);
}
switch ($listtype){
case 1:
$query .= " AND ticket.status != 4 AND ticket.status != 5";
break;
case 4:
$query .= " AND (ticket.status = 4 OR ticket.status = 5)";
break;
case 2:
$query .= " AND ticket.status != 4 AND ticket.status != 5 AND ticket.isanswered = 1";
break;
case 5:
$query .= " ";
break;
}
$multisearchquery = $this->ticketMultiSearch($searchkeys);
$departments = $this->getJSModel('department')->getDepartments();
$priorities = $this->getPriorities();
$departmentid = isset($multisearchquery['department']) ? $multisearchquery['department'] : '';
$priorityid = isset($multisearchquery['priority']) ? $multisearchquery['priority'] : '';
$lists['departments'] = JHTML::_('select.genericList', $departments, 'filter_department', '', 'value', 'text',$departmentid);
$lists['priorities'] = JHTML::_('select.genericList', $priorities, 'filter_priority', '', 'value', 'text',$priorityid);
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$total = $db->loadResult(); //Total Tickets
$query = "SELECT ticket.*,dep.departmentname AS departmentname, priority.priority AS priority, priority.prioritycolour AS prioritycolour,
concat(staff.firstname,' ',staff.lastname) AS staffname, staff.photo AS staffphoto,
(SELECT COUNT(attach.id) From `#__js_ticket_attachments` AS attach WHERE attach.ticketid = ticket.id) AS attachments, (SELECT reply.name FROM `#__js_ticket_replies` AS reply WHERE ticket.id = reply.ticketid ORDER BY created DESC LIMIT 1 ) lastreplyby
FROM `#__js_ticket_tickets` AS ticket
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
LEFT JOIN `#__js_ticket_departments` AS dep ON ticket.departmentid = dep.id
LEFT JOIN `#__js_ticket_staff` AS staff ON ticket.staffid = staff.id
WHERE ";
if(!$user->getIsGuest()){
$query .= ' (ticket.email = '.$db->quote($email).' OR ticket.uid = '.$user->getId().')';
}else{
$query .= "ticket.email = ".$db->quote($email);
}
switch ($listtype){
case 1:
$query .= " AND ticket.status != 4 AND ticket.status != 5";
break;
case 4:
$query .= " AND (ticket.status = 4 OR ticket.status = 5)";
break;
case 2:
$query .= " AND ticket.status != 4 AND ticket.status != 5 AND ticket.isanswered = 1";
break;
case 5:
$query .= " ";
break;
}
$query .= $multisearchquery['inquery'];
$query .= " ORDER BY ".$sortby;
$db->setQuery($query,$limitstart,$limit);
$result = $db->loadObjectList(); //Tickets
$ticketinfo = array();
$config = $this->getJSModel('config')->getConfigs();
if($config['show_count_tickets'] == 1){
$query = "SELECT COUNT(DISTINCT ticket.id)
FROM `#__js_ticket_tickets` AS ticket
WHERE ticket.status != 4 AND ticket.status != 5 AND ";
if(!$user->getIsGuest()){
$query .= ' (ticket.email = '.$db->quote($email).' OR ticket.uid = '.$user->getId().')';
}else{
$query .= "ticket.email = ".$db->quote($email);
}
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$ticketinfo['open'] = $db->loadResult(); // Open Tickets
$query = "SELECT COUNT(DISTINCT ticket.id)
FROM `#__js_ticket_tickets` AS ticket
WHERE ticket.status != 4 AND ticket.isanswered = 1 AND ticket.status != 5 AND ";
if(!$user->getIsGuest()){
$query .= ' (ticket.email = '.$db->quote($email).' OR ticket.uid = '.$user->getId().')';
}else{
$query .= "ticket.email = ".$db->quote($email);
}
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$ticketinfo['answered'] = $db->loadResult(); // Answered Tickets
$query = "SELECT COUNT(DISTINCT ticket.id)
FROM `#__js_ticket_tickets` AS ticket
WHERE (ticket.status = 4 OR ticket.status = 5) AND ";
if(!$user->getIsGuest()){
$query .= ' (ticket.email = '.$db->quote($email).' OR ticket.uid = '.$user->getId().')';
}else{
$query .= "ticket.email = ".$db->quote($email);
}
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$ticketinfo['close'] = $db->loadResult(); // Closed Tickets
$query = "SELECT COUNT(DISTINCT ticket.id)
FROM `#__js_ticket_tickets` AS ticket
WHERE ";
if(!$user->getIsGuest()){
$query .= ' (ticket.email = '.$db->quote($email).' OR ticket.uid = '.$user->getId().')';
}else{
$query .= "ticket.email = ".$db->quote($email);
}
$query .= $multisearchquery['inquery'];
$db->setQuery($query);
$ticketinfo['allticket'] = $db->loadResult(); // Closed Tickets
}
$multisearchquery['inquery'] = ""; // empty the inquery
if($total == '') $total = 0;
$return[0] = $result;
$return[1] = $total;
$return[2] = $ticketinfo;
$return[3] = $lists;
$return[4] = $multisearchquery;
return $return;
}
function getFormData($id,$data) {
if($id) if (!is_numeric($id)) return false;
$db = $this->getDBO();
$model_staff = $this->getJSModel('staff');
$user = JSSupportticketCurrentUser::getInstance();
$departments = $this->getJSModel('department')->getDepartments();
$defaultdepartmentid = $this->getJSModel('department')->getDefaultDepartmentID();
$assignto = $model_staff->getStaffMembers();
$priorities = $this->getPriorities();
if ($id <> '') {
$user = JSSupportticketCurrentUser::getInstance();
if(JFactory::getApplication()->isClient('site')){
if ($user->getIsStaff()) { //staff
$staff_allowed = $this->validateTicketDetailForStaff($id);
if(!$staff_allowed){
return false;
}
}
}
$query = "SELECT ticket.*,ticket.name AS ticketname, internalnote.note AS internalnote, user.name
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_notes` AS internalnote ON internalnote.ticketid = ticket.id
LEFT JOIN `#__users` AS user ON user.id = ticket.uid
WHERE ticket.id = " . $db->quote($id);
$db->setQuery($query);
$editticket = $db->loadObject();
//to store hash value of id against old tickets
if(isset($editticket)){
if( $editticket->hash == null ){
$hash = $this->generateHash($id);
$query = "UPDATE `#__js_ticket_tickets` SET `hash`='".$hash."' WHERE id=".$id;
$db->setQuery($query);
$db->execute();
} //end
}
}
if(isset($editticket))
$premade = $model_staff->getStaffAccessDepartmentPremade($user->getId(), $editticket->departmentid);
else
$premade = $model_staff->getStaffAccessDepartmentPremade($user->getId(), 0);
//get the required fields for combobox
$userfieldmodel = $this->getJSModel('userfields');
$reqdepartment = $userfieldmodel->isFieldRequiredByField('department') == 1 ? ' required' : '';
$reqhelptopicid = $userfieldmodel->isFieldRequiredByField('helptopic') == 1 ? ' required' : '';
$reqassignto = $userfieldmodel->isFieldRequiredByField('assignto') == 1 ? ' required' : '';
if(isset($editticket)) {
$departmentid = isset($data['departmentid']) ? $data['departmentid'] : $editticket->departmentid;
$helptopicid = isset($data['helptopicid']) ? $data['helptopicid'] : $editticket->helptopicid;
$priorityid = isset($data['priorityid']) ? $data['priorityid'] : $editticket->priorityid;
$staffid = isset($data['staffid']) ? $data['staffid'] : $editticket->staffid;
$lists['departments'] = JHTML::_('select.genericList', $departments, 'departmentid', 'class="js-form-select-field '.$reqdepartment.'" ' . 'onChange="gethelptopicandpremade(\'helptopic\',\'premades\', this.value)"', 'value', 'text', $departmentid);
$lists['helptopic'] = JHTML::_('select.genericList', $this->getJSModel('helptopic')->getHelpTopicForCombo($editticket->departmentid, JText::_('Select Help Topic')), 'helptopicid', 'class="js-form-select-field' .$reqhelptopicid.'" ' . '', 'value', 'text', $helptopicid);
$lists['priorities'] = JHTML::_('select.genericList', $priorities, 'priorityid', 'class="js-form-select-field required" ' . '', 'value', 'text', $priorityid);
$lists['assignto'] = JHTML::_('select.genericList', $assignto, 'staffid', 'class="js-form-select-field '.$reqassignto.'" ' . '', 'value', 'text', $staffid);
} else {
$query = "SELECT id FROM `#__js_ticket_priorities` WHERE isdefault = 1";
$db->setQuery($query);
$priority = $db->loadObject();
if(isset($data['departmentid'])){
$departmentid = $data['departmentid'];
}else if(JFactory::getApplication()->input->get('departmentid') > 0){
$departmentid = JFactory::getApplication()->input->get('departmentid');
}else{
$departmentid = $defaultdepartmentid;
}
if(isset($data['helptopicid'])){
$helptopicid = $data['helptopicid'];
}else if(JFactory::getApplication()->input->get('helptopicid') > 0){
$helptopicid = JFactory::getApplication()->input->get('helptopicid');
}else{
$helptopicid = 0;
}
$priorityid = isset($data['priorityid']) ? $data['priorityid'] : $priority->id;
$staffid = isset($data['staffid']) ? $data['staffid'] : $user->getID();
$helptopiccombovalue = ($departmentid == '') ? $defaultdepartmentid : $departmentid;
$lists['departments'] = JHTML::_('select.genericList', $departments, 'departmentid', 'class="inputbox js-form-select-field '.$reqdepartment.'" ' . 'onChange="gethelptopicandpremade(\'helptopic\',\'premades\', this.value)"', 'value', 'text', $departmentid);
$lists['helptopic'] = JHTML::_('select.genericList', $this->getJSModel('helptopic')->getHelpTopicForCombo($helptopiccombovalue, JText::_('Select Help Topic')), 'helptopicid', 'class="inputbox js-form-select-field '.$reqhelptopicid.'" ' . '', 'value', 'text', $helptopicid);
$lists['priorities'] = JHTML::_('select.genericList', $priorities, 'priorityid', 'class="inputbox js-form-select-field required" ' . '', 'value', 'text', $priorityid);
$lists['assignto'] = JHTML::_('select.genericList', $assignto, 'staffid', 'class="inputbox js-form-select-field '.$reqassignto.'" ' . '', 'value', 'text', $staffid);
}
$reqpremade = $userfieldmodel->isFieldRequiredByField('premade') == 1 ? ' required' : '';
$lists['premade'] = JHTML::_('select.genericList', $premade, 'premadeid', 'class="inputbox js-ticket-premade-select '.$reqpremade.'" ' . 'onChange="getpremade(\'issue_summary\', this.value ,append.checked)"', 'value', 'text', '');
$ufields = $this->getJSModel('userfields');
if (isset($editticket))
$result[0] = $editticket;
$result[1] = '';
$result[2] = $lists;
//$result[3] = $ufields->getUserFieldsForForm(1, $id);
$result[4] = $ufields->getFieldsOrderingforForm(1);
$result[5] = $this->getJSModel('attachments')->getAttachmentForForm($id);
return $result;
}
function getTicketDetail($id) {
if (!is_numeric($id))
return false;
$config = $this->getJSModel('config')->getConfigByFor('default');
$autoclose = $config['ticket_auto_close_indays'];
if ($autoclose == "")
$autoclose = 0;
$db = $this->getDBO();
$query = "SELECT ticket.* , tickpriority.priority AS priority,tickpriority.prioritycolour AS prioritycolour ,
dep.departmentname ,concat(staff.firstname,' ',staff.lastname) AS staffname,attachdata.id AS attachmentid,
(SELECT Count(id) FROM `#__js_ticket_replies` AS reply WHERE reply.ticketid = ticket.id) AS replies, attachdata.filename AS filename , attachdata.filesize AS filesize,
DATE_ADD(ticket.lastreply,INTERVAL $autoclose DAY) AS autoclosedate
FROM `#__js_ticket_tickets` AS ticket
JOIN `#__js_ticket_priorities` AS tickpriority ON ticket.priorityid =tickpriority.id
LEFT JOIN `#__js_ticket_departments` AS dep ON ticket.departmentid =dep.id
LEFT JOIN `#__js_ticket_attachments` AS attachdata ON ticket.id =attachdata.ticketid AND attachdata.replyattachmentid = 0
LEFT JOIN `#__js_ticket_staff` AS staff ON ticket.staffid = staff.id
WHERE ticket.id = " . $id;
$db->setQuery($query);
$ticket = $db->loadObjectList();
$query = "SELECT replies.*,attachment.id AS attachmentid, attachment.filename AS filename, attachment.filesize AS filesize, staff.appendsignature AS appendsignature, staff.signature AS signature,
(SELECT COUNT(id) FROM `#__js_ticket_attachments` WHERE ticketid = replies.ticketid AND replyattachmentid = replies.id) AS count
FROM`#__js_ticket_replies` AS replies
LEFT JOIN `#__js_ticket_staff` AS staff ON replies.staffid = staff.id
LEFT JOIN `#__js_ticket_attachments` AS attachment ON replies.ticketid = attachment.ticketid AND replies.id = attachment.replyattachmentid
WHERE replies.ticketid = " . $id . " ORDER BY replies.created";
$db->setQuery($query);
$messages = $db->loadObjectList();
$ufields = $this->getJSModel('userfields');
$result['ticket'] = $ticket[0];
$result['attachment'] = $ticket;
$result['messages'] = $messages;
$result[7] = $ufields->getUserFieldsForView(1, $id);
//$result[8] = $ufields->getFieldsOrdering(1); // company fields
//$tickethistory=$this->getTicketHistory($id);
//if($tickethistory) $result[9] = $tickethistory;
return $result;
}
function getTicketDetailById($id){
if (!is_numeric($id))
return false;
$permission_granted = false;
$time_taken = 0;
$user = JSSupportticketCurrentUser::getInstance();
if ($user->getIsStaff()) { //staff
$time_taken = $this->getJSModel('staff')->getTimeTakenByTicketId($id);
if($user->getIsAdmin()){
$permission_granted = true;
}else{
// check whether all tickets permission is allowed to staff
$allticket = $user->checkUserPermission('All Tickets');
$permission_granted = true;
if(!$allticket){
$permission_granted = $this->validateTicketDetailForStaff($id);
}
$_SESSION['ticket_time_start'][$id] = date('Y-m-d H:i:s');
}
} else { // user
if($user->getIsAdmin()){
$permission_granted = true;
$time_taken = $this->getJSModel('staff')->getTimeTakenByTicketId($id);
}
elseif (!$user->getIsGuest()){
$permission_granted = $this->validateTicketDetailForUser($id);
if (!$permission_granted) { // to show message when ticket exsists but current user not allowed to view it.
$session = JFactory::getApplication()->getSession();
$ticketuserid = $session->get('ticketuserid',-1);
if($ticketuserid == 0){
return 4;// when ticket belongs to visitor but logged in member trying to view it
}else{
return 2;// when logged in tries to view ticket that does not belong to him
}
}
}else{
$permission_granted = $this->validateTicketDetailForVisitor($id);
if (!$permission_granted) { // to show message when ticket exsists but visitor can not view it.
return 3;
}
}
}
if (!$permission_granted) { // validation failed
return false;
}
$db = $this->getDbo();
$inquery="";
if($user->getIsGuest()){
//$inquery = " AND ticket.uid=0";
}
$query = "SELECT ticket.*,department.departmentname AS departmentname ,priority.priority AS priority,priority.prioritycolour AS prioritycolour,attach.id AS attachmentid,
helptopic.topic AS helptopic ,staff.firstname AS firstname ,staff.lastname AS lastname,attach.filename,attach.filesize,staff.photo AS staffphoto,staff.id AS staffid,
(SELECT COUNT(id) FROM `#__js_ticket_attachments` WHERE ticketid = ticket.id AND replyattachmentid = 0) AS count,ticket.priorityid
FROM `#__js_ticket_tickets` AS ticket
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
LEFT JOIN `#__js_ticket_help_topics` AS helptopic ON ticket.helptopicid = helptopic.id
LEFT JOIN `#__js_ticket_staff` AS staff ON ticket.staffid = staff.id
LEFT JOIN `#__js_ticket_attachments` AS attach ON ticket.id = attach.ticketid AND attach.replyattachmentid = 0
WHERE ticket.id=" . $id;
$query .= $inquery;
$db->setQuery($query);
$ticketdetails = $db->loadObjectList();
$ticketemail = array();
if($ticketdetails[0]->ticketviaemail == 1){
$ticketemail = $this->getJSModel('ticketviaemail')->getTicketEmailById($ticketdetails[0]->ticketviaemail_id);
}
$query = "SELECT replies.*, staff.appendsignature AS appendsignature, staff.signature AS signature,
CONCAT(staff.firstname,' ',staff.lastname) AS staffname,staff.photo AS staffphoto,staff.id AS staffid, time.usertime
FROM`#__js_ticket_replies` AS replies
LEFT JOIN `#__js_ticket_staff` AS staff ON replies.staffid = staff.id
LEFT JOIN `#__js_ticket_staff_time` AS time ON time.referenceid = replies.id AND time.referencefor = 1
WHERE replies.ticketid = " . $id . " ORDER BY replies.created ASC";
$db->setQuery($query);
$replies = $db->loadObjectList();
$attachmentmodel = $this->getJSModel('attachments');
foreach ($replies AS $reply) {
$reply->attachments = $attachmentmodel->getAttachmentForReply($id, $reply->id);
}
if($user->getIsStaff() || $user->getIsAdmin()){
$query = "SELECT note.*,ticket.staffid AS staffid,CONCAT(staff.firstname,' ',staff.lastname) AS staffname,staff.photo AS staffphoto,staff.id AS staffid,time.usertime
FROM `#__js_ticket_notes` AS note
LEFT JOIN `#__js_ticket_tickets` AS ticket ON note.ticketid = ticket.id
LEFT JOIN `#__js_ticket_staff` AS staff ON note.staffid = staff.id
LEFT JOIN `#__js_ticket_staff_time` AS time ON time.referenceid = note.id AND time.referencefor = 2
WHERE note.ticketid=" . $id . " ORDER BY note.created DESC ";
$db->setQuery($query);
$notes = $db->loadObjectList();
$model_staff = $this->getJSModel('staff');
if ($user->getIsAdmin()){
$departments = $this->getJSModel('department')->getDepartments();
$premade = $this->getJSModel('premade')->getPremade($ticketdetails[0]->departmentid);
}else{
$departments = $model_staff->getStaffAccessDepartments($user->getId());
$premade = $model_staff->getStaffAccessDepartmentPremade($user->getId(),0);
}
$assignto = $model_staff->getStaffMembers();
$priorities = $this->getPriorities();
$assign_staffid = '';
$assign_departmentid = '';
if(isset($ticketdetails[0])) $assign_staffid = $ticketdetails[0]->staffid;
if(isset($ticketdetails[0])) $assign_departmentid = $ticketdetails[0]->departmentid;
$lists['departments'] = JHTML::_('select.genericList', $departments, 'departmentid', 'class="inputbox js-ticket-premade-select" ' . '', 'value', 'text', $assign_departmentid);
$lists['staff'] = JHTML::_('select.genericList', $assignto, 'assigntostaff', 'class="inputbox js-ticket-premade-select" ' . '', 'value', 'text', $assign_staffid);
$lists['premade'] = JHTML::_('select.genericList', $premade, '', 'class="inputbox js-ticket-premade-select" ' . 'onChange="getpremade(\'responcemsg\', this.value ,append.checked)"', 'value', 'text', '');
$lists['priorities'] = JHTML::_('select.genericList', $priorities, 'priorityid', 'class="inputbox"', 'value', 'text', $ticketdetails[0]->priorityid);
if(isset($ticketdetails[0]->email)){
$query = "SELECT COUNT(id) AS id FROM `#__js_ticket_email_banlist` WHERE email = " . $db->quote($ticketdetails[0]->email);
$db->setQuery($query);
}
$isemailban = $db->loadResult();
if ($isemailban > 0)
$isemailban = 1;
else
$isemailban = 2;
$config_ticket = $this->getJSModel('config')->getConfigByFor('ticket');
$result[1] = $notes;
$result[3] = $lists;
$result[4] = $isemailban;
$result[5] = $config_ticket;
} //end is staff
$ufields = $this->getJSModel('userfields');
$tickethistory = $this->getTicketHistory($id);
$result[0] = isset($ticketdetails[0]) ? $ticketdetails[0] : '';
$result[2] = $replies;
$result[6] = $ticketdetails;
$result[10] = $time_taken;
$result[11] = $ticketemail;
//$result[7] = $ufields->getUserFieldsForView(1, $id);
//$result[8] = $ufields->getFieldsOrdering(1);
//get user tickets for right widget
if($ticketdetails[0]->uid > 0){
//count all ticket of user
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE `uid` = ".$ticketdetails[0]->uid;
$db->setQuery($query);
$result[12] = $db->loadResult();
//get user tickets for right widget
$inquery = " WHERE ticket.id != " . $id . " AND ticket.uid = " . $ticketdetails[0]->uid;
if(!$user->getIsAdmin() && $this->getJSModel('staff')->isUserStaff()){
$allowed = $user->checkUserPermission('All Tickets');
if($allowed != true){
$staffid = $user->getStaffid();
$inquery .= " AND (ticket.staffid = $staffid OR ticket.departmentid IN (SELECT dept.departmentid FROM `#__js_ticket_acl_user_access_departments` AS dept WHERE dept.staffid = $staffid))";
}
}
$query = "SELECT ticket.id,ticket.subject,ticket.status,ticket.lock,ticket.isoverdue,priority.priority AS priority,priority.prioritycolour AS prioritycolour,department.departmentname AS departmentname
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id";
$query .= $inquery . " LIMIT 3 ";
$db->setQuery($query);
$result[13] = $db->loadObjectList();
}
//attachment data
$query = "SELECT published,isvisitorpublished
FROM `#__js_ticket_fieldsordering` WHERE field = 'attachments'";
$db->setQuery($query);
$result['publishedInfo'] = $db->loadObject();
if($tickethistory) $result[9] = $tickethistory;
return $result;
}
function ticketClose($ticketid ,$created,$banemailandcloseticket = false) { // cron flag is to check whether current call is cron call
if (!is_numeric($ticketid))
return false;
$eventtype = JText::_('Close Ticket');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
if($user->getIsStaff()){
if($banemailandcloseticket == false)
$per = $user->checkUserPermission('Close Ticket');
else
$per = $user->checkUserPermission('Ban Email And Close Ticket');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}elseif(!$user->getIsGuest()){
$email = $user->getEmail();
$userTicket = $this->isUserTicket($ticketid, $email);
$msg1 = JText::_('User');
if (!$userTicket) {
$msg = JText::_('YOU are not allowed');
$message = JText::_('User') . " ( " . $user->getName() . " ) " . $msg;
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return OTHER_USER_TASK;
}
}else{ // in case of guest
$msg1 = JText::_('Guest');
}
}
$row = $this->getTable('tickets');
$row->load($ticketid);
// $row->reopened = '';
$row->status = 4;
$row->closed = $created;
$row->update = $created;
$row->isoverdue = 0;
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return TICKET_ACTION_ERROR;
}
$referenceid = $row->id;
$msg = JText::_('Ticket is closed by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
$result = $this->activity_log->storeActivityLog($referenceid,1,$eventtype,$message,'Sucessfull');
$this->getJSModel('email')->sendMail(1,2,$ticketid); // Mailfor,Close Ticket,Ticketid
// on ticket close make remove credentails data and show messsage on retrive.
$this->getJSModel('privatecredentials')->deleteCredentialsOnCloseTicket($ticketid);
return TICKET_ACTION_OK;
}
function reopenTicket($ticketid, $lastreply) {
if (!is_numeric($ticketid))
return false;
$eventtype = JText::_('Reopen Ticket');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$canreopen = $this->checkCanReopenTicket($ticketid, $lastreply);
if ($canreopen == false) {
$msg = JText::_('Ticket reopen time limit end');
$message = $msg . " " . $user->getName() . " (" . $msg1 . ") ";
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return TIME_LIMIT_END;
}
if($user->getIsStaff()){
$per = $user->checkUserPermission('Reopen Ticket');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}elseif(!$user->getIsGuest()){
$email = $user->getEmail();
$userTicket = $this->isUserTicket($ticketid, $email);
$msg1 = JText::_('User');
if (!$userTicket) {
$msg = JText::_('You are not allowed');
$message = JText::_('User') . " ( " . $user->getName() . " ) " . $msg;
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return OTHER_USER_TASK;
}
}else{ //User Guest
$msg1 = JText::_('Guest');
}
}
$row = $this->getTable('tickets');
$row->load($ticketid);
$row->status = 0;
$row->reopened = date('Y-m-d H:i:s');
$row->update = date('Y-m-d H:i:s');
$row->lastreply = date('Y-m-d H:i:s');
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return TICKET_ACTION_ERROR;
}
$referenceid = $row->id;
$msg = JText::_('Ticket is reopened by');
$message = $msg . " " . $user->getName() . " (" . $msg1 . ") ";
$this->activity_log->storeActivityLog($referenceid,1,$eventtype,$message,'Sucessfull');
return TICKET_ACTION_OK;
}
function changeTicketPriority($ticketid, $priorityid, $created) {
if (!is_numeric($ticketid))
return false;
if (!is_numeric($priorityid))
return false;
$eventtype = JText::_('Change ticket priority');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
if($user->getIsStaff()){
$per = $user->checkUserPermission('Change Ticket Priority');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}elseif($user->getIsGuest()){
$email = $user->email;
$userTicket = $this->isUserTicket($ticketid, $email);
$msg1 = JText::_('User');
if (!$userTicket) {
$msg = JText::_('You are not allowed');
$message = JText::_('User') . " ( " . $user->getName() . " ) " . $msg;
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return OTHER_USER_TASK;
}
}else return OTHER_USER_TASK;
}
$row = $this->getTable('tickets');
$row->load($ticketid);
$row->priorityid = $priorityid;
$row->update = $created;
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$result = $this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return PRIORITY_CHANGE_ERROR;
}
$referenceid = $row->id;
$msg = JText::_('Ticket priority is changed by');
$message = $msg . " " . $user->getName() . " (" . $msg1 . ") ";
$result = $this->activity_log->storeActivityLog($referenceid,1,$eventtype,$message,'Sucessfull');
$this->getJSModel('email')->sendMail(1,11,$ticketid); // Mailfor,priority change,Ticketid
return PRIORITY_CHANGED;
}
function ticketMarkInprogress($ticketid,$created) {
if (!is_numeric($ticketid))
return false;
$eventtype = JText::_('Mark in Progress');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$per = $user->checkUserPermission('Mark In Progress');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}
$row = $this->getTable('tickets');
$row->load($ticketid);
$row->status = 2;
$row->update = $created;
if (!$row->store()) {
$this->setError($row->getError());
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return TICKET_ACTION_ERROR;
}
$referenceid = $row->id;
$msg = JText::_('Ticket is marked as in progress by');
$message = $msg . " " . $user->getName() . " (" . $msg1 . ") ";
$this->activity_log->storeActivityLog($referenceid,1,$eventtype,$message,'Sucessfull');
$this->getJSModel('email')->sendMail(1,9,$ticketid); // Mailfor,inprogress tickert,Ticketid
return TICKET_ACTION_OK;
}
function markOverDueTicket($ticketid,$created,$cron_flag = 0) {
if (!is_numeric($ticketid))
return false;
$eventtype = JText::_('Mark overdue');
$user = JSSupportticketCurrentUser::getInstance();
$msg1 = "System";
if($cron_flag == 0){
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$per = $user->checkUserPermission('Mark Overdue');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}
}
$row = $this->getTable('tickets');
$row->load($ticketid);
$row->isoverdue = 1;
$row->update = $created;
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return TICKET_ACTION_ERROR;
}
$referenceid = $row->id;
$msg = JText::_('Ticket is marked as overdue by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
$this->activity_log->storeActivityLog($referenceid,1,$eventtype,$message,'Sucessfull');
$this->getJSModel('email')->sendMail(1,8,$ticketid); // Mailfor,over due Ticket,Ticketid
return TICKET_ACTION_OK;
}
function unMarkOverDueTicket($ticketid,$created) {
if (!is_numeric($ticketid))
return false;
$eventtype = JText::_('Mark overdue');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$per = $user->checkUserPermission('Mark Overdue');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}
$row = $this->getTable('tickets');
$row->load($ticketid);
$row->isoverdue = 0;
$row->update = $created;
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return TICKET_ACTION_ERROR;
}
$referenceid = $row->id;
$msg = JText::_('Ticket is unmarked as overdue by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
$this->activity_log->storeActivityLog($referenceid,1,$eventtype,$message,'Sucessfull');
//$this->getJSModel('email')->sendMail(1,8,$ticketid); // Mailfor,over due Ticket,Ticketid
return TICKET_ACTION_OK;
}
function lockTicket($id) {
if (!is_numeric($id))
return false;
$eventtype = JText::_('Lock ticket');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$per = $user->checkUserPermission('Lock Ticket');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}
$db = $this->getDbo();
$query = "UPDATE `#__js_ticket_tickets` AS ticket set ticket.lock = 1 WHERE id =" . $id;
$db->setQuery($query);
if (!$db->execute()) {
$message = $row->getError();
$this->activity_log->storeActivityLog($id,1,$eventtype,$message,'Error');
return TICKET_ACTION_ERROR;
}
$msg = JText::_('Ticket is locked by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
$this->activity_log->storeActivityLog($id,1,$eventtype,$message,'Sucessfull');
$this->getJSModel('email')->sendMail(1,6,$id); // Mailfor,lock,Ticketid
return TICKET_ACTION_OK;
}
function unlockTicket($id) {
if (!is_numeric($id))
return false;
$eventtype = JText::_('Unlock ticket');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$per = $user->checkUserPermission('Lock Ticket');
if ($per == false){
return PERMISSION_ERROR;
}
$msg1 = JText::_('Staff');
}
$db = $this->getDbo();
$query = "UPDATE `#__js_ticket_tickets` AS ticket set ticket.lock = 0 WHERE ticket.id =" . $id;
$db->setQuery($query);
if (!$db->execute()) {
$message = $row->getError();
$this->activity_log->storeActivityLog($id,1,$eventtype,$message,'Error');
return TICKET_ACTION_ERROR;
}
$msg = JText::_('Ticket is unlocked by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
$this->activity_log->storeActivityLog($id,1,$eventtype,$message,'Sucessfull');
$this->getJSModel('email')->sendMail(1,7,$id); // Mailfor,unlock,Ticketid
return TICKET_ACTION_OK;
}
function storeTicketInternalNote($ticketid, $staffid, $internalnote, $created, $internalnotetitle) {
if (!is_numeric($ticketid))
return false;
if(!JFactory::getApplication()->isClient('administrator')){
if (!is_numeric($staffid))
return false;
}
$user = JSSupportticketCurrentUser::getInstance();
$row = $this->getTable('notes');
$data['ticketid'] = $ticketid;
//$data['staffid'] = $staffid;
$data['staffid'] = $user->getStaffId();
$data['title'] = $internalnotetitle;
$data['note'] = $internalnote;
$data['status'] = 1;
$data['created'] = $created;
$data['from'] = 0;
if (!$row->bind($data)) {
$this->setError($row->getError());
return false;
}
if (!$row->check()) {
$this->setError($row->getError());
return false;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
return false;
}
return true;
}
function storeTicket_InternalNote($ticketid,$title, $note, $created, $data2) {//when ticket open for reply
if (!is_numeric($ticketid))
return false;
$name ="";
$staffid=0;
$eventtype = JText::_('Post Internal Note');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
$name = $user->getName();
}else{
$per = $user->checkUserPermission('Post Internal Note');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
$staffid=$data2['staffid'];
}
$row = $this->getTable('notes');
$data['ticketid'] = $ticketid;
$data['staffid'] = $staffid;
$data['from'] = $name;
$data['title'] = $title;
$data['note'] = $note;
$data['status'] = 1;
$data['created'] = $created;
$return_value = true;
if (!$row->bind($data)) {
$this->setError($row->getError());
$return_value = false;
}
if (!$row->check()) {
$this->setError($row->getError());
$return_value = false;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if(!$user->getIsAdmin() && $return_value != false){// store time
$data2['ticketid'] = $ticketid;
$data2['timer_edit_desc'] = JFactory::getApplication()->input->get('timer_edit_desc', '', 'raw');
$this->getJSModel('staff')->storeTimeTaken($data2,$row->id,2);
}
$config = $this->getJSModel('config')->getConfigByFor('default');
$filesize = $config['filesize'];
$model_note = $this->getJSModel('note');
if ($_FILES['noteattachment']['name'] != '') {
if ($_FILES['noteattachment']['size'] > 0) {
$uploadfilesize = $_FILES['noteattachment']['size'];
$uploadfilesize = $uploadfilesize / 1024; //kb
if ($uploadfilesize > $filesize) { // filename
return FILE_SIZE_ERROR;
}
$file_name = str_replace(' ', '_', $_FILES['noteattachment']['name']);
$result = $model_note->checkExtension($file_name);
if ($result == 'N') { // filename
return FILE_EXTENTION_ERROR;
}
$res = $model_note->uploadAttchment($ticketid);
if ($res == true) {
$row->filename = $file_name;
$row->filesize = $uploadfilesize;
$row->store();
}
}
}
//for ticket close
if (isset($data2['internalnotestatus']) && $data2['internalnotestatus'] == 4) {
$result = $this->updateTicketStatus($ticketid, $data2['internalnotestatus'], $data2['created']);
if ($result == false)
return POST_ERROR;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return POST_ERROR;
}
$msg = JText::_('Internal note is posted by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Sucessfull');
return POSTED;
}
function storeTicketReplies($ticketid, $message, $created, $data2) {
if (!is_numeric($ticketid))
return false;
//validate reply for break down
$ticketrandomid = $data2['ticketid'];
$hash = $data2['hash'];
$db = $this->getDBo();
$query = "SELECT id FROM `#__js_ticket_tickets` WHERE ticketid='$ticketrandomid' AND IF(hash is NULL,true,hash='$hash')";
$db->setQuery($query);
$res = $db->loadResult();
if($res != $data2['id']){
return false;
}//end
/*$ticketviaemailstaffid = 0;
// set in ticket via email
if(isset($data2['staffid'])){
$ticketviaemailstaffid = $data2['staffid'];
unset($data2['staffid']);
}*/
if(isset($data['ticketviaemail']) && $data['ticketviaemail'] == 1){
$eventtype = JText::_('Reply ticket via email');
}else{
$eventtype = JText::_('Reply ticket');
}
$user = JSSupportticketCurrentUser::getInstance();
$uname = $user->getName();
if($user->getIsStaff()){
$per = $user->checkUserPermission('Reply Ticket');
if ($per == false)
return PERMISSION_ERROR;
}
if(isset($data2['appendsignature']) && $data2['appendsignature'] != 3){
$id = $data2['id'];
$appendSignature = $data2['appendsignature'];
if ($appendSignature == 1) {
$signature = $this->getJSModel('staff')->getStaffMemberSignature($user->getId());
} elseif ($appendSignature == 2) {
$signature = $this->getJSModel('department')->getDepartmentSignature($id);
}
$signature = str_replace(Chr(13), '<br>', $signature);
$message .= '<br/><br/>' . $signature;
}
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
$status = 3;
}elseif($user->getIsStaff()){
$msg1 = JText::_('Staff');
$status = 3;
}else{
$status = 1;
$msg1 = JText::_('User');
if($user->getIsGuest()){
$msg1 = JText::_('Guest');
$uname = $this->getReplierName($ticketid);
}
}
if(isset($data2['ticketviaemail']) && $data2['ticketviaemail'] == 1){ // overwrite if ticket via email
$status = $data2['status'];
// check this ticket is not assign to any one
if( $this->isTicketAssigned($data2['ticketid']) == false){
// if not assigned then assign to me
$data2['assigntomyself'] = 1;
}
}
$config = $this->getJSModel('config')->getConfigByFor('default');
if(!$user->getIsStaff() && !$user->getIsAdmin() && $config['reply_to_closed_ticket'] != 1){ // to hanlde closed ticket reply confiration for user
$row = $this->getTable('tickets');
$row->load($ticketid);
$closed = $row->status;
if($closed == 4){
$this->getJSModel('email')->sendMail(1,14,$ticketid); // sned to email to user when he tries to reply to a colsed ticket (email is sent to handle ticket via email case)
return POST_ERROR;
}
}
$res = $this->updateTicketStatus($ticketid,$status);
if(!$res) return POST_ERROR;
$row = $this->getTable('replies');
$data['ticketid'] = $ticketid;
$data['staffid'] = isset($data2['staffid']) ? $data2['staffid'] : '';
$data['name'] = $uname;
$data['message'] = $message;
$data['status'] = 1;
$data['created'] = $created;
//utf auto switch
if($this->getJSModel('config')->getConfigurationByName('read_utf_ticket_via_email') == 1){
$data['name'] = iconv_mime_decode($data['name'],0,"UTF-8");
}
$return_value = true;
if (!$row->bind($data)) {
$this->setError($row->getError());
$return_value = false;
}
if (!$row->check()) {
$this->setError($row->getError());
return MESSAGE_EMPTY;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return POST_ERROR;
}
$replyattachmentid = $row->id;
if(!$user->getIsAdmin() && $return_value != false){// store time
$data2['ticketid'] = $ticketid;
$data2['timer_edit_desc'] = JFactory::getApplication()->input->get('timer_edit_desc', '', 'raw');
$this->getJSModel('staff')->storeTimeTaken($data2,$row->id,1);
}
$isanswered = 0;
if($status == 3)
$isanswered = 1;
$res = $this->updateIsAnswered($ticketid,$isanswered);
if(!$res) return POST_ERROR;
$res = $this->updateTicketLastReply($ticketid,$created);
if(!$res) return POST_ERROR;
if (isset($data2['assigntomyself'])){
$res = $this->updateTicketAssignToMyself($ticketid, $user->getStaffid());
if(!$res) return POST_ERROR;
}
$total = 0;
if(isset($_FILES['filename']))
$total = count($_FILES['filename']['name']);
if ($total > 0) {
$config = $this->getJSModel('config')->getConfigByFor('default');
$filesize = $config['filesize'];
$model_attachment = $this->getJSModel('attachments');
for ($i = 0; $i < $total; $i++) {
if ($_FILES['filename']['name'][$i] != '') {
if ($_FILES['filename']['size'][$i] > 0) {
$uploadfilesize = $_FILES['filename']['size'][$i];
$uploadfilesize = $uploadfilesize / 1024; //kb
if ($uploadfilesize > $filesize) { // filename
return FILE_SIZE_ERROR;
}
$file_name = str_replace(' ', '_', $_FILES['filename']['name'][$i]);
$result = $model_attachment->checkExtension($file_name);
if ($result == 'N') { // filename
return FILE_EXTENTION_ERROR;
}
$res = $model_attachment->uploadAttchments($i, $ticketid, 1, 0, 'ticket');
if ($res == true) {
$result = $this->storeTicketAttachment($ticketid, $uploadfilesize, $file_name, $replyattachmentid);
}
}
}
}
}
//for ticket close
if (isset($data2['replystatus']) && $data2['replystatus'] == 4) {
$result = $this->updateTicketStatus($ticketid, $data2['replystatus'], $data2['created']);
if ($result == false)
return POST_ERROR;
$referenceid = $ticketid;
$msg = JText::_('Ticket is closed by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
$this->activity_log->storeActivityLog($referenceid, 1, $eventtype, $message, 'Sucessfull');
}
$referenceid = $ticketid;
if(isset($data['ticketviaemail']) && $data['ticketviaemail'] == 1){
$msg = JText::_('Ticket view email is replied by');
$msg1 = $this->getJSModel('ticketviaemail')->getTicketEmailById($data['ticketviaemail_id']);
$message = $msg . " ( " . $msg1 . " ) ";
}else{
$msg = JText::_('Ticket is replied by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
}
$this->activity_log->storeActivityLog($referenceid, 1, $eventtype, $message, 'Sucessfull');
$replyfromadminstaff = 0;
if($user->getIsAdmin() || $user->getIsStaff()) $replyfromadminstaff = 1;
if(isset($data2['ticketviaemail']) && $data2['ticketviaemail'] == 1){ // overwrite if ticket via email
if($data2['status'] == 3) $replyfromadminstaff = 1;
}
if($replyfromadminstaff == 1){
$this->getJSModel('email')->sendMail(1,4,$ticketid); // Mailfor,reply,Ticketid [admin/staffmember]
}else{
$this->getJSModel('email')->sendMail(1,5,$ticketid); // Mailfor,reply,Ticketid [user reply]
}
return POSTED;
}
function storeUserReplies() {
$data = JFactory::getApplication()->input->post->getArray();
$ticketid = $data['ticketid'];
// update status that reply from the USER
$row = $this->getTable('tickets');
$row->load($ticketid);
$row->status = 1;
if($data['isreopen'] == 1) {
$result = $this->reopenTicket($data['ticketid'], $data['lastreply']);
if($result == TICKET_ACTION_ERROR)
return SENT_ERROR;
elseif($result != TICKET_ACTION_OK)
return $result;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
return SENT_ERROR;
}
$user = JSSupportticketCurrentUser::getInstance();
$eventtype = JText::_('Reply ticket');
$row = $this->getTable('replies');
$name = $this->getReplierName($ticketid);
$data['name'] = $name;
$data['staffid'] = 0; //Front end reply clue
$data['status'] = 1; //Front end reply clue
$messagedata = JFactory::getApplication()->input->get('message', '', 'raw');
if ($messagedata == "") { // ticket is autoclose and close and reopen to handel editor show correctly change id message to messages
$messagedata = JFactory::getApplication()->input->get('messages', '', 'raw');
}
$data['message'] = $messagedata;
if (!$row->bind($data)) {
$this->setError($row->getError());
$return_value = false;
}
if (!$row->check()) {
$this->setError($row->getError());
$return_value = false;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$result = $this->activity_log->storeActivityLog($ticketid, 1,$eventtype,$message,'Error');
return SENT_ERROR;
}
$msg = JText::_('Ticket is replied by');
$msg1 = JText::_('User');
$message = $msg . " " . $user->getName() . " (" . $msg1 . ") ";
$result = $this->activity_log->storeActivityLog($ticketid, 1,$eventtype,$message,'Sucessfull');
$config = $this->getJSModel('config')->getConfigByFor('default');
$ticketid = $row->ticketid;
$replyattachmentid = $row->id;
$filesize = $config['filesize'];
$total = count((isset($_FILES['filename']['name'])) ? $_FILES['filename']['name'] : 0);
if ($total > 0) {
$model_attachment = $this->getJSModel('attachments');
for ($i = 0; $i < $total; $i++) {
if ($_FILES['filename']['name'][$i] != '') {
if ($_FILES['filename']['size'][$i] > 0) {
$uploadfilesize = $_FILES['filename']['size'][$i];
$uploadfilesize = $uploadfilesize / 1024; //kb
if ($uploadfilesize > $filesize) { // filename
return FILE_SIZE_ERROR;
}
$file_name = str_replace(' ', '_', $_FILES['filename']['name'][$i]);
$result = $model_attachment->checkExtension($file_name);
if ($result == 'N') { // filename
return FILE_EXTENTION_ERROR;
}
$res = $model_attachment->uploadAttchments($i, $ticketid, 1, 0, 'ticket');
if ($res == true) {
$result = $this->storeReplyAttachment($ticketid, $replyattachmentid, $uploadfilesize, $file_name);
}
}
}
}
}
$this->getJSModel('email')->sendMail(1,5,$ticketid); // Mailfor,reply,Ticketid [ticket owner reply]
//die('reply owner');
return SENT;
}
function ticketDepartmentTransfer($ticketid,$departmentid, $note, $created, $data2) {
if (!is_numeric($ticketid))
return false;
$eventtype = JText::_('Ticket department transfer');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$per = $user->checkUserPermission('Ticket Department Transfer');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}
if($created == "") $created = date("Y-m-d H:i:s");
$row = $this->getTable('tickets');
$row->load($ticketid);
$row->departmentid = $departmentid;
$row->update = $created;
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return TICKET_TRANSFER_ERROR;
}
//for internal note
$result = $this->storeTicketInternalNote($ticketid, $data2['staffid'], $note, $created, '');
if ($result == false)
return TICKET_TRANSFER_ERROR;
$referenceid = $row->id;
$msg = JText::_('Department is transfered by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
$this->activity_log->storeActivityLog($referenceid,1,$eventtype,$message,'Sucessfull');
$this->getJSModel('email')->sendMail(1,12,$ticketid); // Mailfor,department transwer,Ticketid
return TICKET_TRANSFERED;
}
function ticketStaffTransfer($ticketid,$staffid, $note, $created, $data2) {
if (!is_numeric($ticketid))
return false;
$eventtype = JText::_('Assign ticket to staff');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$per = $user->checkUserPermission('Assign Ticket To Staff');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}
if($created == "") $created = date("Y-m-d H:i:s");
$row = $this->getTable('tickets');
$row->load($ticketid);
$row->staffid = $staffid;
$row->update = $created;
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = false;
}
if (isset($return_value) && $return_value == false) {
$message = $row->getError();
$this->activity_log->storeActivityLog($ticketid,1,$eventtype,$message,'Error');
return TICKET_TRANSFER_ERROR;
}
//for internal note
if($note){
$result = $this->storeTicketInternalNote($ticketid, $staffid, $note, $created, '');
if ($result == false)
return TICKET_TRANSFER_ERROR;
}
$referenceid = $row->id;
$msg = JText::_('Ticket is assigned to staff by');
$message = $msg . " " . $user->getName() . " ( " . $msg1 . " ) ";
$this->activity_log->storeActivityLog($referenceid,1,$eventtype,$message,'Sucessfull');
$this->getJSModel('email')->sendMail(1,13,$ticketid); // Mailfor,staff transwer,Ticketid
return TICKET_TRANSFERED;
}
function checkCanReopenTicket($ticketid, $lastreply) {
if (!is_numeric($ticketid))
return false;
$config_ticket = $this->getJSModel('config')->getConfigByFor('ticket');
$days = $config_ticket['ticket_reopen_within_days'];
if (!$lastreply)
$lastreply = date('Y-m-d H:i:s');
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s", strtotime($lastreply)) . " +" . $days . " day"));
if ($date < date('Y-m-d H:i:s'))
return false;
else
return true;
}
function banEmailAndCloseTicket($ticketid, $created, $email) {
if (!is_numeric($ticketid))
return false;
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$per = $user->checkUserPermission('Ban Email And Close Ticket');
if ($per == false){
$msg = JSSupportticketMessage::getMessage(PERMISSION_ERROR,'CLOSE');
return $msg;
}
}
if($created == "") $created = date("Y-m-d H:i:s");
$result = $this->getJSModel('emailbanlist')->banEmailTicket($email,$created, $ticketid, 1);
$msg1 = JSSupportticketMessage::getMessage($result,'BAN_EMAIL');
$result = $this->ticketClose($ticketid, $created,true);
$msg2 = JSSupportticketMessage::getMessage($result,'CLOSE');
if($msg1 == $msg2){
$msg = $msg1;
}else{
$msg = $msg1.'<br/>'.$msg2;
}
$this->getJSModel('email')->sendMail(2,1,$ticketid,"js_ticket_tickets"); // Mailfor,banemail and closeticket ,Ticketid
$this->getJSModel('email')->sendMail(1,2,$ticketid); // Mailfor,banemail and closeticket ,Ticketid
return $msg;
}
function storeTicketIssueSummary($ticketid, $uid, $name, $issuesummary, $created) {
if (!is_numeric($ticketid))
return false;
if (!is_numeric($uid))
return false;
if($created == "") $created = date("Y-m-d H:i:s");
$row = $this->getTable('replies');
$data['ticketid'] = $ticketid;
$data['staffid'] = $uid;
$data['name'] = $name;
$data['message'] = $issuesummary;
$data['status'] = 1;
$data['created'] = $created;
if (!$row->bind($data)) {
$this->setError($row->getError());
return false;
}
if (!$row->check()) {
$this->setError($row->getError());
return false;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
return false;
}
return true;
}
function storeTicketAttachment($ticketid, $filesize, $filename, $replyattachmentid = 0) {
if (!is_numeric($ticketid))
return false;
$row = $this->getTable('attachments');
$data['ticketid'] = $ticketid;
$data['replyattachmentid'] = $replyattachmentid; // this should set to zero when new ticket created
$data['filename'] = $filename;
$data['filesize'] = $filesize;
$data['created'] = $curdate = date('Y-m-d H:i:s');
if (!$row->bind($data)) {
$this->setError($row->getError());
return false;
}
if (!$row->check()) {
$this->setError($row->getError());
return false;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
return false;
}
return true;
}
function getReplierName($ticketid) {
if (!is_numeric($ticketid))
return false;
$db = $this->getDbo();
$query = "SELECT ticket.name From `#__js_ticket_tickets` AS ticket WHERE ticket.id = " . $ticketid;
$db->setQuery($query);
$name = $db->loadResult();
return $name;
}
function storeReplyAttachment($ticketid, $replyattachmentid, $filesize, $filename) {
if (!is_numeric($ticketid))
return false;
if (!is_numeric($replyattachmentid))
return false;
$row = $this->getTable('attachments');
$data['ticketid'] = $ticketid;
$data['replyattachmentid'] = $replyattachmentid;
$data['filename'] = $filename;
$data['filesize'] = $filesize;
$data['created'] = $curdate = date('Y-m-d H:i:s');
if (!$row->bind($data)) {
$this->setError($row->getError());
return false;
}
if (!$row->check()) {
$this->setError($row->getError());
return false;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
echo $row->getError();
return false;
}
return true;
}
function checkForNewMessageSetting($id) {
if (!is_numeric($id))
return false;
$db = JFactory::getDBO();
$query = "SELECT dep.messageautoresponce
FROM `#__js_ticket_tickets` AS ticket
JOIN `#__js_ticket_departments` AS dep ON dep.id = ticket.departmentid
WHERE ticket.id = " . $id;
$db->setQuery($query);
$depsetting = $db->loadResult();
return $depsetting;
}
function getAttachmentByTicketId($id){
if(!is_numeric($id)) return false;
$db = JFactory::getDBO();
$query = "SELECT attachment.filename , ticket.attachmentdir
FROM `#__js_ticket_attachments` AS attachment
JOIN `#__js_ticket_tickets` AS ticket ON ticket.id = attachment.ticketid AND ticket.id =".$id. " AND attachment.replyattachmentid = 0 ";
$db->setQuery($query);
$attachments = $db->loadObjectList();
return $attachments;
}
function getTicketIdForEmail($id) {
if (!is_numeric($id))
return false;
$db = $this->getDbo();
$query = "Select ticketid,email from `#__js_ticket_tickets` where id = " . $id;
$db->setQuery($query);
$ticket = $db->loadObject();
return $ticket;
}
function delete_Ticket($id) {
if (!is_numeric($id))
return false;
$user = JSSupportticketCurrentUser::getInstance();
$eventtype = JText::_('Delete ticket');
if($user->getIsAdmin()){
$msg1 = JText::_('Admin');
}else{
$per = $user->checkUserPermission('Delete Ticket');
if ($per == false)
return PERMISSION_ERROR;
$msg1 = JText::_('Staff');
}
$row = $this->getTable('tickets');
//for email get ticketid first
$ticket = $this->getTicketIdForEmail($id);
if ($this->ticketCanDelete($id) == true) {
if (!$row->delete($id)) {
$message = $row->getError();
$this->activity_log->storeActivityLog($id,1,$eventtype,$message,'Error');
return TICKET_ACTION_ERROR;
}
//for email to sure ticket is deleted
$this->getJSModel('email')->sendMail(1,3,$id); // Mailfor,Delete Ticket,Ticketid
}
return TICKET_ACTION_OK;
}
function getTicketAttachmentDir($id){
if(!is_numeric($id))
return false;
$db = $this->getDBO();
$query = "SELECT attachmentdir FROM `#__js_ticket_tickets` WHERE id = $id";
$db->setQuery($query);
$result = $db->loadResult();
return $result;
}
function enforcedeleteTicket() {
$id = JFactory::getApplication()->input->get('cid');
if (!is_numeric($id))
return false;
$db = $this->getDBO();
$dir = $this->getTicketAttachmentDir($id);
$query = "DELETE ticket,reply,attach,notes
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_replies` AS reply ON reply.ticketid = ticket.id
LEFT JOIN `#__js_ticket_attachments` AS attach ON attach.ticketid = ticket.id
LEFT JOIN `#__js_ticket_notes` AS notes ON notes.ticketid = ticket.id
WHERE ticket.id = " . $id;
$db->setQuery($query);
if (!$db->execute()) {
return DELETE_ERROR;
} else {
$this->getJSModel('attachments')->removeTicketAttachments( $dir );
return DELETED;
}
}
function deleteTicket() {
$id = JFactory::getApplication()->input->get('cid');
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsStaff()){
$per = $user->checkUserPermission('Delete Ticket');
if ($per == false)
return PERMISSION_ERROR;
}
if (!is_numeric($id))
return false;
$dir = $this->getTicketAttachmentDir($id);
if($this->canDeleteTicket($id)){
$db = $this->getDBO();
$query = "DELETE ticket,attach
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_attachments` AS attach ON attach.ticketid = ticket.id
WHERE ticket.id = " . $id;
$db->setQuery($query);
if (!$db->execute()) {
return DELETE_ERROR;
} else {
$this->getJSModel('attachments')->removeTicketAttachments( $dir );
return DELETED;
}
}else{
return IN_USE;
}
}
function canDeleteTicket($id){
if(!is_numeric($id)) return false;
$db = JFactory::getDbo();
$query = "SELECT COUNT(reply.id) FROM `#__js_ticket_replies` AS reply WHERE reply.ticketid = $id";
$db->setQuery($query);
$result = $db->loadResult();
if($result == 0)
return true;
else
return false;
}
function getEmailAndTicketIdById($id) {
if(!is_numeric($id)) return false;
$db = $this->getDBO();
$query = "SELECT ticketid,email,subject,staffid FROM `#__js_ticket_tickets` WHERE id =" . $db->quote($id);
$db->setQuery($query);
$result = $db->loadObject();
return $result;
}
function checkEmailAndTicketID($email, $ticketid) {
$db = $this->getDBO();
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE email =" . $db->quote($email) . " AND ticketid =" . $db->quote($ticketid);
$user = JFactory::getUser();
if(!$user->guest){
$query .= " AND uid = ".$user->id;
}
$db->setQuery($query);
$result = $db->loadResult();
return $result;
}
function getIdFromTrackingId($ticketid) {
$db = $this->getDBO();
$query = "SELECT id FROM `#__js_ticket_tickets` WHERE ticketid =" . $db->quote($ticketid);
$db->setQuery($query);
$result = $db->loadResult();
return $result;
}
function isUserTicket($ticketid, $email) {
if (!is_numeric($ticketid))
return false;
$db = $this->getDBO();
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE email =" . $db->quote($email) . " AND id=" . $ticketid;
$db->setQuery($query);
$result = $db->loadResult();
if ($result > 0)
return true;
return false;
}
function checkCanAddTicket($email) {
if(empty($email)) return false;
$db = $this->getDbo();
$user = JFactory::getUser();
$config_ticket = $this->getJSModel('config')->getConfigByFor('default');
$maxticketinterval = $config_ticket['maximum_ticket_interval_time'];
switch($maxticketinterval){
case "1": // maximum ticket in a day
$checkdate = " AND date(created) = " . $db->quote(date('Y-m-d'));
break;
case "2": // maximum ticket in month
$checkdate = " AND MONTH(created) = " . $db->quote(date('m',strtotime(date('Y-m-d'))));
break;
case "3": // maximum ticket in year
$checkdate = " AND YEAR(created) = " . $db->quote(date('Y',strtotime(date('Y-m-d'))));
break;
case "4": // maximum ticket in life time
$checkdate = "";
break;
}
if($user->guest){
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE email = " . $db->quote($email); // ticket not answer and not closed
}else{
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE uid = " . $user->id; // ticket not answer and not closed
}
$db->setQuery($query);
$total = $db->loadResult();
$ticketperemail = $config_ticket['maximum_ticket'];
if ($total >= $ticketperemail) {
return false;
}
return true;
}
function checkMaxOpenTickets($email) {
if(empty($email)) return false;
$db = $this->getDbo();
$user = JFactory::getUser();
if($user->guest){
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE status != 4 AND email = " . $db->quote($email); // ticket not answer and not closed
}else{
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE status != 4 AND uid = " . $user->id; // ticket not answer and not closed
}
$db->setQuery($query);
$total = $db->loadResult();
$config_ticket = $this->getJSModel('config')->getConfigByFor('ticket');
$ticketperemail = $config_ticket['ticket_per_email'];
if ($total >= $ticketperemail) {
return false;
}
return true;
}
function checkIsTicketDuplicate($subject,$email){
if(empty($subject)) return false;
if(empty($email)) return false;
$curdate = date('Y-m-d H:i:s');
$db = $this->getDbo();
$subject = filter_var($subject, FILTER_SANITIZE_STRING);
$query = "SELECT created FROM `#__js_ticket_tickets` WHERE email = " . $db->quote($email) . " AND subject = '" . $subject . "' ORDER BY created DESC LIMIT 1";
$db->setQuery($query);
$datetime = $db->loadResult();
if($datetime){
$diff = strtotime($curdate) - strtotime($datetime);
if($diff <= 15){
return false;
}
}
return true;
}
function getTicketId() {
$db = $this->getDBO();
$query = "SELECT ticketid FROM `#__js_ticket_tickets`";
$ticketid_sequence = $this->getJSModel('config')->getConfigurationByName('ticketid_sequence');
$match = '';
$ticketid = "";
do {
if($ticketid_sequence == 1){ // Random ticketid
$ticketid = "";
$length = 13;
$possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
$maxlength = strlen($possible);
if ($length > $maxlength) {
$length = $maxlength;
}
$i = 0;
while ($i < $length) {
$char = substr($possible, mt_rand(0, $maxlength - 1), 1);
if (!strstr($ticketid, $char)) {
if ($i == 0) {
if (ctype_alpha($char)) {
$ticketid .= $char;
$i++;
}
} else {
$ticketid .= $char;
$i++;
}
}
}
}else{ // Sequential ticketid
if($ticketid == ""){
$ticketid = 0; // by default its set to zero
}
$maxquery = "SELECT max(convert(ticketid, SIGNED INTEGER)) FROM `#__js_ticket_tickets`";
$db->setQuery($maxquery);
$maxticketid = $db->loadResult();
if(is_numeric($maxticketid)){
$ticketid = $maxticketid + 1;
}else{
$ticketid = $ticketid + 1;
}
}
$db->setQuery($query);
$rows = $db->loadObjectList();
foreach ($rows as $row) {
if ($ticketid == $row->ticketid){
$match = 'Y';
break;
}else{
$match = 'N';
}
}
}while ($match == 'Y');
return $ticketid;
}
function getPriorities() {
$db = $this->getDBO();
$user = JSSupportTicketCurrentUser::getInstance();
if($user->getIsStaff() || JFactory::getApplication()->isClient('administrator')){
$query = "SELECT * FROM `#__js_ticket_priorities`";
}else{
$query = "SELECT * FROM `#__js_ticket_priorities` WHERE ispublic = 1";
}
$priorities = array();
$db->setQuery($query);
$rows = $db->loadObjectList();
$priorities[] = array('value' => null, 'text' => JText::_('Select Priority'));
foreach ($rows as $row) {
$priorities[] = array('value' => $row->id, 'text' => JText::_($row->priority));
}
return $priorities;
}
function getAttachmentByReplyId($id){
if(!is_numeric($id)) return false;
$db = $this->getDBO();
$query = "SELECT attachment.filename , ticket.attachmentdir
FROM `#__js_ticket_attachments` AS attachment
JOIN `#__js_ticket_tickets` AS ticket ON ticket.id = attachment.ticketid AND attachment.replyattachmentid = ".$id ;
$db->setQuery($query);
$replyattachments = $db->loadObjectList();
return $replyattachments;
}
private function getTicketHistory($id) {
if(!is_numeric($id)) return false;
$db = $this->getDBO();
$query = "SELECT al.id,al.message,al.datetime,al.uid,al.level
from `#__js_ticket_activity_log` AS al
join `#__js_ticket_tickets` AS tic on al.referenceid=tic.id
where al.referenceid=" . $id . " AND al.eventfor=1 ORDER BY al.datetime DESC ";
$db->setQuery($query);
$result = $db->loadObjectList();
return $result;
}
function updateTicketStatus($ticketid,$status,$created = false) {
if (!is_numeric($ticketid) || (!is_numeric($status)))
return false;
$db = $this->getDbo();
$inquery = '';
if($status == 4 && $created)
$inquery = ", ticket.closed = ".$db->quote($created)." , ticket.update = ".$db->quote($created);
$query = "UPDATE `#__js_ticket_tickets` AS ticket SET ticket.status = $status ".$inquery." WHERE ticket.id = " . $ticketid;
$db->setQuery($query);
if (!$db->execute())
return false;
else
return true;
}
function updateIsAnswered($ticketid,$isanswered) {
if (!is_numeric($ticketid) || (!is_numeric($isanswered)))
return false;
$db = $this->getDbo();
$query = "UPDATE `#__js_ticket_tickets` set isanswered = $isanswered WHERE id = " . $ticketid;
$db->setQuery($query);
if (!$db->execute())
return false;
else
return true;
}
function updateTicketLastReply($ticketid, $created) {
if (!is_numeric($ticketid))
return false;
$db = $this->getDbo();
$query = "UPDATE `#__js_ticket_tickets` set lastreply = " . $db->quote($created) . " WHERE id = " . $ticketid;
$db->setQuery($query);
if (!$db->execute()) {
return false;
} else {
return true;
}
}
function updateTicketAssignToMyself($ticketid, $staffid) {
if (!is_numeric($ticketid))
return false;
if($staffid){
$db = $this->getDbo();
$query = "UPDATE `#__js_ticket_tickets` set staffid = " .$staffid. " WHERE id = " . $ticketid;
$db->setQuery($query);
if (!$db->execute()) {
return false;
} else {
return true;
}
}
}
function isTicketAssigned($ticketid){
if (!is_numeric($ticketid))
return false;
$query = "SELECT staffid FROM `#__js_ticket_tickets` WHERE id=".$ticketid;
$db = $this->getDbo();
$db->setQuery($query);
$staffid = $db->loadResult();
if($staffid > 0)
return true;
return false;
}
private function performChecks() {
// $request = JFactory::getApplication()->input->get();
$request = JFactory::getApplication()->input->post->getArray();
$session = JFactory::getApplication()->getSession();
$type_calc = true;
if ($type_calc) {
if ($session->get('jsticket_rot13', null, 'jsticket_checkspamcalc') == 1) {
$spamcheckresult = base64_decode(str_rot13($session->get('jsticket_spamcheckresult', null, 'jsticket_checkspamcalc')));
} else {
$spamcheckresult = base64_decode($session->get('jsticket_spamcheckresult', null, 'jsticket_checkspamcalc'));
}
$spamcheck = JFactory::getApplication()->input->getInt($session->get('jsticket_spamcheckid', null, 'jsticket_checkspamcalc'), '', 'post');
$session->clear('jsticket_rot13', 'jsticket_checkspamcalc');
$session->clear('jsticket_spamcheckid', 'jsticket_checkspamcalc');
$session->clear('jsticket_spamcheckresult', 'jsticket_checkspamcalc');
if (!is_numeric($spamcheckresult) || $spamcheckresult != $spamcheck) {
return false; // Failed
}
}
// Hidden field
$type_hidden = 0;
if ($type_hidden) {
$hidden_field = $session->get('hidden_field', null, 'checkspamcalc');
$session->clear('hidden_field', 'checkspamcalc');
if (JFactory::getApplication()->input->get($hidden_field, '', 'post')) {
return false; // Hidden field was filled out - failed
}
}
// Time lock
$type_time = 0;
if ($type_time) {
$time = $session->get('time', null, 'checkspamcalc');
$session->clear('time', 'checkspamcalc');
if (time() - $this->params->get('type_time_sec') <= $time) {
return false; // Submitted too fast - failed
}
}
// Own Question
// Conversion to lower case
$session->clear('ip', 'jsticket_checkspamcalc');
$session->clear('saved_data', 'jsticket_checkspamcalc');
return true;
}
function getLatestReplyByTicketId($id) {
if (!is_numeric($id))
return false;
$db = JFactory::getDBO();
$query = "SELECT reply.message FROM `#__js_ticket_replies` AS reply WHERE reply.ticketid = " . $id . " ORDER BY reply.created DESC LIMIT 1";
$db->setQuery($query);
$message = $db->loadResult();
return $message;
}
function getFileSizeAndExtensions() {
$file = array();
$db = $this->getDBO();
$query = "SELECT * FROM `#__js_ticket_config` WHERE configname ='filesize' OR configname='fileextension'";
$db->setQuery($query);
$result = $db->loadObjectList();
foreach ($result AS $res) {
if ($res->configname == 'filesize') {
$file['filesize'] = $res->configvalue;
} elseif ($res->configname == 'fileextension') {
$file['fileextension'] = $res->configvalue;
}
}
return json_encode($file);
}
function saveResponceAJAX($id,$responce){
if($id) if(!is_numeric($id)) return false;
$user = JSSupportticketCurrentUser::getInstance();
$per = $user->checkUserPermission('Edit Ticket');
if ($per == false) return PERMISSION_ERROR;
$row = $this->getTable('replies');
$data['id'] = $id;
//$data['message'] = JFactory::getApplication()->input->get('message', '', 'raw');
$data['message'] = $responce;
if (!$row->bind($data)){
$this->setError($row->getError());
return SENT_ERROR;
}
if (!$row->check()){
$this->setError($row->getError());
return SENT_ERROR;
}
if (!$row->store()){
$this->setError($row->getError());
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
return SENT_ERROR;
}
return SENT;
}
function editResponceAJAX($id){
$db = $this->getDBO();
if($id) if(!is_numeric($id)) return false;
$query = "SELECT message FROM `#__js_ticket_replies` WHERE id = ".$id;
$db->setQuery( $query );
$row = $db->loadObject();
$editor = JFactory::getConfig()->get('editor');
$editor = JEditor::getInstance($editor);
if(isset($row)){
//$return_value = $editor->display("editor_responce_$id", $row->message, '550', '300', '60', '20', false);
$return_value = $editor->display("editor_responce_$id", $row->message, "600", "400", "80", "15", 1, null, null, null, array('mode' => 'advanced'));
}else{
$return_value = $editor->display('editor_responce_'.$id, '', '550', '300', '60', '20', false);
}
$return_value .= '<br />
<input type="button" class="tk_dft_btn" value="'.JText::_('Post Reply').'" onclick="saveResponce('.$id.')">
<input type="button" class="tk_dft_btn" value="'.JText::_('Close').'" onclick="closeResponce('.$id.')">';
return $return_value;
}
function deleteResponceAJAX($id){
if($id) if(!is_numeric($id)) return false;
$user = JSSupportticketCurrentUser::getInstance();
$per = $user->checkUserPermission('Delete Ticket');
if ($per == false) return PERMISSION_ERROR;
$row = $this->getTable('replies');
if (!$row->delete($id)){
$this->setError($row->getErrorMsg());
return SENT_ERROR;
}
return SENT;
}
function getDownloadAttachmentById($id){
if(!is_numeric($id)) return false;
$db = JFactory::getDbo();
$query = "SELECT ticket.id AS ticketid,attach.filename,ticket.attachmentdir AS foldername "
. " FROM `#__js_ticket_attachments` AS attach "
. " JOIN `#__js_ticket_tickets` AS ticket ON ticket.id = attach.ticketid "
. " WHERE attach.id = $id";
$db->setQuery($query);
$object = $db->loadObject();
$ticketid = $object->ticketid;
$filename = $object->filename;
$foldername = $object->foldername;
$download = false;
$user = JFactory::getUser();
if(!$user->guest){
if(JFactory::getApplication()->isClient('administrator')){
$download = true;
}else{
if($this->getJSModel('staff')->isUserStaff()){
$download = true;
}else{
if($this->getJSModel('ticket')->validateTicketDetailForUser($ticketid)){
$download = true;
}
}
}
}else{ // user is visitor
$download = $this->getJSModel('ticket')->validateTicketDetailForVisitor($ticketid);
}
if($download == true){
$datadirectory = $this->getJSModel('config')->getConfigurationByName('data_directory');
$base = JPATH_BASE;
if(JFactory::getApplication()->isClient('administrator')){
$base = substr($base, 0, strlen($base) - 14); //remove administrator
}
$path = $base.'/'.$datadirectory;
$path = $path . '/attachmentdata';
$path = $path . '/ticket/' . $foldername;
$file = $path . '/' . $filename;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit();
}else{
throw new Exception(JText::_('Page not found'),404);
exit;
}
}
function getAllDownloadFiles() {
$downloadid = JFactory::getApplication()->input->get('id');
$ticketattachment = $this->getAttachmentByTicketId($downloadid);
if(!class_exists('PclZip')){
require_once('administrator/components/com_jssupportticket/include/lib/pclzip.lib.php');
}
$config = $this->getJSModel('config')->getConfigs();
$path = JPATH_BASE.'/'.$config['data_directory'];
$path .= '/zipdownloads';
$this->getJSModel('attachments')->makeDir($path);
$randomfolder = $this->getRandomFolderName($path);
$path .= '/' . $randomfolder;
$this->getJSModel('attachments')->makeDir($path);
$archive = new PclZip($path . '/alldownloads.zip');
$arr = array();
foreach ($ticketattachment AS $ticketattachments) {
$directory = JPATH_BASE .'/'. $config['data_directory'] . '/attachmentdata/ticket/' . $ticketattachments->attachmentdir . '/';
// $scanned_directory = array_diff(scandir($directory), array('..', '.'));
array_push($scanned_directory,$ticketattachments->filename);
$arr[] = $ticketattachments->filename;
}
$scanned_directory = array_diff(scandir($directory), array('..', '.'));
$scanned_directory = array_diff(scandir($directory), array('..', '.','index.html'));
$filelist = '';
foreach ($scanned_directory AS $file) {
if(in_array($file,$arr)){
$filelist .= $directory . '/' . $file . ',';
}
}
$filelist = substr($filelist, 0, strlen($filelist) - 1);
$v_list = $archive->create($filelist, PCLZIP_OPT_REMOVE_PATH, $directory);
if ($v_list == 0) {
die("Error : '" . $archive->errorInfo() . "'");
}
$file = $path . '/alldownloads.zip';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
@unlink($file);
/*$path = jssupportticket::$_path;
$path .= 'zipdownloads';
$path .= '/' . $randomfolder;*/
@unlink($path . '/index.html');
rmdir($path);
exit();
}
function getAllReplyDownloadsFiles() {
$downloadid = JFactory::getApplication()->input->get('id');
$replyattachment = $this->getAttachmentByReplyId($downloadid);
if(!class_exists('PclZip')){
require_once('administrator/components/com_jssupportticket/include/lib/pclzip.lib.php');
}
$config = $this->getJSModel('config')->getConfigs();
$path = JPATH_BASE.'/'.$config['data_directory'];
$path .= '/zipdownloads';
$this->getJSModel('attachments')->makeDir($path);
$randomfolder = $this->getRandomFolderName($path);
$path .= '/' . $randomfolder;
$this->getJSModel('attachments')->makeDir($path);
$archive = new PclZip($path . '/alldownloads.zip');
$arr=array();
foreach ($replyattachment AS $replyattachments) {
$directory = JPATH_BASE .'/'. $config['data_directory'] . '/attachmentdata/ticket/' . $replyattachments->attachmentdir . '/';
// $scanned_directory = array_diff(scandir($directory), array('..', '.'));
array_push($scanned_directory,$replyattachments->filename);
$arr[] = $replyattachments->filename;
}
$scanned_directory = array_diff(scandir($directory), array('..', '.'));
$scanned_directory = array_diff(scandir($directory), array('..', '.','index.html'));
$filelist = '';
foreach ($scanned_directory AS $file) {
if(in_array($file,$arr)){
$filelist .= $directory . '/' . $file . ',';
}
}
$filelist = substr($filelist, 0, strlen($filelist) - 1);
$v_list = $archive->create($filelist, PCLZIP_OPT_REMOVE_PATH, $directory);
if ($v_list == 0) {
die("Error : '" . $archive->errorInfo() . "'");
}
$file = $path . '/alldownloads.zip';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
@unlink($file);
/*$path = jssupportticket::$_path;
$path .= 'zipdownloads';
$path .= '/' . $randomfolder;*/
@unlink($path . '/index.html');
rmdir($path);
exit();
}
function getDownloadAttachmentByName($file_name,$id){
if(empty($file_name)) return false;
if(!is_numeric($id)) return false;
$db = JFactory::getDbo();
$file_name = basename($file_name);
$filename = str_replace(' ', '_',$file_name);
$query = "SELECT attachmentdir FROM `#__js_ticket_tickets` WHERE id = ".$id;
$db->setQuery($query);
$foldername = $db->loadResult();
$datadirectory = $this->getJSModel('config')->getConfigurationByName('data_directory');
$base = JPATH_BASE;
if(JFactory::getApplication()->isClient('administrator')){
$base = substr($base, 0, strlen($base) - 14); //remove administrator
}
$path = $base.'/'.$datadirectory;
$path = $path . '/attachmentdata';
$path = $path . '/ticket/' . $foldername;
$file = $path . '/' . $filename;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
//ob_clean();
flush();
readfile($file);
exit();
exit;
}
function validateTicketDetailForUser($id) {
if (!is_numeric($id))
return false;
$session = JFactory::getApplication()->getSession();
$db = JFactory::getDbo();
$query = "SELECT uid,email FROM `#__js_ticket_tickets` WHERE id = " . $id;
$db->setQuery($query);
$ticket = $db->loadObject();
$user_id = JFactory::getUser();
$user = JSSupportticketCurrentUser::getInstance();
if(!empty($ticket->uid)){
if (($ticket->uid == $user_id->id) || ( $ticket->uid == 0 && $ticket->email == $user->getEmail() ) ) {// seoncd check to handle tickets created as visitor using email of a logged in member
return true;
}else{
$session->set('ticketuserid',$ticket->uid);
return false;
}
}
}
function validateTicketDetailForVisitor($id) {
$session = JFactory::getApplication()->getSession();
$ticketid = $session->get('userticketid');
$ticketid = $this->getJSModel('ticket')->getIdFromTrackingId($ticketid);
if ($ticketid == $id) {
return true;
} else {
return false;
}
}
function validateTicketDetailForStaff($ticketid) {
if (!is_numeric($ticketid))
return false;
// check in assign department
$user = JSSupportticketCurrentUser::getInstance();
$db = JFactory::getDbo();
$query = "SELECT ticket.id FROM `#__js_ticket_tickets` AS ticket
JOIN `#__js_ticket_acl_user_access_departments` AS dept ON ticket.departmentid = dept.departmentid
JOIN `#__js_ticket_staff` AS staff ON dept.staffid = staff.id AND staff.uid = " . $user->getId() . "
WHERE ticket.id = " . $ticketid;
$db->setQuery($query);
$id = $db->loadResult();
if ($id) {
return true;
} else {
// check in assign ticket
$query = "SELECT ticket.id FROM `#__js_ticket_tickets` AS ticket
JOIN `#__js_ticket_staff` AS staff ON ticket.staffid = staff.id AND staff.uid = " . $user->getId(). "
WHERE ticket.id = " . $ticketid;
$db->setQuery($query);
$id = $db->loadResult();
if ($id)
return true;
else
return false;
}
}
// new
function uploadFileCustom($id,$field){
if(! is_numeric($id))
return;
$db = JFactory::getDbo();
$config = $this->getJSModel('config')->getConfigByFor('default');
$model_attachment = $this->getJSModel('attachments');
if ($_FILES[$field]['size'] > 0) {
$file_name = str_replace(' ', '_', $_FILES[$field]['name']);
$file_tmp = $_FILES[$field]['tmp_name']; // actual location
}else{
return;
}
$file_size = $config['filesize'];
if($_FILES[$field]['size'] > ($file_size * 1024)){
return;
}
if ($file_name != "" AND $file_tmp != "") {
$is_allow = $model_attachment->checkExtension($file_name);
if($is_allow == 'N'){
return;
}
}
$datadirectory = $config['data_directory'];
$base = JPATH_BASE;
if(JFactory::getApplication()->isClient('administrator')){
$base = substr($base, 0, strlen($base) - 14); //remove administrator
}
$path = $base.'/'.$datadirectory;
if (!file_exists($path)){ // create user directory
$model_attachment->makeDir($path);
}
$path = $path . '/attachmentdata';
if (!file_exists($path)){ // create user directory
$model_attachment->makeDir($path);
}
$path = $path . '/ticket';
if (!file_exists($path)){ // create user directory
$model_attachment->makeDir($path);
}
$query = "SELECT attachmentdir FROM `#__js_ticket_tickets` WHERE id = ".$id;
$db->setQuery($query);
$foldername = $db->loadResult();
$userpath = $path . '/' . $foldername;
if (!file_exists($userpath)) { // create user directory
$model_attachment->makeDir($userpath);
}
move_uploaded_file($file_tmp, $userpath . '/' . $file_name);
/*
//Override the record and delete the old file if exists
$query = "SELECT params FROM `#__js_ticket_tickets` WHERE id = ".$id;
$db->setQuery($query);
$params = $db->loadResult();
$p_array = json_decode($params,true);
//Remove old file if exists
$old_file = $p_array[$field];
if(file_exists($userpath . '/' . $old_file)){
unlink($userpath . '/' . $old_file);
}
//--------------------------
$p_array[$field] = $file_name;
$params = json_encode($p_array);
$query = "UPDATE `#__js_ticket_tickets` SET params = '".$params."' WHERE id = ".$id;
$db->setQuery($query);
$db->execute();
*/
return;
}
function removeFileCustom($id, $key){
$filename = str_replace(' ', '_', $key);
if(! is_numeric($id))
return;
$db = JFactory::getDbo();
$config = $this->getJSModel('config')->getConfigByFor('default');
$datadirectory = $config['data_directory'];
$base = JPATH_BASE;
if(JFactory::getApplication()->isClient('administrator')){
$base = substr($base, 0, strlen($base) - 14); //remove administrator
}
$path = $base . '/' . $datadirectory. '/attachmentdata/ticket';
$query = "SELECT attachmentdir FROM `#__js_ticket_tickets` WHERE id = ".$id;
$db->setQuery($query);
$foldername = $db->loadResult();
$userpath = $path . '/' . $foldername.'/'.$filename;
unlink($userpath);
return;
}
/// ...
function getReplyDataByID() {
$db = JFactory::getDbo();
$replyid = JFactory::getApplication()->input->get('val');
if(!is_numeric($replyid)) return false;
$query = "SELECT reply.id AS replyid, reply.message AS message
FROM `#__js_ticket_replies` AS reply
WHERE reply.id = " . $replyid ;
$db->setQuery($query);
$lastreply = $db->loadObject();
return json_encode($lastreply);
}
function editReply($data) {
$db = JFactory::getDbo();
if (empty($data))
return false;
//$desc = JFactory::getApplication()->input->get( 'jsticket_replytext', '', 'post','string', JREQUEST_ALLOWHTML ); // use jsticket_message to avoid conflict
$desc = JFactory::getApplication()->input->get('jsticket_replytext', '', 'raw');
$query = "UPDATE `#__js_ticket_replies` SET message = " . $db->Quote($desc) . " WHERE id = " . $data['reply-replyid']; $db->setQuery($query);
$db->execute();
return REPLY_EDITED;
}
function getTimeByReplyID() {
$db = JFactory::getDbo();
$replyid = JFactory::getApplication()->input->get('val');
if(!is_numeric($replyid)) return false;
$query = "SELECT time.usertime, time.conflict, time.description,time.systemtime
FROM `#__js_ticket_staff_time` AS time
WHERE time.referencefor = 1 AND time.referenceid = " . $replyid ;
$db->setQuery($query);
$stime = $db->loadObject();
$result['time'] = '';
$result['desc'] = '';
$result['conflict'] = '';
$result['systemtime'] = '';
if(!empty($stime)){
$hours = floor($stime->usertime / 3600);
$mins = floor($stime->usertime / 60 % 60);
$secs = floor($stime->usertime % 60);
$shours = floor($stime->systemtime / 3600);
$smins = floor($stime->systemtime / 60 % 60);
$ssecs = floor($stime->systemtime % 60);
$result['time'] = sprintf('%02d:%02d:%02d', $hours, $mins, $secs);
$result['desc'] = $stime->description == '' ? ' ' : $stime->description ;
$result['conflict'] = $stime->conflict;
$result['systemtime'] = sprintf('%02d:%02d:%02d', $shours, $smins, $ssecs);
}
return json_encode($result);
}
function editTime($data) {// for reply
$db = JFactory::getDbo();
if (empty($data))
return false;
// confilct resolution handling
if($data['time-confilct'] == 1){
if($data['time-confilct-combo'] == 1){
$up_query = ' , conflict = 0';
}
}else{
$up_query = '';
}
//$data['edit_reason'] = JFactory::getApplication()->input->get( 'edit_reason', '', 'post','string', JREQUEST_ALLOWHTML ); // use jsticket_message to avoid conflict
$data['edit_reason'] = JFactory::getApplication()->input->get('edit_reason', '', 'raw');
$query = "SELECT id FROM `#__js_ticket_staff_time` WHERE referencefor = 1 AND referenceid = " . $data['reply-replyid'];
$db->setQuery($query);
$id = $db->loadResult();
$edited_time = $data['edited_time'];
$timearray = explode(':', $edited_time);
if(!isset($timearray[0]) || !isset($timearray[1]) || !isset($timearray[2])){
$seconds = 0;
}else{
if(is_numeric($timearray[0]) && is_numeric($timearray[1]) && is_numeric($timearray[2])){
$seconds = ($timearray[0] * 3600) + ($timearray[1] * 60) + $timearray[2];
}else{
return;
}
}
if($seconds < 0){
return;
}
if($id > 0){
$query = "UPDATE `#__js_ticket_staff_time` SET usertime = " . $seconds .$up_query . ",description = '".$data['edit_reason']."' WHERE referencefor = 1 AND referenceid = " . $data['reply-replyid'];
$db->setQuery($query);
$db->execute($query);
}else{
$query = "SELECT staffid,ticketid FROM `#__js_ticket_replies` WHERE id = " . $data['reply-replyid'];
$db->setQuery($query);
$reply = $db->loadObject();
$created = date('Y-m-d H:i:s');
$row = $this->getTable('stafftime');
$data2['ticketid'] = $reply->ticketid;
$data2['staffid'] = $reply->staffid;
$data2['referencefor'] = 1;
$data2['referenceid'] = $data['reply-replyid'];
$data2['usertime'] = $seconds;
$data2['systemtime'] = 0;
$data2['conflict'] = 0;
$data2['description'] = $data['edit_reason'];
$data2['status'] = 1;
$data2['created'] = $created;
if (!$row->bind($data2)) {
$this->setError($row->getError());
return;
}
if (!$row->check()) {
$this->setError($row->getError());
return;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
return;
}
}
return TIME_EDITED;
}
function editTimeForNote($data) {// for Note
$db = JFactory::getDbo();
if (empty($data))
return false;
// confilct resolution handling
if($data['time-confilct'] == 1){
if($data['time-confilct-combo'] == 1){
$up_query = ' , conflict = 0';
}
}else{
$up_query = '';
}
//$data['edit_reason'] = JFactory::getApplication()->input->get( 't_desc', '', 'post','string', JREQUEST_ALLOWHTML ); // use jsticket_message to avoid conflict
$data['edit_reason'] = JFactory::getApplication()->input->get('t_desc', '', 'raw');
$query = "SELECT id FROM `#__js_ticket_staff_time` WHERE referencefor = 2 AND referenceid = " . $data['note-noteid'];
$db->setQuery($query);
$id = $db->loadResult();
$edited_time = $data['edited_time'];
$timearray = explode(':', $edited_time);
if(!isset($timearray[0]) || !isset($timearray[1]) || !isset($timearray[2])){
$seconds = 0;
}else{
if(is_numeric($timearray[0]) && is_numeric($timearray[1]) && is_numeric($timearray[2])){
$seconds = ($timearray[0] * 3600) + ($timearray[1] * 60) + $timearray[2];
}else{
return;
}
}
if($seconds < 0){
return;
}
if($id > 0){
$query = "UPDATE `#__js_ticket_staff_time` SET usertime = " . $seconds .$up_query . ",description = '".$data['edit_reason']."' WHERE referencefor = 2 AND referenceid = " . $data['note-noteid'];
$db->setQuery($query);
$db->execute($query);
}else{
$query = "SELECT staffid,ticketid FROM `#__js_ticket_notes` WHERE id = " . $data['note-noteid'];
$db->setQuery($query);
$reply = $db->loadObject();
$created = date('Y-m-d H:i:s');
$row = $this->getTable('stafftime');
$data2['ticketid'] = $reply->ticketid;
$data2['staffid'] = $reply->staffid;
$data2['referencefor'] = 2;
$data2['referenceid'] = $data['note-noteid'];
$data2['usertime'] = $seconds;
$data2['systemtime'] = 0;
$data2['conflict'] = 0;
$data2['description'] = $data['edit_reason'];
$data2['status'] = 1;
$data2['created'] = $created;
if (!$row->bind($data2)) {
$this->setError($row->getError());
return;
}
if (!$row->check()) {
$this->setError($row->getError());
return;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
return;
}
}
return TIME_EDITED;
}
function getTicketsForMerging(){
$db = JFactory::getDbo();
$user = JSSupportticketCurrentUser::getInstance();
$ticketlimit = JFactory::getApplication()->input->get('ticketlimit', null, 0);
$id = JFactory::getApplication()->input->get('ticketid');
$name = JFactory::getApplication()->input->getString('name');
$email = JFactory::getApplication()->input->getString('email');
$maxrecorded = 4;
$wherequery = '';
if (strlen($name) > 1) {
$name = trim($name);
$wherequery .= " AND ticket.subject LIKE ".$db->quote('%'.$name.'%');
}
if (strlen($email) > 1) {
$email = trim($email);
$wherequery .= " AND ticket.email LIKE ".$db->quote('%'.$email.'%');
}
$status = 1;
$tickets = array();
if($user->getIsGuest())
$status = 0;
if($status == 1){
$query = "SELECT ticket.id, ticket.subject, ticket.ticketid,department.departmentname AS departmentname,ticket.name, ticket.created,ticket.uid,ticket.email,priority.priority as priorityname, priority.prioritycolour,staff.photo as staffphoto, staff.id as staffid
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
INNER JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
LEFT JOIN `#__js_ticket_staff` AS staff ON staff.uid = ticket.uid
WHERE ticket.id=" .$id;
$db->setQuery($query);
$ticketdetail = $db->loadObject();
if($ticketdetail->uid != 0){
$wherequery .= " AND ticket.uid = " .$ticketdetail->uid;
}else{
$wherequery .= " AND ticket.email = '" .$ticketdetail->email ."'";
}
$query = "SELECT COUNT(ticket.id)
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
INNER JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id";
$query .= " WHERE ticket.status != 4 AND ticket.mergestatus != 1 AND ticket.id !=" .$id;
$query .= $wherequery;
$db->setQuery($query);
$total = $db->loadResult();
$limit = $ticketlimit * $maxrecorded;
if ($limit >= $total) {
$limit = 0;
}
$query = "SELECT ticket.id, ticket.ticketid, ticket.subject, ticket.email, department.departmentname AS departmentname, ticket.name as username, ticket.created,priority.priority as priorityname,priority.prioritycolour, staff.photo as staffphoto, staff.id as staffid
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
INNER JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
LEFT JOIN `#__js_ticket_staff` AS staff ON staff.uid = ticket.uid";
$query .= " WHERE ticket.id !=" .$id;
$query .= " AND ticket.status != 4 AND ticket.mergestatus != 1";
$query .= $wherequery;
$query .= " LIMIT $limit, $maxrecorded";
$db->setQuery($query);
$tickets = $db->loadObjectList();
}
$html = $this->makeTicketList($tickets, $total, $maxrecorded, $ticketlimit,$ticketdetail,$email,$name);
return array("status"=>$status,"data"=>$html);
}
function getLatestReplyForMerging(){
$user = JSSupportticketCurrentUser::getInstance();
$secondaryid = JFactory::getApplication()->input->get('secondaryid');
$primaryid = JFactory::getApplication()->input->get('primaryid');
$primaryticket = $this->getTicketNameById($primaryid);
$secondaryticket = $this->getTicketNameById($secondaryid);
$latestreply = strip_tags($this->getLatestReplyByTicketId($secondaryid));
$secondarymessage = JText::_('Ticket Has Been Closed Due To Merged With').' '.$primaryticket;
$primarymessage = JText::_('Ticket').' '.$secondaryticket.' '.JText::_('Has Been merged into').' '.$primaryticket;
$secondaryticketdata = $this->getTicketDataForMerge($secondaryid);
$primaryticketdata = $this->getTicketDataForMerge($primaryid);
$html = $this->makeTicketMergeView($latestreply,$primaryid,$secondaryid,$primarymessage,$secondarymessage,$secondaryticketdata,$primaryticketdata);
return $html;
}
function getTicketDataForMerge($id){
if(!is_numeric($id)) return false;
$db = JFactory::getDbo();
$query = "SELECT ticket.id, ticket.subject, ticket.ticketid,department.departmentname AS departmentname,ticket.name, ticket.created,ticket.uid,ticket.email,priority.priority as priorityname, priority.prioritycolour,staff.photo as staffphoto, staff.id as staffid
FROM `#__js_ticket_tickets` AS ticket
LEFT JOIN `#__js_ticket_departments` AS department ON ticket.departmentid = department.id
INNER JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
LEFT JOIN `#__js_ticket_staff` AS staff ON staff.uid = ticket.uid
WHERE ticket.id=" .$id;
$db->setQuery($query);
$ticketdata=$db->loadObject();
return $ticketdata;
}
function makeTicketList($tickets, $total, $maxrecorded, $ticketlimit,$ticketdata,$email,$name) {
$datadirectory = $this->getJSModel('config')->getConfigurationByName('data_directory');
$html ='
<div class="jsst-popup-header">
<div class="popup-header-text">
'.JText::_("Merge Ticket").'
</div>
<div class="popup-header-close-img" id="close-pop"></div>
</div>
<div id="js-ticket-merge-ticket-wrp">
<div class="js-ticket-merge-ticket-wrapper">
<div class="js-col-xs-12 js-col-md-12 js-ticket-wrapper js-ticket-merge-white-bg">
<div class="js-col-xs-12 js-col-md-12 js-ticket-toparea">
<div class="js-col-md-2 js-col-xs-12 js-ticket-pic">';
if ($ticketdata->staffphoto){
$html .='<img class="js-ticket-staff-img" src=" '. JURI::root(). $datadirectory . "/staffdata/staff_" . $ticketdata->staffid . "/" . $ticketdata->staffphoto .' ">';
}else {
$html .='<img class="js-ticket-staff-img" src="' . JURI::root().'components/com_jssupportticket/include/images/user.png" />';
}; $html .='
</div>
<div class="js-col-md-6 js-col-xs-6 js-ticket-data js-nullpadding">
<div class="js-col-md-12 js-col-xs-12 js-ticket-padding-xs js-ticket-body-data-elipses subject">
<span class="js-ticket-title">
'.JText::_('Subject').JText::_(':').' : 
</span>
<a class="js-ticket-merge-ticket-title">' .$ticketdata->subject.' </a>
</div>
<div class="js-col-md-12 js-col-xs-12 js-ticket-padding-xs js-ticket-body-data-elipses">
<span class="js-ticket-title">' .JText::_('From').JText::_(':').' : </span>
<span class="js-ticket-value" style="cursor:pointer;">'. $ticketdata->name.'</span>
</div>
<div class="js-col-md-12 js-col-xs-12 js-ticket-padding-xs js-ticket-body-data-elipses">
<span class="js-ticket-title">' .JText::_('Department').JText::_(':').' : </span>
<span class="js-ticket-value" style="cursor:pointer;">'.$ticketdata->departmentname.'</span>
</div>
</div>
<div class="js-col-md-4 js-col-xs-4 js-ticket-data1 js-ticket-padding-left-xs">
<div class="js-row">
<div class="js-col-md-6 js-col-xs-3">'.JText::_('Ticket ID').JText::_(' : # ').'</div>
<div class="js-col-md-6 js-col-xs-6">'. $ticketdata->id.'</div>
</div>
<div class="js-row">
<div class="js-col-md-6 js-col-xs-3">'.JText::_('Created').JText::_(' : ').'</div>
<div class="js-col-md-6 js-col-xs-6">'.date( "Y-m-d", strtotime($ticketdata->created)).'</div>
</div>
<div class="js-row">
<div class="js-col-md-6 js-col-xs-3">'.JText::_('Priority').JText::_(' : ').'</div>
<div class="js-col-md-6 js-col-xs-6"><span class="js-ticket-wrapper-textcolor" style="background:' .$ticketdata->prioritycolour.'">'.JText::_($ticketdata->priorityname).'</span></div>
</div>
</div>
</div>
</div>
</div>
<div class="js-tickets-list-wrp">
<form id="ticketpopupsearch" class="js-popup-search">
<div class="js-col-md-12 js-form-wrapper jsst-form-wrapper">
<div class="js-col-md-12 js-form-title js-merge-form-title js-bold-text">'. JText::_('Search Ticket to merge into') . '</div>
<div class="js-merge-form-wrp">
<div class="js-form-value js-merge-form-value"><input class="inputbox js-merge-field" id="name" type="text" name="name" placeholder='.JText::_("Username").'/></div>
<div class="js-form-value js-merge-form-value"><input class="inputbox js-merge-field" id="email" type="text" name="email" placeholder='.JText::_("Email").' /></div>
</div>
<div class="js-merge-form-btn-wrp">
<span class="js-merge-btn"><input type="submit" value=' . JText::_('Search') . ' class="button js-merge-button js-search" /></span>
<span class="js-merge-btn"><input type="submit" value=' . JText::_('Reset') . ' onclick="formField()" class="button js-merge-button js-cancel" /></span>
</div>
</div>
</form>
<div class="js-col-md-12 js-view-tickets">';
if (!empty($tickets)) {
if (is_array($tickets)) {
foreach ($tickets AS $ticket) {
$html .= '
<div class="js-col-xs-12 js-col-md-12 js-ticket-wrapper js-merge-ticket-overlay js-ticket-merge-white-bg">
<div class="js-col-xs-12 js-col-md-12 js-ticket-toparea">
<div class="js-col-xs-2 js-col-md-2 js-ticket-pic">';
if ($ticket->staffphoto){
$html .='<img class="js-ticket-staff-img" src=" '. JURI::root(). $datadirectory . "/staffdata/staff_" . $ticket->staffid . "/" . $ticket->staffphoto .' ">';
}else {
$html .='<img class="js-ticket-staff-img" src="' . JURI::root().'components/com_jssupportticket/include/images/user.png" />';
};
$html .='</div>
<div class="js-col-xs-6 js-col-md-6 js-col-xs-6 js-ticket-data js-nullpadding">
<div class="js-col-xs-12 js-col-md-12 js-ticket-padding-xs js-ticket-body-data-elipses subject">
<span class="js-ticket-title">
'.JText::_('Subject').': : 
</span>
<a class="js-ticket-merge-ticket-title">' .$ticket->subject.' </a>
</div>
<div class="js-col-xs-12 js-col-md-12 js-ticket-padding-xs js-ticket-body-data-elipses">
<span class="js-ticket-title">' .JText::_('From').': : </span>
<span class="js-ticket-value" style="cursor:pointer;">'. $ticket->username.'</span>
</div>
<div class="js-col-xs-12 js-col-md-12 js-ticket-padding-xs js-ticket-body-data-elipses">
<span class="js-ticket-title">' .JText::_('Department').': : </span>
<span class="js-ticket-value" style="cursor:pointer;">'.$ticket->departmentname.'</span>
</div>
</div>
<div class="js-col-xs-4 js-col-md-4 js-ticket-data1 js-ticket-padding-left-xs">
<div class="js-row">
<div class="js-col-xs-6 js-col-md-6 js-col-xs-3">'.JText::_("Ticket ID").JText::_(" : ").'</div>
<div class="js-col-xs-6 js-col-md-6 js-col-xs-6">'. $ticket->id.'</div>
</div>
<div class="js-row">
<div class="js-col-xs-6 js-col-md-6 js-col-xs-3">'.JText::_('Created').JText::_(': ').'</div>
<div class="js-col-xs-6 js-col-md-6 js-col-xs-6">'.date( "Y-m-d", strtotime($ticket->created)).'</div>
</div>
<div class="js-row">
<div class="js-col-xs-6 js-col-md-6 js-col-xs-3">'.JText::_('Priority').JText::_(': ').'</div>
<div class="js-col-xs-6 js-col-md-6 js-col-xs-6"><span class="js-ticket-wrapper-textcolor" style="background:' .$ticket->prioritycolour.'">'. JText::_($ticket->priorityname).'</span></div>
</div>
</div>
</div>
<div class="js-over-lay">
<a href="#" class="js-merge-btn" onclick=getmergeticketid('.$ticketdata->id.','.$ticket->id.')>'. JText::_("Select").'</a>
</div>
</div>';
}
}
}else {
$html .= messageslayout::getRecordNotFound(1);
}
$html .= '</div>';
$num_of_pages = ceil($total / $maxrecorded);
$num_of_pages = ($num_of_pages > 0) ? ceil($num_of_pages) : floor($num_of_pages);
if($num_of_pages > 0){
$page_html = '';
$prev = $ticketlimit;
if($prev > 0){
$page_html .= '<a class="jsst_userlink" href="#" onclick="updateticketlist('.($prev - 1).','.$ticketdata->id.');">'.JText::_('Previous').'</a>';
}
for($i = 0; $i < $num_of_pages; $i++){
if($i == $ticketlimit)
$page_html .= '<span class="jsst_userlink selected" >'.($i + 1).'</span>';
else
$page_html .= '<a class="jsst_userlink" href="#" onclick="updateticketlist('.$i.','.$ticketdata->id.');">'.($i + 1).'</a>';
}
$next = $ticketlimit + 1;
if($next < $num_of_pages){
$page_html .= '<a class="jsst_userlink js-text-align-right" href="#" onclick="updateticketlist('.$next.','.$ticketdata->id.');">'.JText::_('Next').'</a>';
}
if($page_html != ''){
$html .= '<div class="jsst_userpages">'.$page_html.'</div>';
}
}
$html .='</div>
<div class="js-col-md-12 js-form-button-wrapper js-form-button-wrapper-merge">
<input id="close-pop" type="button" onclick="closePopup()" value=' . JText::_('Cancel') . ' class="button js-merge-cancel-btn" />
<input type="hidden" id="ticketidformerge" value="'.$ticketdata->id.'" />
</div>
</div>';
return $html;
}
function makeTicketMergeView($latestmessage,$primaryid,$secondaryid,$primarymessage,$secondarymessage,$secondaryticketdata,$primarywithticketdata){
if (!empty($secondaryticketdata)) {
$html ='
<form id="jsst-ticket-merge-form" method="post">
<div class="js-ticket-merge-ticket-wrapper">
<div class="js-col-xs-12 js-col-md-12 js-ticket-wrapper js-ticket-merge-white-bg">
<div class="js-col-xs-12 js-col-md-12 js-ticket-toparea">
<div class="js-col-md-2 js-col-xs-12 js-ticket-pic">';
if ($secondaryticketdata->staffphoto){
$html .='<img class="js-ticket-staff-img" src=" '. JURI::root(). $datadirectory . "/staffdata/staff_" . $secondaryticketdata->staffid . "/" . $secondaryticketdata->staffphoto .' ">';
}else {
$html .='<img class="js-ticket-staff-img" src="' . JURI::root().'components/com_jssupportticket/include/images/user.png" />';
}; $html .='
</div>
<div class="js-col-md-6 js-col-xs-6 js-ticket-data js-nullpadding">
<div class="js-col-md-12 js-col-xs-12 js-ticket-padding-xs js-ticket-body-data-elipses subject">
<span class="js-ticket-title">
'.JText::_('Subject').': : 
</span>
<a class="js-ticket-merge-ticket-title">' .$secondaryticketdata->subject.' </a>
</div>
<div class="js-col-md-12 js-col-xs-12 js-ticket-padding-xs js-ticket-body-data-elipses">
<span class="js-ticket-title">' .JText::_('From').': : </span>
<span class="js-ticket-value" style="cursor:pointer;">'. $secondaryticketdata->name.'</span>
</div>
<div class="js-col-md-12 js-col-xs-12 js-ticket-padding-xs js-ticket-body-data-elipses">
<span class="js-ticket-title">' .JText::_('Department').': : </span>
<span class="js-ticket-value" style="cursor:pointer;">'.$secondaryticketdata->departmentname.'</span>
</div>
</div>
<div class="js-col-md-4 js-col-xs-4 js-ticket-data1 js-ticket-padding-left-xs">
<div class="js-row">
<div class="js-col-md-6 js-col-xs-6">'.JText::_('Ticket ID').' : # '.'</div>
<div class="js-col-md-6 js-col-xs-6">'. $secondaryticketdata->id.'</div>
</div>
<div class="js-row">
<div class="js-col-md-6 js-col-xs-6">'.JText::_('Created').': '.'</div>
<div class="js-col-md-6 js-col-xs-6">'.date( "Y-m-d", strtotime($secondaryticketdata->created)).'</div>
</div>
<div class="js-row">
<div class="js-col-md-6 js-col-xs-6">'.JText::_('Priority').': '.'</div>
<div class="js-col-md-6 js-col-xs-6"><span class="js-ticket-wrapper-textcolor" style="background:' .$secondaryticketdata->prioritycolour.'">'. JText::_($secondaryticketdata->priorityname).'</span></div>
</div>
</div>
</div>
</div>
<div class="js-edit-msg-field-wrp">
<span class="js-edit-msg-heading">' .JText::_('Edit Last Reply'). '</span>
<textarea class="inputbox js-merge-field" id="mergeticketid" name="secondarymessage" cols="" rows="3" >'.$secondarymessage.'</textarea>
</div>
</div>';
}
if (!empty($primarywithticketdata)) {
$html .='
<div class="js-col-md-12 js-view-tickets js-view-last-tickets">
<span class="js-heading js-heading-text">'. JText::_('Merge Ticket Latest Reply') . '</span>
<div class="js-col-xs-12 js-col-md-12 js-ticket-wrapper js-ticket-merge-white-bg">
<div class="js-col-xs-12 js-col-md-12 js-ticket-toparea">
<div class="js-col-xs-2 js-col-md-2 js-ticket-pic">';
if ($primarywithticketdata->staffphoto){;
$html .='<img class="js-ticket-staff-img" src=" '. JURI::root(). $datadirectory . "/staffdata/staff_" . $primarywithticketdata->staffid . "/" . $primarywithticketdata->staffphoto .' ">';
}else {
$html .='<img class="js-ticket-staff-img" src="' . JURI::root().'components/com_jssupportticket/include/images/user.png" />';
};
$html .='</div>
<div class="js-col-md-6 js-col-xs-6 js-ticket-data js-nullpadding">
<div class="js-col-md-12 js-col-xs-12 js-ticket-padding-xs js-ticket-body-data-elipses subject">
<span class="js-ticket-title">
'.JText::_('Subject').': : 
</span>
<a class="js-ticket-merge-ticket-title">' .$primarywithticketdata->subject.' </a>
</div>
<div class="js-col-md-12 js-col-xs-12 js-ticket-padding-xs js-ticket-body-data-elipses">
<span class="js-ticket-title">' .JText::_('From').': : </span>
<span class="js-ticket-value" style="cursor:pointer;">'. $primarywithticketdata->name.'</span>
</div>
<div class="js-col-md-12 js-col-xs-12 js-ticket-padding-xs js-ticket-body-data-elipses">
<span class="js-ticket-title">' .JText::_('Department').': : </span>
<span class="js-ticket-value" style="cursor:pointer;">'.$primarywithticketdata->departmentname.'</span>
</div>
</div>
<div class="js-col-md-4 js-col-xs-4 js-ticket-data1 js-ticket-padding-left-xs">
<div class="js-row">
<div class="js-col-md-6 js-col-xs-6">'.JText::_('Ticket ID').' : # '.'</div>
<div class="js-col-md-6 js-col-xs-6">'. $primarywithticketdata->id.'</div>
</div>
<div class="js-row">
<div class="js-col-md-6 js-col-xs-6">'.JText::_('Created').': '.'</div>
<div class="js-col-md-6 js-col-xs-6">'.date( "Y-m-d", strtotime($primarywithticketdata->created)).'</div>
</div>
<div class="js-row">
<div class="js-col-md-6 js-col-xs-6">'.JText::_('Priority').': '.'</div>
<div class="js-col-md-6 js-col-xs-6"><span class="js-ticket-wrapper-textcolor" style="background:' .$primarywithticketdata->prioritycolour.'">'. JText::_($primarywithticketdata->priorityname).'</span></div>
</div>
</div>
</div>
</div>
<div class="js-edit-msg-field-wrp">
<span class="js-edit-msg-heading">' .JText::_('Edit Last Reply'). '</span>
<textarea class="inputbox js-merge-field" id="primaryid" name="primarymessage" cols="" rows="3" >'.$primarymessage."\r\n\r\n".$latestmessage.'</textarea>
</div>';
$html .=' </div>';
}
$html .='
<div class="js-col-md-12 js-form-button-wrapper js-form-button-wrapper-merge">
<input type="submit" value=' . JText::_('Merge') . ' class="button js-merge-save-btn"/>
</div>
<input type="hidden" name="c" id="c" value="ticket" />
<input type="hidden" name="view" id="view" value="ticket" />
<input type="hidden" name="layout" id="layout" value="ticketdetail" />
<input type="hidden" name="task" id="task" value="mergeticket" />
<input type="hidden" name="primaryticket" id="primaryticket" value="'.$primaryid.'" />
<input type="hidden" name="secondaryticket" id="secondaryticket" value="'.$secondaryid.'" />
'.JHtml::_('form.token').'
</form>';
return $html;
}
function storeMergeTicket($arraydata){
if(empty($arraydata))
return false;
$db = JFactory::getDbo();
$data = array();
$user = JSSupportticketCurrentUser::getInstance();
$staffid = $user->getStaffId();
if($arraydata['primaryticket'] == $arraydata['secondaryticket']){
return SAVE_ERROR;
}
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE mergestatus = 1 AND (status = 5 OR status = 4) AND id=" .$arraydata['secondaryticket'];
$db->setQuery($query);
$result = $db->loadResult();
if($result == 0){
$curdate = date('Y-m-d H:i:s');
$user = JSSupportticketCurrentUser::getInstance();
$uname = $user->getName();
$multimerge = array($arraydata['secondaryticket']);
$query = "SELECT multimergeparams FROM `#__js_ticket_tickets` WHERE id =" .$arraydata['primaryticket'];
$db->setQuery($query);
$array = $db->loadResult();
if(empty($array)){
$mergeticketvalues[] = array("uid" => $user->getId(), "mergedate" => $curdate, "ticketid" => $arraydata['secondaryticket']);
$array = json_encode($mergeticketvalues);
}else{
$mergeticketvalues = array("uid" => $user->getId(), "mergedate" => $curdate, "ticketid" => $arraydata['secondaryticket']);
$array = json_decode($array);
array_push($array, $mergeticketvalues);
$array = json_encode($array);
}
$data['id'] = $arraydata['secondaryticket'];
$data['mergestatus'] = 1;
$data['mergedate'] = $curdate;
$data['mergewith'] = $arraydata['primaryticket'];
$data['status'] = 5;
$data['mergeuid'] = $user->getId();
$data['update'] = $curdate;
$data['overdue'] = 0;
$status = 1;
$row = $this->getTable('tickets');
if (!$row->bind($data)) {
$this->setError($row->getError());
die($row->getError());
$status = 0;
}
if(!$data['id'])
if (!$row->check($data)) {
$this->setError($row->getError());
die($row->getError());
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$status = 0;
}
$data = array();
$data['id'] = $arraydata['primaryticket'];
$data['multimergeparams'] = $array;
$data['update'] = $curdate;
$row = $this->getTable('tickets');
if (!$row->bind($data)) {
$this->setError($row->getError());
$status = 0;
}
if(!$data['id'])
if (!$row->check()) {
$this->setError($row->getError());
$status = 0;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$status = 0;
}
$secondaryurl = JText::_('<a class="js-ticket-merge-link" href="index.php?option=com_jssupportticket&c=ticket&layout=ticketdetail&id='.$arraydata['secondaryticket'].'">#'.$arraydata['secondaryticket'].'</a>');
$primaryurl = JText::_('<a class="js-ticket-merge-link" href="index.php?option=com_jssupportticket&c=ticket&layout=ticketdetail&id='.$arraydata['primaryticket'].'">#'.$arraydata['primaryticket'].'</a>');
$secondarymessage = $arraydata['secondarymessage'].'('.$primaryurl.')';
$primarymessage = $arraydata['primarymessage'].'('.$secondaryurl.')';
$status = $this->storeMergeTicketReplies(htmlspecialchars($secondarymessage),$arraydata['secondaryticket'],$staffid);
$status = $this->storeMergeTicketReplies(htmlspecialchars($primarymessage),$arraydata['primaryticket'],$staffid);
}else{
$status = 0;
}
if($status == 1){
return SAVED;
}elseif($status == 0){
return SAVE_ERROR;
}
}
function storeMergeTicketReplies($reply,$ticketid,$staffid){
if(!is_string($reply))
return false;
$user = JSSupportticketCurrentUser::getInstance();
$uname = $user->getName();
$row = $this->getTable('replies');
$data['ticketid'] = $ticketid;
$data['staffid'] = $staffid;
$data['name'] = $uname;
$data['message'] = $reply;
$data['status'] = 1;
$data['created'] = date('Y-m-d H:i:s');
$data['mergemessage'] = 1;
$return_value = 1;
if (!$row->bind($data)) {
$this->setError($row->getError());
$return_value = 0;
}
if (!$row->check()) {
$this->setError($row->getError());
$return_value = 0;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getError());
$this->setError($row->getError());
$return_value = 0;
}
return $return_value;
}
function removeTicketReplies($ticketid) {
if(!is_numeric($ticketid)) return false;
$db = $this->getDBo();
$query = "DELETE FROM `#__js_ticket_replies` WHERE ticketid = ".$ticketid;
$db->setQuery($query);
$db->execute($query);
return;
}
static function generateHash($id){
if(!is_numeric($id))
return null;
return base64_encode(json_encode(base64_encode($id)));
}
function getUserMyTicketsForCP() {
$db = $this->getDBO();
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsGuest())
return false;
$query = "SELECT ticket.id AS ticketid,ticket.subject,ticket.name,ticket.status,ticket.created,dep.departmentname AS departmentname, priority.priority AS priority, priority.prioritycolour AS prioritycolour,
concat(staff.firstname,' ',staff.lastname) AS staffname
FROM `#__js_ticket_tickets` AS ticket
JOIN `#__js_ticket_priorities` AS priority ON ticket.priorityid = priority.id
LEFT JOIN `#__js_ticket_departments` AS dep ON ticket.departmentid = dep.id
LEFT JOIN `#__js_ticket_staff` AS staff ON ticket.staffid = staff.id
WHERE ticket.uid = " .$user->getId();
$query .= " ORDER BY ticket.created DESC";
$db->setQuery($query,0,4);
$result = $db->loadObjectList(); //Tickets
return $result;
}
function getDefaultTicketSorting($value=2){ // 2 for query
$ticketsorting = $this->getJSModel('config')->getConfigurationByName('tickets_sorting');
if($ticketsorting == 1){
$sort = "ASC";
}else{
$sort = "DESC";
}
if($value == 1) // 1 for showing value in html
$sort = strtolower($sort);
return $sort;
}
function getUserRemainMaxticket(){
$uid = $this->_jinput->post->get('uid' , 0);
if($uid == 0){
$user = JSSupportticketCurrentUser::getInstance();
if($user->getIsStaff())
return false;
$uid = $user->getId();
}
if(!is_numeric($uid))
return false;
$db = $this->getDbo();
$config_ticket = $this->getJSModel('config')->getConfigByFor('default');
$maxticketinterval = $config_ticket['maximum_ticket_interval_time'];
switch($maxticketinterval){
case "1": // maximum ticket in a day
$checkdate = " AND date(created) = " . $db->quote(date('Y-m-d'));
$msg = JText::_("The maximum remaining ticket(s) in a day is %s .");
break;
case "2": // maximum ticket in month
$checkdate = " AND MONTH(created) = " . $db->quote(date('m',strtotime(date('Y-m-d'))));
$msg = JText::_("The maximum remaining ticket(s) in a month is %s .");
break;
case "3": // maximum ticket in year
$checkdate = " AND YEAR(created) = " . $db->quote(date('Y',strtotime(date('Y-m-d'))));
$msg = JText::_("The maximum remaining ticket(s) in a year is %s .");
break;
case "4": // maximum ticket in life time
$checkdate = "";
$msg = JText::_("The maximum remaining ticket(s) are %s .");
break;
}
$query = "SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE uid = " . $uid . $checkdate; // ticket not answer and not closed
$db->setQuery($query);
$total = $db->loadResult();
$ticketperemail = $config_ticket['maximum_ticket'];
if ($total >= $ticketperemail) {
$remaining = 0;
}else{
$remaining = $ticketperemail - $total;
}
$msg = sprintf($msg , $remaining);
$html = '
<div class="alert alert-success">
<a class="close" data-dismiss="alert">×</a>
<h4 class="alert-heading">Message</h4>
<div>
<div class="alert-message">'. $msg .'</div>
</div>
</div>
';
return $html;
}
}
?>