Я использую плагин FOP2 Full Wallboard, который добавляет три разных виджета для отображения на стенде стенда: список агентов, список ожидающих вызовов, поля «Информация о очереди» / «Статистика». Настенная панель может отображать статистическую информацию, полученную от Asternic CCStats PRO. Виджеты полностью настраиваются с использованием html, css и javascript с использованием шаблонов dustjs. Вот полная документация на стене.
В фоновом режиме он загружает скрипт под названием getstatsfromasternic.php
Я намерен отображать итоговые исходящие в моем шаблоне очереди, но проблема в том, что он принимает только переменные очереди Wallboard, как указано в документации.
getstatsfromasternic код скрипта:
<?php if (php_sapi_name() !='cli') exit; require_once(dirname(__FILE__)."/../../dblib.php"); require_once(dirname(__FILE__)."/../../asmanager.php"); $ini_array = parse_ini_file('fullwallboard.ini', true); $asternic_dir = $ini_array['asternic_install_directory']; if($asternic_dir == '') { $asternic_dir = '/var/www/html/stats'; } require_once("$asternic_dir/config.php"); $SLA_ANSWERED = Array(); $DEBUG = 0; $SLA_ANSWERED[''] = 20; $loggedInAgents = array(); $condagent =''; if(isset($argv[1])) { $agente=base64_decode($argv[1]); $condagent = " AND agent IN ($agente) "; $partes = preg_split("/,/",$agente); foreach($partes as $valor) { $loggedInAgents[]=substr($valor,1,-1); } } if($DEBUG & 1) { $fp = fopen("/tmp/wallboard_debug.log","a"); fputs($fp,"GET WALLBOARD STATS ($condagent)\n\n"); if(count($loggedInAgents)>0) { fputs($fp,"Agents logged:\n"); fputs($fp,print_r($loggedInAgents,1)."\n"); } } $astman = new AsteriskManager(); if($DEBUG & 2) { fputs($fp,"MySQL host: $DBHOST, user: $DBUSER, pass: $DBPASS, database name: $DBNAME\n"); } // Connect to MySQL $db = new dbcon($DBHOST, $DBUSER, $DBPASS, $DBNAME, false); if (!function_exists('json_encode')) { function json_encode($content) { require_once dirname(__FILE__).'/../../../JSON.php'; $json = new Services_JSON; return $json->encode($content); } } $myqevents = array(); $last_stop = array(); $last_stop_pause = array(); $agent_stats = array(); $queue_stats = array(); $outbound = array(); $abr['COMPLETECALLER'] = 'CC'; $abr['COMPLETEAGENT'] = 'CA'; $abr['COMPLETEOUTBOUND'] = 'CO'; $abr['RINGNOANSWER'] = 'RA'; $abr['COMPLETED'] = 'COMPLETED'; $abr['COMPLETEDSLA'] = 'COMPLETEDSLA'; $abr['SERVICELEVEL'] = 'SERVICELEVEL'; $abr['ABANDONED'] = 'ABANDONED'; $abr['TALKTIME'] = 'TALKTIME'; $abr['WAITTIME'] = 'WAITTIME'; function parse_conf($filename) { $file = file($filename); foreach ($file AS $line) { if (preg_match("/^\s*([\w]+)\s*=\s*\"?([\w\/\:\.\*\%!=\+\#@&\\$-]*)\"?\s*([;].*)?/",$line,$matches)) { $conf[ $matches[1] ] = $matches[2]; } } if(!isset($conf['manager_port'])) { $conf['manager_port']='0000'; } if(!isset($conf['manager_host'])) { $conf['manager_host']='0.0.0.0'; } return $conf; } if(is_file("/usr/local/fop2/fop2.cfg") || is_file("/etc/asterisk/fop2/fop2.cfg")) { if(is_file("/usr/local/fop2/fop2.cfg")) { $fop2conf = parse_conf("/usr/local/fop2/fop2.cfg"); } } $query = "SELECT * FROM qevent ORDER BY null"; $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $myqevents[$row['event']] = $row['event_id']; } $query = "SELECT * FROM setup WHERE keyword='call_flow' OR keyword='sla_answered'"; $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { if($row['value']=='outbound') { $outbound[]="\"".$row['parameter']."\""; } if($row['keyword']=='sla_answered') { $SLA_ANSWERED[$row['parameter']]=intval($row['value']); } } if(count($outbound)>0) { $outboundqueues = "AND queue NOT IN (".implode(",",$outbound).") "; $outboundquery = "AND queue IN (".implode(",",$outbound).") "; } else { $outboundqueues = ''; $outboundquery = ''; } if($DEBUG & 1) { fputs($fp,"----- Session Times Start ----- \n\n"); } $query = "SELECT @start:=NULL, @stop:=NULL, @qagent:=NULL"; $res = $db->consulta($query); $query = "SELECT queue_stats_id, agent, UNIX_TIMESTAMP(start) AS start, UNIX_TIMESTAMP(stop) AS stop, "; $query.= "TIMESTAMPDIFF(SECOND, start, stop) AS duration "; $query.= "FROM ( SELECT queue_stats_id, datetime, qevent, (@qagent <> qagent) AS new_qagent, "; $query.= "@start AS start, @start := IF(qevent = '".$myqevents['ADDMEMBER']."', datetime, NULL) AS prev_start, "; $query.= "@stop := IF(qevent = '".$myqevents['REMOVEMEMBER']."', datetime, NULL) AS stop, @qagent := qagent AS qagent "; $query.= "FROM queue_stats WHERE qevent IN (".$myqevents['ADDMEMBER'].",".$myqevents['REMOVEMEMBER'].") ORDER BY qagent, datetime ) AS tmp "; $query.= "LEFT JOIN qagent ON qagent = qagent.agent_id, (SELECT @start:=NULL, @stop:=NULL, @qagent:=NULL) AS vars "; $query.= "WHERE new_qagent = 0 AND start IS NOT NULL AND stop IS NOT NULL and start>=CURDATE() $condagent"; $query = "SELECT queue_stats_id, agent, start, stop, (stop - start) AS duration "; $query.= "FROM ( SELECT queue_stats_id,datetime,unix_timestamp(datetime),(@qagent <> qagent) AS new_qagent, "; $query.= "agent,event, @prev_start := @start as start, "; $query.= "@start := if(qevent='".$myqevents['ADDMEMBER']."',if(@start=0,unix_timestamp(datetime),if(@qagent<>qagent,unix_timestamp(datetime),@start)),0) as pstart, "; $query.= "@stop := IF(qevent = '".$myqevents['REMOVEMEMBER']."', unix_timestamp(datetime), NULL) AS stop, "; $query.= "@qagent := qagent FROM queue_stats LEFT JOIN qevent ON qevent=event_id "; $query.= "LEFT JOIN qagent ON qagent=agent_id, ( select @start := 0, @prev_start :=0, @qagent :='' ) sqlvars "; $query.= "WHERE datetime>=CURDATE() AND qevent in (".$myqevents['ADDMEMBER'].",".$myqevents['REMOVEMEMBER'].") ORDER BY qagent,datetime) AS tmp "; $query.= "WHERE start > 0 AND stop > 0 AND stop > start $condagent"; $res = $db->consulta($query); if($DEBUG & 2) { fputs($fp,"\nClosed sessions MySQL query:\n\n$query\n\n"); } while($row=$db->fetch_assoc($res)) { $last_stop[$row['agent']]=$row['stop']; // Save last stop date to use in open session query below if(!isset($agent_stats[$row['agent']]['ST'])) { $agent_stats[$row['agent']]['ST']=0; } if(!isset($agent_stats[$row['agent']]['WT'])) { $agent_stats[$row['agent']]['WT']=0; } if(!isset($agent_stats[$row['agent']]['HT'])) { $agent_stats[$row['agent']]['HT']=0; } if(!isset($agent_stats[$row['agent']]['TT'])) { $agent_stats[$row['agent']]['TT']=0; } if(!isset($agent_stats[$row['agent']]['PT'])) { $agent_stats[$row['agent']]['PT']=0; } $agent_stats[$row['agent']]['ST']+=$row['duration']; if($DEBUG & 4) { fputs($fp,"Agent closed session: ".$row['agent'].", sesion += ".$row['duration']." = ".$agent_stats[$row['agent']]['ST']."\n"); } } // Perform actual query for open sessions, (session with no closing event) $query = "SELECT queue_stats_id,agent,UNIX_TIMESTAMP(datetime) AS start,UNIX_TIMESTAMP(now()) AS stop, "; $query.= "TIMESTAMPDIFF(SECOND,datetime,now()) AS duration FROM queue_stats "; $query.= "LEFT JOIN qagent ON qagent = qagent.agent_id WHERE qevent=".$myqevents['ADDMEMBER']." AND datetime>=CURDATE() $condagent"; $res = $db->consulta($query); if($DEBUG & 2) { fputs($fp,"\nOpen sessions MySQL query:\n\n$query\n\n"); } while($row=$db->fetch_assoc($res)) { if(!isset($last_stop[$row['agent']])) { $last_stop[$row['agent']]=$row['start']; } // We did not have a last stop from closed session so use the first start instead if($row['start']>=$last_stop[$row['agent']]) { if(!isset($agent_stats[$row['agent']])) { $agent_stats[$row['agent']]=array();} if(!isset($agent_stats[$row['agent']]['ST'])) { $agent_stats[$row['agent']]['ST']=0;} if(!isset($agent_stats[$row['agent']]['WT'])) { $agent_stats[$row['agent']]['WT']=0; } if(!isset($agent_stats[$row['agent']]['HT'])) { $agent_stats[$row['agent']]['HT']=0; } if(!isset($agent_stats[$row['agent']]['TT'])) { $agent_stats[$row['agent']]['TT']=0; } if(!isset($agent_stats[$row['agent']]['PT'])) { $agent_stats[$row['agent']]['PT']=0; } $agent_stats[$row['agent']]['ST']+=$row['duration']; $last_stop[$row['agent']]=time(); // If there is a match, last stop is current time if($DEBUG & 4) { fputs($fp,"Agent open session: ".$row['agent']." sesion += ".$row['duration']." = ".$agent_stats[$row['agent']]['ST']."\n"); } } } // Now, for agents with no start or stop sessions, lets just compute a session time from todays 00 hours $query = "SELECT agent,UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(CURDATE()) as ST FROM qagent WHERE 1=1"; if($DEBUG & 2) { fputs($fp,"\nComputed sessions MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { if(!in_array($row['agent'],$loggedInAgents)) { if($DEBUG & 4) { fputs($fp,"Agent ".$row['agent']." is not logged, we can safely skip it.\n"); } } else { if(!isset($agent_stats[$row['agent']]['ST'])) { if($DEBUG & 1) { fputs($fp,"Agent computed session: ".$row['agent']." ST to ".$row['ST']."\n"); } $agent_stats[$row['agent']]['ST']=$row['ST']; if(!isset($agent_stats[$row['agent']]['WT'])) { $agent_stats[$row['agent']]['WT']=0; } if(!isset($agent_stats[$row['agent']]['HT'])) { $agent_stats[$row['agent']]['HT']=0; } if(!isset($agent_stats[$row['agent']]['TT'])) { $agent_stats[$row['agent']]['TT']=0; } if(!isset($agent_stats[$row['agent']]['PT'])) { $agent_stats[$row['agent']]['PT']=0; } } } } if($DEBUG & 1) { fputs($fp,"----- Session Times End ----- \n\n"); } // Call and Pause Stats for AGENTS if($DEBUG & 1) { fputs($fp,"----- Agents Call Stats Start ----- \n"); } // Total Pause duration for today, excluding pauses with reasons Hold, Login and Wrapup. Only counts "closed" pauses $query = "SELECT @start:=NULL, @stop:=NULL, @qagent:=NULL"; $res = $db->consulta($query); // Perform actual query $query = "SELECT queue_stats_id, agent, unix_timestamp(start) AS start, unix_timestamp(stop) AS stop, "; $query.= "TIMESTAMPDIFF(SECOND, start, stop) AS duration FROM ( SELECT queue_stats_id, datetime, qevent, "; $query.= "(@qagent <> qagent) AS new_qagent, @start AS start, "; $query.= "@start := IF(qevent = '".$myqevents['PAUSE']."' or qevent='".$myqevents['PAUSEALL']."', datetime, NULL) AS prev_start, "; $query.= "@stop := IF(qevent = '".$myqevents['UNPAUSE']."' or qevent='".$myqevents['UNPAUSEALL']."', datetime, NULL) AS stop, "; $query.= "@qagent := qagent AS qagent FROM queue_stats WHERE qevent IN (".$myqevents['PAUSE'].",".$myqevents['PAUSEALL'].",".$myqevents['UNPAUSE'].",".$myqevents['UNPAUSEALL'].") "; $query.= "AND info1<>'Hold' AND info1<>'Login' AND info1<>'Wrapup' AND datetime>=CURDATE() ORDER BY qagent, datetime ) AS tmp "; $query.= "LEFT JOIN qagent ON qagent = qagent.agent_id, (SELECT @start:=NULL, @stop:=NULL, @qagent:=NULL) AS vars "; $query.= "WHERE new_qagent = 0 AND start IS NOT NULL AND stop IS NOT NULL $condagent"; if($DEBUG & 2) { fputs($fp,"\nPauses (excluding hold and wrapup) MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $last_stop_pause[$row['agent']]=$row['stop']; if(!isset($agent_stats[$row['agent']]['PT'])) { $agent_stats[$row['agent']]['PT']=0; } $agent_stats[$row['agent']]['PT']+=$row['duration']; if($DEBUG & 4) { fputs($fp,"Regular Pause agent ".$row['agent']." += ".$row['duration'].", sums up to ".$agent_stats[$row['agent']]['PT']."\n"); } } // Total Pause duration with reason Hold, when using the Hold report plugin $query = "SELECT @start:=NULL, @stop:=NULL, @qagent:=NULL, @reason:=NULL"; $res = $db->consulta($query); // Perform actual query $query = "SELECT queue_stats_id, agent, unix_timestamp(start) AS start, unix_timestamp(stop) AS stop, "; $query.= "TIMESTAMPDIFF(SECOND, start, stop) AS duration, reason from (SELECT queue_stats_id, datetime, qevent, "; $query.= "(@qagent <> qagent) AS new_qagent, @start AS start, "; $query.= "@start := IF(qevent = '".$myqevents['PAUSE']."' or qevent='".$myqevents['PAUSEALL']."', datetime, NULL) AS prev_start, "; $query.= "@stop := IF(qevent = '".$myqevents['UNPAUSE']."' or qevent='".$myqevents['UNPAUSEALL']."', datetime, NULL) AS stop, "; $query.= "@qagent := qagent AS qagent, @reason AS reason, "; $query.= "@reason := IF(qevent = '".$myqevents['PAUSE']."' or qevent='".$myqevents['PAUSEALL']."', info1, NULL) as prev_reason "; $query.= "FROM queue_stats WHERE qevent IN (".$myqevents['PAUSE'].",".$myqevents['PAUSEALL'].",".$myqevents['UNPAUSE'].",".$myqevents['UNPAUSEALL'].") "; $query.= "AND datetime>=CURDATE() ORDER BY qagent, datetime) tmp LEFT JOIN qagent ON qagent = qagent.agent_id, "; $query.= "(SELECT @start:=NULL, @stop:=NULL, @qagent:=NULL,@reason:=NULL) AS vars "; $query.= "WHERE start IS NOT NULL AND stop IS NOT NULL AND new_qagent=0 AND start>=CURDATE() AND reason='Hold' $condagent"; if($DEBUG & 2) { fputs($fp,"\nPauses (Hold) MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $last_stop_pause[$row['agent']]=$row['stop']; if(!isset($agent_stats[$row['agent']]['HT'])) { $agent_stats[$row['agent']]['HT']=0; } $agent_stats[$row['agent']]['HT']+=$row['duration']; if($DEBUG & 4) { fputs($fp,"Hold Pause agent ".$row['agent']." += ".$row['duration'].", sums up to ".$agent_stats[$row['agent']]['HT']."\n"); } } // Total Pause duration with reason Wrapup, when using the auto wrapup plugin with reason Wrapup $query = "SELECT @start:=NULL, @stop:=NULL, @qagent:=NULL, @reason:=NULL"; $res = $db->consulta($query); // Perform actual query $query = "SELECT queue_stats_id, agent, unix_timestamp(start) AS start, unix_timestamp(stop) AS stop, "; $query.= "TIMESTAMPDIFF(SECOND, start, stop) AS duration, reason from (SELECT queue_stats_id, datetime, qevent, "; $query.= "(@qagent <> qagent) AS new_qagent, @start AS start, "; $query.= "@start := IF(qevent = '".$myqevents['PAUSE']."' or qevent='".$myqevents['PAUSEALL']."', datetime, NULL) AS prev_start, "; $query.= "@stop := IF(qevent = '".$myqevents['UNPAUSE']."' or qevent='".$myqevents['UNPAUSEALL']."', datetime, NULL) AS stop, "; $query.= "@qagent := qagent AS qagent, @reason AS reason, "; $query.= "@reason := IF(qevent = '".$myqevents['PAUSE']."' or qevent='".$myqevents['PAUSEALL']."', info1, NULL) as prev_reason "; $query.= "FROM queue_stats WHERE qevent IN (".$myqevents['PAUSE'].",".$myqevents['PAUSEALL'].",".$myqevents['UNPAUSE'].",".$myqevents['UNPAUSEALL'].") "; $query.= "AND datetime>=CURDATE() ORDER BY qagent, datetime) tmp LEFT JOIN qagent ON qagent = qagent.agent_id, "; $query.= "(SELECT @start:=NULL, @stop:=NULL, @qagent:=NULL,@reason:=NULL) AS vars "; $query.= "WHERE start IS NOT NULL AND stop IS NOT NULL AND new_qagent=0 AND reason='Wrapup' $condagent"; if($DEBUG & 2) { fputs($fp,"\nPauses (Wrapup) MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $last_stop_pause[$row['agent']]=$row['stop']; if(!isset($agent_stats[$row['agent']]['WT'])) { $agent_stats[$row['agent']]['WT']=0; } $agent_stats[$row['agent']]['WT']+=$row['duration']; if($DEBUG & 4) { fputs($fp,"Wrapup Pause agent ".$row['agent']." += ".$row['duration'].", sums up to ".$agent_stats[$row['agent']]['WT']."\n"); } } // check for Open Pauses now, open pauses with no unpause, discarding hold and wrapup $query = "SELECT queue_stats_id,agent,unix_timestamp(datetime) AS start, "; $query.= "unix_timestamp(now()) AS stop, TIMESTAMPDIFF(SECOND,datetime,now()) AS duration "; $query.= "FROM queue_stats LEFT JOIN qagent ON qagent = qagent.agent_id "; $query.= "WHERE qevent IN (".$myqevents['PAUSE'].",".$myqevents['PAUSEALL'].") AND datetime>=CURDATE() AND (info1<>'Hold' AND info1<>'Wrapup') $condagent"; if($DEBUG & 2) { fputs($fp,"\nOpen Pauses MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { if(!isset($last_stop_pause[$row['agent']])) { $last_stop_pause[$row['agent']]=$row['start']; } if($row['start']>=$last_stop_pause[$row['agent']]) { if(!isset($agent_stats[$row['agent']]['PT'])) { $agent_stats[$row['agent']]['PT']=0; } $agent_stats[$row['agent']]['PT']+=$row['duration']; if($DEBUG & 4) { fputs($fp,"Open pause agent ".$row['agent']." += ".$row['duration'].", sums up to ".$agent_stats[$row['agent']]['PT']."\n"); } $last_stop_pause[$row['agent']]=time(); } } // TALKTIME for today, per agent $query = "SELECT agent,sum(info2) AS talktime "; $query.= "FROM queue_stats LEFT JOIN qagent ON qagent=qagent.agent_id "; $query.= "LEFT JOIN qevent ON qevent=qevent.event_id "; $query.= "LEFT JOIN qname ON qname=qname.queue_id "; $query.= "WHERE qevent IN(".$myqevents['COMPLETECALLER'].",".$myqevents['COMPLETEAGENT'].") $outboundqueues "; $query.= "AND datetime >= CURDATE() $condagent GROUP BY qagent"; if($DEBUG & 2) { fputs($fp,"\nTalk time MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $agent_stats[$row['agent']]['TT']=$row['talktime']; if($DEBUG & 4) { fputs($fp,"Talk time agent ".$row['agent']." = ".$row['talktime']."\n"); } } // RING NO ANSWER y COMPLETE for today, per agent $query = "SELECT agent,event,count(qevent) AS count FROM queue_stats "; $query.= "LEFT JOIN qagent ON qagent=qagent.agent_id "; $query.= "LEFT JOIN qevent ON qevent=qevent.event_id "; $query.= "LEFT JOIN qname ON qname=qname.queue_id "; $query.=" WHERE qevent IN(".$myqevents['COMPLETECALLER'].",".$myqevents['COMPLETEAGENT'].",".$myqevents['RINGNOANSWER'].") $outboundqueues "; $query.= "AND datetime >= CURDATE() $condagent GROUP BY qagent,qevent"; if($DEBUG & 2) { fputs($fp,"\nRingNoAnswer and Complete* MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $agent_stats[$row['agent']][$abr[$row['event']]]=$row['count']; if($DEBUG & 4) { fputs($fp,"Completed agent ".$row['agent'].", event ".$row['event']." = ".$row['count']."\n"); } } // OUTBOUND for today using Asternic call_flow setup. Requires a licensed Asternicy if($outboundquery<>'') { $query = "SELECT agent,event,count(qevent) AS count FROM queue_stats "; $query.= "LEFT JOIN qagent ON qagent=qagent.agent_id LEFT JOIN qevent ON qevent=qevent.event_id "; $query.= "LEFT JOIN qname ON qname=qname.queue_id WHERE qevent "; $query.= "IN(".$myqevents['COMPLETECALLER'].",".$myqevents['COMPLETEAGENT'].") $outboundquery AND datetime >= CURDATE() $condagent "; $query.= "GROUP BY qagent,qevent"; if($DEBUG & 2) { fputs($fp,"\nOutbound query via Asternic call_flow queues MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $agent_stats[$row['agent']][$abr['COMPLETEOUTBOUND']]=$row['count']; if($DEBUG & 4) { fputs($fp,"Outbound asternic agent ".$row['agent']." = ".$row['count']."\n"); } } } // Use CDR table for outbound count in a FreePBX System. For this to work // we must be sure the Asternic user is able to access asteriskcdrdb.cdr // table /* Custom query */ $query = "SELECT agent,count(*) as count,data2 as talktime "; $query.= "FROM queuemetrics.queue_log "; $query.= "WHERE partition = 'P001' "; $query.= "AND time_id >= UNIX_TIMESTAMP(CURDATE()) "; $query.= "AND verb IN ('COMPLETECALLER', 'COMPLETEAGENT') AND data3 = '' $condagent "; $query.= "GROUP BY agent "; if($DEBUG & 2) { fputs($fp,"\nOutbound query via FreePBX CDR MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $agent_stats[$row['agent']][$abr['COMPLETEOUTBOUND']]=$row['count']; if(!isset($agent_stats[$row['agent']]['TT'])) { $agent_stats[$row['agent']]['TT']=0; } $agent_stats[$row['agent']]['TT']+=$row['talktime']; if($DEBUG & 4) { fputs($fp,"Outbound cdr agent ".$row['agent']." = ".$row['count']."\n"); fputs($fp,"Outbound cdr agent talktime ".$row['agent']." = ".$agent_stats[$row['agent']]['TT']."\n"); } } foreach($agent_stats AS $agent=>$nada) { if(!isset($agent_stats[$agent]['PT'])) { $agent_stats[$agent]['PT']=0; } if(!isset($agent_stats[$agent]['ST'])) { $agent_stats[$agent]['ST']=0; } if(!isset($agent_stats[$agent]['CC'])) { $agent_stats[$agent]['CC']=0; } if(!isset($agent_stats[$agent]['CA'])) { $agent_stats[$agent]['CA']=0; } if(!isset($agent_stats[$agent]['CO'])) { $agent_stats[$agent]['CO']=0; } if(!isset($agent_stats[$agent]['RA'])) { $agent_stats[$agent]['RA']=0; } if(!isset($agent_stats[$agent]['TT'])) { $agent_stats[$agent]['TT']=0; } if(preg_match("/Agent\//",$agent)) { $numeric_agent = preg_replace("/Agent\//","",$agent); $agent_stats[$numeric_agent]=$agent_stats[$agent]; } } if($DEBUG & 1) { fputs($fp,print_r($agent_stats,1)); fputs($fp,"----- Agents Call Stats End ----- \n\n"); } if($DEBUG & 1) { fputs($fp,"----- Queue Stats Start ----- \n"); } // Queue Stats Queries $query = "SELECT queue FROM qname WHERE queue NOT IN ('All','None')"; if($DEBUG & 2) { fputs($fp,"\nQueues filler MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { if(!isset($queue_stats[$row['queue']][$abr['SERVICELEVEL']])) { $queue_stats[$row['queue']][$abr['SERVICELEVEL']]=isset($SLA_ANSWERED[$row['queue']])?$SLA_ANSWERED[$row['queue']]:$SLA_ANSWERED['']; } if(!isset($queue_stats[$row['queue']][$abr['COMPLETEDSLA']])) { $queue_stats[$row['queue']][$abr['COMPLETEDSLA']]=0; } if(!isset($queue_stats[$row['queue']][$abr['COMPLETED']])) { $queue_stats[$row['queue']][$abr['COMPLETED']]=0; } if(!isset($queue_stats[$row['queue']][$abr['TALKTIME']])) { $queue_stats[$row['queue']][$abr['TALKTIME']]=0; } if(!isset($queue_stats[$row['queue']][$abr['WAITTIME']])) { $queue_stats[$row['queue']][$abr['WAITTIME']]=0; } if(!isset($queue_stats[$row['queue']][$abr['ABANDONED']])) { $queue_stats[$row['queue']][$abr['ABANDONED']]=0; } } // total completed caller and agent $query = "SELECT count(*) AS count,queue,sum(info1) as waittime, sum(info2) as talktime "; $query.= "FROM queue_stats LEFT JOIN qevent ON qevent=qevent.event_id "; $query.= "LEFT JOIN qname ON qname=qname.queue_id "; $query.= "WHERE datetime>=CURDATE() AND event IN ('COMPLETECALLER','COMPLETEAGENT','TRANSFER') GROUP BY qname ORDER BY null"; if($DEBUG & 2) { fputs($fp,"\nQueues Completed MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $queue_stats[$row['queue']][$abr['COMPLETED']]=intval($row['count']); $queue_stats[$row['queue']][$abr['COMPLETEDSLA']]=0; $queue_stats[$row['queue']][$abr['TALKTIME']]=intval($row['talktime']); $queue_stats[$row['queue']][$abr['WAITTIME']]=intval($row['waittime']); if($DEBUG & 4) { fputs($fp,"Queue ".$row['queue'].", completed: ".$row['count'].", TalkTime: ".$row['talktime'].", Wait Time: ".$row['waittime']."\n"); } } // completed under sla $query = "SELECT queue,info1 "; $query.= "FROM queue_stats LEFT JOIN qevent ON qevent=qevent.event_id "; $query.= "LEFT JOIN qname ON qname=qname.queue_id "; $query.= "WHERE datetime>=CURDATE() AND event IN ('COMPLETECALLER','COMPLETEAGENT','TRANSFER') $outboundqueues ORDER BY null"; if($DEBUG & 2) { fputs($fp,"\nQueues Completed SLA MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { $sla = (isset($SLA_ANSWERED[$row['queue']]))?$SLA_ANSWERED[$row['queue']]:$SLA_ANSWERED['']; $waittime = $row['info1']; if($waittime<=$sla) { $queue_stats[$row['queue']][$abr['COMPLETEDSLA']]++; } } // exit and abandon $query = "SELECT count(*) AS count,queue,sum(info3) as waittime FROM queue_stats "; $query.= "LEFT JOIN qevent ON qevent=qevent.event_id "; $query.= "LEFT JOIN qname ON qname=qname.queue_id "; $query.= "WHERE datetime>=CURDATE() AND event IN ('ABANDON','EXITWITHKEY','EXITWITHTIMEOUT','EXITEMPTY') GROUP BY qname ORDER BY null"; if($DEBUG & 2) { fputs($fp,"\nQueues no answer/abandon MySQL query:\n\n$query\n\n"); } $res = $db->consulta($query); while($row=$db->fetch_assoc($res)) { if(!isset($queue_stats[$row['queue']][$abr['COMPLETED']])) { $queue_stats[$row['queue']][$abr['COMPLETED']]=0; } if(!isset($queue_stats[$row['queue']][$abr['TALKTIME']])) { $queue_stats[$row['queue']][$abr['TALKTIME']]=0; } if(!isset($queue_stats[$row['queue']][$abr['WAITTIME']])) { $queue_stats[$row['queue']][$abr['WAITTIME']]=0; } if(!isset($queue_stats[$row['queue']][$abr['ABANDONED']])) { $queue_stats[$row['queue']][$abr['ABANDONED']]=0; } $queue_stats[$row['queue']][$abr['ABANDONED']]=intval($row['count']); $queue_stats[$row['queue']][$abr['WAITTIME']]+=intval($row['waittime']); if($DEBUG & 4) { fputs($fp,"Queue ".$row['queue'].", abandoned: ".$row['count'].", Wait Time: ".$row['waittime']."\n"); } } if($DEBUG & 1) { fputs($fp,print_r($queue_stats,1)); fputs($fp,"----- Queue Stats End ----- \n\n"); } // Connect to AMI and fire events for every piece of stats we have if(!$res = $astman->connect($fop2conf['manager_host'].':'.$fop2conf['manager_port'], $fop2conf['manager_user'] , $fop2conf['manager_secret'], 'off')) { unset($astman); } if ($astman) { foreach ($agent_stats as $key => $nada) { // we have to send individual events as there is a limit in AMI events header size $pepe_stats = Array(); $pepe_stats[$key] = $agent_stats[$key]; $json_data = json_encode($pepe_stats); $res = $astman->UserEvent('ASTERNICAGENTSTATS',array('Channel'=>'GLOBAL_FULLWALLBOARD','Family'=>'ASTERNICAGENTSTATS','Value'=>base64_encode($json_data))); } $res = $astman->UserEvent('ASTERNICQUEUESTATSRESET',array('Channel'=>'GLOBAL_FULLWALLBOARD','Family'=>'ASTERNICQUEUESTATSRESET','Value'=>'')); foreach ($queue_stats as $key => $nada) { $pepe_stats = Array(); $pepe_stats[$key] = $queue_stats[$key]; $json_data = json_encode($pepe_stats); $res = $astman->UserEvent('ASTERNICQUEUESTATS',array('Channel'=>'GLOBAL_FULLWALLBOARD','Family'=>'ASTERNICQUEUESTATS','Value'=>base64_encode($json_data))); } $res = $astman->UserEvent('ASTERNICQUEUESTATSEND',array('Channel'=>'GLOBAL_FULLWALLBOARD','Family'=>'ASTERNICQUEUESTATSEND','Value'=>'')); } if($DEBUG & 1) { fclose($fp); }
Обратите внимание, что у меня нет ключа Asternic, установленного без лицензии, поскольку для запуска плагина необязательно.