diff --git a/include/class.config.php b/include/class.config.php index a2cad713eb487ab4542f4186fb19cc4c5f308fe1..7c2995a8d8fb1856978388bcdbccba1b52b8003c 100644 --- a/include/class.config.php +++ b/include/class.config.php @@ -905,6 +905,9 @@ class OsticketConfig extends Config { case 'tickets': return $this->updateTicketsSettings($vars, $errors); break; + case 'tasks': + return $this->updateTasksSettings($vars, $errors); + break; case 'emails': return $this->updateEmailsSettings($vars, $errors); break; @@ -1056,6 +1059,82 @@ class OsticketConfig extends Config { )); } + function updateTasksSettings($vars, &$errors) { + $f=array(); + $f['default_task_sla_id']=array('type'=>'int', 'required'=>1, 'error'=>__('Selection required')); + $f['default_task_priority_id']=array('type'=>'int', 'required'=>1, 'error'=>__('Selection required')); + + if (!preg_match('`(?!<\\\)#`', $vars['task_number_format'])) + $errors['task_number_format'] = 'Task number format requires at least one hash character (#)'; + + Validator::process($f, $vars, $errors); + + if ($vars['task_alert_active'] + && (!isset($vars['task_alert_admin']) + && !isset($vars['task_alert_dept_manager']) + && !isset($vars['task_alert_dept_members']) + && !isset($vars['task_alert_acct_manager']))) { + $errors['task_alert_active'] = __('Select recipient(s)'); + } + + if ($vars['task_activity_alert_active'] + && (!isset($vars['task_activity_alert_laststaff']) + && !isset($vars['task_activity_alert_assigned']) + && !isset($vars['task_activity_alert_dept_manager']))) { + $errors['task_activity_alert_active'] = __('Select recipient(s)'); + } + + if ($vars['task_transfer_alert_active'] + && (!isset($vars['task_transfer_alert_assigned']) + && !isset($vars['task_transfer_alert_dept_manager']) + && !isset($vars['task_transfer_alert_dept_members']))) { + $errors['task_transfer_alert_active'] = __('Select recipient(s)'); + } + + if ($vars['task_overdue_alert_active'] + && (!isset($vars['task_overdue_alert_assigned']) + && !isset($vars['task_overdue_alert_dept_manager']) + && !isset($vars['task_overdue_alert_dept_members']))) { + $errors['task_overdue_alert_active'] = __('Select recipient(s)'); + } + + if ($vars['task_assignment_alert_active'] + && (!isset($vars['task_assignment_alert_staff']) + && !isset($vars['task_assignment_alert_team_lead']) + && !isset($vars['task_assignment_alert_team_members']))) { + $errors['task_assignment_alert_active'] = __('Select recipient(s)'); + } + + if ($errors) + return false; + + return $this->updateAll(array( + 'task_number_format'=>$vars['task_number_format'] ?: '######', + 'task_sequence_id'=>$vars['task_sequence_id'] ?: 0, + 'default_task_priority_id'=>$vars['default_task_priority_id'], + 'default_task_sla_id'=>$vars['default_task_sla_id'], + 'task_alert_active'=>$vars['task_alert_active'], + 'task_alert_admin'=>isset($vars['task_alert_admin']) ? 1 : 0, + 'task_alert_dept_manager'=>isset($vars['task_alert_dept_manager']) ? 1 : 0, + 'task_alert_dept_members'=>isset($vars['task_alert_dept_members']) ? 1 : 0, + 'task_activity_alert_active'=>$vars['task_activity_alert_active'], + 'task_activity_alert_laststaff'=>isset($vars['task_activity_alert_laststaff']) ? 1 : 0, + 'task_activity_alert_assigned'=>isset($vars['task_activity_alert_assigned']) ? 1 : 0, + 'task_activity_alert_dept_manager'=>isset($vars['task_activity_alert_dept_manager']) ? 1 : 0, + 'task_assignment_alert_active'=>$vars['task_assignment_alert_active'], + 'task_assignment_alert_staff'=>isset($vars['task_assignment_alert_staff']) ? 1 : 0, + 'task_assignment_alert_team_lead'=>isset($vars['task_assignment_alert_team_lead']) ? 1 : 0, + 'task_assignment_alert_team_members'=>isset($vars['task_assignment_alert_team_members']) ? 1 : 0, + 'task_transfer_alert_active'=>$vars['task_transfer_alert_active'], + 'task_transfer_alert_assigned'=>isset($vars['task_transfer_alert_assigned']) ? 1 : 0, + 'task_transfer_alert_dept_manager'=>isset($vars['task_transfer_alert_dept_manager']) ? 1 : 0, + 'task_transfer_alert_dept_members'=>isset($vars['task_transfer_alert_dept_members']) ? 1 : 0, + 'task_overdue_alert_active'=>$vars['task_overdue_alert_active'], + 'task_overdue_alert_assigned'=>isset($vars['task_overdue_alert_assigned']) ? 1 : 0, + 'task_overdue_alert_dept_manager'=>isset($vars['task_overdue_alert_dept_manager']) ? 1 : 0, + 'task_overdue_alert_dept_members'=>isset($vars['task_overdue_alert_dept_members']) ? 1 : 0, + )); + } function updateEmailsSettings($vars, &$errors) { $f=array(); diff --git a/include/class.nav.php b/include/class.nav.php index c5c296d4733cfb17ec4cde98e795e1ecbe4ce547..7d3c119b753d515ddf3e24a76359627eec9723c2 100644 --- a/include/class.nav.php +++ b/include/class.nav.php @@ -246,6 +246,7 @@ class AdminNav extends StaffNav{ $subnav[]=array('desc'=>__('Company'),'href'=>'settings.php?t=pages','iconclass'=>'pages'); $subnav[]=array('desc'=>__('System'),'href'=>'settings.php?t=system','iconclass'=>'preferences'); $subnav[]=array('desc'=>__('Tickets'),'href'=>'settings.php?t=tickets','iconclass'=>'ticket-settings'); + $subnav[]=array('desc'=>__('Tasks'),'href'=>'settings.php?t=tasks','iconclass'=>'lists'); $subnav[]=array('desc'=>__('Access'),'href'=>'settings.php?t=access','iconclass'=>'users'); $subnav[]=array('desc'=>__('Knowledgebase'),'href'=>'settings.php?t=kb','iconclass'=>'kb-settings'); $subnav[]=array('desc'=>__('Autoresponder'),'href'=>'settings.php?t=autoresp','iconclass'=>'email-autoresponders'); diff --git a/include/i18n/en_US/help/tips/settings.tasks.yaml b/include/i18n/en_US/help/tips/settings.tasks.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6d1f056187ec87bc7e9ce8d42a05bd702f5bf7c0 --- /dev/null +++ b/include/i18n/en_US/help/tips/settings.tasks.yaml @@ -0,0 +1,110 @@ +# +# This is popup help messages for the Admin Panel -> Settings -> Tasks +# +# Fields: +# title - Shown in bold at the top of the popover window +# content - The body of the help popover +# links - List of links shows below the content +# title - Link title +# href - href of link (links starting with / are translated to the +# helpdesk installation path) +# +# The key names such as 'helpdesk_name' should not be translated as they +# must match the HTML #ids put into the page template. +# +--- +number_format: + title: Task Number Format + content: > + This setting is used to generate task numbers. Use hash signs + (`#`) where digits are to be placed. Any other text in the number + format will be preserved. + <br/><br/> + For example, for six-digit numbers, use <code>######</code>. + +sequence_id: + title: Task Number Sequence + content: > + Choose a sequence from which to derive new task numbers. The + system has a incrementing sequence and a random sequence by default. + You may create as many sequences as you wish. + +default_sla: + title: Default SLA + content: > + Choose the default Service Level Agreement to manage how long a task + can remain Open before it is rendered Overdue. + links: + - title: Create more SLA Plans + href: /scp/slas.php + +default_priority: + title: Default Priority + content: > + Choose a default <span class="doc-desc-title">priority</span> for + tasks not assigned a priority automatically. + +task_attachment_settings: + title: Task Thread Attachments + content: > + Configure settings for files attached to the <span + class="doc-desc-title">description</span> field. These settings + are used for all new tasks and new messages regardless of the + source channel (web portal, email, api, etc.). + +page_title: + title: Alerts and Notices + content: > + Alerts and Notices are automated email notifications sent to Agents + when various task events are triggered. + +task_alert: + title: New Task Alert + content: > + <p> + Alert sent out to Agents when a new task is created. + </p><p class="info-banner"> + <i class="icon-info-sign"></i> + This alert is not sent out if the task is auto-assigned. + </p> + links: + - title: Default New Task Alert Template + href: /scp/templates.php?default_for=task.alert + +activity_alert: + title: New Activity Alert + content: > + Alert sent out to Agents when a new message is appended to an + existing task. + links: + - title: Default New Activity Alert Template + href: /scp/templates.php?default_for=task.activity.alert + +assignment_alert: + title: Task Assignment Alert + content: > + Alert sent out to Agents on task assignment. + links: + - title: Default Task Assignment Alert Template + href: /scp/templates.php?default_for=task.assignment.alert + +transfer_alert: + title: Task Transfer Alert + content: > + Alert sent out to Agents on task transfer between Departments. + links: + - title: Default Task Transfer Alert Template + href: /scp/templates.php?default_for=task.transfer.alert + +overdue_alert: + title: Overdue Task Alert + content: > + Alert sent out to Agents when a task becomes overdue based on SLA + or Due Date. + links: + - title: Default Stale Task Alert Template + href: /scp/templates.php?default_for=task.overdue.alert + + - title: Manage SLAs + href: /scp/slas.php + diff --git a/include/staff/settings-tasks.inc.php b/include/staff/settings-tasks.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..d6a0d61d69d8cf73028dd566ac74f193486ef98f --- /dev/null +++ b/include/staff/settings-tasks.inc.php @@ -0,0 +1,311 @@ +<?php +if(!defined('OSTADMININC') || !$thisstaff || !$thisstaff->isAdmin() || !$config) die('Access Denied'); +if(!($maxfileuploads=ini_get('max_file_uploads'))) + $maxfileuploads=DEFAULT_MAX_FILE_UPLOADS; +?> +<h2><?php echo __('Tasks Settings and Options');?></h2> +<form action="settings.php?t=tasks" method="post" id="save"> +<?php csrf_token(); ?> +<input type="hidden" name="t" value="tasks" > + +<ul class="tabs" id="tasks-tabs"> + <li class="active"><a href="#settings"> + <i class="icon-asterisk"></i> <?php echo __('Settings'); ?></a></li> + <li><a href="#alerts"> + <i class="icon-bell-alt"></i> <?php echo __('Alerts & Notices'); ?></a></li> +</ul> +<div id="tasks-tabs_container"> + <div id="settings" class="tab_content"> + <table class="form_table settings_table" width="940" border="0" cellspacing="0" cellpadding="2"> + <thead> + <tr> + <th colspan="2"> + <em><?php echo __('Global default task settings and options.'); ?></em> + </th> + </tr> + </thead> + <tbody> + <tr> + <td> + <?php echo __('Default Task Number Format'); ?>: + </td> + <td> + <input type="text" name="task_number_format" value="<?php + echo $config['task_number_format']; ?>"/> + <span class="faded"><?php echo __('e.g.'); ?> <span id="format-example"><?php + if ($config['task_sequence_id']) + $seq = Sequence::lookup($config['task_sequence_id']); + if (!isset($seq)) + $seq = new RandomSequence(); + echo $seq->current($config['task_number_format']); + ?></span></span> + <i class="help-tip icon-question-sign" href="#number_format"></i> + <div class="error"><?php echo $errors['task_number_format']; ?></div> + </td> + </tr> + <tr><td width="220"><?php echo __('Default Task Number Sequence'); ?>:</td> + <?php $selected = 'selected="selected"'; ?> + <td> + <select name="task_sequence_id"> + <option value="0" <?php if ($config['task_sequence_id'] == 0) echo $selected; + ?>>— <?php echo __('Random'); ?> —</option> + <?php foreach (Sequence::objects() as $s) { ?> + <option value="<?php echo $s->id; ?>" <?php + if ($config['task_sequence_id'] == $s->id) echo $selected; + ?>><?php echo $s->name; ?></option> + <?php } ?> + </select> + <button class="action-button pull-right" onclick="javascript: + $.dialog('ajax.php/sequence/manage', 205); + return false; + "><i class="icon-gear"></i> <?php echo __('Manage'); ?></button> + <i class="help-tip icon-question-sign" href="#sequence_id"></i> + </td> + </tr> + <tr> + <td width="180" class="required"><?php echo __('Default Priority');?>:</td> + <td> + <select name="default_task_priority_id"> + <?php + $priorities= db_query('SELECT priority_id,priority_desc FROM '.TICKET_PRIORITY_TABLE); + while (list($id,$tag) = db_fetch_row($priorities)){ ?> + <option value="<?php echo $id; ?>"<?php echo + ($config['default_task_priority_id']==$id)?'selected':''; ?>><?php echo $tag; ?></option> + <?php + } ?> + </select> + <span class="error">* <?php echo + $errors['default_task_priority_id']; ?></span> <i class="help-tip icon-question-sign" href="#default_priority"></i> + </td> + </tr> + <tr> + <td width="180" class="required"> + <?php echo __('Default SLA');?>: + </td> + <td> + <span> + <select name="default_task_sla_id"> + <option value="0">— <?php echo __('None');?> —</option> + <?php + if($slas=SLA::getSLAs()) { + foreach($slas as $id => $name) { + echo sprintf('<option value="%d" %s>%s</option>', + $id, + ($config['default_task_sla_id'] && + $id==$config['default_task_sla_id'])?'selected="selected"':'', + $name); + } + } + ?> + </select> + <span class="error">* <?php + echo $errors['default_task_sla_id']; ?></span> <i class="help-tip icon-question-sign" href="#default_sla"></i> + </span> + </td> + </tr> + </tbody> + </table> + </div> + <div id="alerts" class="tab_content" style="display:none;"> + <table class="form_table settings_table" width="940" border="0" cellspacing="0" cellpadding="2"> + <tbody> + <tr><th><em><b><?php echo __('New Task Alert'); ?></b>: + <i class="help-tip icon-question-sign" href="#task_alert"></i> + </em></th></tr> + <tr> + <td><em><b><?php echo __('Status'); ?>:</b></em> + <input type="radio" name="task_alert_active" value="1" + <?php echo $config['task_alert_active'] ? 'checked="checked"' : ''; ?> + /> <?php echo __('Enable'); ?> + <input type="radio" name="task_alert_active" value="0" + <?php echo !$config['task_alert_active'] ? 'checked="checked"' : ''; ?> /> + <?php echo __('Disable'); ?> + <font class="error"> <?php echo $errors['task_alert_active']; ?></font></em> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_alert_admin" <?php + echo $config['task_alert_admin'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Admin Email'); ?> <em>(<?php echo $cfg->getAdminEmail(); ?>)</em> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_alert_dept_manager" + <?php echo $config['task_alert_dept_manager'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Department Manager'); ?> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_alert_dept_members" + <?php echo $config['task_alert_dept_members'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Department Members'); ?> + </td> + </tr> + <tr><th><em><b><?php echo __('New Activity Alert'); ?></b>: + <i class="help-tip icon-question-sign" href="#activity_alert"></i> + </em></th></tr> + <tr> + <td><em><b><?php echo __('Status'); ?>:</b></em> + <input type="radio" name="task_activity_alert_active" value="1" + <?php echo $config['task_activity_alert_active'] ? 'checked="checked"' : ''; ?> /> + <?php echo __('Enable'); ?> + + <input type="radio" name="task_activity_alert_active" value="0" + <?php echo !$config['task_activity_alert_active'] ? 'checked="checked"' : ''; ?> /> + <?php echo __('Disable'); ?> + <font class="error"> <?php echo $errors['task_activity_alert_active']; ?></font> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_activity_alert_laststaff" <?php + echo $config['task_activity_alert_laststaff'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Last Respondent'); ?> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_activity_alert_assigned" + <?php echo $config['task_activity_alert_assigned'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Assigned Agent / Team'); ?> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_activity_alert_dept_manager" + <?php echo $config['task_activity_alert_dept_manager'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Department Manager'); ?> + </td> + </tr> + <tr><th><em><b><?php echo __('Task Assignment Alert'); ?></b>: + <i class="help-tip icon-question-sign" href="#assignment_alert"></i> + </em></th></tr> + <tr> + <td><em><b><?php echo __('Status'); ?>: </b></em> + <input name="task_assignment_alert_active" value="1" type="radio" + <?php echo $config['task_assignment_alert_active'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Enable'); ?> + + <input name="task_assignment_alert_active" value="0" type="radio" + <?php echo !$config['task_assignment_alert_active'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Disable'); ?> + <font class="error"> <?php echo $errors['task_assignment_alert_active']; ?></font> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_assignment_alert_staff" <?php echo + $config['task_assignment_alert_staff'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Assigned Agent / Team'); ?> + </td> + </tr> + <tr> + <td> + <input type="checkbox"name="task_assignment_alert_team_lead" <?php + echo $config['task_assignment_alert_team_lead'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Team Lead'); ?> + </td> + </tr> + <tr> + <td> + <input type="checkbox"name="task_assignment_alert_team_members" + <?php echo $config['task_assignment_alert_team_members'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Team Members'); ?> + </td> + </tr> + <tr><th><em><b><?php echo __('Task Transfer Alert'); ?></b>: + <i class="help-tip icon-question-sign" href="#transfer_alert"></i> + </em></th></tr> + <tr> + <td><em><b><?php echo __('Status'); ?>:</b></em> + <input type="radio" name="task_transfer_alert_active" value="1" + <?php echo $config['task_transfer_alert_active'] ? 'checked="checked"' : ''; ?> /> + <?php echo __('Enable'); ?> + <input type="radio" name="task_transfer_alert_active" value="0" + <?php echo !$config['task_transfer_alert_active'] ? 'checked="checked"' : ''; ?> /> + <?php echo __('Disable'); ?> + <font class="error"> <?php + echo $errors['task_transfer_alert_active']; ?></font> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_transfer_alert_assigned" + <?php echo $config['task_transfer_alert_assigned']?'checked="checked"':''; ?>> + <?php echo __('Assigned Agent / Team'); ?> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_transfer_alert_dept_manager" + <?php echo $config['task_transfer_alert_dept_manager'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Department Manager'); ?> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_transfer_alert_dept_members" + <?php echo $config['task_transfer_alert_dept_members'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Department Members'); ?> + </td> + </tr> + <tr><th><em><b><?php echo __('Overdue Task Alert'); ?></b>: + <i class="help-tip icon-question-sign" href="#overdue_alert"></i> + </em></th></tr> + <tr> + <td><em><b><?php echo __('Status'); ?>:</b></em> + <input type="radio" name="task_overdue_alert_active" value="1" + <?php echo $config['task_overdue_alert_active'] ? 'checked="checked"' : ''; ?> /> <?php echo __('Enable'); ?> + <input type="radio" name="task_overdue_alert_active" value="0" + <?php echo !$config['task_overdue_alert_active'] ? 'checked="checked"' : ''; ?> /> <?php echo __('Disable'); ?> + <font class="error"> <?php echo $errors['task_overdue_alert_active']; ?></font> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_overdue_alert_assigned" <?php + echo $config['task_overdue_alert_assigned'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Assigned Agent / Team'); ?> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_overdue_alert_dept_manager" <?php + echo $config['task_overdue_alert_dept_manager'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Department Manager'); ?> + </td> + </tr> + <tr> + <td> + <input type="checkbox" name="task_overdue_alert_dept_members" <?php + echo $config['task_overdue_alert_dept_members'] ? 'checked="checked"' : ''; ?>> + <?php echo __('Department Members'); ?> + </td> + </tr> + </tbody> + </table> + </div> +</div> +<p style="padding-left:250px;"> + <input class="button" type="submit" name="submit" value="<?php echo __('Save Changes');?>"> + <input class="button" type="reset" name="reset" value="<?php echo __('Reset Changes');?>"> +</p> +</form> +<script type="text/javascript"> +$(function() { + var request = null, + update_example = function() { + request && request.abort(); + request = $.get('ajax.php/sequence/' + + $('[name=task_sequence_id] :selected').val(), + {'format': $('[name=task_number_format]').val()}, + function(data) { $('#format-example').text(data); } + ); + }; + $('[name=task_sequence_id]').on('change', update_example); + $('[name=task_number_format]').on('keyup', update_example); +}); +</script> diff --git a/scp/settings.php b/scp/settings.php index 2fef525750d4ac1db73ccbdf6e576129f5ca5435..a0d0a8c2a8ddba53f215a076a1d1acdb29dfd8e8 100644 --- a/scp/settings.php +++ b/scp/settings.php @@ -21,6 +21,8 @@ $settingOptions=array( array(__('System Settings'), 'settings.system'), 'tickets' => array(__('Ticket Settings and Options'), 'settings.ticket'), + 'tasks' => + array(__('Task Settings and Options'), 'settings.tasks'), 'pages' => array(__('Site Pages'), 'settings.pages'), 'access' =>