Added groups isolation

This commit is contained in:
Dmitriy Simushev 2012-02-25 19:40:05 +00:00
parent a5243fa1f3
commit 61c52eb127
12 changed files with 109 additions and 23 deletions

View File

@ -695,6 +695,7 @@ $settings = array(
'forcessl' => '0', 'forcessl' => '0',
'usercanchangename' => '1', 'usercanchangename' => '1',
'enablegroups' => '0', 'enablegroups' => '0',
'enablegroupsisolation' => '0',
'enablestatistics' => '1', 'enablestatistics' => '1',
'enabletracking' => '0', 'enabletracking' => '0',
'enablepresurvey' => '1', 'enablepresurvey' => '1',

View File

@ -80,6 +80,25 @@ function operator_get_all()
return $operators; return $operators;
} }
function get_operators_from_adjacent_groups($operator)
{
global $mysqlprefix;
$link = connect();
$query = "select distinct ${mysqlprefix}chatoperator.operatorid, vclogin, vclocalename, vccommonname, istatus, idisabled, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from ${mysqlprefix}chatoperator, ${mysqlprefix}chatgroupoperator " .
" where ${mysqlprefix}chatoperator.operatorid = ${mysqlprefix}chatgroupoperator.operatorid and ${mysqlprefix}chatgroupoperator.groupid in " .
"(select g.groupid from ${mysqlprefix}chatgroup g, " .
"(select distinct parent from ${mysqlprefix}chatgroup, ${mysqlprefix}chatgroupoperator " .
"where ${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid and ${mysqlprefix}chatgroupoperator.operatorid = ".$operator['operatorid'].") i " .
"where g.groupid = i.parent or g.parent = i.parent " .
") order by vclogin";
$operators = select_multi_assoc($query, $link);
close_connection($link);
return $operators;
}
function operator_is_online($operator) function operator_is_online($operator)
{ {
global $settings; global $settings;
@ -286,18 +305,23 @@ function logout_operator()
} }
} }
function setup_redirect_links($threadid, $token) function setup_redirect_links($threadid, $operator, $token)
{ {
global $page, $webimroot, $settings, $mysqlprefix; global $page, $webimroot, $settings, $mysqlprefix;
loadsettings(); loadsettings();
$link = connect();
$operatorscount = db_rows_count("${mysqlprefix}chatoperator", array(), "", $link); $operator_in_isolation = in_isolation($operator);
$operators = $operator_in_isolation?get_operators_from_adjacent_groups($operator):operator_get_all();
$operatorscount = count($operators);
$link = connect();
$groupscount = 0; $groupscount = 0;
$groups = array(); $groups = array();
if ($settings['enablegroups'] == "1") { if ($settings['enablegroups'] == "1") {
foreach (get_groups($link, true) as $group) { $groupslist = $operator_in_isolation?get_groups_for_operator($link, $operator, true):get_groups($link, true);
foreach ($groupslist as $group) {
if ($group['inumofagents'] == 0) { if ($group['inumofagents'] == 0) {
continue; continue;
} }
@ -305,17 +329,14 @@ function setup_redirect_links($threadid, $token)
} }
$groupscount = count($groups); $groupscount = count($groups);
} }
close_connection($link);
prepare_pagination(max($operatorscount, $groupscount), 8); prepare_pagination(max($operatorscount, $groupscount), 8);
$p = $page['pagination']; $p = $page['pagination'];
$limit = $p['limit']; $limit = $p['limit'];
$operators = select_multi_assoc(db_build_select( $operators = array_slice($operators, $p['start'], $p['end'] - $p['start']);
"operatorid, vclogin, vclocalename, vccommonname, istatus, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time",
"${mysqlprefix}chatoperator", array(), "order by vclogin $limit"), $link);
$groups = array_slice($groups, $p['start'], $p['end'] - $p['start']); $groups = array_slice($groups, $p['start'], $p['end'] - $p['start']);
close_connection($link);
$agent_list = ""; $agent_list = "";
$params = array('thread' => $threadid, 'token' => $token); $params = array('thread' => $threadid, 'token' => $token);
@ -375,6 +396,13 @@ function is_capable($perm, $operator)
return $perm >= 0 && $perm < 32 && ($permissions & (1 << $perm)) != 0; return $perm >= 0 && $perm < 32 && ($permissions & (1 << $perm)) != 0;
} }
function in_isolation($operator)
{
global $settings, $can_administrate;
loadsettings();
return (!is_capable($can_administrate, $operator) && $settings['enablegroups'] && $settings['enablegroupsisolation']);
}
function prepare_menu($operator, $hasright = true) function prepare_menu($operator, $hasright = true)
{ {
global $page, $settings, $can_administrate; global $page, $settings, $can_administrate;
@ -395,6 +423,18 @@ function get_all_groups($link)
return get_sorted_child_groups_(select_multi_assoc($query, $link)); return get_sorted_child_groups_(select_multi_assoc($query, $link));
} }
function get_all_groups_for_operator($operator, $link)
{
global $mysqlprefix;
$query = "select g.groupid as groupid, g.parent, g.vclocalname, g.vclocaldescription " .
"from ${mysqlprefix}chatgroup g, " .
"(select distinct parent from ${mysqlprefix}chatgroup, ${mysqlprefix}chatgroupoperator " .
"where ${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid and ${mysqlprefix}chatgroupoperator.operatorid = ".$operator['operatorid'].") i " .
"where g.groupid = i.parent or g.parent = i.parent " .
"order by vclocalname";
return get_sorted_child_groups_(select_multi_assoc($query, $link));
}
function get_sorted_child_groups_($groupslist, $skipgroups = array(), $maxlevel = -1, $groupid = NULL, $level = 0) function get_sorted_child_groups_($groupslist, $skipgroups = array(), $maxlevel = -1, $groupid = NULL, $level = 0)
{ {
$child_groups = array(); $child_groups = array();
@ -410,10 +450,10 @@ function get_sorted_child_groups_($groupslist, $skipgroups = array(), $maxlevel
return $child_groups; return $child_groups;
} }
function get_groups($link, $checkaway) function get_groups_($link, $operator, $checkaway)
{ {
global $mysqlprefix; global $mysqlprefix;
$query = "select ${mysqlprefix}chatgroup.groupid as groupid, parent, vclocalname, vclocaldescription, iweight" . $query = "select ${mysqlprefix}chatgroup.groupid as groupid, ${mysqlprefix}chatgroup.parent as parent, vclocalname, vclocaldescription, iweight" .
", (SELECT count(*) from ${mysqlprefix}chatgroupoperator where ${mysqlprefix}chatgroup.groupid = " . ", (SELECT count(*) from ${mysqlprefix}chatgroupoperator where ${mysqlprefix}chatgroup.groupid = " .
"${mysqlprefix}chatgroupoperator.groupid) as inumofagents" . "${mysqlprefix}chatgroupoperator.groupid) as inumofagents" .
", (SELECT min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " . ", (SELECT min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
@ -427,10 +467,27 @@ function get_groups($link, $checkaway)
"and ${mysqlprefix}chatgroupoperator.operatorid = ${mysqlprefix}chatoperator.operatorid) as ilastseenaway" "and ${mysqlprefix}chatgroupoperator.operatorid = ${mysqlprefix}chatoperator.operatorid) as ilastseenaway"
: "" : ""
) . ) .
" from ${mysqlprefix}chatgroup order by iweight, vclocalname"; " from ${mysqlprefix}chatgroup" .
($operator
? ", (select distinct parent from ${mysqlprefix}chatgroup, ${mysqlprefix}chatgroupoperator " .
"where ${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid and ${mysqlprefix}chatgroupoperator.operatorid = ".$operator['operatorid'].") i " .
"where ${mysqlprefix}chatgroup.groupid = i.parent or ${mysqlprefix}chatgroup.parent = i.parent "
: ""
) .
" order by iweight, vclocalname";
return get_sorted_child_groups_(select_multi_assoc($query, $link)); return get_sorted_child_groups_(select_multi_assoc($query, $link));
} }
function get_groups($link, $checkaway)
{
return get_groups_($link, NULL, $checkaway);
}
function get_groups_for_operator($link, $operator, $checkaway)
{
return get_groups_($link, $operator, $checkaway);
}
function get_operator_groupids($operatorid) function get_operator_groupids($operatorid)
{ {
global $mysqlprefix; global $mysqlprefix;

View File

@ -478,6 +478,8 @@ settings.enableban.description=Using it you can block attacks from specific IPs
settings.enableban=Enable feature "Malicious Visitors" settings.enableban=Enable feature "Malicious Visitors"
settings.enablegroups.description=Use it to have separate queues for different questions. settings.enablegroups.description=Use it to have separate queues for different questions.
settings.enablegroups=Enable "Groups" settings.enablegroups=Enable "Groups"
settings.enablegroupsisolation=Enable "Groups Isolation"
settings.enablegroupsisolation.description=Use it to completely isolate groups from each other.
settings.enablepresurvey.description=Forces the user to fill out a special form to start a chat. settings.enablepresurvey.description=Forces the user to fill out a special form to start a chat.
settings.enablepresurvey=Enable "Pre-chat survey" settings.enablepresurvey=Enable "Pre-chat survey"
settings.enablessl.description=Please note that your web server should be configured to support https requests. settings.enablessl.description=Please note that your web server should be configured to support https requests.

View File

@ -476,6 +476,8 @@ settings.enableban.description=
settings.enableban=Включить функцию "Нежелательные посетители" settings.enableban=Включить функцию "Нежелательные посетители"
settings.enablegroups.description=Позволяет объединять операторов в группы и организовывать для них отдельные очереди. settings.enablegroups.description=Позволяет объединять операторов в группы и организовывать для них отдельные очереди.
settings.enablegroups=Включить функцию "Группы" settings.enablegroups=Включить функцию "Группы"
settings.enablegroupsisolation=Âêëþ÷èòü ôóíêöèþ "Èçîëÿöèÿ ãðóïï"
settings.enablegroupsisolation.description=Ïîçâîëÿåò ïîëíîñòüþ èçîëèðîâàòü ãðóïïû äðóã îò äðóãà.
settings.enablepresurvey.description=Предлагает посетителю заполнить специальную форму перед началом чата. settings.enablepresurvey.description=Предлагает посетителю заполнить специальную форму перед началом чата.
settings.enablepresurvey=Включить "Опрос перед началом диалога" settings.enablepresurvey=Включить "Опрос перед началом диалога"
settings.enablessl.description=Ваш сервер должен быть настроен для обработки https запросов. settings.enablessl.description=Ваш сервер должен быть настроен для обработки https запросов.

View File

@ -123,7 +123,7 @@ start_html_output();
$pparam = verifyparam("act", "/^(redirect)$/", "default"); $pparam = verifyparam("act", "/^(redirect)$/", "default");
if ($pparam == "redirect") { if ($pparam == "redirect") {
setup_redirect_links($threadid, $token); setup_redirect_links($threadid, $operator, $token);
expand("../styles/dialogs", getchatstyle(), "redirect.tpl"); expand("../styles/dialogs", getchatstyle(), "redirect.tpl");
} else { } else {
expand("../styles/dialogs", getchatstyle(), "chat.tpl"); expand("../styles/dialogs", getchatstyle(), "chat.tpl");

View File

@ -61,7 +61,7 @@ if ($groupid) {
} }
$link = connect(); $link = connect();
$allgroups = get_all_groups($link); $allgroups = in_isolation($operator)?get_all_groups_for_operator($operator, $link):get_all_groups($link);
close_connection($link); close_connection($link);
$page['groups'] = array(); $page['groups'] = array();
$page['groups'][] = array('groupid' => '', 'vclocalname' => getlocal("page.gen_button.default_group")); $page['groups'][] = array('groupid' => '', 'vclocalname' => getlocal("page.gen_button.default_group"));

View File

@ -29,7 +29,9 @@ $page = array('agentId' => '');
$errors = array(); $errors = array();
$options = array( $options = array(
'enableban', 'usercanchangename', 'enablegroups', 'enablestatistics', 'enabletracking', 'enableban', 'usercanchangename',
'enablegroups', 'enablegroupsisolation',
'enablestatistics', 'enabletracking',
'enablessl', 'forcessl', 'enablessl', 'forcessl',
'enablepresurvey', 'surveyaskmail', 'surveyaskgroup', 'surveyaskmessage', 'enablepresurvey', 'surveyaskmail', 'surveyaskgroup', 'surveyaskmessage',
'enablepopupnotification', 'showonlineoperators', 'enablepopupnotification', 'showonlineoperators',

View File

@ -92,7 +92,7 @@ if (isset($_GET['act'])) {
} }
$page = array(); $page = array();
$page['allowedAgents'] = operator_get_all(); $page['allowedAgents'] = in_isolation($operator)?get_operators_from_adjacent_groups($operator):operator_get_all();
$page['canmodify'] = is_capable($can_administrate, $operator); $page['canmodify'] = is_capable($can_administrate, $operator);
setlocale(LC_TIME, getstring("time.locale")); setlocale(LC_TIME, getstring("time.locale"));

View File

@ -36,11 +36,12 @@ function update_operator_groups($operatorid, $newvalue)
close_connection($link); close_connection($link);
} }
$operator_in_isolation = in_isolation($operator);
$opId = verifyparam("op", "/^\d{1,9}$/"); $opId = verifyparam("op", "/^\d{1,9}$/");
$page = array('opid' => $opId); $page = array('opid' => $opId);
$link = connect(); $link = connect();
$page['groups'] = get_all_groups($link); $page['groups'] = $operator_in_isolation?get_all_groups_for_operator($operator, $link):get_all_groups($link);
close_connection($link); close_connection($link);
$errors = array(); $errors = array();

View File

@ -79,7 +79,7 @@ if ($show == 'redirect' || $show == 'redirected' || $show == 'agentchat' || $sho
'operatorid' => ($show == 'agentrochat' ? 2 : 1), 'operatorid' => ($show == 'agentrochat' ? 2 : 1),
)); ));
if ($show == 'redirect') { if ($show == 'redirect') {
setup_redirect_links(0, $show == 'agentrochat' ? 124 : 123); setup_redirect_links(0, $operator, $show == 'agentrochat' ? 124 : 123);
} elseif ($show == 'redirected') { } elseif ($show == 'redirected') {
$page['message'] = getlocal2("chat.redirected.content", array("Administrator")); $page['message'] = getlocal2("chat.redirected.content", array("Administrator"));
} }

View File

@ -151,11 +151,11 @@ function print_pending_threads($groupids, $since)
echo "</threads>"; echo "</threads>";
} }
function print_operators() function print_operators($operator)
{ {
global $webim_encoding; global $webim_encoding, $settings;
echo "<operators>"; echo "<operators>";
$operators = operator_get_all(); $operators = in_isolation($operator)?get_operators_from_adjacent_groups($operator):operator_get_all();
foreach ($operators as $operator) { foreach ($operators as $operator) {
if (!operator_is_online($operator)) if (!operator_is_online($operator))
@ -278,7 +278,7 @@ $groupids = $_SESSION["${mysqlprefix}operatorgroups"];
start_xml_output(); start_xml_output();
echo '<update>'; echo '<update>';
if ($showonline) { if ($showonline) {
print_operators(); print_operators($operator);
} }
print_pending_threads($groupids, $since); print_pending_threads($groupids, $since);
if ($showvisitors) { if ($showvisitors) {

View File

@ -45,6 +45,14 @@ function updateSSL() {
} }
} }
function updateGroups(){
if($("#enablegroups").is(":checked")) {
$(".undergroups").show();
} else {
$(".undergroups").hide();
}
}
$(function(){ $(function(){
$("#enablepresurvey").change(function() { $("#enablepresurvey").change(function() {
updateSurvey(); updateSurvey();
@ -52,8 +60,12 @@ $(function(){
$("#enablessl").change(function() { $("#enablessl").change(function() {
updateSSL(); updateSSL();
}); });
$("#enablegroups").change(function() {
updateGroups();
});
updateSurvey(); updateSurvey();
updateSSL(); updateSSL();
updateGroups();
}); });
</script> </script>
<?php <?php
@ -109,10 +121,19 @@ require_once('inc_errors.php');
<div class="field"> <div class="field">
<div class="flabel"><?php echo getlocal('settings.enablegroups') ?></div> <div class="flabel"><?php echo getlocal('settings.enablegroups') ?></div>
<div class="fvalue"> <div class="fvalue">
<input type="checkbox" name="enablegroups" value="on"<?php echo form_value_cb('enablegroups') ? " checked=\"checked\"" : "" ?><?php echo $page['canmodify'] ? "" : " disabled=\"disabled\"" ?>/> <input id="enablegroups" type="checkbox" name="enablegroups" value="on"<?php echo form_value_cb('enablegroups') ? " checked=\"checked\"" : "" ?><?php echo $page['canmodify'] ? "" : " disabled=\"disabled\"" ?>/>
</div> </div>
<div class="fdescr"> &mdash; <?php echo getlocal('settings.enablegroups.description') ?></div> <div class="fdescr"> &mdash; <?php echo getlocal('settings.enablegroups.description') ?></div>
<br clear="all"/> <br clear="all"/>
<div class="subfield undergroups">
<div class="flabel"><?php echo getlocal('settings.enablegroupsisolation') ?></div>
<div class="fvalue">
<input type="checkbox" name="enablegroupsisolation" value="on"<?php echo form_value_cb('enablegroupsisolation') ? " checked=\"checked\"" : "" ?><?php echo $page['canmodify'] ? "" : " disabled=\"disabled\"" ?>/>
</div>
<div class="fdescr"> &mdash; <?php echo getlocal('settings.enablegroupsisolation.description') ?></div>
<br clear="all"/>
</div>
</div> </div>
<div class="field"> <div class="field">