Exemplo n.º 1
0
 function SaveField()
 {
     if (!$this->ValidateUser()) {
         return $this->noPermission();
     }
     $ticketid = FSS_Input::getInt('ticketid');
     $savefield = FSS_Input::getInt('savefield');
     $model = $this->getModel();
     $ticket = $model->getTicket($ticketid);
     $user = JFactory::getUser();
     $userid = $user->get('id');
     $uids = $model->getUIDS($userid);
     //print_r($uids);
     if (!array_key_exists($ticket['user_id'], $uids)) {
         $this->ticket = $ticket;
         $this->getCCInfo();
         // doesnt have permission to view, check cc list
         if (!array_key_exists("cc", $ticket)) {
             return $this->noPermission();
         }
         $found = false;
         foreach ($ticket['cc'] as &$user) {
             if ($user['id'] == $userid) {
                 $found = true;
             }
         }
         if (!$found) {
             return $this->noPermission();
         }
     }
     $this->GetTicketPerms($ticket);
     if (!$ticket['can_edit']) {
         return $this->noPermission();
     }
     $this->fields = FSSCF::GetCustomFields($ticketid, $ticket['prod_id'], $ticket['ticket_dept_id']);
     list($old, $new) = FSSCF::StoreField($savefield, $ticketid, $ticket);
     if ($old != $new) {
         $field = FSSCF::GetField($savefield);
         if ($this->CanEditField($field)) {
             if ($field->type == 'checkbox') {
                 if ($old == "") {
                     $old = "No";
                 }
                 if ($old == "on") {
                     $old = "Yes";
                 }
                 if ($new == "") {
                     $new = "No";
                 }
                 if ($new == "on") {
                     $new = "Yes";
                 }
             }
             $this->AddTicketAuditNote($ticketid, "Custom field '" . $field->description . "' changed from '" . $old . "' to '" . $new . "'");
         }
     }
     //FSSCF::StoreFields($this->fields, $ticketid);
     // forward with what=
     /*$mainframe = JFactory::getApplication();
     		$link = FSSRoute::_('&what=new_status=new_pri=',false);
     		$mainframe->redirect($link);
     		*/
     echo "<script>parent.window.location.reload();</script>";
     exit;
     return true;
 }
Exemplo n.º 2
0
 function updateCustomField($fieldid, $value, $max_permission = 3)
 {
     // TODO: Dont like how this works, needs the field data to be stored in the class object!
     if (empty($this->fields)) {
         $this->fields = FSSCF::GetCustomFields($this->id, $this->prod_id, $this->ticket_dept_id, $max_permission);
     }
     list($old, $new) = FSSCF::StoreField($fieldid, $this->id, $this, $value);
     if ($old != $new) {
         $field = FSSCF::GetField($fieldid);
         if ($field->type == 'checkbox') {
             if ($old == "") {
                 $old = "No";
             }
             if ($old == "on") {
                 $old = "Yes";
             }
             if ($new == "") {
                 $new = "No";
             }
             if ($new == "on") {
                 $new = "Yes";
             }
         }
         $this->addAuditNote("Custom field '" . $field->description . "' changed from '" . $old . "' to '" . $new . "'");
         $this->updateLastUpdated();
         SupportActions::DoAction_Ticket("updateCustomField", $this, array('field_id' => $fieldid, 'old' => $old, 'new' => $new));
     }
 }
Exemplo n.º 3
0
 function &getTickets()
 {
     $db = JFactory::getDBO();
     $user = JFactory::getUser();
     $userid = $user->get('id');
     $uidlist = $this->getUIDS($userid);
     $tidlist = $this->getTIDS($userid);
     $query = "SELECT t.*, s.title as status, s.color, u.name, au.name as assigned, u.email as useremail, u.username as username, au.email as handleremail, au.username as handlerusername, ";
     $query .= " dept.title as department, cat.title as category, prod.title as product, pri.title as priority, pri.color as pricolor, ";
     $query .= " grp.groupname as groupname, grp.id as group_id ";
     $query .= " , pri.translation as ptl, dept.translation as dtr, s.translation as str, cat.translation as ctr, prod.translation as prtr";
     $query .= " FROM #__fss_ticket_ticket as t ";
     $query .= " LEFT JOIN #__fss_ticket_status as s ON t.ticket_status_id = s.id ";
     $query .= " LEFT JOIN #__users as u ON t.user_id = u.id ";
     $query .= " LEFT JOIN #__users as au ON t.admin_id = au.id ";
     $query .= " LEFT JOIN #__fss_ticket_dept as dept ON t.ticket_dept_id = dept.id ";
     $query .= " LEFT JOIN #__fss_ticket_cat as cat ON t.ticket_cat_id = cat.id ";
     $query .= " LEFT JOIN #__fss_prod as prod ON t.prod_id = prod.id ";
     $query .= " LEFT JOIN #__fss_ticket_pri as pri ON t.ticket_pri_id = pri.id ";
     $query .= " LEFT JOIN (SELECT group_id, user_id FROM #__fss_ticket_group_members GROUP BY user_id) as mem ON t.user_id = mem.user_id ";
     $query .= " LEFT JOIN #__fss_ticket_group as grp ON grp.id = mem.group_id ";
     // add product, department and category
     $query .= " WHERE ( t.user_id IN (" . implode(", ", $uidlist) . ") OR t.id IN (" . implode(", ", $tidlist) . ") ) ";
     $query .= " AND " . SupportSource::user_list_sql();
     $tickets = FSS_Input::getCmd('tickets', 'open');
     if (FSS_Settings::get('support_simple_userlist_tabs')) {
         $tickets = "all";
     }
     if (FSS_Input::getCmd('search_all')) {
         $tickets = "";
     }
     if ($tickets == 'open') {
         $allopen = FSS_Ticket_Helper::GetStatusIDs("is_closed", true);
         // tickets that arent closed
         $query .= " AND ticket_status_id IN ( " . implode(", ", $allopen) . ") ";
     }
     if ($tickets == 'closed') {
         $allopen = FSS_Ticket_Helper::GetStatusIDs("is_closed");
         // remove the archived tickets from the list to deal with
         $def_archive = FSS_Ticket_Helper::GetStatusID('def_archive');
         foreach ($allopen as $offset => $value) {
             if ($value == $def_archive) {
                 unset($allopen[$offset]);
             }
         }
         // tickets that are closed
         $query .= " AND ticket_status_id IN ( " . implode(", ", $allopen) . ") ";
     } else {
         if ($tickets > 0) {
             $statuss = SupportHelper::getStatuss(false);
             $status_list = array();
             $status_list[] = (int) $tickets;
             foreach ($statuss as $status) {
                 if ($status->combine_with == (int) $tickets) {
                     $status_list[] = $status->id;
                 }
             }
             $query .= " AND ticket_status_id IN (" . implode(", ", $status_list) . ")";
         }
     }
     $search = FSS_Input::getString('search');
     if ($search != "") {
         FSS_Helper::AllowCache();
         // We have the nearly full query here, so use it to get a list of ticket ids
         $db->setQuery($query);
         $recs = $db->loadObjectList();
         $ids = array();
         $ids[] = 0;
         foreach ($recs as $rec) {
             $ids[] = $rec->id;
         }
         $mode = "";
         if (FSS_Helper::contains($search, array('*', '+', '-', '<', '>', '(', ')', '~', '"'))) {
             $mode = "IN BOOLEAN MODE";
         }
         $msgsrch = "SELECT ticket_ticket_id FROM #__fss_ticket_messages WHERE ticket_ticket_id IN (" . implode(", ", $ids) . ") AND admin < 3 AND ";
         $msgsrch .= " MATCH (body) AGAINST ('" . $db->escape($search) . "' {$mode}) ";
         $db->setQuery($msgsrch);
         $results = $db->loadObjectList();
         $ids = array();
         $ids[] = 0;
         foreach ($results as $rec) {
             $ids[] = $rec->ticket_ticket_id;
         }
         // search custom fields that are set to be searched
         $fields = FSSCF::GetAllCustomFields(true);
         foreach ($fields as $field) {
             if (!$field["basicsearch"]) {
                 continue;
             }
             if ($field['permissions'] > 1 && $field['permissions'] < 5) {
                 continue;
             }
             $fieldid = $field['id'];
             if ($field['type'] == "checkbox") {
                 if ($search == "1") {
                     $search = "on";
                 } else {
                     $search = "";
                 }
             }
             if ($field['peruser']) {
                 continue;
             }
             if ($field['type'] == "plugin") {
                 // try to do a plugin based search
                 $data = array();
                 foreach ($field['values'] as $item) {
                     list($key, $value) = explode("=", $item, 2);
                     $data[$key] = $value;
                 }
                 if (array_key_exists("plugin", $data)) {
                     $plugins = FSSCF::get_plugins();
                     if (array_key_exists($data['plugin'], $plugins)) {
                         $po = $plugins[$data['plugin']];
                         if (method_exists($po, "Search")) {
                             $res = $po->Search($data['plugindata'], $search, false, false);
                             if ($res !== false) {
                                 foreach ($res as $item) {
                                     $ids[] = (int) $item->ticket_id;
                                 }
                                 continue;
                             }
                         }
                     }
                 }
             }
             $qry = "SELECT ticket_id FROM #__fss_ticket_field WHERE field_id = '" . FSSJ3Helper::getEscaped($db, $fieldid) . "' AND value LIKE '%" . FSSJ3Helper::getEscaped($db, $search) . "%'";
             $db->setQuery($qry);
             $data = $db->loadObjectList();
             foreach ($data as $item) {
                 $id = (int) $item->ticket_id;
                 if ($id > 0) {
                     $ids[] = $id;
                 }
             }
         }
         //"MATCH (question, answer) AGAINST ('" . $db->escape($search) . "')"
         $query .= " AND ( t.id IN (" . implode(", ", $ids) . ") OR MATCH (t.title) AGAINST ('" . $db->escape($search) . "' {$mode}) OR t.reference LIKE '%" . $db->escape($search) . "%' ) ";
     }
     $order = FSS_Input::getCmd('order');
     $order_dir = FSS_Input::getCmd('order_dir', 'asc');
     $order_dir_allowed = array('asc', 'desc');
     if (!in_array($order_dir, $order_dir_allowed)) {
         $order_dir = 'asc';
     }
     $order_allowed = array('t.title', 'lastupdate', 'status', 'assigned', 'lastupdate', 'u.name');
     if (!in_array($order, $order_allowed)) {
         $order = '';
     }
     if ($order != "") {
         $query .= " ORDER BY {$order} {$order_dir}";
     } else {
         $query .= " ORDER BY lastupdate DESC ";
     }
     $mainframe = JFactory::getApplication();
     $limit = $mainframe->getUserStateFromRequest('global.list.limit_ticket', 'limit', FSS_Settings::Get('ticket_per_page'), 'int');
     $limitstart = FSS_Input::getInt('limitstart');
     $limitstart = $limit != 0 ? floor($limitstart / $limit) * $limit : 0;
     $db->setQuery($query);
     $db->query();
     //echo $query . "<br>";
     $count = $db->getNumRows();
     $result['pagination'] = new JPaginationJs($count, $limitstart, $limit);
     $db->setQuery($query, $limitstart, $limit);
     $result['tickets'] = $db->loadObjectList();
     foreach ($result['tickets'] as &$ticket) {
         $fields = FSSCF::GetCustomFields($ticket->id, $ticket->prod_id, $ticket->ticket_dept_id);
         $values = FSSCF::GetTicketValues($ticket->id, $ticket);
         $ticket->fields = array();
         foreach ($fields as &$field) {
             $ticket->fields[$field['id']] = array();
             $ticket->fields[$field['id']]['name'] = $field['description'];
             $ticket->fields[$field['id']]['value'] = '';
             if (isset($values[$field['id']])) {
                 $ticket->fields[$field['id']]['value'] = $values[$field['id']]['value'];
             }
         }
     }
     return $result;
 }
Exemplo n.º 4
0
 function doReply()
 {
     $this->ticketid = FSS_Input::getInt('ticketid');
     $this->ticket = new SupportTicket();
     if (!$this->ticket->load($this->ticketid)) {
         return JError::raiseWarning(404, JText::_('Ticket not found'));
     }
     $this->ticket->loadAll();
     if (FSS_Settings::get('time_tracking') != "") {
         if (FSS_Settings::get('time_tracking_type') == 'se') {
             $this->time_start = FSS_Helper::Date(time(), FSS_DATE_CUSTOM, "H:i:s");
             $this->time_end = FSS_Helper::Date(time(), FSS_DATE_CUSTOM, "H:i:s");
         } elseif (FSS_Settings::get('time_tracking_type') == 'tm') {
             $this->time_start = FSS_Helper::Date(time(), FSS_DATE_CUSTOM, FSS_Helper::getFormat());
             $this->time_end = FSS_Helper::Date(time(), FSS_DATE_CUSTOM, FSS_Helper::getFormat());
         } else {
             $this->taken_hours = 0;
             $this->taken_mins = 0;
         }
     }
     if (FSS_Settings::get('time_tracking') == "auto") {
         $session = JFactory::getSession();
         $taken = $session->get('ticket_' . $this->ticket->id . "_opened");
         if (FSS_Settings::get('time_tracking_type') == 'se') {
             $document = JFactory::getDocument();
             $document->addScript(JURI::root() . 'components/com_fss/assets/js/bootstrap/bootstrap-timepicker.min.js');
             $document->addScriptDeclaration("jQuery(document).ready(function () {jQuery('#timetaken_start').timepicker({minuteStep:5, showMeridian: false});jQuery('#timetaken_end').timepicker({minuteStep:5, showMeridian: false});});");
             $this->time_start = FSS_Helper::Date($taken, FSS_DATE_CUSTOM, "H:i:s");
         } else {
             if ($taken > 0) {
                 $taken = time() - $taken;
             }
             $this->time_taken = $taken;
             $taken = ceil($taken / 60);
             $this->taken_hours = floor($taken / 60);
             $this->taken_mins = $taken % 60 + 1;
         }
     }
     $this->fields = FSSCF::GetCustomFields($this->ticket->id, $this->ticket->prod_id, $this->ticket->ticket_dept_id, 3);
     $this->fieldvalues = FSSCF::GetTicketValues($this->ticket->id, $this->ticket);
     $pathway = JFactory::getApplication()->getPathway();
     $pathway->addItem(JText::_("SUPPORT"), FSSRoute::_('index.php?option=com_fss&view=admin_support&tickets=' . $this->ticket_view, false));
     $pathway->addItem(JText::_("VIEW_TICKET") . " : " . $this->ticket->reference . " - " . $this->ticket->title, FSSRoute::_('index.php?option=com_fss&view=admin_support&tickets=' . $this->ticket_view . "&ticketid=" . $this->ticket->id, false));
     $this->reply_type = FSS_Input::getCmd('type', 'reply');
     if ($this->reply_type == "") {
         $this->reply_type = "reply";
     }
     switch ($this->reply_type) {
         case 'reply':
             $this->reply_title = "REPLY_TO_SUPORT_TICKET";
             $this->reply_button = "POST_REPLY";
             $pathway->addItem(JText::_("POST_REPLY"));
             break;
         case 'private':
             $this->reply_title = "ADD_HANDLER_COMMENT_TO_TICKET";
             $this->reply_button = "POST_COMMENT";
             $pathway->addItem(JText::_("ADD_COMMENT"));
             break;
         case 'user':
             $this->reply_title = "FORWARD_TICKET_TO_A_DIFFERENT_USER";
             $this->reply_button = "FORWARD_TICKET";
             if ($this->ticket->user_id > 0) {
                 $user = JFactory::getUser($this->ticket->user_id);
             } else {
                 $user = new stdClass();
                 $user->username = $this->ticket->email;
                 $user->name = $this->ticket->unregname;
             }
             $this->user = $user;
             $pathway->addItem(JText::_("FORWARD_TO_USER"));
             break;
         case 'product':
             $this->reply_title = "FORWARD_TICKET_TO_A_DIFFERENT_DEPARTMENT";
             $this->reply_button = "FORWARD_TICKET";
             $this->handlers = SupportUsers::getHandlers(false, true);
             $pathway->addItem(JText::_("FORWARD_TO_DEPARTMENT"));
             break;
         case 'handler':
             $this->reply_title = "FORWARD_TICKET_TO_A_DIFFERENT_HANDLER";
             $this->reply_button = "FORWARD_TICKET";
             $this->handlers = SupportUsers::getHandlers(false, true);
             $pathway->addItem(JText::_("FORWARD_TO_HANDLER"));
             break;
     }
     $this->draft = FSS_Input::getInt('draft');
     $this->user_message = $this->loadDraft($this->draft);
     $this->support_assign_reply = FSS_Settings::get('support_assign_reply');
     FSS_Helper::IncludeModal();
     FSS_Helper::AddSCEditor();
     parent::_display();
 }
Exemplo n.º 5
0
 function saveTicket()
 {
     $name = "";
     $db = JFactory::getDBO();
     $ok = true;
     $this->errors['subject'] = '';
     $this->errors['body'] = '';
     $this->errors['cat'] = '';
     if (FSS_Settings::get('support_subject_message_hide') == "subject") {
         $ticket->subject = substr(strip_tags($ticket->body), 0, 40);
     } else {
         if ($ticket->subject == "") {
             $this->errors['subject'] = JText::_("YOU_MUST_ENTER_A_SUBJECT_FOR_YOUR_SUPPORT_TICKET");
             $ok = false;
         }
     }
     if (FSS_Settings::get('support_altcat')) {
         $cats = $this->get('Cats');
         if (count($cats) > 0 && $catid == 0) {
             $this->errors['cat'] = JText::_("YOU_MUST_SELECT_A_CATEGORY");
             $ok = false;
         }
     }
     if ($body == "" && FSS_Settings::get('support_subject_message_hide') != "message") {
         $this->errors['body'] = JText::_("YOU_MUST_ENTER_A_MESSAGE_FOR_YOUR_SUPPORT_TICKET");
         $ok = false;
     }
     $fields = FSSCF::GetCustomFields(0, $prodid, $deptid);
     if (!FSSCF::ValidateFields($fields, $this->errors)) {
         $ok = false;
     }
     $email = "";
     $password = "";
     $now = FSS_Helper::CurDate();
     if ($ok) {
         /*$admin_id = FSS_Ticket_Helper::AssignHandler($prodid, $deptid, $catid);
         			
         			$now = FSS_Helper::CurDate();
         			
         			$def_open = FSS_Ticket_Helper::GetStatusID('def_open');
         			
         			$qry = "INSERT INTO #__fss_ticket_ticket (reference, ticket_status_id, ticket_pri_id, ticket_cat_id, ticket_dept_id, prod_id, title, opened, lastupdate, user_id, admin_id, email, password, unregname, lang) VALUES ";
         			$qry .= "('', $def_open, '".FSSJ3Helper::getEscaped($db, $priid)."', '".FSSJ3Helper::getEscaped($db, $catid)."', '".FSSJ3Helper::getEscaped($db, $deptid)."', '".FSSJ3Helper::getEscaped($db, $prodid)."', '".FSSJ3Helper::getEscaped($db, $subject)."', '{$now}', '{$now}', '".FSSJ3Helper::getEscaped($db, $userid)."', '".FSSJ3Helper::getEscaped($db, $admin_id)."', '{$email}', '".FSSJ3Helper::getEscaped($db, $password)."', '{$name}', '".JFactory::getLanguage()->getTag()."')";
         			
         
         			$db->setQuery($qry);$db->Query();
         			$this->ticketid = $db->insertid();
         			
         			$ref = FSS_Ticket_Helper::createRef($this->ticketid);
         
         			$qry = "UPDATE #__fss_ticket_ticket SET reference = '".FSSJ3Helper::getEscaped($db, $ref)."' WHERE id = '" . FSSJ3Helper::getEscaped($db, $this->ticketid) . "'";  
         			$db->setQuery($qry);$db->Query();
         
         
         			$qry = "INSERT INTO #__fss_ticket_messages (ticket_ticket_id, subject, body, user_id, posted) VALUES ('";
         			$qry .= FSSJ3Helper::getEscaped($db, $this->ticketid) . "','".FSSJ3Helper::getEscaped($db, $subject)."','".FSSJ3Helper::getEscaped($db, $body)."','".FSSJ3Helper::getEscaped($db, $userid)."','{$now}')";
         			
         			$db->setQuery($qry);$db->Query();
         			$messageid = $db->insertid();
         			
         			FSSCF::StoreFields($fields,$this->ticketid);
         			
         			
         			$files = array();
         			// save any uploaded file
         			
         			for ($i = 1; $i < 10; $i++)
         			{
         				$file = JRequest::getVar('filedata_' . $i, '', 'FILES', 'array');
         				if (array_key_exists('error',$file) && $file['error'] == 0 && $file['name'] != '')
         				{
         					$destpath = JPATH_COMPONENT_SITE.DS.'files'.DS.'support'.DS;					
         					$destname = md5(mt_rand(0,999999).'-'.$file['name']); 
         					
         					while (JFile::exists($destpath . $destname))
         					{
         						$destname = md5(mt_rand(0,999999).'-'.$file['name']);               
         					}
         					
         					if (JFile::upload($file['tmp_name'], $destpath . $destname))
         					{
         						$qry = "INSERT INTO #__fss_ticket_attach (ticket_ticket_id, filename, diskfile, size, user_id, added, message_id) VALUES ('";
         						$qry .= FSSJ3Helper::getEscaped($db, $this->ticketid) . "',";
         						$qry .= "'" . FSSJ3Helper::getEscaped($db, $file['name']) . "',";
         						$qry .= "'" . FSSJ3Helper::getEscaped($db, $destname) . "',";
         						$qry .= "'" . $file['size'] . "',";
         						$qry .= "'" . FSSJ3Helper::getEscaped($db, $userid) . "',";
         						$qry .= "'{$now}', $messageid )";
         						
         						
         						$file_obj = new stdClass();
         						$file_obj->filename = $file['name'];
         						$file_obj->diskfile = $destname;
         						$file_obj->size = $file['size'];
         						$files[] = $file_obj;
         						
         						
         						$db->setQuery($qry);$db->Query();     
         					} else {
         						// ERROR : File cannot be uploaded! try permissions	
         					}
         				}
         			}
         			
         			$t = new SupportTicket();
         			$t->load($this->ticketid, true);
         			
         			$subject = JRequest::getVar('subject','','','string');
         			$body = JRequest::getVar('body','','','string', JREQUEST_ALLOWRAW);
         			
         			$action_name = "User_Open";
         			$action_params = array('subject' => $subject, 'user_message' => $body, 'files' => $files);
         			SupportActions::DoAction($action_name, $t, $action_params);*/
     }
     $this->errors = $errors;
     $this->ticket = $ticket;
     return $ok;
 }