'.$hesklang['click_login'].''); + } else { + return false; + } + } + } + + /* Admins have full access to all features, besides possibly settings */ + if ($_SESSION['isadmin']) + { + return true; + } + + /* Check other staff for permissions */ + if (strpos($_SESSION['heskprivileges'], $feature) === false) + { + if ($showerror) + { + hesk_error($hesklang['no_permission'].'
'.$hesklang['click_login'].'');
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return true;
+ }
+
+} // END hesk_checkPermission()
diff --git a/inc/email_functions.inc.php b/inc/email_functions.inc.php
new file mode 100644
index 00000000..d8dc60ac
--- /dev/null
+++ b/inc/email_functions.inc.php
@@ -0,0 +1,617 @@
+ $myuser['email'], 'language' => $myuser['language']);
+ continue;
+ }
+
+ /* Not admin, is he/she allowed this category? */
+ $myuser['categories']=explode(',',$myuser['categories']);
+ if (in_array($ticket['category'],$myuser['categories']))
+ {
+ $admins[] = array('email' => $myuser['email'], 'language' => $myuser['language']);
+ continue;
+ }
+ }
+
+ if (count($admins) > 0)
+ {
+ /* Make sure each user gets email in his/her preferred language */
+ $current_language = 'NONE';
+ $recipients = array();
+
+ /* Loop through staff */
+ foreach ($admins as $admin)
+ {
+ /* If admin language is NULL force default HESK language */
+ if ( ! $admin['language'] || ! isset($hesk_settings['languages'][$admin['language']]) )
+ {
+ $admin['language'] = HESK_DEFAULT_LANGUAGE;
+ }
+
+ /* Generate message or add email to the list of recepients */
+ if ($admin['language'] == $current_language)
+ {
+ /* We already have the message, just add email to the recipients list */
+ $recipients[] = $admin['email'];
+ }
+ else
+ {
+ /* Send email messages in previous languages (if required) */
+ if ($current_language != 'NONE')
+ {
+ /* Send e-mail to staff */
+ hesk_mail(implode(',',$recipients), $subject, $message );
+
+ /* Reset list of email addresses */
+ $recipients = array();
+ }
+
+ /* Set new language */
+ hesk_setLanguage($admin['language']);
+
+ /* Format staff email subject and message for this language */
+ $subject = hesk_getEmailSubject($email_template,$ticket);
+ $message = hesk_getEmailMessage($email_template,$ticket,$is_ticket);
+
+ /* Add email to the recipients list */
+ $recipients[] = $admin['email'];
+
+ /* Remember the last processed language */
+ $current_language = $admin['language'];
+ }
+ }
+
+ /* Send email messages to the remaining staff */
+ hesk_mail(implode(',',$recipients), $subject, $message );
+
+ /* Reset language to original one */
+ hesk_resetLanguage();
+ }
+
+ return true;
+
+} // END hesk_notifyStaff()
+
+
+function hesk_validEmails()
+{
+ global $hesklang;
+
+ return array(
+
+ /*** Emails sent to CLIENT ***/
+
+ // --> Send reminder about existing tickets
+ 'forgot_ticket_id' => $hesklang['forgot_ticket_id'],
+
+ // --> Staff replied to a ticket
+ 'new_reply_by_staff' => $hesklang['new_reply_by_staff'],
+
+ // --> New ticket submitted
+ 'new_ticket' => $hesklang['ticket_received'],
+
+ // --> Ticket closed
+ 'ticket_closed' => $hesklang['ticket_closed'],
+
+
+ /*** Emails sent to STAFF ***/
+
+ // --> Ticket moved to a new category
+ 'category_moved' => $hesklang['category_moved'],
+
+ // --> Client replied to a ticket
+ 'new_reply_by_customer' => $hesklang['new_reply_by_customer'],
+
+ // --> New ticket submitted
+ 'new_ticket_staff' => $hesklang['new_ticket_staff'],
+
+ // --> New ticket assigned to staff
+ 'ticket_assigned_to_you'=> $hesklang['ticket_assigned_to_you'],
+
+ // --> New private message
+ 'new_pm' => $hesklang['new_pm'],
+
+ // --> New note by someone to a ticket assigned to you
+ 'new_note' => $hesklang['new_note'],
+
+ );
+} // END hesk_validEmails()
+
+
+function hesk_mail($to,$subject,$message)
+{
+ global $hesk_settings, $hesklang;
+
+ // Demo mode
+ if ( defined('HESK_DEMO') )
+ {
+ return true;
+ }
+
+ // Encode subject to UTF-8
+ $subject = "=?UTF-8?B?" . base64_encode( hesk_html_entity_decode($subject) ) . "?=";
+
+ // Setup "name TO: $to
SUBJECT: $subject
MSG: $message
' .
+ $hesklang['error'] . ': ' . htmlspecialchars($smtp->error). '
' .
+ '';
+ ob_end_clean();
+ hesk_error($error);
+ }
+ else
+ {
+ $_SESSION['HESK_2ND_NOTICE'] = true;
+ $_SESSION['HESK_2ND_MESSAGE'] = $hesklang['esf'] . ' ' . $hesklang['contact_webmsater'] . ' ' . $hesk_settings['webmaster_mail'] . '';
+ }
+ }
+
+ ob_end_clean();
+
+ return true;
+
+} // END hesk_mail()
+
+
+function hesk_getEmailSubject($eml_file, $ticket='', $is_ticket=1, $strip=0)
+{
+ global $hesk_settings, $hesklang;
+
+ // Demo mode
+ if ( defined('HESK_DEMO') )
+ {
+ return '';
+ }
+
+ /* Get list of valid emails */
+ $valid_emails = hesk_validEmails();
+
+ /* Verify this is a valid email include */
+ if ( ! isset($valid_emails[$eml_file]))
+ {
+ hesk_error($hesklang['inve']);
+ }
+ else
+ {
+ $msg = $valid_emails[$eml_file];
+ }
+
+ /* If not a ticket-related email return subject as is */
+ if ( ! $ticket )
+ {
+ return $msg;
+ }
+
+ /* Strip slashes from the subject only if it's a new ticket */
+ if ($strip)
+ {
+ $ticket['subject'] = stripslashes($ticket['subject']);
+ }
+
+ /* Not a ticket, but has some info in the $ticket array */
+ if ( ! $is_ticket)
+ {
+ return str_replace('%%SUBJECT%%', $ticket['subject'], $msg);
+ }
+
+ /* Set category title */
+ $ticket['category'] = hesk_msgToPlain(hesk_getCategoryName($ticket['category']), 1);
+
+ /* Get priority */
+ switch ($ticket['priority'])
+ {
+ case 0:
+ $ticket['priority'] = $hesklang['critical'];
+ break;
+ case 1:
+ $ticket['priority'] = $hesklang['high'];
+ break;
+ case 2:
+ $ticket['priority'] = $hesklang['medium'];
+ break;
+ default:
+ $ticket['priority'] = $hesklang['low'];
+ }
+
+ /* Set status */
+ switch ($ticket['status'])
+ {
+ case 1:
+ $ticket['status'] = $hesklang['wait_reply'];
+ break;
+ case 2:
+ $ticket['status'] = $hesklang['replied'];
+ break;
+ case 3:
+ $ticket['status'] = $hesklang['closed'];
+ break;
+ case 4:
+ $ticket['status'] = $hesklang['in_progress'];
+ break;
+ case 5:
+ $ticket['status'] = $hesklang['on_hold'];
+ break;
+ default:
+ $ticket['status'] = $hesklang['open'];
+ }
+
+ /* Replace all special tags */
+ $msg = str_replace('%%SUBJECT%%', $ticket['subject'], $msg);
+ $msg = str_replace('%%TRACK_ID%%', $ticket['trackid'], $msg);
+ $msg = str_replace('%%CATEGORY%%', $ticket['category'], $msg);
+ $msg = str_replace('%%PRIORITY%%', $ticket['priority'], $msg);
+ $msg = str_replace('%%STATUS%%', $ticket['status'], $msg);
+
+ return $msg;
+
+} // hesk_getEmailSubject()
+
+
+function hesk_getEmailMessage($eml_file, $ticket, $is_admin=0, $is_ticket=1, $just_message=0)
+{
+ global $hesk_settings, $hesklang;
+
+ // Demo mode
+ if ( defined('HESK_DEMO') )
+ {
+ return '';
+ }
+
+ /* Get list of valid emails */
+ $valid_emails = hesk_validEmails();
+
+ /* Verify this is a valid email include */
+ if ( ! isset($valid_emails[$eml_file]))
+ {
+ hesk_error($hesklang['inve']);
+ }
+
+ /* Get email template */
+ $eml_file = 'language/' . $hesk_settings['languages'][$hesk_settings['language']]['folder'] . '/emails/' . $eml_file . '.txt';
+
+ if (file_exists(HESK_PATH . $eml_file))
+ {
+ $msg = file_get_contents(HESK_PATH . $eml_file);
+ }
+ else
+ {
+ hesk_error($hesklang['emfm'].': '.$eml_file);
+ }
+
+ /* Return just the message without any processing? */
+ if ($just_message)
+ {
+ return $msg;
+ }
+
+ // Convert any entities in site title to plain text
+ $hesk_settings['site_title'] = hesk_msgToPlain($hesk_settings['site_title'], 1);
+
+ /* If it's not a ticket-related mail (like "a new PM") just process quickly */
+ if ( ! $is_ticket)
+ {
+ $trackingURL = $hesk_settings['hesk_url'] . '/' . $hesk_settings['admin_dir'] . '/mail.php?a=read&id=' . intval($ticket['id']);
+
+ $msg = str_replace('%%NAME%%', $ticket['name'] ,$msg);
+ $msg = str_replace('%%SUBJECT%%', $ticket['subject'] ,$msg);
+ $msg = str_replace('%%TRACK_URL%%', $trackingURL ,$msg);
+ $msg = str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'] ,$msg);
+ $msg = str_replace('%%SITE_URL%%', $hesk_settings['site_url'] ,$msg);
+
+ if ( isset($ticket['message']) )
+ {
+ return str_replace('%%MESSAGE%%', $ticket['message'], $msg);
+ }
+ else
+ {
+ return $msg;
+ }
+ }
+
+ // Is email required to view ticket (for customers only)?
+ $hesk_settings['e_param'] = $hesk_settings['email_view_ticket'] ? '&e=' . rawurlencode($ticket['email']) : '';
+
+ /* Generate the ticket URLs */
+ $trackingURL = $hesk_settings['hesk_url'];
+ $trackingURL.= $is_admin ? '/' . $hesk_settings['admin_dir'] . '/admin_ticket.php' : '/ticket.php';
+ $trackingURL.= '?track='.$ticket['trackid'].($is_admin ? '' : $hesk_settings['e_param']).'&Refresh='.rand(10000,99999);
+
+ /* Set category title */
+ $ticket['category'] = hesk_msgToPlain(hesk_getCategoryName($ticket['category']), 1);
+
+ /* Set priority title */
+ switch ($ticket['priority'])
+ {
+ case 0:
+ $ticket['priority'] = $hesklang['critical'];
+ break;
+ case 1:
+ $ticket['priority'] = $hesklang['high'];
+ break;
+ case 2:
+ $ticket['priority'] = $hesklang['medium'];
+ break;
+ default:
+ $ticket['priority'] = $hesklang['low'];
+ }
+
+ /* Get owner name */
+ $ticket['owner'] = hesk_msgToPlain( hesk_getOwnerName($ticket['owner']), 1);
+
+ /* Set status */
+ switch ($ticket['status'])
+ {
+ case 1:
+ $ticket['status'] = $hesklang['wait_reply'];
+ break;
+ case 2:
+ $ticket['status'] = $hesklang['replied'];
+ break;
+ case 3:
+ $ticket['status'] = $hesklang['closed'];
+ break;
+ case 4:
+ $ticket['status'] = $hesklang['in_progress'];
+ break;
+ case 5:
+ $ticket['status'] = $hesklang['on_hold'];
+ break;
+ default:
+ $ticket['status'] = $hesklang['open'];
+ }
+
+ /* Replace all special tags */
+ $msg = str_replace('%%NAME%%', $ticket['name'] ,$msg);
+ $msg = str_replace('%%SUBJECT%%', $ticket['subject'] ,$msg);
+ $msg = str_replace('%%TRACK_ID%%', $ticket['trackid'] ,$msg);
+ $msg = str_replace('%%TRACK_URL%%', $trackingURL ,$msg);
+ $msg = str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'],$msg);
+ $msg = str_replace('%%SITE_URL%%', $hesk_settings['site_url'] ,$msg);
+ $msg = str_replace('%%CATEGORY%%', $ticket['category'] ,$msg);
+ $msg = str_replace('%%PRIORITY%%', $ticket['priority'] ,$msg);
+ $msg = str_replace('%%OWNER%%', $ticket['owner'] ,$msg);
+ $msg = str_replace('%%STATUS%%', $ticket['status'] ,$msg);
+ $msg = str_replace('%%EMAIL%%', $ticket['email'] ,$msg);
+ $msg = str_replace('%%CREATED%%', $ticket['dt'] ,$msg);
+ $msg = str_replace('%%UPDATED%%', $ticket['lastchange'] ,$msg);
+
+ /* All custom fields */
+ foreach ($hesk_settings['custom_fields'] as $k=>$v)
+ {
+ if ($v['use'])
+ {
+ if ($v['type'] == 'checkbox')
+ {
+ $ticket[$k] = str_replace("
","\n",$ticket[$k]);
+ }
+
+ $msg = str_replace('%%'.strtoupper($k).'%%',stripslashes($ticket[$k]),$msg);
+ }
+ else
+ {
+ $msg = str_replace('%%'.strtoupper($k).'%%','',$msg);
+ }
+ }
+
+ // Is message tag in email template?
+ if (strpos($msg, '%%MESSAGE%%') !== false)
+ {
+ // Replace message
+ $msg = str_replace('%%MESSAGE%%',$ticket['message'],$msg);
+
+ // Add direct links to any attachments at the bottom of the email message
+ if ($hesk_settings['attachments']['use'] && isset($ticket['attachments']) && strlen($ticket['attachments']) )
+ {
+ $msg .= "\n\n\n" . $hesklang['fatt'];
+
+ $att = explode(',', substr($ticket['attachments'], 0, -1));
+ foreach ($att as $myatt)
+ {
+ list($att_id, $att_name) = explode('#', $myatt);
+ $msg .= "\n\n" . $att_name . "\n" . $hesk_settings['hesk_url'] . '/download_attachment.php?att_id='.$att_id.'&track='.$ticket['trackid'].$hesk_settings['e_param'];
+ }
+ }
+
+ // For customer notifications: if we allow email piping/pop 3 fetching and
+ // stripping quoted replies add an "reply above this line" tag
+ if ( ! $is_admin && ($hesk_settings['email_piping'] || $hesk_settings['pop3']) && $hesk_settings['strip_quoted'])
+ {
+ $msg = $hesklang['EMAIL_HR'] . "\n\n" . $msg;
+ }
+ }
+
+ return $msg;
+
+} // END hesk_getEmailMessage
diff --git a/language/en/emails/ticket_closed.txt b/language/en/emails/ticket_closed.txt
new file mode 100644
index 00000000..51cfb97c
--- /dev/null
+++ b/language/en/emails/ticket_closed.txt
@@ -0,0 +1,14 @@
+Dear %%NAME%%,
+
+Your support ticket "%%SUBJECT%%" has been updated to a closed/resolved status.
+
+Ticket tracking ID: %%TRACK_ID%%
+
+You can view the status of your ticket here:
+%%TRACK_URL%%
+
+
+Sincerely,
+
+%%SITE_TITLE%%
+%%SITE_URL%%
\ No newline at end of file
diff --git a/language/en/text.php b/language/en/text.php
index 23eb6d45..14e9c087 100644
--- a/language/en/text.php
+++ b/language/en/text.php
@@ -21,6 +21,11 @@ $hesklang['_COLLATE']='utf8_unicode_ci';
// This is the email break line that will be used in email piping
$hesklang['EMAIL_HR']='------ Reply above this line ------';
+// ADDED OR MODIFIED IN Mods For Hesk 1.6.0
+$hesklang['ticket_closed'] = '[#%%TRACK_ID%%] Ticket closed/resolved';
+$hesklang['ticket_reopen'] = '[#%%TRACK_ID%%] Ticket reopened';
+$hesklang['ticket_reopen_assigned'] = '[#%%TRACK_ID%%] Assigned ticket reopened';
+
// ADDED OR MODIFIED IN NuMods 1.5.0
$hesklang['ticket_auto_refresh'] = 'Ticket Table Auto-Refresh:';
$hesklang['display_rtl'] = 'Display site right-to-left';