diff --git a/admin/admin_reply_ticket.php b/admin/admin_reply_ticket.php index 5a422efe..2b85c6cc 100644 --- a/admin/admin_reply_ticket.php +++ b/admin/admin_reply_ticket.php @@ -62,7 +62,9 @@ hesk_dbConnect(); hesk_isLoggedIn(); /* Check permissions for this feature */ -hesk_checkPermission('can_reply_tickets'); +if (!isset($_REQUEST['isManager']) || !$_REQUEST['isManager']) { + hesk_checkPermission('can_reply_tickets'); +} /* A security check */ # hesk_token_check('POST'); @@ -310,7 +312,7 @@ else $sql .= ",`time_worked` = ADDTIME(`time_worked`,'" . hesk_dbEscape($time_worked) . "') "; } -if ( ! empty($_POST['assign_self']) && hesk_checkPermission('can_assign_self',0)) +if ( ! empty($_POST['assign_self']) && (hesk_checkPermission('can_assign_self',0) || (isset($_REQUEST['isManager']) && $_REQUEST['isManager']))) { $revision = sprintf($hesklang['thist2'],hesk_date(),$_SESSION['name'].' ('.$_SESSION['user'].')',$_SESSION['name'].' ('.$_SESSION['user'].')'); $sql .= " , `owner`=".intval($_SESSION['id']).", `history`=CONCAT(`history`,'".hesk_dbEscape($revision)."') "; diff --git a/admin/admin_ticket.php b/admin/admin_ticket.php index 4bf2e0be..3b5cfc32 100644 --- a/admin/admin_ticket.php +++ b/admin/admin_ticket.php @@ -123,15 +123,21 @@ else } /* Get category name and ID */ -$result = hesk_dbQuery("SELECT `id`, `name` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` WHERE `id`='".intval($ticket['category'])."' LIMIT 1"); +$result = hesk_dbQuery("SELECT `id`, `name`, `manager` 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 `id`, `name` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` WHERE `id`='1' LIMIT 1"); + $result = hesk_dbQuery("SELECT `id`, `name`, `manager` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` WHERE `id`='1' LIMIT 1"); } $category = hesk_dbFetchAssoc($result); +$managerRS = hesk_dbQuery('SELECT * FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'users` WHERE `id` = '.intval($_SESSION['id'])); +$managerRow = hesk_dbFetchAssoc($managerRS); +$isManager = $managerRow['id'] == $category['manager']; +if ($isManager) { + $can_del_notes = $can_reply = $can_delete = $can_edit = $can_archive = $can_assign_self = $can_view_unassigned = $can_change_cat = true; +} /* Is this user allowed to view tickets inside this category? */ hesk_okCategory($category['id']); @@ -989,16 +995,17 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); $isClosable = $isTicketClosedRow['Closable'] == 'yes' || $isTicketClosedRow['Closable'] == 'sonly'; echo '
'; + $mgr = $isManager ? '&isManager=1' : ''; if ($isTicketClosed == 0 && $isClosable) // Ticket is still open { echo ' + class="btn btn-default btn-sm" href="change_status.php?track='.$trackingID.$mgr.'&s='.$staffClosedOptionStatus['ID'].'&Refresh='.$random.'&token='.hesk_token_echo(0).'"> '.$hesklang['close_action'].''; } elseif ($isTicketClosed == 1) { echo ' + class="btn btn-default btn-sm" href="change_status.php?track='.$trackingID.$mgr.'&s='.$staffReopenedStatus['ID'].'&Refresh='.$random.'&token='.hesk_token_echo(0).'"> '.$hesklang['open_action'].''; } @@ -1059,8 +1066,11 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); - - + '; + if ($isManager) { + echo ''; + } + echo ' @@ -1083,13 +1093,16 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); - - + '; + if ($isManager) { + echo ''; + } + echo '
'; echo '

'.$hesklang['owner'].'

'; - if (hesk_checkPermission('can_assign_others',0)) + if (hesk_checkPermission('can_assign_others',0) || $isManager) { echo'
@@ -1631,7 +1644,7 @@ function hesk_getFontAwesomeIconForFileExtension($fileExtension) function hesk_getAdminButtons($reply=0,$white=1) { - global $hesk_settings, $hesklang, $ticket, $reply, $trackingID, $can_edit, $can_archive, $can_delete; + global $hesk_settings, $hesklang, $ticket, $reply, $trackingID, $can_edit, $can_archive, $can_delete, $isManager; $options = '
'; @@ -1680,7 +1693,8 @@ function hesk_getAdminButtons($reply=0,$white=1) if ($can_edit) { $tmp = $reply ? '&reply='.$reply['id'] : ''; - $options .= ' '.$hesklang['edtt'].' '; + $mgr = $isManager ? '&isManager=true' : ''; + $options .= ' '.$hesklang['edtt'].' '; } @@ -1712,7 +1726,7 @@ function hesk_getAdminButtons($reply=0,$white=1) function hesk_getAdminButtonsInTicket($reply=0,$white=1) { - global $hesk_settings, $hesklang, $ticket, $reply, $trackingID, $can_edit, $can_archive, $can_delete; + global $hesk_settings, $hesklang, $ticket, $reply, $trackingID, $can_edit, $can_archive, $can_delete, $isManager; $options = '
'; @@ -1724,7 +1738,8 @@ function hesk_getAdminButtonsInTicket($reply=0,$white=1) if ($can_edit) { $tmp = $reply ? '&reply='.$reply['id'] : ''; - $options .= ' '.$hesklang['edtt'].' '; + $mgr = $isManager ? '&isManager=true' : ''; + $options .= ' '.$hesklang['edtt'].' '; } @@ -1761,74 +1776,30 @@ function print_form() global $trackingID; /* Print header */ - require_once(HESK_PATH . 'inc/header.inc.php'); + require_once(HESK_PATH . 'inc/headerAdmin.inc.php'); /* Print admin navigation */ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); - ?> - - - - - - -  
- - -
- - - - - - - - - - - - - - - - -
  - - - - - - - - - - - - - - - - - - - - -
-

-
  
  - :

  -
 
- - - -
 
-
- -

 

+
+
+

+
+
+ +
+
+ + +
+
+
+
+
@@ -2078,9 +2049,11 @@ function hesk_printReplyForm() { ?>
- + + +
-
diff --git a/admin/change_status.php b/admin/change_status.php index 1949719d..84d3761b 100644 --- a/admin/change_status.php +++ b/admin/change_status.php @@ -46,8 +46,10 @@ hesk_dbConnect(); hesk_isLoggedIn(); /* Check permissions for this feature */ -hesk_checkPermission('can_view_tickets'); -hesk_checkPermission('can_reply_tickets'); +if (!isset($_REQUEST['isManager']) || !$_REQUEST['isManager']) { + hesk_checkPermission('can_view_tickets'); + hesk_checkPermission('can_reply_tickets'); +} /* A security check */ hesk_token_check(); diff --git a/admin/edit_post.php b/admin/edit_post.php index 4abcb98e..833f5b24 100644 --- a/admin/edit_post.php +++ b/admin/edit_post.php @@ -46,8 +46,10 @@ hesk_dbConnect(); hesk_isLoggedIn(); /* Check permissions for this feature */ -hesk_checkPermission('can_view_tickets'); -hesk_checkPermission('can_edit_tickets'); +if (!isset($_REQUEST['isManager']) || !$_REQUEST['isManager']) { + hesk_checkPermission('can_view_tickets'); + hesk_checkPermission('can_edit_tickets'); +} /* Ticket ID */ $trackingID = hesk_cleanID() or die($hesklang['int_error'].': '.$hesklang['no_trackID']); @@ -70,7 +72,9 @@ if ( defined('HESK_DEMO') ) } /* Is this user allowed to view tickets inside this category? */ -hesk_okCategory($ticket['category']); +if (!isset($_REQUEST['isManager']) || !$_REQUEST['isManager']) { + hesk_okCategory($ticket['category']); +} if ( hesk_isREQUEST('reply') ) { @@ -466,6 +470,9 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
+ + +
diff --git a/admin/manage_categories.php b/admin/manage_categories.php index 70980ba5..0ba7baba 100644 --- a/admin/manage_categories.php +++ b/admin/manage_categories.php @@ -68,6 +68,7 @@ if ( $action = hesk_REQUEST('a') ) elseif ($action == 'autoassign') {toggle_autoassign();} elseif ($action == 'type') {toggle_type();} elseif ($action == 'priority') {change_priority();} + elseif ($action == 'manager') {change_manager();} } /* Print header */ @@ -238,7 +239,6 @@ else {return false;} }) -
+ @@ -275,6 +276,11 @@ else {return false;} /* Get list of categories */ $res = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` ORDER BY `cat_order` ASC"); + $usersRes = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `isadmin` = '0' ORDER BY `name` ASC"); + $users = array(); + while ($userRow = hesk_dbFetchAssoc($usersRes)) { + array_push($users, $userRow); + } $i=1; $j=0; @@ -356,6 +362,7 @@ else {return false;}
+ '.output_user_dropdown($mycat['id'], $mycat['manager'], $users).' ' . $autoassign_code . ' @@ -702,4 +709,58 @@ function toggle_type() hesk_process_messages($tmp,'./manage_categories.php','SUCCESS'); } // End toggle_type() + +function output_user_dropdown($catId, $selectId, $userArray) { + global $hesklang; + + if (!hesk_checkPermission('can_set_manager', 0)) { + foreach ($userArray as $user) { + if ($user['id'] == $selectId) { + return '

'.$user['name'].'

'; + } + } + return '

'.$hesklang['no_manager'].'

'; + } else { + $dropdownMarkup = ''; + + + return '
+ + + '.$dropdownMarkup.' +
'; + } +} + +function change_manager() { + global $hesklang, $hesk_settings; + + $catid = hesk_POST('catid'); + $newManagerId = hesk_POST('managerid'); + + hesk_dbQuery('UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix']).'categories` SET `manager` = '.intval($newManagerId).' WHERE `id` = '.intval($catid)); + if (hesk_dbAffectedRows() != 1) + { + hesk_process_messages($hesklang['int_error'].': '.$hesklang['cat_not_found'],'./manage_categories.php'); + } + if ($newManagerId == 0) { + // There is no new manager. + return; + } + // Add the category to the user's categories list, if not already present + $currentCatRs = hesk_dbQuery('SELECT `categories` FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'users` WHERE `id` = '.intval($newManagerId)); + $currentCategories = hesk_dbFetchAssoc($currentCatRs); + $categories = explode(',', $currentCategories['categories']); + if (!in_array($catid, $categories)) { + hesk_dbQuery('UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix']).'users` SET `categories` = \''.$currentCategories['categories'].','.$catid.'\' WHERE `id` = '.intval($newManagerId)); + } + + hesk_process_messages($hesklang['manager_updated'],'./manage_categories.php','SUCCESS'); +} ?> diff --git a/admin/manage_users.php b/admin/manage_users.php index 5e2e4d59..ed8ec1eb 100644 --- a/admin/manage_users.php +++ b/admin/manage_users.php @@ -79,6 +79,7 @@ $hesk_settings['features'] = array( 'can_service_msg', /* User can manage service messages shown in customer interface */ 'can_man_email_tpl', /* User can manage email templates */ 'can_man_ticket_statuses', /* User can manage ticket statuses */ +'can_set_manager', /* User can set category managers */ ); /* Set default values */ @@ -685,6 +686,31 @@ function update_user() hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `owner`=0 WHERE `owner`='".intval($myuser['id'])."' AND `category` NOT IN (".$myuser['categories'].")"); } + // Find the list of categories they are manager of. If they no longer have access to the category, revoke their manager permission. + if ($myuser['isadmin']) { + // Admins can't be managers + hesk_dbQuery('UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix']).'categories` SET `manager` = 0 WHERE `manager` = '.intval($myuser['id'])); + } else { + $currentCatRs = hesk_dbQuery("SELECT `categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `id` = '".intval($myuser['id'])."' LIMIT 1"); + $rowOfCategories = hesk_dbFetchAssoc($currentCatRs); + $cats = $rowOfCategories['categories']; + $currentCategories = explode(',', $cats); + $newCategories = explode(',', $myuser['categories']); + + // If any any elements are in current but not in new, add them to the revoke array + $revokeCats = array(); + foreach ($currentCategories as $currentCategory) { + if (!in_array($currentCategory, $newCategories) && $currentCategory != '') { + array_push($revokeCats, $currentCategory); + } + } + + if (count($revokeCats) > 0) { + hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "categories` SET `manager` = 0 WHERE `id` IN (" . implode(',', $revokeCats) . ")"); + } + } + + hesk_dbQuery( "UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` SET `user`='".hesk_dbEscape($myuser['user'])."', @@ -714,6 +740,13 @@ function update_user() `autorefresh`=".intval($myuser['autorefresh'])." WHERE `id`='".intval($myuser['id'])."' LIMIT 1"); + // If they are now inactive, remove any manager rights + if (!$myuser['active']) { + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` SET `manager` = 0 WHERE `manager` = ".intval($myuser['id'])); + } + + + unset($_SESSION['save_userdata']); unset($_SESSION['userdata']); @@ -892,6 +925,9 @@ function remove() hesk_process_messages($hesklang['cant_del_own'],'./manage_users.php'); } + // Revoke manager rights + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` SET `manager` = 0 WHERE `manager` = ".intval($myuser)); + /* Un-assign all tickets for this user */ $res = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `owner`=0 WHERE `owner`='".intval($myuser)."'"); @@ -962,9 +998,14 @@ function toggle_active() { $active = 0; $tmp = $hesklang['user_deactivated']; + + // Revoke any manager rights + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` SET `manager` = 0 WHERE `manager` = ".intval($myuser)); + $notificationSql = ", `autoassign` = 0, `notify_new_unassigned` = 0, `notify_new_my` = 0, `notify_reply_unassigned` = 0, `notify_reply_my` = 0, `notify_assigned` = 0, `notify_pm` = 0, `notify_note` = 0, `notify_note_unassigned` = 0"; } + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` SET `active` = '".$active."'".$notificationSql." WHERE `id` = '".intval($myuser)."'"); if (hesk_dbAffectedRows() != 1) { diff --git a/install/mods-for-hesk/sql/installSql.php b/install/mods-for-hesk/sql/installSql.php index 97974648..38427c96 100644 --- a/install/mods-for-hesk/sql/installSql.php +++ b/install/mods-for-hesk/sql/installSql.php @@ -452,6 +452,7 @@ function execute230Scripts() { executeQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` ADD COLUMN `longitude` VARCHAR(100) NOT NULL DEFAULT 'E-0'"); executeQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."stage_tickets` ADD COLUMN `latitude` VARCHAR(100) NOT NULL DEFAULT 'E-0'"); executeQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."stage_tickets` ADD COLUMN `longitude` VARCHAR(100) NOT NULL DEFAULT 'E-0'"); + executeQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` ADD COLUMN `manager` INT NOT NULL DEFAULT 0"); executeQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."settings` SET `Value` = '2.3.0' WHERE `Key` = 'modsForHeskVersion'"); } diff --git a/language/en/text.php b/language/en/text.php index 10a2aee3..9614ffd2 100644 --- a/language/en/text.php +++ b/language/en/text.php @@ -66,6 +66,10 @@ $hesklang['your_current_location'] = 'Your location'; $hesklang['requesting_location_ellipsis'] = 'Requesting location...'; $hesklang['unable_to_determine_location'] = 'Unable to determine your location, or you declined to share it.'; $hesklang['save_to_see_updated_address'] = 'Save the new location to see the updated address'; +$hesklang['manager'] = 'Manager'; +$hesklang['manager_updated'] = 'Category manager has been updated.'; +$hesklang['can_set_manager'] = 'Can set category managers'; +$hesklang['no_manager'] = 'No manager'; // ADDED OR MODIFIED IN Mods for HESK 2.2.1 $hesklang['popart_no_colon']='Top Knowledgebase Articles'; // same as $hesklang['popart'] but without a colon (:)