You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
573 lines
17 KiB
573 lines
17 KiB
<?php
|
|
/* For licensing terms, see /license.txt */
|
|
|
|
/**
|
|
*
|
|
* @package chamilo.plugin.ticket
|
|
*/
|
|
require_once __DIR__.'/../inc/global.inc.php';
|
|
|
|
api_block_anonymous_users();
|
|
|
|
$user_id = api_get_user_id();
|
|
$isAdmin = api_is_platform_admin();
|
|
$interbreadcrumb[] = array(
|
|
'url' => api_get_path(WEB_CODE_PATH).'ticket/tickets.php',
|
|
'name' => get_lang('MyTickets')
|
|
);
|
|
$interbreadcrumb[] = array('url' => '#', 'name' => get_lang('TicketDetail'));
|
|
|
|
$disableReponseButtons = '';
|
|
$htmlHeadXtra[] = '<script>
|
|
$(document).ready(function() {
|
|
$("#dialog-form").dialog({
|
|
autoOpen: false,
|
|
height: 450,
|
|
width: 600,
|
|
modal: true,
|
|
buttons: {
|
|
' . get_lang('Accept').': function(){
|
|
$("#frmResponsable").submit()
|
|
},
|
|
' . ucfirst(get_lang('Close')).': function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}
|
|
});
|
|
|
|
$("a#assign").click(function () {
|
|
$( "#dialog-form" ).dialog( "open" );
|
|
});
|
|
|
|
$(".responseyes").click(function () {
|
|
if(!confirm("' . get_lang('AreYouSure').' : '.strtoupper(get_lang('Yes')).'. '.get_lang('IfYouAreSureTheTicketWillBeClosed').'")){
|
|
return false;
|
|
}
|
|
});
|
|
|
|
$("input#responseno").click(function () {
|
|
if(!confirm("' . get_lang('AreYouSure').' : '.strtoupper(get_lang('No')).'")){
|
|
return false;
|
|
}
|
|
});
|
|
|
|
'.$disableReponseButtons.'
|
|
});
|
|
|
|
var counter_image = 1;
|
|
|
|
function remove_image_form(element_id) {
|
|
$("#" + element_id).remove();
|
|
counter_image = counter_image - 1;
|
|
$("#link-more-attach").css("display", "block");
|
|
}
|
|
|
|
function add_image_form() {
|
|
// Multiple filepaths for image form
|
|
var filepaths = $("#filepaths");
|
|
var new_elem, input_file, link_remove, img_remove, new_filepath_id;
|
|
|
|
if ($("#filepath_"+counter_image)) {
|
|
counter_image = counter_image + 1;
|
|
} else {
|
|
counter_image = counter_image;
|
|
}
|
|
|
|
new_elem = "filepath_"+counter_image;
|
|
|
|
$("<div/>", {
|
|
id: new_elem,
|
|
class: "controls"
|
|
}).appendTo(filepaths);
|
|
|
|
input_file = $("<input/>", {
|
|
type: "file",
|
|
name: "attach_" + counter_image,
|
|
size: 20
|
|
});
|
|
|
|
link_remove = $("<a/>", {
|
|
onclick: "remove_image_form(\'" + new_elem + "\')",
|
|
style: "cursor: pointer"
|
|
});
|
|
|
|
img_remove = $("<img/>", {
|
|
src: "' . Display::returnIconPath('delete.png').'"
|
|
});
|
|
|
|
new_filepath_id = $("#filepath_" + counter_image);
|
|
new_filepath_id.append(input_file, link_remove.append(img_remove));
|
|
|
|
if (counter_image === 6) {
|
|
var link_attach = $("#link-more-attach");
|
|
if (link_attach) {
|
|
$(link_attach).css("display", "none");
|
|
}
|
|
}
|
|
}
|
|
</script>';
|
|
|
|
$htmlHeadXtra[] = '<style>
|
|
div.row div.label2 {
|
|
float:left;
|
|
text-align: right;
|
|
width:22%;
|
|
}
|
|
div.row div.formw2 {
|
|
width:50%;
|
|
margin-left: 2%;
|
|
margin-right: 16%;
|
|
float:left;
|
|
}
|
|
.messageuser, .messagesupport {
|
|
border: 1px solid;
|
|
margin: 10px 0px;
|
|
padding:15px 10px 15px 50px;
|
|
background-repeat: no-repeat;
|
|
background-position: 10px center;
|
|
width:50%;
|
|
behavior: url(/pie/PIE.htc);
|
|
}
|
|
.messageuser {
|
|
color: #00529B;
|
|
-moz-border-radius: 15px 15px 15px 15px;
|
|
-webkit-border-radius: 15px 15px 15px 15px;
|
|
background-color: #BDE5F8;
|
|
margin-left:20%;
|
|
border-radius:15px;
|
|
float: left;
|
|
}
|
|
.messagesupport {
|
|
color: #4F8A10;
|
|
-moz-border-radius: 15px 15px 15px 15px;
|
|
-webkit-border-radius: 15px 15px 15px 15px;
|
|
background-color: #DFF2BF;
|
|
margin-right: 20%;
|
|
float: right;
|
|
border-radius:15px;
|
|
}
|
|
.attachment-link {
|
|
margin: 12px;
|
|
}
|
|
#link-more-attach {
|
|
color: white;
|
|
cursor: pointer;
|
|
width: 120px;
|
|
}
|
|
</style>';
|
|
|
|
$ticket_id = $_GET['ticket_id'];
|
|
$ticket = TicketManager::get_ticket_detail_by_id($ticket_id);
|
|
if (!isset($ticket['ticket'])) {
|
|
api_not_allowed();
|
|
}
|
|
if (!isset($_GET['ticket_id'])) {
|
|
header('Location: '.api_get_path(WEB_CODE_PATH).'ticket/tickets.php');
|
|
exit;
|
|
}
|
|
|
|
if (isset($_POST['response'])) {
|
|
if ($user_id == $ticket['ticket']['assigned_last_user'] || api_is_platform_admin()) {
|
|
$response = $_POST['response'] === '1' ? true : false;
|
|
$newStatus = TicketManager::STATUS_PENDING;
|
|
if ($response) {
|
|
$newStatus = TicketManager::STATUS_CLOSE;
|
|
}
|
|
TicketManager::update_ticket_status(
|
|
TicketManager::getStatusIdFromCode($newStatus),
|
|
$ticket_id,
|
|
$user_id
|
|
);
|
|
Display::addFlash(Display::return_message(get_lang('Updated')));
|
|
header("Location:".api_get_self()."?ticket_id=".$ticket_id);
|
|
exit;
|
|
|
|
}
|
|
}
|
|
|
|
$title = 'Ticket #'.$ticket['ticket']['code'];
|
|
|
|
if (!isset($_POST['compose'])) {
|
|
if (isset($_REQUEST['close'])) {
|
|
TicketManager::close_ticket($_REQUEST['ticket_id'], $user_id);
|
|
$ticket['ticket']['status_id'] = TicketManager::STATUS_CLOSE;
|
|
$ticket['ticket']['status'] = get_lang('Closed');
|
|
}
|
|
|
|
Display::display_header();
|
|
$projectId = $ticket['ticket']['project_id'];
|
|
echo '<div class="actions">';
|
|
echo Display::url(
|
|
Display::return_icon('back.png', get_lang('Tickets'), [], ICON_SIZE_MEDIUM),
|
|
api_get_path(WEB_CODE_PATH).'ticket/tickets.php?project_id='.$projectId
|
|
);
|
|
echo '</div>';
|
|
$bold = '';
|
|
if ($ticket['ticket']['status_id'] == TicketManager::STATUS_CLOSE) {
|
|
$bold = 'style = "font-weight: bold;"';
|
|
echo "<style>
|
|
#confirmticket {
|
|
display: none;
|
|
}
|
|
</style>";
|
|
}
|
|
if ($isAdmin) {
|
|
$senderData = get_lang('AddedBy').' '.$ticket['ticket']['user_url'].' ('.$ticket['usuario']['username'].').';
|
|
} else {
|
|
$senderData = get_lang('AddedBy').' '.$ticket['usuario']['complete_name'].' ('.$ticket['usuario']['username'].').';
|
|
}
|
|
|
|
echo '<table width="100%" >
|
|
<tr>
|
|
<td colspan="3">
|
|
<h1>'.$title.'</h1>
|
|
<h2>'.$ticket['ticket']['subject'].'</h2>
|
|
<p>
|
|
'.$senderData.' '.
|
|
get_lang('Created').' '.
|
|
Display::url(
|
|
date_to_str_ago($ticket['ticket']['start_date_from_db']),
|
|
'#',
|
|
['title' => $ticket['ticket']['start_date'], 'class' => 'boot-tooltip']
|
|
).'. '.
|
|
get_lang('TicketUpdated').' '.
|
|
Display::url(
|
|
date_to_str_ago($ticket['ticket']['sys_lastedit_datetime_from_db']),
|
|
'#',
|
|
['title' => $ticket['ticket']['sys_lastedit_datetime'], 'class' => 'boot-tooltip']
|
|
).'
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><p><b>' . get_lang('Category').': </b>'.$ticket['ticket']['name'].'</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td><p ' . $bold.'><b>'.get_lang('Status').':</b> '.$ticket['ticket']['status'].'</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td><p><b>' . get_lang('Priority').': </b>'.$ticket['ticket']['priority'].'<p></td>
|
|
</tr>';
|
|
|
|
if (!empty($ticket['ticket']['assigned_last_user'])) {
|
|
$assignedUser = api_get_user_info($ticket['ticket']['assigned_last_user']);
|
|
echo '<tr>
|
|
<td><p><b>' . get_lang('AssignedTo').': </b>'.$assignedUser['complete_name'].'<p></td>
|
|
</tr>';
|
|
} else {
|
|
echo '<tr>
|
|
<td><p><b>' . get_lang('AssignedTo').': </b>-<p></td>
|
|
</tr>';
|
|
}
|
|
if ($ticket['ticket']['course_url'] != null) {
|
|
if (!empty($ticket['ticket']['session_id'])) {
|
|
$sessionInfo = api_get_session_info($ticket['ticket']['session_id']);
|
|
echo '<tr>
|
|
<td><b>' . get_lang('Session').':</b> '.$sessionInfo['name'].' </td>
|
|
<td></td>
|
|
<td colspan="2"></td>
|
|
</tr>';
|
|
}
|
|
|
|
echo '<tr>
|
|
<td><b>' . get_lang('Course').':</b> '.$ticket['ticket']['course_url'].' </td>
|
|
<td></td>
|
|
<td colspan="2"></td>
|
|
</tr>';
|
|
}
|
|
echo '<tr>
|
|
<td>
|
|
<hr />
|
|
<b>' . get_lang('Description').':</b> <br />
|
|
'.$ticket['ticket']['message'].'
|
|
<hr />
|
|
</td>
|
|
</tr>
|
|
';
|
|
echo '</table>';
|
|
$messages = $ticket['messages'];
|
|
$counter = 1;
|
|
foreach ($messages as $message) {
|
|
$date = Display::url(
|
|
date_to_str_ago($message['sys_insert_datetime']),
|
|
'#',
|
|
['title' => api_get_local_time($message['sys_insert_datetime']), 'class' => 'boot-tooltip']
|
|
);
|
|
|
|
$receivedMessage = '';
|
|
if (!empty($message['subject'])) {
|
|
$receivedMessage = '<b>'.get_lang('Subject').': </b> '.$message['subject'].'<br/>';
|
|
}
|
|
|
|
if (!empty($message['message'])) {
|
|
$receivedMessage = '<b>'.get_lang('Message').':</b><br/>'.$message['message'].'<br/>';
|
|
}
|
|
|
|
$attachmentLinks = '';
|
|
if (isset($message['attachments'])) {
|
|
$attributeClass = array(
|
|
'class' => 'attachment-link'
|
|
);
|
|
foreach ($message['attachments'] as $attach) {
|
|
$attachmentLinks .= Display::tag('div', $attach['attachment_link'], $attributeClass);
|
|
}
|
|
}
|
|
|
|
$entireMessage = $receivedMessage.$attachmentLinks;
|
|
$counterLink = Display::url('#'.$counter, api_get_self().'?ticket_id='.$ticket_id.'#note-'.$counter);
|
|
echo '<a id="note-'.$counter.'"> </a><h4>'.sprintf(get_lang('UpdatedByX'), $message['user_created']).' '.$date.
|
|
' <span class="pull-right">'.$counterLink.'</span></h4>';
|
|
echo '<hr />';
|
|
|
|
if (!empty($entireMessage)) {
|
|
echo Display::div(
|
|
$entireMessage,
|
|
['class' => 'well']
|
|
);
|
|
}
|
|
|
|
$counter++;
|
|
}
|
|
|
|
$subject = get_lang('ReplyShort').': '.$ticket['ticket']['subject'];
|
|
|
|
if ($ticket['ticket']['status_id'] != TicketManager::STATUS_FORWARDED &&
|
|
$ticket['ticket']['status_id'] != TicketManager::STATUS_CLOSE
|
|
) {
|
|
if (!$isAdmin && $ticket['ticket']['status_id'] != TicketManager::STATUS_UNCONFIRMED) {
|
|
show_form_send_message($ticket['ticket']);
|
|
} else {
|
|
if (
|
|
$ticket['ticket']['assigned_last_user'] == $user_id ||
|
|
$ticket['ticket']['sys_insert_user_id'] == $user_id ||
|
|
$isAdmin
|
|
) {
|
|
show_form_send_message($ticket['ticket']);
|
|
}
|
|
}
|
|
}
|
|
|
|
Display::display_footer();
|
|
} else {
|
|
$ticket_id = $_POST['ticket_id'];
|
|
$content = $_POST['content'];
|
|
$messageToSend = '';
|
|
$subject = $_POST['subject'];
|
|
$message = isset($_POST['confirmation']) ? true : false;
|
|
$file_attachments = $_FILES;
|
|
$user_id = api_get_user_id();
|
|
|
|
if ($isAdmin) {
|
|
$oldUserId = $ticket['ticket']['assigned_last_user'];
|
|
if (isset($_POST['assigned_last_user']) && !empty($_POST['assigned_last_user']) &&
|
|
$_POST['assigned_last_user'] != $oldUserId
|
|
) {
|
|
TicketManager::assignTicketToUser(
|
|
$ticket_id,
|
|
$_POST['assigned_last_user']
|
|
);
|
|
$oldUserName = '-';
|
|
if (!empty($oldUserId)) {
|
|
$oldUserInfo = api_get_user_info($oldUserId);
|
|
$oldUserName = $oldUserInfo['complete_name'];
|
|
}
|
|
|
|
$userCompleteName = '-';
|
|
if (!empty($_POST['assigned_last_user'])) {
|
|
$userInfo = api_get_user_info($_POST['assigned_last_user']);
|
|
$userCompleteName = $userInfo['complete_name'];
|
|
}
|
|
|
|
$messageToSend .= sprintf(
|
|
get_lang('AssignedChangeFromXToY'),
|
|
$oldUserName,
|
|
$userCompleteName
|
|
).'<br />';
|
|
}
|
|
|
|
TicketManager::updateTicket(
|
|
[
|
|
'priority_id' => $_POST['priority_id'],
|
|
'status_id' => $_POST['status_id']
|
|
],
|
|
$ticket_id,
|
|
api_get_user_id()
|
|
);
|
|
|
|
if ($_POST['priority_id'] != $ticket['ticket']['priority_id']) {
|
|
$newPriority = TicketManager::getPriority($_POST['priority_id']);
|
|
$newPriorityTitle = '-';
|
|
if ($newPriority) {
|
|
$newPriorityTitle = $newPriority->getName();
|
|
}
|
|
$oldPriority = TicketManager::getPriority($ticket['ticket']['priority_id']);
|
|
$oldPriorityTitle = '-';
|
|
if ($oldPriority) {
|
|
$oldPriorityTitle = $oldPriority->getName();
|
|
}
|
|
$messageToSend .= sprintf(
|
|
get_lang('PriorityChangeFromXToY'),
|
|
$oldPriorityTitle,
|
|
$newPriorityTitle
|
|
).'<br />';
|
|
}
|
|
|
|
if ($_POST['status_id'] != $ticket['ticket']['status_id']) {
|
|
$newStatus = TicketManager::getStatus($_POST['status_id']);
|
|
$newTitle = '-';
|
|
if ($newStatus) {
|
|
$newTitle = $newStatus->getName();
|
|
}
|
|
$oldStatus = TicketManager::getStatus($ticket['ticket']['status_id']);
|
|
$oldStatusTitle = '-';
|
|
if ($oldStatus) {
|
|
$oldStatusTitle = $oldStatus->getName();
|
|
}
|
|
|
|
$messageToSend .= sprintf(
|
|
get_lang('StatusChangeFromXToY'),
|
|
$oldStatusTitle,
|
|
$newTitle
|
|
).'<br />';
|
|
}
|
|
}
|
|
|
|
$messageToSend .= $content;
|
|
|
|
TicketManager::insertMessage(
|
|
$ticket_id,
|
|
$subject,
|
|
$messageToSend,
|
|
$file_attachments,
|
|
$user_id,
|
|
'NOL',
|
|
$message
|
|
);
|
|
|
|
TicketManager::sendNotification(
|
|
$ticket_id,
|
|
get_lang('TicketUpdated'),
|
|
$messageToSend
|
|
);
|
|
|
|
Display::addFlash(Display::return_message(get_lang('Saved')));
|
|
header("Location:".api_get_self()."?ticket_id=".$ticket_id);
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* @param array $ticket
|
|
*/
|
|
function show_form_send_message($ticket)
|
|
{
|
|
global $isAdmin;
|
|
global $subject;
|
|
|
|
$form = new FormValidator(
|
|
'send_ticket',
|
|
'POST',
|
|
api_get_self().'?ticket_id='.$ticket['id'],
|
|
'',
|
|
array(
|
|
'enctype' => 'multipart/form-data',
|
|
'class' => 'form-horizontal'
|
|
)
|
|
);
|
|
|
|
if ($isAdmin) {
|
|
$statusList = TicketManager::getStatusList();
|
|
$form->addElement(
|
|
'select',
|
|
'status_id',
|
|
get_lang('Status'),
|
|
$statusList
|
|
);
|
|
|
|
$priorityList = TicketManager::getPriorityList();
|
|
$form->addElement(
|
|
'select',
|
|
'priority_id',
|
|
get_lang('Priority'),
|
|
$priorityList,
|
|
array(
|
|
'id' => 'priority_id',
|
|
'for' => 'priority_id'
|
|
)
|
|
);
|
|
|
|
$form->addSelectAjax(
|
|
'assigned_last_user',
|
|
get_lang('Assign'),
|
|
null,
|
|
['url' => api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?a=get_user_like']
|
|
);
|
|
|
|
$form->setDefaults(
|
|
[
|
|
'priority_id' => $ticket['priority_id'],
|
|
'status_id' => $ticket['status_id'],
|
|
'assigned_last_user' => $ticket['assigned_last_user']
|
|
]
|
|
);
|
|
}
|
|
|
|
$form->addElement(
|
|
'text',
|
|
'subject',
|
|
get_lang('Subject'),
|
|
array(
|
|
'for' => 'subject',
|
|
'value' => $subject,
|
|
'style' => 'width: 540px;'
|
|
)
|
|
);
|
|
|
|
$form->addElement('hidden', 'ticket_id', $ticket['id']);
|
|
|
|
$form->addHtmlEditor(
|
|
'content',
|
|
get_lang('Message'),
|
|
false,
|
|
false,
|
|
array(
|
|
'ToolbarSet' => 'Profile',
|
|
'Width' => '550',
|
|
'Height' => '250'
|
|
)
|
|
);
|
|
|
|
if ($isAdmin) {
|
|
$form->addElement(
|
|
'checkbox',
|
|
'confirmation',
|
|
null,
|
|
get_lang('RequestConfirmation')
|
|
);
|
|
}
|
|
|
|
$form->addElement('file', 'attach_1', get_lang('FilesAttachment'));
|
|
$form->addLabel(
|
|
'',
|
|
'<span id="filepaths"><div id="filepath_1"></div></span>'
|
|
);
|
|
$form->addLabel(
|
|
'',
|
|
'<span id="link-more-attach">
|
|
<span class="btn btn-success" onclick="return add_image_form()">' . get_lang('AddOneMoreFile').'</span>
|
|
</span>
|
|
('.sprintf(get_lang('MaximunFileSizeX'), format_file_size(api_get_setting('message_max_upload_filesize'))).')
|
|
');
|
|
|
|
$form->addElement('html', '<br/>');
|
|
$form->addElement(
|
|
'button',
|
|
'compose',
|
|
get_lang('SendMessage'),
|
|
null,
|
|
null,
|
|
null,
|
|
'btn btn-primary'
|
|
);
|
|
|
|
$form->display();
|
|
}
|
|
|