1
Scripting QueueMetrics / Re: Wallboard agent status with dynamic users.
« on: July 25, 2012, 14:55:26 »
Hi,
We only have the rdy agnt: on screen.
Normally we got the agent status on the wallboard but after the new queuemetrics installation we only get the ready agents.
and here the php script.
We only have the rdy agnt: on screen.
Normally we got the agent status on the wallboard but after the new queuemetrics installation we only get the ready agents.
and here the php script.
Quote
<?php
/*
qmon.php
Author: Barry Flanagan <barry AT flantel DOT com>
Date: 21 Nov 2007
Copyright Barry Flanagan 2007
Small program to grab the calls waiting and Agent information for a given queue from the QueueMetrics XML-RPC service and
create a simple display for use on a wallboard.
*/
$defaultqueue = 'inbound';
require_once 'XML/RPC.php';
$qm_server = "XXXXXXXXXXXX"; // the QueueMetrics server address
$qm_port = "8080"; // the port QueueMetrics is running on
$qm_webapp = "queuemetrics"; // the webapp name for QueueMetrics
isset($_REQUEST['refresh'])?$refresh = $_REQUEST['refresh']:$refresh=5;
isset($_REQUEST['queue'])?$queuereq = $_REQUEST['queue']:$queuereq=$defaultqueue;
switch ($queuereq) {
case 'inbound':
$queueids = "9000|9001|9002|9003|9004|9005|9006|9007|9008|9009|9010|9011|9012|9013|9014|9015|q-123";
$outboundqueue = '';
$queuename='inbound';
break;;
case 'outbound':
$queueids = "q-123";
$outboundqueue = '';
$queuename='outbound';
break ;;
}
?>
<html><head><meta http-equiv="refresh" content="<?php echo $refresh ?>"><title><?php echo $queuename . " Wallboard" ?></title></head><body marginheight=0 marginwidth=0>
<table width="100%" cellpadding=0 cellspacing=0 border="0">
<tr>
<?php
$queuelist = array_merge(explode("|", $queueids),explode("|",$outboundqueue));
// Choose the Realtime nethods we want to query.
$req_blocks_rt = new XML_RPC_Value(array(
new XML_RPC_Value("RealtimeDO.RTCallsBeingProc"),
new XML_RPC_Value("RealtimeDO.RTAgentsLoggedIn"),
new XML_RPC_Value("RealtimeDO.RTRiassunto")
), "array");
// initialize the XML_RPC call
$params_rt = array(
new XML_RPC_Value($queueids),
new XML_RPC_Value("robot"),
new XML_RPC_Value("robot"),
new XML_RPC_Value(""),
new XML_RPC_Value(""),
$req_blocks_rt
);
// Make the XML_RPC call
$msg_rt = new XML_RPC_Message('QM.realtime', $params_rt);
$cli_rt = new XML_RPC_Client("/$qm_webapp/xmlrpc.do", $qm_server,$qm_port);
//$cli_rt->setDebug(1);
$resp_rt = $cli_rt->send($msg_rt);
// Make sure it was successful
if (!$resp_rt) {
echo 'Communication error: ' . $cli_rt->errstr;
exit;
}
if ($resp_rt->faultCode()) {
echo 'Fault Code: ' . $resp_rt->faultCode() . "\n";
echo 'Fault Reason: ' . $resp_rt->faultString() . "\n";
} else {
$val_rt = $resp_rt->value();
$blocks_rt = XML_RPC_decode($val_rt);
// now we decode the results
// Get the Agents' Status
$agent = getAgentLoggedIn( "RealtimeDO.RTAgentsLoggedIn", $blocks_rt );
// Get all the current call details
$agentStatus = getCurrentCalls( "RealtimeDO.RTCallsBeingProc", $blocks_rt);
// Get details of all the queue activity and store them in the $queue array
getQueueStatus( "RealtimeDO.RTRiassunto", $blocks_rt, $queueids, $print);
// Output the html for the $queue array
printQueues($queue);
}
// Get the current queue stats and place them into the $queue array
function getQueueStatus( $blockname, $blocks, $queueids, $print ) {
global $queue, $queuelist, $ragents;
$block = $blocks[$blockname];
for ( $r = 1; $r < sizeof( $block ) ; $r++ ) {
$currentQueue = $block[$r][1];
if ( $currentQueue == "all selected") {
$ragents = $block[$r][3];
// continue;
}
// if this is a SubQueue, we need to put all the results into the Master Queue for display
if (1 == substr_count($currentQueue,'.')) {
list($masterqueue, $subqueue) = explode('.', $currentQueue);
$currentQueue = $masterqueue;
$queue[$currentQueue]['name'] = $masterqueue;
$queue[$currentQueue]['waiting'] = $block[$r][7] + $queue[$currentQueue]['waiting'];
$queue[$currentQueue]['nagents'] = $block[$r][2];
$queue[$currentQueue]['ragents'] = $block[$r][3];
$queue[$currentQueue]['incalls'] = $block[$r][8] + $queue[$currentQueue]['incalls'];
$queue[$currentQueue]['outcalls'] = $block[$r][9] + $queue[$currentQueue]['outcalls'];
} else { // it is a normal queue
$queue[$currentQueue]['waiting'] = $block[$r][7];
$queue[$currentQueue]['name'] = $block[$r][1];
$queue[$currentQueue]['nagents'] = $block[$r][2];
$queue[$currentQueue]['ragents'] = $block[$r][3];
$queue[$currentQueue]['incalls'] = $block[$r][8];
$queue[$currentQueue]['outcalls'] = $block[$r][9];
}
// sometimes the maxholdtime is blank, fix it
if($queue[$currentQueue]['maxholdtime'] == '') $queue[$currentQueue]['maxholdtime'] = '00:00';
// If this is an Outbound queue it needs some special treatment
if (preg_match('/utbound/', $currentQueue)) {
$ragents = $queue[$currentQueue]['ragents'];
$queue[$currentQueue]['waiting'] = '0';
$queue[$currentQueue]['maxholdtime'] = '00:00';
}
}
// This function sorts the $data array of arrays by $field
function orderBy(&$data, $field) {
$code = "return strnatcmp(\$a['$field'], \$b['$field']);";
usort($data, create_function('$a,$b', $code));
}
// create the html output for the $queues array
function printQueues($queues) {
orderBy($queues,'name');
global $ragents;
$tdwidth = round(100/sizeof($queues),1) . "%";
foreach ( $queues as $queue ) {
// width for the tables
$currentQueue = $queue['name'];
if (1 == substr_count($currentQueue,'Master')) continue;
$queueholdtime = $queue['maxholdtime'];
$waitqueue = $queue['waiting'];
$nagents = $queue['nagents'];
$currcalls = $queue['incalls'] + $queue['outcalls'];
$ragents = $queue['ragents'];
// Set up colour and formatting depending on the status of the queue
if( $waitqueue == 0 ) {
$waitbgcolor = "green";
$snd = null;
$waitfontcolor = "white";
} elseif ($waitqueue == 1){
$waitbgcolor = "yellow";
$snd = '<EMBED SRC="/sounds/dingdong.wav" HIDDEN="true" AUTOSTART="true">';
$waitfontcolor = "black";
} elseif ($waitqueue > 1) {
$waitbgcolor = "red";
$snd = '<EMBED SRC="/sounds/ringer.wav" HIDDEN="true" AUTOSTART="true">';
$waitfontcolor = "white";
$waitqueue = "<blink>" . $waitqueue . "</blink>";
}
if( $ragents > 2 ) {
$ragentsbgcolor = "green";
$ragentsfontcolor = "white";
} elseif ($ragents == 2){
$ragentsbgcolor = "yellow";
$ragentsfontcolor = "black";
} elseif ($ragents <= 1) {
$ragentsbgcolor = "red";
$ragentsfontcolor = "white";
}
print <<<END
<td width="$tdwidth" valign="top">
<div style="border: 2px solid #FFF; width: 100%">
<div width="100%" align="center" valign="center" style="color:white; font-size: 15px; background-color: green; height: 20px;">$currentQueue</div>
<div style="background-color: grey; height:3px"> </div>
<div align="center" style="color:$waitfontcolor; font-size: 15px; background-color: $waitbgcolor; ">Calls Waiting</div>
<div align="center" style="color:$waitfontcolor; font-size: 70px; background-color: $waitbgcolor; ">$waitqueue</div>
<div align="center" style="color:$waitfontcolor; font-size: 15px; background-color: $waitbgcolor; ">Max $queueholdtime</div>
<div style="background-color: grey; height:3px"> </div>
<div align="center" style="color:white; font-size: 15px; background-color: green">Curr Calls:</div>
<div align="center" style="color:white; font-size: 70px; background-color: green">$currcalls</div>
<div style="background-color: grey; height:3px"> </div>
<div align="center" style="color:$ragentsfontcolor; font-size: 20px; background-color: $ragentsbgcolor">Rdy Agnt: $ragents/$nagents</div>
<!-- <div align="center" style="color:$ragentsfontcolor; font-size: 70px; background-color: $ragentsbgcolor">$ragents </div> -->
</div>
</td>
END;
}
}
}
// Get the actual status of each agent
function getAgentLoggedIn( $blockname, $blocks ) {
$agent = array();
$block = $blocks[$blockname];
for ( $r = 1; $r < sizeof( $block ) ; $r++ ) {
$agent[$block[$r][1]]['name'] = $block[$r][1];
$agent[$block[$r][1]]['lastlogin'] = $block[$r][3];
$agent[$block[$r][1]]['queues'] = $block[$r][4];
$agent[$block[$r][1]]['extension'] = $block[$r][5];
$agent[$block[$r][1]]['onpause'] = $block[$r][6];
$agent[$block[$r][1]]['srv'] = $block[$r][7];
$agent[$block[$r][1]]['lastcall'] = $block[$r][8];
$agent[$block[$r][1]]['onqueue'] = $block[$r][9];
$agent[$block[$r][1]]['caller'] = 'none';
$agent[$block[$r][1]]['entered'] = null;
$agent[$block[$r][1]]['waiting'] = null;
$agent[$block[$r][1]]['duration'] = null;
}
return $agent;
}
// Get the current call details for each agent or call waiting
function getCurrentCalls( $blockname, $blocks) {
global $agent, $queue;
$block = $blocks[$blockname];
for ( $r = 1; $r < sizeof( $block ) ; $r++ ) {
$agentname = $block[$r][6];
$agent[$agentname]['queue'] = $block[$r][1];
$agent[$agentname]['caller'] = $block[$r][2];
$agent[$agentname]['entered'] = $block[$r][3];
$agent[$agentname]['waiting'] = $block[$r][4];
$agent[$agentname]['duration'] = $block[$r][5];
if ($agent[$agentname]['duration'] == '-') {
if (1 == substr_count($agent[$agentname]['queue'],'.')) {
list($agent[$agentname]['queue'], $subqueue) = explode('.', $agent[$agentname]['queue']);
}
if (toSec($agent[$agentname]['waiting']) > toSec($queue[$agent[$agentname]['queue']]['maxholdtime'])) $queue[$agent[$agentname]['queue']]['maxholdtime'] = $agent[$agentname]['waiting'] ;
}
}
$agentStatus = '';
$rowcount=1;
for ( $r = 0; $r < sizeof( $agent ) ; $r++ ) {
$agent = array_values($agent);
if ($rowcount == 1){
$rowcolor = "green";
$rowcount++;
} elseif ($rowcount == 2) {
$rowcolor = "gray";
$rowcount = 1;
}
// get the last call time for the agent, and convery to epoc time
if (strstr($agent[$r]['lastcall'],':')) {
list($h, $m, $s) = explode(':', $agent[$r]['lastcall']);
$lastcalltime = mktime($h,$m,$s);
}
// decide on the agent status we should display
if ($agent[$r]['duration'] != '') {
$status = "On Call since " . $agent[$r]['entered'] . " (" . $agent[$r]['duration'] . " mins)";
$bgcolor3 = $rowcolor;
$fontcolor3 = "white";
} elseif (!preg_match('/-/',$agent[$r]['onpause'])){
$status = "On Pause since " . $agent[$r]['onpause'];
$bgcolor3 = $rowcolor;
$fontcolor3 = "white";
} elseif (time() - $lastcalltime < 5) {
$status = "Wrapping up";
$bgcolor3 = $rowcolor;
$fontcolor3 = "white";
} else {
$status = "Available";
$bgcolor3 = $rowcolor;
$fontcolor3 = "white";
}
if ($agent[$r]['name']) {
$agentStatus .="<tr bgcolor=\"" . $rowcolor . "\" style=\"color:white; font-size: 20px;\"><td> </td><td>" . $agent[$r]['name'] . "</td><td style=\"color:" . $fontcolor3 . ";\" bgcolor=\"" . $bgcolor3 . "\" >" . $status . "</td><td>" . $agent[$r]['lastcall'] . "</td><td>" . $agent[$r]['queue'] . "</td></tr>";
}
}
return $agentStatus;
}
// function to convert 00:00:00 time to seconds.
function toSec ($hms) {
list($h, $m, $s) = explode (":", $hms);
$seconds = 0;
$seconds += (intval($h) * 3600);
$seconds += (intval($m) * 60);
$seconds += (intval($s));
return $seconds;
}
?>
</tr><tr><td> </td></tr><tr>
<!-- Agent Status Table -->
<td colspan=20 bgcolor="gray" valign="top">
<table width="100%" height="100%" cellpadding=0 cellspacing=0 style="border: 2px solid #000">
<tr style="color:white; font-size: 25px;">
<td> </td><td>Agent</td><td>Status</td><td>Last Call</td><td>Current Queue</td>
</tr>
<?php echo $agentStatus ?>
</table>
</td>
</table>
</body>
</html>