You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
696 lines
27 KiB
PHP
696 lines
27 KiB
PHP
<?php
|
|
/*******************************************************************************
|
|
* Title: Help Desk Software HESK
|
|
* Version: 2.5.5 from 5th August 2014
|
|
* Author: Klemen Stirn
|
|
* Website: http://www.hesk.com
|
|
********************************************************************************
|
|
* COPYRIGHT AND TRADEMARK NOTICE
|
|
* Copyright 2005-2013 Klemen Stirn. All Rights Reserved.
|
|
* HESK is a registered trademark of Klemen Stirn.
|
|
|
|
* The HESK may be used and modified free of charge by anyone
|
|
* AS LONG AS COPYRIGHT NOTICES AND ALL THE COMMENTS REMAIN INTACT.
|
|
* By using this code you agree to indemnify Klemen Stirn from any
|
|
* liability that might arise from it's use.
|
|
|
|
* Selling the code for this program, in part or full, without prior
|
|
* written consent is expressly forbidden.
|
|
|
|
* Using this code, in part or full, to create derivate work,
|
|
* new scripts or products is expressly forbidden. Obtain permission
|
|
* before redistributing this software over the Internet or in
|
|
* any other medium. In all cases copyright and header must remain intact.
|
|
* This Copyright is in full effect in any country that has International
|
|
* Trade Agreements with the United States of America or
|
|
* with the European Union.
|
|
|
|
* Removing any of the copyright notices without purchasing a license
|
|
* is expressly forbidden. To remove HESK copyright notice you must purchase
|
|
* a license for this script. For more information on how to obtain
|
|
* a license please visit the page below:
|
|
* https://www.hesk.com/buy.php
|
|
*******************************************************************************/
|
|
|
|
define('IN_SCRIPT',1);
|
|
define('HESK_PATH','./');
|
|
define('HESK_NO_ROBOTS',1);
|
|
|
|
/* Get all the required files and functions */
|
|
require(HESK_PATH . 'hesk_settings.inc.php');
|
|
require(HESK_PATH . 'inc/common.inc.php');
|
|
hesk_load_database_functions();
|
|
|
|
hesk_session_start();
|
|
|
|
$hesk_error_buffer = array();
|
|
$do_remember = '';
|
|
$display = 'none';
|
|
|
|
/* Was this accessed by the form or link? */
|
|
$is_form = isset($_GET['f']) ? 1 : 0;
|
|
|
|
/* Get the tracking ID */
|
|
$trackingID = hesk_cleanID();
|
|
|
|
/* Email required to view ticket? */
|
|
$my_email = hesk_getCustomerEmail(1);
|
|
|
|
/* A message from ticket reminder? */
|
|
if ( ! empty($_GET['remind']) )
|
|
{
|
|
$display = 'block';
|
|
print_form();
|
|
}
|
|
|
|
/* Any errors? Show the form */
|
|
if ($is_form)
|
|
{
|
|
if ( empty($trackingID) )
|
|
{
|
|
$hesk_error_buffer[] = $hesklang['eytid'];
|
|
}
|
|
|
|
if ($hesk_settings['email_view_ticket'] && empty($my_email) )
|
|
{
|
|
$hesk_error_buffer[] = $hesklang['enter_valid_email'];
|
|
}
|
|
|
|
$tmp = count($hesk_error_buffer);
|
|
if ($tmp == 1)
|
|
{
|
|
$hesk_error_buffer = implode('',$hesk_error_buffer);
|
|
hesk_process_messages($hesk_error_buffer,'NOREDIRECT');
|
|
print_form();
|
|
}
|
|
elseif ($tmp == 2)
|
|
{
|
|
$hesk_error_buffer = $hesklang['pcer'].'<br /><br /><ul><li>'.$hesk_error_buffer[0].'</li><li>'.$hesk_error_buffer[1].'</li></ul>';
|
|
hesk_process_messages($hesk_error_buffer,'NOREDIRECT');
|
|
print_form();
|
|
}
|
|
}
|
|
elseif ( empty($trackingID) || ( $hesk_settings['email_view_ticket'] && empty($my_email) ) )
|
|
{
|
|
print_form();
|
|
}
|
|
|
|
/* Connect to database */
|
|
hesk_dbConnect();
|
|
|
|
/* Limit brute force attempts */
|
|
hesk_limitBfAttempts();
|
|
|
|
/* Get ticket info */
|
|
$res = hesk_dbQuery( "SELECT `t1`.* , `t2`.name AS `repliername`, `ticketStatus`.`IsClosed` AS `isClosed`, `ticketStatus`.`TicketViewContentKey` AS `statusKey` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` AS `t1` INNER JOIN `".hesk_dbEscape($hesk_settings['db_pfix'])."statuses` AS `ticketStatus` ON `t1`.`status` = `ticketStatus`.`ID` LEFT JOIN `".hesk_dbEscape($hesk_settings['db_pfix'])."users` AS `t2` ON `t1`.`replierid` = `t2`.`id` WHERE `trackid`='".hesk_dbEscape($trackingID)."' LIMIT 1");
|
|
|
|
/* Ticket found? */
|
|
if (hesk_dbNumRows($res) != 1)
|
|
{
|
|
/* Ticket not found, perhaps it was merged with another ticket? */
|
|
$res = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` WHERE `merged` LIKE '%#".hesk_dbEscape($trackingID)."#%' LIMIT 1");
|
|
|
|
if (hesk_dbNumRows($res) == 1)
|
|
{
|
|
/* OK, found in a merged ticket. Get info */
|
|
$ticket = hesk_dbFetchAssoc($res);
|
|
|
|
/* If we require e-mail to view tickets check if it matches the one from merged ticket */
|
|
if ( hesk_verifyEmailMatch($ticket['trackid'], $my_email, $ticket['email'], 0) )
|
|
{
|
|
hesk_process_messages( sprintf($hesklang['tme'], $trackingID, $ticket['trackid']) ,'NOREDIRECT','NOTICE');
|
|
$trackingID = $ticket['trackid'];
|
|
}
|
|
else
|
|
{
|
|
hesk_process_messages( sprintf($hesklang['tme1'], $trackingID, $ticket['trackid']) . '<br /><br />' . sprintf($hesklang['tme2'], $ticket['trackid']) ,'NOREDIRECT','NOTICE');
|
|
$trackingID = $ticket['trackid'];
|
|
print_form();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Nothing found, error out */
|
|
hesk_process_messages($hesklang['ticket_not_found'],'NOREDIRECT');
|
|
print_form();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* We have a match, get ticket info */
|
|
$ticket = hesk_dbFetchAssoc($res);
|
|
|
|
/* If we require e-mail to view tickets check if it matches the one in database */
|
|
hesk_verifyEmailMatch($trackingID, $my_email, $ticket['email']);
|
|
}
|
|
|
|
/* Ticket exists, clean brute force attempts */
|
|
hesk_cleanBfAttempts();
|
|
|
|
/* Remember email address? */
|
|
if ($is_form)
|
|
{
|
|
if ( ! empty($_GET['r']) )
|
|
{
|
|
setcookie('hesk_myemail', $my_email, strtotime('+1 year'));
|
|
$do_remember = ' checked="checked" ';
|
|
}
|
|
elseif ( isset($_COOKIE['hesk_myemail']) )
|
|
{
|
|
setcookie('hesk_myemail', '');
|
|
}
|
|
}
|
|
|
|
/* Set last replier name */
|
|
if ($ticket['lastreplier'])
|
|
{
|
|
if (empty($ticket['repliername']))
|
|
{
|
|
$ticket['repliername'] = $hesklang['staff'];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$ticket['repliername'] = $ticket['name'];
|
|
}
|
|
|
|
/* Get category name and ID */
|
|
$result = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` WHERE `id`='".intval($ticket['category'])."' LIMIT 1");
|
|
|
|
/* If this category has been deleted use the default category with ID 1 */
|
|
if (hesk_dbNumRows($result) != 1)
|
|
{
|
|
$result = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` WHERE `id`='1' LIMIT 1");
|
|
}
|
|
|
|
$category = hesk_dbFetchAssoc($result);
|
|
|
|
/* Get replies */
|
|
$result = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` WHERE `replyto`='".intval($ticket['id'])."' ORDER BY `id` ".($hesk_settings['new_top'] ? 'DESC' : 'ASC') );
|
|
$replies = hesk_dbNumRows($result);
|
|
$unread_replies = array();
|
|
|
|
// Demo mode
|
|
if ( defined('HESK_DEMO') )
|
|
{
|
|
$ticket['email'] = 'hidden@demo.com';
|
|
}
|
|
|
|
/* Print header */
|
|
require_once(HESK_PATH . 'inc/header.inc.php');
|
|
?>
|
|
|
|
<ol class="breadcrumb">
|
|
<li><a href="<?php echo $hesk_settings['site_url']; ?>"><?php echo $hesk_settings['site_title']; ?></a></li>
|
|
<li><a href="<?php echo $hesk_settings['hesk_url']; ?>"><?php echo $hesk_settings['hesk_title']; ?></a></li>
|
|
<li><a href="ticket.php"><?php echo $hesklang['view_ticket_nav']; ?></a></li>
|
|
<li class="active"><?php hesk_showTopBar($hesklang['cid'].': '.$trackingID); ?></li>
|
|
</ol>
|
|
|
|
<div class="row">
|
|
<div align="left" class="col-md-4">
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading"><?php echo $hesklang['quick_help']; ?></div>
|
|
<div class="panel-body">
|
|
<?php if ($hesk_settings['can_sel_lang']) { ?>
|
|
<div class="row">
|
|
<div class="col-md-6 col-xs-12">
|
|
<label class="control-label" style="margin-top:8px;"><?php echo $hesklang['changeLanguage']; ?></label>
|
|
</div>
|
|
<div class="col-md-6 col-xs-12">
|
|
<?php echo hesk_getLanguagesAsFormIfNecessary(); ?>
|
|
</div>
|
|
</div>
|
|
<?php } ?>
|
|
<p><?php echo $hesklang['quick_help_ticket']; ?></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-8">
|
|
<?php
|
|
/* This will handle error, success and notice messages */
|
|
hesk_handle_messages();
|
|
|
|
/*
|
|
* If the ticket has been reopened by customer:
|
|
* - show the "Add a reply" form on top
|
|
* - and ask them why the form has been reopened
|
|
*/
|
|
if (isset($_SESSION['force_form_top']))
|
|
{
|
|
hesk_printCustomerReplyForm(1);
|
|
echo ' <p> </p> ';
|
|
|
|
unset($_SESSION['force_form_top']);
|
|
}
|
|
?>
|
|
<h3 align="left"><?php echo $hesklang['view_ticket']; ?>: <?php
|
|
if ($hesk_settings['sequential'])
|
|
{
|
|
echo $trackingID.' ('.$hesklang['seqid'].': '.$ticket['id'].')';
|
|
}
|
|
else
|
|
{
|
|
echo $trackingID;
|
|
}
|
|
?></h3>
|
|
<div class="footerWithBorder"></div>
|
|
<div class="blankSpace"></div>
|
|
<div class="table-bordered">
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<h2><?php echo $ticket['subject']; ?></h2>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-md-3 col-sm-12">
|
|
<p><?php echo $hesklang['created_on']; ?>: <?php echo hesk_date($ticket['dt'], true); ?></p>
|
|
</div>
|
|
<div class="col-md-3 col-sm-12">
|
|
<p><?php echo $hesklang['last_update']; ?>: <?php echo hesk_date($ticket['lastchange'], true); ?></p>
|
|
</div>
|
|
<div class="col-md-2 col-md-offset-4 col-sm-12 close-ticket">
|
|
<p><?php $random=rand(10000,99999);
|
|
if ($ticket['isClosed'] == true && $ticket['locked'] != 1 && $hesk_settings['custopen']) {echo '<a href="change_status.php?track='.$trackingID.$hesk_settings['e_query'].'&s=2&Refresh='.$random.'&token='.hesk_token_echo(0).'" title="'.$hesklang['open_action'].'">'.$hesklang['open_action'].'</a>';}
|
|
else {echo '<a href="change_status.php?track='.$trackingID.$hesk_settings['e_query'].'&s=3&Refresh='.$random.'&token='.hesk_token_echo(0).'" title="'.$hesklang['close_action'].'">'.$hesklang['close_action'].'</a>';} ?></p>
|
|
</div>
|
|
</div>
|
|
<div class="row medLowPriority">
|
|
<?php //This entire conditional is all just for priority
|
|
if ($hesk_settings['cust_urgency'])
|
|
{
|
|
$repliesColumnWidth = 2;
|
|
echo '<div class="col-md-2 col-sm-12 ticket-cell ';
|
|
if ($ticket['priority'] == 0) {echo 'criticalPriority">';}
|
|
elseif ($ticket['priority'] == 1) {echo 'highPriority">';}
|
|
else {echo 'medLowPriority">';}
|
|
echo '<p class="ticketPropertyTitle">'.$hesklang['priority'].'</p>';
|
|
|
|
if ($ticket['priority']==0) {echo '<p class="ticketPropertyText">'.$hesklang['critical'].'</p>';}
|
|
elseif ($ticket['priority']==1) {echo '<p class="ticketPropertyText">'.$hesklang['high'].'</p>';}
|
|
elseif ($ticket['priority']==2) {echo '<p class="ticketPropertyText">'.$hesklang['medium'].'</p>';}
|
|
else {echo '<p class="ticketPropertyText">'.$hesklang['low'].'</p>';}
|
|
echo '</div>';
|
|
}
|
|
else
|
|
{
|
|
$hesk_settings['ticketColumnWidth'] = 3;
|
|
}
|
|
echo '<div class="col-md-3 col-sm-12 ticket-cell"><p class="ticketPropertyTitle">'.$hesklang['status'].'</p>';
|
|
$ticketStatusKey = $ticket['statusKey'];
|
|
echo '<p class="ticketPropertyText">'.$hesklang[$ticketStatusKey].'</p>';
|
|
echo '</div>';
|
|
echo '<div class="col-md-3 col-sm-12 ticket-cell"><p class="ticketPropertyTitle">'.$hesklang['last_replier'].'</p>
|
|
<p class="ticketPropertyText">'.$ticket['repliername'].'</p></div>';
|
|
echo '<div class="col-md-'.$repliesColumnWidth.' col-sm-12 ticket-cell"><p class="ticketPropertyTitle">'.$hesklang['category'].'</p>
|
|
<p class="ticketPropertyText">'.$category['name'].'</p></div>';
|
|
echo '<div class="col-md-'.$repliesColumnWidth.' col-sm-12 ticket-cell"><p class="ticketPropertyTitle">'.$hesklang['replies'].'</p>
|
|
<p class="ticketPropertyText">'.$replies.'</p></div>';
|
|
?>
|
|
</div>
|
|
</div>
|
|
<div class="blankSpace"></div>
|
|
<!-- REPLIES -->
|
|
|
|
<?php
|
|
if ($hesk_settings['new_top'])
|
|
{
|
|
$i = hesk_printCustomerTicketReplies() ? 0 : 1;
|
|
}
|
|
else
|
|
{
|
|
$i = 1;
|
|
}
|
|
|
|
/* Make sure original message is in correct color if newest are on top */
|
|
$color = 'class="ticketMessageContainer"';
|
|
?>
|
|
<div class="row ticketMessageContainer">
|
|
<div class="col-md-3 col-xs-12">
|
|
<div class="ticketName"><?php echo $ticket['name']; ?></div>
|
|
<div class="ticketEmail"><?php echo $ticket['email']; ?></div>
|
|
</div>
|
|
<div class="col-md-9 col-xs-12 pushMarginLeft">
|
|
<div class="ticketMessageTop withBorder">
|
|
<!-- Date and Action buttons -->
|
|
<p><?php echo $hesklang['date']; ?>: <?php echo hesk_date($ticket['dt'], true); ?><span style="float: right"><?php echo hesk_getCustomerButtons($i); ?></span></p>
|
|
<!-- Custom Fields Before Message -->
|
|
<?php
|
|
foreach ($hesk_settings['custom_fields'] as $k=>$v)
|
|
{
|
|
if ($v['use'] && $v['place']==0)
|
|
{
|
|
echo '
|
|
<p>'.$v['name'].': '.$ticket[$k].'</p>';
|
|
}
|
|
}
|
|
?>
|
|
</div>
|
|
<div class="ticketMessageBottom">
|
|
<!-- Message -->
|
|
<p><b><?php echo $hesklang['message']; ?>:</b></p>
|
|
<p class="message"><?php echo $ticket['message']; ?><br /> </p>
|
|
</div>
|
|
<div class="ticketMessageTop">
|
|
<!-- Custom Fields after Message -->
|
|
<?php
|
|
foreach ($hesk_settings['custom_fields'] as $k=>$v)
|
|
{
|
|
if ($v['use'] && $v['place'])
|
|
{
|
|
echo '
|
|
<p>'.$v['name'].': '.$ticket[$k].'</p>';
|
|
}
|
|
}
|
|
/* Attachments */
|
|
hesk_listAttachments($ticket['attachments'], $i);
|
|
?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
if ( ! $hesk_settings['new_top'])
|
|
{
|
|
hesk_printCustomerTicketReplies();
|
|
}
|
|
?>
|
|
<!-- END REPLIES -->
|
|
<?php
|
|
// Print "Submit a reply" form?
|
|
if ($ticket['locked'] != 1 && $ticket['status'] != 3 && $hesk_settings['reply_top'] == 1)
|
|
{
|
|
hesk_printCustomerReplyForm();
|
|
}
|
|
?>
|
|
|
|
<?php
|
|
/* Print "Submit a reply" form? */
|
|
if ($ticket['locked'] != 1 && $ticket['status'] != 3 && ! $hesk_settings['reply_top'])
|
|
{
|
|
hesk_printCustomerReplyForm();
|
|
}
|
|
|
|
/* If needed update unread replies as read for staff to know */
|
|
if ( count($unread_replies) )
|
|
{
|
|
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` SET `read` = '1' WHERE `id` IN ('".implode("','", $unread_replies)."')");
|
|
}
|
|
?>
|
|
</div> <!-- End col-md-7 -->
|
|
</div> <!-- End row -->
|
|
|
|
|
|
|
|
<?php
|
|
|
|
/* Clear unneeded session variables */
|
|
hesk_cleanSessionVars('ticket_message');
|
|
|
|
require_once(HESK_PATH . 'inc/footer.inc.php');
|
|
|
|
/*** START FUNCTIONS ***/
|
|
|
|
function print_form()
|
|
{
|
|
global $hesk_settings, $hesklang;
|
|
global $hesk_error_buffer, $my_email, $trackingID, $do_remember, $display;
|
|
|
|
/* Print header */
|
|
$hesk_settings['tmp_title'] = $hesk_settings['hesk_title'] . ' - ' . $hesklang['view_ticket'];
|
|
require_once(HESK_PATH . 'inc/header.inc.php');
|
|
?>
|
|
<ol class="breadcrumb">
|
|
<li><a href="<?php echo $hesk_settings['site_url']; ?>"><?php echo $hesk_settings['site_title']; ?></a></li>
|
|
<li><a href="<?php echo $hesk_settings['hesk_url']; ?>"><?php echo $hesk_settings['hesk_title']; ?></a></li>
|
|
<li class="active"><?php echo $hesklang['view_ticket_nav']; ?></li>
|
|
</ol>
|
|
|
|
<div class="row">
|
|
<div align="left" class="col-md-4">
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading">
|
|
<?php echo $hesklang['quick_help']; ?>
|
|
</div>
|
|
<div class="panel-body">
|
|
<p><?php echo $hesklang['quick_help_view_ticket']; ?></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-8">
|
|
<?php
|
|
/* This will handle error, success and notice messages */
|
|
hesk_handle_messages();
|
|
?>
|
|
<h3 align="left"><?php echo $hesklang['view_existing']; ?></h3>
|
|
<div class="footerWithBorder"></div>
|
|
<div class="blankSpace"></div>
|
|
<form action="ticket.php" class="form-horizontal" role="form" method="get" name="form2">
|
|
<div class="form-group">
|
|
<label for="track" class="col-sm-3 control-label"><?php echo $hesklang['ticket_trackID']; ?></label>
|
|
<div class="col-sm-9">
|
|
<input type="text" class="form-control" name="track" id="track" maxlength="20" size="35" value="<?php echo $trackingID; ?>" placeholder="<?php echo $hesklang['ticket_trackID']; ?>">
|
|
</div>
|
|
</div>
|
|
<?php
|
|
$tmp = '';
|
|
if ($hesk_settings['email_view_ticket'])
|
|
{
|
|
$tmp = 'document.form1.email.value=document.form2.e.value;';
|
|
?>
|
|
<div class="form-group">
|
|
<label for="e" class="col-sm-3 control-label"><?php echo $hesklang['email']; ?></label>
|
|
<div class="col-sm-9">
|
|
<input type="text" class="form-control" id="e" name="e" size="35" value="<?php echo $my_email; ?>" placeholder="<?php echo $hesklang['email']; ?>" />
|
|
</div>
|
|
</div>
|
|
<div align="left" class="form-group">
|
|
<div class="col-sm-offset-3 col-sm-9">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" name="r" value="Y" <?php echo $do_remember; ?> /> <?php echo $hesklang['rem_email']; ?>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php } ?>
|
|
<div align="left" class="form-group">
|
|
<div class="col-sm-offset-3 col-sm-9">
|
|
<button type="submit" class="btn btn-default" value="<?php echo $hesklang['view_ticket']; ?>"><?php echo $hesklang['view_ticket']; ?></button>
|
|
<input type="hidden" name="Refresh" value="<?php echo rand(10000,99999); ?>"><input type="hidden" name="f" value="1">
|
|
<div class="blankSpace"></div>
|
|
<a href="Javascript:void(0)" onclick="javascript:hesk_toggleLayerDisplay('forgot');<?php echo $tmp; ?>"><?php echo $hesklang['forgot_tid'];?></a>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
<div align="left" id="forgot" class="alert alert-info" style="display: <?php echo $display; ?>;">
|
|
<p><?php echo $hesklang['tid_mail']; ?></p>
|
|
<div class="blankSpace"></div>
|
|
<form action="index.php" method="post" class="form-horizontal" name="form1">
|
|
<div class="form-group">
|
|
<label for="email" class="col-sm-3 control-label"><?php echo $hesklang['email']; ?></label>
|
|
<div class="col-sm-9">
|
|
<input type="text" id="email" class="form-control" name="email" size="35" value="<?php echo $my_email; ?>" placeholder="<?php echo $hesklang['email']; ?>"/><input type="hidden" name="a" value="forgot_tid" />
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<div class="col-sm-offset-3 col-sm-9">
|
|
<button type="submit" class="btn btn-default" value="<?php echo $hesklang['tid_send']; ?>"><?php echo $hesklang['tid_send']; ?></button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php
|
|
require_once(HESK_PATH . 'inc/footer.inc.php');
|
|
exit();
|
|
} // End print_form()
|
|
|
|
|
|
function hesk_printCustomerReplyForm($reopen=0)
|
|
{
|
|
global $hesklang, $hesk_settings, $trackingID, $my_email;
|
|
|
|
// Already printed?
|
|
if (defined('REPLY_FORM'))
|
|
{
|
|
return '';
|
|
}
|
|
|
|
?>
|
|
|
|
<h3 class="text-left"><?php echo $hesklang['add_reply']; ?></h3>
|
|
<div class="footerWithBorder"></div>
|
|
<div class="blankSpace"></div>
|
|
|
|
<form role="form" class="form-horizontal" method="post" action="reply_ticket.php" enctype="multipart/form-data">
|
|
<div class="form-group">
|
|
<label for="message" class="col-sm-3 control-label"><?php echo $hesklang['message']; ?>: <span class="important">*</span></label>
|
|
<div class="col-sm-9">
|
|
<textarea name="message" class="form-control" rows="12" cols="60"><?php if (isset($_SESSION['ticket_message'])) {echo stripslashes(hesk_input($_SESSION['ticket_message']));} ?></textarea>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
/* attachments */
|
|
if ($hesk_settings['attachments']['use'])
|
|
{
|
|
?>
|
|
<div class="form-group">
|
|
<label for="attachments" class="col-sm-3 control-label"><?php echo $hesklang['attachments']; ?>:</label>
|
|
<div class="col-sm-9 text-left">
|
|
<?php
|
|
for ($i=1;$i<=$hesk_settings['attachments']['max_number'];$i++)
|
|
{
|
|
echo '<input type="file" name="attachment['.$i.']" size="50" /><br />';
|
|
}
|
|
echo '<a href="file_limits.php" target="_blank" onclick="Javascript:hesk_window(\'file_limits.php\',250,500);return false;">' . $hesklang['ful'] . '</a>';
|
|
?>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
}
|
|
?>
|
|
<input type="hidden" name="token" value="<?php hesk_token_echo(); ?>" />
|
|
<input type="hidden" name="orig_track" value="<?php echo $trackingID; ?>" />
|
|
<?php
|
|
if ($hesk_settings['email_view_ticket'])
|
|
{
|
|
echo '<input type="hidden" name="e" value="' . $my_email . '" />';
|
|
}
|
|
if ($reopen)
|
|
{
|
|
echo '<input type="hidden" name="reopen" value="1" />';
|
|
}
|
|
?>
|
|
<input type="submit" value="<?php echo $hesklang['submit_reply']; ?>" class="btn btn-default" />
|
|
</form>
|
|
|
|
<?php
|
|
|
|
// Make sure the form is only printed once per page
|
|
define('REPLY_FORM', true);
|
|
|
|
} // End hesk_printCustomerReplyForm()
|
|
|
|
|
|
function hesk_printCustomerTicketReplies()
|
|
{
|
|
global $hesklang, $hesk_settings, $result, $reply, $trackingID, $unread_replies;
|
|
|
|
$i = $hesk_settings['new_top'] ? 0 : 1;
|
|
|
|
while ($reply = hesk_dbFetchAssoc($result))
|
|
{
|
|
$color = 'class="ticketMessageContainer"';
|
|
|
|
/* Store unread reply IDs for later */
|
|
if ($reply['staffid'] && ! $reply['read'])
|
|
{
|
|
$unread_replies[] = $reply['id'];
|
|
}
|
|
|
|
$reply['dt'] = hesk_date($reply['dt'], true);
|
|
?>
|
|
|
|
<div class="row ticketMessageContainer">
|
|
<div class="col-md-3 col-xs-12">
|
|
<div class="ticketName"><?php echo $reply['name']; ?></div>
|
|
</div>
|
|
<div class="col-md-9 col-xs-12 pushMarginLeft">
|
|
<div class="ticketMessageTop withBorder">
|
|
<p><?php echo $hesklang['date']; ?>: <?php echo $reply['dt']; ?><span style="float: right;"><?php echo hesk_getCustomerButtons($i); ?></span></p>
|
|
<?php
|
|
/* Staff rating */
|
|
if ($hesk_settings['rating'] && $reply['staffid'])
|
|
{
|
|
if ($reply['rating']==1)
|
|
{
|
|
echo '<p class="rate">'.$hesklang['rnh'].'</p>';
|
|
}
|
|
elseif ($reply['rating']==5)
|
|
{
|
|
echo '<p class="rate">'.$hesklang['rh'].'</p>';
|
|
}
|
|
else
|
|
{
|
|
echo '
|
|
<div id="rating'.$reply['id'].'" class="rate">
|
|
'.$hesklang['r'].'
|
|
<a href="Javascript:void(0)" onclick="Javascript:hesk_rate(\'rate.php?rating=5&id='.$reply['id'].'&track='.$trackingID.'\',\'rating'.$reply['id'].'\')">'.strtolower($hesklang['yes']).'</a> /
|
|
<a href="Javascript:void(0)" onclick="Javascript:hesk_rate(\'rate.php?rating=1&id='.$reply['id'].'&track='.$trackingID.'\',\'rating'.$reply['id'].'\')">'.strtolower($hesklang['no']).'</a>
|
|
</div>
|
|
';
|
|
}
|
|
}
|
|
?>
|
|
</div>
|
|
<div class="ticketMessageBottom">
|
|
<!-- Message -->
|
|
<p><b><?php echo $hesklang['message']; ?>:</b></p>
|
|
<p class="message"><?php echo $reply['message']; ?></p>
|
|
</div>
|
|
<div class="ticketMessageTop">
|
|
<?php hesk_listAttachments($reply['attachments'],$i);?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
return $i;
|
|
|
|
} // End hesk_printCustomerTicketReplies()
|
|
|
|
|
|
function hesk_listAttachments($attachments='', $white=1)
|
|
{
|
|
global $hesk_settings, $hesklang, $trackingID;
|
|
|
|
/* Attachments disabled or not available */
|
|
if ( ! $hesk_settings['attachments']['use'] || ! strlen($attachments) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/* Style and mousover/mousout */
|
|
$tmp = $white ? 'White' : 'Blue';
|
|
$style = 'class="option'.$tmp.'OFF" onmouseover="this.className=\'option'.$tmp.'ON\'" onmouseout="this.className=\'option'.$tmp.'OFF\'"';
|
|
|
|
/* List attachments */
|
|
echo '<p><b>'.$hesklang['attachments'].':</b><br />';
|
|
$att=explode(',',substr($attachments, 0, -1));
|
|
foreach ($att as $myatt)
|
|
{
|
|
list($att_id, $att_name) = explode('#', $myatt);
|
|
|
|
echo '
|
|
<a href="download_attachment.php?att_id='.$att_id.'&track='.$trackingID.$hesk_settings['e_query'].'"><img src="img/clip.png" width="16" height="16" alt="'.$hesklang['dnl'].' '.$att_name.'" title="'.$hesklang['dnl'].' '.$att_name.'" '.$style.' /></a>
|
|
<a href="download_attachment.php?att_id='.$att_id.'&track='.$trackingID.$hesk_settings['e_query'].'">'.$att_name.'</a><br />
|
|
';
|
|
}
|
|
echo '</p>';
|
|
|
|
return true;
|
|
} // End hesk_listAttachments()
|
|
|
|
|
|
function hesk_getCustomerButtons($white=1)
|
|
{
|
|
global $hesk_settings, $hesklang, $trackingID;
|
|
|
|
$options = '';
|
|
|
|
/* Style and mousover/mousout */
|
|
$tmp = $white ? 'White' : 'Blue';
|
|
$style = 'class="option'.$tmp.'OFF" onmouseover="this.className=\'option'.$tmp.'ON\'" onmouseout="this.className=\'option'.$tmp.'OFF\'"';
|
|
|
|
/* Print ticket button */
|
|
$options .= '<a href="print.php?track='.$trackingID.$hesk_settings['e_query'].'" title="'.$hesklang['printer_friendly'].'"><span class="glyphicon glyphicon-print"></span> '.$hesklang['printer_friendly'].' </a> ';
|
|
|
|
/* Return generated HTML */
|
|
return $options;
|
|
|
|
} // END hesk_getCustomerButtons()
|
|
?>
|