Added and tested ChartJS features for more aesthetically appealing graphs to many reports

git-svn-id: svn://192.168.202.10@2568 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
mattf
2016-07-31 14:19:56 +00:00
parent 739f898299
commit 31ab0f1ad4
28 changed files with 15234 additions and 2542 deletions
+2
View File
@@ -274,6 +274,8 @@ OTHER CHANGES:
definitions, removed san-serif fonts, changed loading/login/logout
screens, logging of browser width/height.
74. Changed HTML Reports to use dynamic charting Javascript elements
@@ -32,6 +32,7 @@
# 150516-1258 - Fixed Javascript element problem, Issue #857
# 151125-1627 - Added search archive option
# 160227-1153 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -294,6 +295,8 @@ while ($i < $groups_to_print)
$NWB = " &nbsp; <a href=\"javascript:openNewWindow('help.php?ADD=99999";
$NWE = "')\"><IMG SRC=\"help.gif\" WIDTH=20 HEIGHT=20 BORDER=0 ALT=\"HELP\" ALIGN=TOP></A>";
$JS_text.="<script language=\"JavaScript\">\n";
$HEADER.="<HTML>\n";
$HEADER.="<HEAD>\n";
$HEADER.="<STYLE type=\"text/css\">\n";
@@ -313,6 +316,10 @@ if (!preg_match("/\|$group\|/i",$groups_string))
$HEADER.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HEADER.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HEADER.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HEADER.="<script src=\"chart/Chart.js\"></script>\n";
$HEADER.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HEADER.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HEADER.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -735,20 +742,6 @@ $max_calls=1;
$max_totalcalltime=1;
$max_avgcalltime=1;
$GRAPH="<BR><BR><a name='inbound_graph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='10%' class='grey_graph_cell' id='inbound_graph1'><a href='#' onClick=\"DrawGraph('DROPS', '1'); return false;\">"._QXZ("DROPS")."</a></th><th width='10%' class='grey_graph_cell' id='inbound_graph2'><a href='#' onClick=\"DrawGraph('DROPPCT', '2'); return false;\">"._QXZ("DROP")." %</a></th><th width='10%' class='grey_graph_cell' id='inbound_graph3'><a href='#' onClick=\"DrawGraph('AVGDROPS', '3'); return false;\">"._QXZ("AVG DROP(s)")."</a></th><th width='10%' class='grey_graph_cell' id='inbound_graph4'><a href='#' onClick=\"DrawGraph('HOLD', '4'); return false;\">"._QXZ("HOLD")."</a></th><th width='10%' class='grey_graph_cell' id='inbound_graph5'><a href='#' onClick=\"DrawGraph('HOLDPCT', '5'); return false;\">"._QXZ("HOLD")." %</a></th><th width='10%' class='grey_graph_cell' id='inbound_graph6'><a href='#' onClick=\"DrawGraph('AVGHOLDS', '6'); return false;\">"._QXZ("AVG HOLD(s)")." HOLD</a></th><th width='10%' class='grey_graph_cell' id='inbound_graph7'><a href='#' onClick=\"DrawGraph('AVGHOLDSTOTAL', '7'); return false;\">"._QXZ("AVG HOLD(s) TOTAL")."</a></th><th width='10%' class='grey_graph_cell' id='inbound_graph8'><a href='#' onClick=\"DrawGraph('CALLS', '8'); return false;\">"._QXZ("CALLS")."</a></th><th width='10%' class='grey_graph_cell' id='inbound_graph9'><a href='#' onClick=\"DrawGraph('TOTALCALLTIME', '9'); return false;\">"._QXZ("TOTAL CALLTIME MIN:SEC")."</a></th><th width='10%' class='grey_graph_cell' id='inbound_graph10'><a href='#' onClick=\"DrawGraph('AVGCALLTIME', '10'); return false;\">"._QXZ("AVG CALLTIME SECONDS")."</a></th></tr>";
$GRAPH.="<tr><td colspan='10' class='graph_span_cell'><span id='inbound_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("INBOUND SERVICE LEVEL REPORT")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("STATUS")."</th>";
$DROPS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DROPS")." </th></tr>";
$DROPPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DROP")." % </th></tr>";
$AVGDROPS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG DROP(s)")." </th></tr>";
$HOLD_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("HOLD")." </th></tr>";
$HOLDPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("HOLD")." % </th></tr>";
$AVGHOLDS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG HOLD(s) HOLD")." </th></tr>";
$AVGHOLDSTOTAL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG HOLD(s) TOTAL")." </th></tr>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")." </th></tr>";
$TOTALCALLTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL CALLTIME MIN:SEC")." </th></tr>";
$AVGCALLTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG CALLTIME SECONDS")." </th></tr>";
$d=0;
while ($d < $DURATIONday)
{
@@ -852,9 +845,6 @@ $ASCII_text.="| "._QXZ("TOTALS",41,"r")." | $FtotDROPS | $FtotDROPSpct%|$FtotDRO
$ASCII_text.="+-------------------------------------------+--------+--------+--------+--------+--------+--------+--------+--------+----------+--------+\n";
$CSV_text.="\"TOTALS\",\"$FtotDROPS\",\"$FtotDROPSpct%\",\"$FtotDROPSavg\",\"$FtotQUEUE\",\"$FtotQUEUEpct%\",\"$FtotQUEUEavg\",\"$FtotQUEUEtot\",\"$FtotCALLS\",\"$totTIME_MS\",\"$FtotCALLSavg\"\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$DROPS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_drops))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$DROPPCT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_droppct))."' height='16' />".$graph_stats[$d][2]."%</td></tr>";
$AVGDROPS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_avgdrops))."' height='16' />".$graph_stats[$d][3]."</td></tr>";
@@ -865,42 +855,86 @@ $CSV_text.="\"TOTALS\",\"$FtotDROPS\",\"$FtotDROPSpct%\",\"$FtotDROPSavg\",\"$Ft
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][8], $max_calls))."' height='16' />".$graph_stats[$d][8]."</td></tr>";
$TOTALCALLTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][9], $max_totalcalltime))."' height='16' />".$graph_stats[$d][10]."</td></tr>";
$AVGCALLTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][11], $max_avgcalltime))."' height='16' />".$graph_stats[$d][11]."</td></tr>";
$graph_id++;
$graph_array=array("ACSL_DROPSdata|1|DROPS|integer|", "ACSL_DROPPCTdata|2|DROP PCT|percent|", "ACSL_AVGDROPSdata|3|AVG DROPS|decimal|", "ACSL_HOLDSdata|4|HOLDS|integer|", "ACSL_HOLDPCTdata|5|HOLD PCT|percent|", "ACSL_AVGHOLDSdata|6|AVG HOLDS|decimal|", "ACSL_AVGHOLDSTOTALdata|7|AVG HOLDS TOTAL|decimal|", "ACSL_CALLSdata|8|CALLS|integer|", "ACSL_TOTALCALLTIMEdata|9|TOTAL CALL TIME|time|", "ACSL_AVGCALLTIMEdata|11|AVG CALL TIME|integer|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$link_name=$graph_info[2];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"$link_name\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$DROPS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotDROPS)."</th></tr></table>";
$DROPPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotDROPSpct)."%</th></tr></table>";
$AVGDROPS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotDROPSavg)."</th></tr></table>";
$HOLD_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotQUEUE)."</th></tr></table>";
$HOLDPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotQUEUEpct)."%</th></tr></table>";
$AVGHOLDS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotQUEUEavg)."</th></tr></table>";
$AVGHOLDSTOTAL_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotQUEUEtot)."</th></tr></table>";
$CALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotCALLS)."</th></tr></table>";
$TOTALCALLTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($totTIME_MS)."</th></tr></table>";
$AVGCALLTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotCALLSavg)."</th></tr></table>";
$JS_text="<script language='Javascript'>\n";
$JS_onload="onload = function() {\n";
$JS_onload.="\tDrawGraph('DROPS', '1');\n";
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_text.=" var DROPS_graph=\"$DROPS_graph\";\n";
$JS_text.=" var DROPPCT_graph=\"$DROPPCT_graph\";\n";
$JS_text.=" var AVGDROPS_graph=\"$AVGDROPS_graph\";\n";
$JS_text.=" var HOLD_graph=\"$HOLD_graph\";\n";
$JS_text.=" var HOLDPCT_graph=\"$HOLDPCT_graph\";\n";
$JS_text.=" var AVGHOLDS_graph=\"$AVGHOLDS_graph\";\n";
$JS_text.=" var AVGHOLDSTOTAL_graph=\"$AVGHOLDSTOTAL_graph\";\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var TOTALCALLTIME_graph=\"$TOTALCALLTIME_graph\";\n";
$JS_text.=" var AVGCALLTIME_graph=\"$AVGCALLTIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=10; i++) {\n";
$JS_text.=" var cellID=\"inbound_graph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"inbound_graph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('inbound_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
# $MAIN.=$GRAPH;
$graph_count=count($graph_array);
$graph_title=_QXZ("CALL STATUS STATS");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
## FORMAT OUTPUT ##
@@ -1013,10 +1047,10 @@ $ASCII_text.="+-------------+-----------------------+-------+-------+ +--------
$max_avg_hold_time=1;
$max_calls=1;
$graph_stats=array();
$GRAPH="<BR><BR><a name='holdcalldropgraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='50%' class='grey_graph_cell' id='holdcalldropgraph1'><a href='#' onClick=\"DrawHCDGraph('AVGHOLD', '1'); return false;\">"._QXZ("AVERAGE HOLD TIME")."</a></th><th width=50% class='grey_graph_cell' id='holdcalldropgraph2'><a href='#' onClick=\"DrawHCDGraph('CALLSHANDLED', '2'); return false;\">"._QXZ("CALLS HANDLED")."</a></th></tr>";
$GRAPH.="<tr><td colspan='5' class='graph_span_cell'><span id='holdcalldrop_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$AVGHOLD_graph="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("AVERAGE HOLD TIME")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("TIME 15-MIN INT")."</th><th class='thgraph' scope='col'>"._QXZ("AVG HOLD TIME")."</th><th class='thgraph' scope='col'>"._QXZ("AVG")."</th><th class='thgraph' scope='col'>"._QXZ("MAX")."</th></tr>";
$CALLSHANDLED_graph="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("CALLS HANDLED")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("TIME 15-MIN INT")."</th><th class='thgraph' scope='col'>"._QXZ("DROPS")." <img src='./images/bar_blue.png' width='10' height='10'> / "._QXZ("CALLS")." <img src='./images/bar.png' width='10' height='10'></th></tr>";
@@ -1159,13 +1193,93 @@ $ASCII_text.="| "._QXZ("TOTAL",35)." | $totQUEUEavg | $totQUEUEmax | |
$ASCII_text.="+-------------------------------------+-------+-------+ +-----------------------+-------+-------+\n";
$CSV_text.="\""._QXZ("TOTAL")."\",\"$totQUEUEavg\",\"$totQUEUEmax\",\"\",\"$totDROPS\",\"$totCALLS\"\n\n";
$AVGHOLD_graph="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("AVERAGE HOLD TIME")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("TIME 15-MIN INT")."</th><th class='thgraph' scope='col'>"._QXZ("AVG HOLD TIME")."</th><th class='thgraph' scope='col'>"._QXZ("AVG")."</th><th class='thgraph' scope='col'>"._QXZ("MAX")."</th></tr>";
$GRAPH_text="";
#########
$graph_array=array("ACS_AVERAGEHOLDTIMEseconds|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][0]."\",";
$data.="\"".$graph_stats[$d][1]."\",";
$current_graph_total+=$graph_stats[$d][1];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("AVERAGE HOLD TIME");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas."<PRE>";
$CALLSHANDLED_graph="<table cellspacing='0' cellpadding='0'><caption align='top'>"._QXZ("CALLS HANDLED")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("TIME 15-MIN INT")."</th><th class='thgraph' scope='col'>"._QXZ("DROPS")." <img src='./images/bar_blue.png' width='10' height='10'> / "._QXZ("CALLS")." <img src='./images/bar.png' width='10' height='10'></th></tr>";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$AVGHOLD_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_avg_hold_time))."' height='16' />".$graph_stats[$d][1]."</td><td class='chart_td$class'>".$graph_stats[$d][1]."</td><td class='chart_td$class'>".$graph_stats[$d][2]."</td></tr>";
$CALLSHANDLED_graph.=" <tr><td class='chart_td' width='50'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value' width='600' valign='bottom'>";
if ($graph_stats[$d][3]>0) {
$CALLSHANDLED_graph.="<ul class='overlap_barGraph'><li class='p1' style='height: 12px; left: 0px; width: ".round(MathZDC(600*$graph_stats[$d][3], $max_calls))."px'><font style='background-color: #900'>".$graph_stats[$d][3]."</font></li>";
@@ -1178,29 +1292,18 @@ for ($d=0; $d<count($graph_stats); $d++) {
}
$CALLSHANDLED_graph.="</td></tr>";
}
$AVGHOLD_graph.="<tr><th class='thgraph' colspan='2' scope='col'>"._QXZ("TOTALS").":</th><th class='thgraph' scope='col'>".trim($totQUEUEavg)."&nbsp;</th><th class='thgraph' scope='col'>&nbsp;".trim($totQUEUEmax)."</th></tr></table>";
$CALLSHANDLED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTALS").":</th><th class='thgraph' scope='col'>"._QXZ("DROPS").": ".trim($totDROPS)."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"._QXZ("CALLS").": ".trim($totCALLS)."</th></tr></table>";
$JS_text.="function DrawHCDGraph(graph, th_id) {\n";
$JS_text.=" var AVGHOLD_graph=\"$AVGHOLD_graph\";\n";
$JS_text.=" var CALLSHANDLED_graph=\"$CALLSHANDLED_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=2; i++) {\n";
$JS_text.=" var cellID=\"holdcalldropgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"holdcalldropgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('holdcalldrop_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$JS_onload.="\tDrawHCDGraph('AVGHOLD','1');\n";
$JS_onload.="}\n";
if ($report_display_type=='HTML') {$JS_text.=$JS_onload;}
$JS_text.=" document.getElementById('holdcalldrop_stats_graph').innerHTML=CALLSHANDLED_graph;\n";
$GRAPH_text.=$GRAPH;
$JS_text.="</script>\n";
if ($report_display_type=="HTML")
{
$MAIN.=$GRAPH;
$MAIN.=$GRAPH_text;
}
else
{
@@ -1356,9 +1459,9 @@ else
{
echo "$HEADER";
echo $JS_text;
require("admin_header.php");
echo "$MAIN";
echo $JS_text;
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -26,6 +26,7 @@
# 150516-1300 - Fixed Javascript element problem, Issue #857
# 151125-1609 - Added search archive option
# 160227-1151 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -390,6 +391,9 @@ $HEADER.="</STYLE>\n";
$HEADER.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HEADER.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HEADER.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HEADER.="<script src='chart/Chart.js'></script>\n";
$HEADER.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HEADER.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HEADER.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -590,26 +594,6 @@ else
$CSV_subreports="";
$graph_stats=array();
$max_calls=1;
$max_answer=1;
$max_talk=1;
$max_avgtalk=1;
$max_queue=1;
$max_avgqueue=1;
$max_maxqueue=1;
$max_totalabandons=1;
$GRAPH="<BR><BR><a name='multigroup_graph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='12%' class='grey_graph_cell' id='multigroup_graph1'><a href='#' onClick=\"DrawGraph('CALLS', '1'); return false;\">TOTAL CALLS</a></th><th width='12%' class='grey_graph_cell' id='multigroup_graph2'><a href='#' onClick=\"DrawGraph('ANSWER', '2'); return false;\">TOTAL ANSWER</a></th><th width='12%' class='grey_graph_cell' id='multigroup_graph3'><a href='#' onClick=\"DrawGraph('TALK', '3'); return false;\">TOTAL TALK</a></th><th width='12%' class='grey_graph_cell' id='multigroup_graph4'><a href='#' onClick=\"DrawGraph('AVGTALK', '4'); return false;\">AVERAGE TALK</a></th><th width='13%' class='grey_graph_cell' id='multigroup_graph5'><a href='#' onClick=\"DrawGraph('QUEUE', '5'); return false;\">TOTAL QUEUE TIME</a></th><th width='13%' class='grey_graph_cell' id='multigroup_graph6'><a href='#' onClick=\"DrawGraph('AVGQUEUE', '6'); return false;\">AVERAGE QUEUE TIME</a></th><th width='13%' class='grey_graph_cell' id='multigroup_graph7'><a href='#' onClick=\"DrawGraph('MAXQUEUE', '7'); return false;\">MAXIMUM QUEUE TIME</a></th><th width='13%' class='grey_graph_cell' id='multigroup_graph8'><a href='#' onClick=\"DrawGraph('TOTALABANDONS', '8'); return false;\">TOTAL ABANDON CALLS</a></th></tr>";
$GRAPH.="<tr><td colspan='8' class='graph_span_cell'><span id='multigroup_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>INBOUND SERVICE LEVEL REPORT</caption><tr><th class='thgraph' scope='col'>IN-GROUP</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>TOTAL CALLS </th></tr>";
$ANSWER_graph=$graph_header."<th class='thgraph' scope='col'>TOTAL ANSWER </th></tr>";
$TALK_graph=$graph_header."<th class='thgraph' scope='col'>TOTAL TALK </th></tr>";
$AVGTALK_graph=$graph_header."<th class='thgraph' scope='col'>AVERAGE TALK </th></tr>";
$QUEUE_graph=$graph_header."<th class='thgraph' scope='col'>TOTAL QUEUE TIME </th></tr>";
$AVGQUEUE_graph=$graph_header."<th class='thgraph' scope='col'>AVERAGE QUEUE TIME </th></tr>";
$MAXQUEUE_graph=$graph_header."<th class='thgraph' scope='col'>MAXIMUM QUEUE TIME </th></tr>";
$TOTALABANDONS_graph=$graph_header."<th class='thgraph' scope='col'>TOTAL ABANDON CALLS </th></tr>";
$i=0;
$TOTcalls_count=0;
@@ -806,26 +790,6 @@ else
$CSV_subreports.="\"HOUR\",\"TOTAL CALLS\",\"TOTAL ANSWER\",\" TOTAL TALK\",\" AVERAGE TALK\",\" TOTAL QUEUE TIME\",\" AVERAGE QUEUE TIME\",\" MAXIMUM QUEUE TIME\",\" TOTAL ABANDON CALLS\"\n";
$sub_graph_stats=array();
$sub_max_calls=1;
$sub_max_answer=1;
$sub_max_talk=1;
$sub_max_avgtalk=1;
$sub_max_queue=1;
$sub_max_avgqueue=1;
$sub_max_maxqueue=1;
$sub_max_totalabandons=1;
$sub_GRAPH.="<BR><BR><a name='".$group[$i]."_graph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$sub_GRAPH.="<tr><th width='12%' class='grey_graph_cell' id='".$group[$i]."_graph1'><a href='#' onClick=\"Draw".$group[$i]."Graph('CALLS', '1'); return false;\">TOTAL CALLS</a></th><th width='12%' class='grey_graph_cell' id='".$group[$i]."_graph2'><a href='#' onClick=\"Draw".$group[$i]."Graph('ANSWER', '2'); return false;\">TOTAL ANSWER</a></th><th width='12%' class='grey_graph_cell' id='".$group[$i]."_graph3'><a href='#' onClick=\"Draw".$group[$i]."Graph('TALK', '3'); return false;\">TOTAL TALK</a></th><th width='12%' class='grey_graph_cell' id='".$group[$i]."_graph4'><a href='#' onClick=\"Draw".$group[$i]."Graph('AVGTALK', '4'); return false;\">AVERAGE TALK</a></th><th width='13%' class='grey_graph_cell' id='".$group[$i]."_graph5'><a href='#' onClick=\"Draw".$group[$i]."Graph('QUEUE', '5'); return false;\">TOTAL QUEUE TIME</a></th><th width='13%' class='grey_graph_cell' id='".$group[$i]."_graph6'><a href='#' onClick=\"Draw".$group[$i]."Graph('AVGQUEUE', '6'); return false;\">AVERAGE QUEUE TIME</a></th><th width='13%' class='grey_graph_cell' id='".$group[$i]."_graph7'><a href='#' onClick=\"Draw".$group[$i]."Graph('MAXQUEUE', '7'); return false;\">MAXIMUM QUEUE TIME</a></th><th width='13%' class='grey_graph_cell' id='".$group[$i]."_graph8'><a href='#' onClick=\"Draw".$group[$i]."Graph('TOTALABANDONS', '8'); return false;\">TOTAL ABANDON CALLS</a></th></tr>";
$sub_GRAPH.="<tr><td colspan='8' class='graph_span_cell'><span id='".$group[$i]."_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$sub_graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>$group[$i] - $group_name[$i] HOURLY BREAKDOWN</caption><tr><th class='thgraph' scope='col'>HOUR</th>";
$sub_CALLS_graph=$sub_graph_header."<th class='thgraph' scope='col'>TOTAL CALLS </th></tr>";
$sub_ANSWER_graph=$sub_graph_header."<th class='thgraph' scope='col'>TOTAL ANSWER </th></tr>";
$sub_TALK_graph=$sub_graph_header."<th class='thgraph' scope='col'>TOTAL TALK </th></tr>";
$sub_AVGTALK_graph=$sub_graph_header."<th class='thgraph' scope='col'>AVERAGE TALK </th></tr>";
$sub_QUEUE_graph=$sub_graph_header."<th class='thgraph' scope='col'>TOTAL QUEUE TIME </th></tr>";
$sub_AVGQUEUE_graph=$sub_graph_header."<th class='thgraph' scope='col'>AVERAGE QUEUE TIME </th></tr>";
$sub_MAXQUEUE_graph=$sub_graph_header."<th class='thgraph' scope='col'>MAXIMUM QUEUE TIME </th></tr>";
$sub_TOTALABANDONS_graph=$sub_graph_header."<th class='thgraph' scope='col'>TOTAL ABANDON CALLS </th></tr>";
$h=0; $q=0;
while ($h < 24)
@@ -920,46 +884,85 @@ else
$hTOTmax_queue_seconds = sprintf("%7s", $hTOTmax_queue_seconds);
$hTOTdrop_count = sprintf("%6s", $hTOTdrop_count);
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("ACSH_TOTALCALLS$group[$i]data|1|TOTAL CALLS|integer|", "ACSH_TOTALANSWER$group[$i]data|2|TOTAL ANSWER|integer|", "ACSH_TOTALTALK$group[$i]data|3|TOTAL TALK|time|", "ACSH_AVERAGETALK$group[$i]data|4|AVERAGE TALK|time|", "ACSH_TOTALQUEUE$group[$i]data|5|TOTAL QUEUE TIME|time|", "ACSH_AVERAGEQUEUE$group[$i]data|6|AVERAGE QUEUE TIME|time|", "ACSH_MAXQUEUE$group[$i]data|7|MAXIMUM QUEUE TIME|time|", "ACSH_TOTALABANDON$group[$i]data|8|TOTAL ABANDON CALLS|integer|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
for ($q=0; $q<count($sub_graph_stats); $q++) {
if ($q==0) {$class=" first";} else if (($q+1)==count($sub_graph_stats)) {$class=" last";} else {$class="";}
$sub_CALLS_graph.=" <tr><td class='chart_td$class'>".$sub_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$sub_graph_stats[$q][1], $sub_max_calls))."' height='16' />".$sub_graph_stats[$q][1]."</td></tr>";
$sub_ANSWER_graph.=" <tr><td class='chart_td$class'>".$sub_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$sub_graph_stats[$q][2], $sub_max_answer))."' height='16' />".$sub_graph_stats[$q][2]."</td></tr>";
$sub_TALK_graph.=" <tr><td class='chart_td$class'>".$sub_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$sub_graph_stats[$q][3], $sub_max_talk))."' height='16' />".sec_convert($sub_graph_stats[$q][3],'H')."</td></tr>";
$sub_AVGTALK_graph.=" <tr><td class='chart_td$class'>".$sub_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$sub_graph_stats[$q][4], $sub_max_avgtalk))."' height='16' />".sec_convert($sub_graph_stats[$q][4],'H')."</td></tr>";
$sub_QUEUE_graph.=" <tr><td class='chart_td$class'>".$sub_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$sub_graph_stats[$q][5], $sub_max_queue))."' height='16' />".sec_convert($sub_graph_stats[$q][5],'H')."</td></tr>";
$sub_AVGQUEUE_graph.=" <tr><td class='chart_td$class'>".$sub_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$sub_graph_stats[$q][6], $sub_max_avgqueue))."' height='16' />".sec_convert($sub_graph_stats[$q][6],'H')."</td></tr>";
$sub_MAXQUEUE_graph.=" <tr><td class='chart_td$class'>".$sub_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$sub_graph_stats[$q][7], $sub_max_maxqueue))."' height='16' />".sec_convert($sub_graph_stats[$q][7],'H')."</td></tr>";
$sub_TOTALABANDONS_graph.=" <tr><td class='chart_td$class'>".$sub_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$sub_graph_stats[$q][8], $sub_max_totalabandons))."' height='16' />".$sub_graph_stats[$q][8]."</td></tr>";
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"$graph_info[2] BY HOUR\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($sub_graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $sub_graph_stats[$d][0])."\",";
$data.="\"".$sub_graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$sub_graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$sub_CALLS_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($hTOTcalls_count)."</th></tr></table>";
$sub_ANSWER_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($hTOTanswer_count)."</th></tr></table>";
$sub_TALK_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($hTOTtalk_sec)."</th></tr></table>";
$sub_AVGTALK_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($hTOTtalk_avg)."</th></tr></table>";
$sub_QUEUE_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($hTOTqueue_seconds)."</th></tr></table>";
$sub_AVGQUEUE_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($hTOTqueue_avg)."</th></tr></table>";
$sub_MAXQUEUE_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($hTOTmax_queue_seconds)."</th></tr></table>";
$sub_TOTALABANDONS_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($hTOTdrop_count)."</th></tr></table>";
$JS_onload.="\tDraw".$group[$i]."Graph('CALLS', '1');\n";
$JS_text.="function Draw".$group[$i]."Graph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$sub_CALLS_graph\";\n";
$JS_text.=" var ANSWER_graph=\"$sub_ANSWER_graph\";\n";
$JS_text.=" var TALK_graph=\"$sub_TALK_graph\";\n";
$JS_text.=" var AVGTALK_graph=\"$sub_AVGTALK_graph\";\n";
$JS_text.=" var QUEUE_graph=\"$sub_QUEUE_graph\";\n";
$JS_text.=" var AVGQUEUE_graph=\"$sub_AVGQUEUE_graph\";\n";
$JS_text.=" var MAXQUEUE_graph=\"$sub_MAXQUEUE_graph\";\n";
$JS_text.=" var TOTALABANDONS_graph=\"$sub_TOTALABANDONS_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=8; i++) {\n";
$JS_text.=" var cellID=\"".$group[$i]."_graph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"".$group[$i]."_graph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('".$group[$i]."_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$graph_count=count($graph_array);
$graph_title=" $group[$i] - $group_name[$i]<BR>"._QXZ("INBOUND SERVICE LEVEL REPORT");
include("graphcanvas.inc");
$sub_GRAPH.=$graphCanvas;
$SUBoutput .= "+------+--------+--------+-----------+---------+-----------+---------+---------+--------+\n";
@@ -977,55 +980,87 @@ else
$TOTtalk_avg = MathZDC($TOTtalk_sec, $TOTanswer_count);
$TOTqueue_avg = MathZDC($TOTqueue_seconds, $TOTcalls_count);
for ($q=0; $q<count($graph_stats); $q++) {
if ($q==0) {$class=" first";} else if (($q+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][1], $max_calls))."' height='16' />".$graph_stats[$q][1]."</td></tr>";
$ANSWER_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][2], $max_answer))."' height='16' />".$graph_stats[$q][2]."</td></tr>";
$TALK_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][3], $max_talk))."' height='16' />".sec_convert($graph_stats[$q][3],'H')."</td></tr>";
$AVGTALK_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][4], $max_avgtalk))."' height='16' />".sec_convert($graph_stats[$q][4],'H')."</td></tr>";
$QUEUE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][5], $max_queue))."' height='16' />".sec_convert($graph_stats[$q][5],'H')."</td></tr>";
$AVGQUEUE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][6], $max_avgqueue))."' height='16' />".sec_convert($graph_stats[$q][6],'H')."</td></tr>";
$MAXQUEUE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][7], $max_maxqueue))."' height='16' />".sec_convert($graph_stats[$q][7],'H')."</td></tr>";
$TOTALABANDONS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][8], $max_totalabandons))."' height='16' />".$graph_stats[$q][8]."</td></tr>";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("ACSH_TOTALCALLSdata|1|TOTAL CALLS|integer|", "ACSH_TOTALANSWERdata|2|TOTAL ANSWERS|integer|", "ACSH_TOTALTALKdata|3|TOTAL TALK TIME|time|", "ACSH_AVERAGETALKdata|4|AGV TALK TIME|time|", "ACSH_TOTALQUEUEdata|5|TOTAL QUEUE TIME|time|", "ACSH_AVERAGEQUEUEdata|6|AVERAGE QUEUE TIME|time|", "ACSH_MAXQUEUEdata|7|MAXIMUM QUEUE TIME|time|", "ACSH_TOTALABANDONdata|8|TOTAL ABANDON CALLS|integer|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"$graph_info[2] BY INGROUP\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$gTOTtalk_avg = round(MathZDC($gTOTtalk_sec, $gTOTanswer_count));
$gTOTqueue_avg = round(MathZDC($gTOTqueue_seconds, $gTOTcalls_count));
$graph_count=count($graph_array);
$graph_title=_QXZ("INBOUND SERVICE LEVEL REPORT");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
$gTOTtalk_sec = sec_convert($gTOTtalk_sec,'H');
$gTOTtalk_avg = sec_convert($gTOTtalk_avg,'H');
$gTOTqueue_seconds = sec_convert($gTOTqueue_seconds,'H');
$gTOTqueue_avg = sec_convert($gTOTqueue_avg,'H');
$gTOTmax_queue_seconds = sec_convert($gTOTmax_queue_seconds,'H');
$CALLS_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($gTOTcalls_count)."</th></tr></table>";
$ANSWER_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($gTOTanswer_count)."</th></tr></table>";
$TALK_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($gTOTtalk_sec)."</th></tr></table>";
$AVGTALK_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($gTOTtalk_avg)."</th></tr></table>";
$QUEUE_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($gTOTqueue_seconds)."</th></tr></table>";
$AVGQUEUE_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($gTOTqueue_avg)."</th></tr></table>";
$MAXQUEUE_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($gTOTmax_queue_seconds)."</th></tr></table>";
$TOTALABANDONS_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($gTOTdrop_count)."</th></tr></table>";
$JS_onload.="\tDrawGraph('CALLS', '1');\n";
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var ANSWER_graph=\"$ANSWER_graph\";\n";
$JS_text.=" var TALK_graph=\"$TALK_graph\";\n";
$JS_text.=" var AVGTALK_graph=\"$AVGTALK_graph\";\n";
$JS_text.=" var QUEUE_graph=\"$QUEUE_graph\";\n";
$JS_text.=" var AVGQUEUE_graph=\"$AVGQUEUE_graph\";\n";
$JS_text.=" var MAXQUEUE_graph=\"$MAXQUEUE_graph\";\n";
$JS_text.=" var TOTALABANDONS_graph=\"$TOTALABANDONS_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=8; i++) {\n";
$JS_text.=" var cellID=\"multigroup_graph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"multigroup_graph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('multigroup_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$TOTtalk_sec = sec_convert($TOTtalk_sec,'H');
@@ -1123,9 +1158,9 @@ else
}
echo "$HEADER";
echo $JS_text;
require("admin_header.php");
echo "$MAIN";
echo $JS_text;
# echo "$SUBoutput";
+242 -58
View File
@@ -28,6 +28,7 @@
# 141230-1508 - Added code for on-the-fly language translations display
# 151125-1614 - Added search archive option
# 160227-1150 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -346,6 +347,9 @@ $HEADER.="</style>\n";
$HEADER.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HEADER.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HEADER.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HEADER.="<script src='chart/Chart.js'></script>\n";
$HEADER.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HEADER.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HEADER.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -444,6 +448,7 @@ $MAIN.="</FORM>\n";
$MAIN.="<PRE><FONT SIZE=2>";
$JS_text="<script language='Javascript'>";
if (!$group)
{
@@ -709,13 +714,7 @@ else
$CSV_text1.="\""._QXZ("DID Summary").":\"\n";
$CSV_text1.="\""._QXZ("DID")."\",\""._QXZ("DESCRIPTION")."\",\""._QXZ("ROUTE")."\",\""._QXZ("CALLS")."\"\n";
$GRAPH_text.="</PRE><table cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"white\" summary=\"DID Summary\" class=\"horizontalgraph\">\n";
$GRAPH_text.=" <caption align=\"top\">"._QXZ("DID Summary").":</caption>\n";
$GRAPH_text.="<tr>\n";
$GRAPH_text.="<th class=\"thgraph\" scope=\"col\">"._QXZ("DID")."</th>\n";
$GRAPH_text.="<th class=\"thgraph\" scope=\"col\">"._QXZ("CALLS")."</th>\n";
$GRAPH_text.="</tr>\n";
$GRAPH_text.="</PRE>";
$stats_array = array_group_count($extension, 'desc');
$stats_array_ct = count($stats_array);
@@ -759,18 +758,85 @@ else
$d++;
}
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH_text.=" <tr>\n";
$GRAPH_text.=" <td class=\"chart_td$class\">".$graph_stats[$d][1]."</td>\n";
$GRAPH_text.=" <td nowrap class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$graph_stats[$d][0], $max_calls))."\" height=\"16\" />".$graph_stats[$d][0]."</td>\n";
$GRAPH_text.=" </tr>\n";
#########
$graph_array=array("DIDSummarydata|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1]; $dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][1]."\",";
$data.="\"".$graph_stats[$d][0]."\",";
$current_graph_total+=$graph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$GRAPH_text.=" <tr>\n";
$GRAPH_text.=" <th class=\"thgraph\" scope=\"col\">TOTAL CALLS:</th>\n";
$GRAPH_text.=" <th class=\"thgraph\" scope=\"col\">".trim($totCALLS)."</th>\n";
$GRAPH_text.=" </tr>\n";
$GRAPH_text.="</table><PRE>\n";
$graph_count=count($graph_array);
$graph_title=_QXZ("DID Summary");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas."<PRE>";
$FtotCALLS = sprintf("%10s", $totCALLS);
@@ -839,13 +905,6 @@ else
$CSV_text1.="\""._QXZ("Server Summary").":\"\n";
$CSV_text1.="\""._QXZ("Server")."\",\""._QXZ("CALLS")."\"\n";
$GRAPH_text.="</PRE><table cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"white\" summary=\"Server Summary\" class=\"horizontalgraph\">\n";
$GRAPH_text.=" <caption align=\"top\">"._QXZ("Server Summary").":</caption>\n";
$GRAPH_text.="<tr>\n";
$GRAPH_text.="<th class=\"thgraph\" scope=\"col\">"._QXZ("SERVER")."</th>\n";
$GRAPH_text.="<th class=\"thgraph\" scope=\"col\">"._QXZ("CALLS")."</th>\n";
$GRAPH_text.="</tr>\n";
$SVstats_array = array_group_count($did_server_ip, 'desc');
$SVstats_array_ct = count($SVstats_array);
@@ -882,19 +941,84 @@ else
$d++;
}
for ($d=0; $d<count($SVgraph_stats); $d++)
{
if ($d==0) {$class=" first";} else if (($d+1)==count($SVgraph_stats)) {$class=" last";} else {$class="";}
$GRAPH_text.=" <tr>\n";
$GRAPH_text.=" <td class=\"chart_td$class\">".$SVgraph_stats[$d][1]."</td>\n";
$GRAPH_text.=" <td nowrap class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$SVgraph_stats[$d][0], $max_calls))."\" height=\"16\" />".$SVgraph_stats[$d][0]."</td>\n";
$GRAPH_text.=" </tr>\n";
#########
$graph_array=array("ServerSummarydata|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1]; $dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($SVgraph_stats); $d++) {
$labels.="\"".$SVgraph_stats[$d][1]."\",";
$data.="\"".$SVgraph_stats[$d][0]."\",";
$current_graph_total+=$SVgraph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$GRAPH_text.=" <tr>\n";
$GRAPH_text.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL CALLS").":</th>\n";
$GRAPH_text.=" <th class=\"thgraph\" scope=\"col\">".trim($SVtotCALLS)."</th>\n";
$GRAPH_text.=" </tr>\n";
$GRAPH_text.="</table><PRE>\n";
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("Server Summary");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas."<PRE>";
$FtotCALLS = sprintf("%10s", $SVtotCALLS);
@@ -917,14 +1041,6 @@ else
$CSV_text1.="\n\""._QXZ("Date Summary").":\"\n";
$CSV_text1.="\""._QXZ("SHIFT DATE-TIME RANGE")."\",\""._QXZ("CALLS")."\"\n";
$GRAPH_text.="</PRE><table cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"white\" summary=\"DID Summary\" class=\"horizontalgraph\">\n";
$GRAPH_text.=" <caption align=\"top\">"._QXZ("Date Summary").":</caption>\n";
$GRAPH_text.="<tr>\n";
$GRAPH_text.="<th class=\"thgraph\" scope=\"col\">"._QXZ("SHIFT DATE-TIME RANGE")."</th>\n";
$GRAPH_text.="<th class=\"thgraph\" scope=\"col\">"._QXZ("CALLS")."</th>\n";
$GRAPH_text.="</tr>\n";
$d=0;
$max_calls=1;
$graph_stats=array();
@@ -957,18 +1073,84 @@ else
$d++;
}
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH_text.=" <tr>\n";
$GRAPH_text.=" <td class=\"chart_td$class\">".$graph_stats[$d][1]."</td>\n";
$GRAPH_text.=" <td nowrap class=\"chart_td value$class\" nowrap><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$graph_stats[$d][0], $max_calls))."\" height=\"16\" />".$graph_stats[$d][0]."</td>\n";
$GRAPH_text.=" </tr>\n";
}
$GRAPH_text.=" <tr>\n";
$GRAPH_text.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL CALLS").":</th>\n";
$GRAPH_text.=" <th class=\"thgraph\" scope=\"col\">".trim($totCALLS)."</th>\n";
$GRAPH_text.=" </tr>\n";
$GRAPH_text.="</table><PRE>\n";
#########
$graph_array=array("DateSummarydata|||integer|");
$graph_id++;
$default_graph="line"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1]; $dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][1]."\",";
$data.="\"".$graph_stats[$d][0]."\",";
$current_graph_total+=$graph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("Date Summary");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas."<PRE>";
$FtotCALLS = sprintf("%6s", $totCALLS);
@@ -1239,9 +1421,11 @@ else
}
$GRAPH_text.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTALS").":</th><th class='thgraph' scope='col'>".trim($totCALLS)."</th></tr></table>";
$JS_text.="</script>";
if ($report_display_type=="HTML")
{
$MAIN.=$GRAPH_text;
$MAIN.=$GRAPH_text.$JS_text;
}
else
{
+91 -50
View File
@@ -34,6 +34,7 @@
# 151125-1643 - Added search archive option
# 151204-0544 - Added code to look for "CALL_MENU" and "XML_PULL" In-Group permissions for those list options
# 160227-1130 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -75,8 +76,6 @@ if ($type == 'inbound')
else
{$report_name = 'Outbound IVR Report';}
$db_source = 'M';
$JS_text="<script language='Javascript'>\n";
$JS_onload="onload = function() {\n";
#############################################
##### START SYSTEM_SETTINGS LOOKUP #####
@@ -475,7 +474,9 @@ $end_date_T = $end_dateARRAY[1];
$HEADER.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HEADER.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HEADER.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HEADER.="<script src='chart/Chart.js'></script>\n";
$HEADER.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HEADER.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HEADER.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -483,6 +484,7 @@ $HEADER.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marg
$short_header=1;
# require("admin_header.php");
$JS_text="<script language='Javascript'>\n";
$MAIN.="<b>"._QXZ("$report_name")."</b> $NWB#IVRstats$NWE\n";
$MAIN.="<TABLE CELLPADDING=3 CELLSPACING=0><TR><TD>";
@@ -818,15 +820,6 @@ else
$max_queue_drops_percent=1;
$max_ivr_avg=1;
$max_total_avg=1;
$GRAPH="<a name='ivrgraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='16%' id='ivrgraph1' class='grey_graph_cell'><a href='#' onClick=\"DrawGraph('IVRCALLS', '1'); return false;\">"._QXZ("IVR CALLS")."</a></th><th width='17%' id='ivrgraph2' class='grey_graph_cell'><a href='#' onClick=\"DrawGraph('QUEUECALLS', '2'); return false;\">"._QXZ("QUEUE CALLS")."</a></th><th width='17%' id='ivrgraph3' class='grey_graph_cell'><a href='#' onClick=\"DrawGraph('QUEUEDROPCALLS', '3'); return false;\">"._QXZ("QUEUE DROP CALLS")."</a></th><th width='16%' id='ivrgraph4' class='grey_graph_cell'><a href='#' onClick=\"DrawGraph('QUEUEDROPPERCENT', '4'); return false;\">"._QXZ("QUEUE DROP PERCENT")."</a></th><th width='17%' id='ivrgraph5' class='grey_graph_cell'><a href='#' onClick=\"DrawGraph('IVRAVGTIME', '5'); return false;\">"._QXZ("IVR AVG TIME")."</a></th><th width='17%' id='ivrgraph6' class='grey_graph_cell'><a href='#' onClick=\"DrawGraph('TOTALAVGTIME', '6'); return false;\">"._QXZ("TOTAL AVG TIME")."</a></th></tr>";
$GRAPH.="<tr><td colspan='6' class='graph_span_cell'><span id='ivr_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$IVRCALLS_graph="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>"._QXZ("IVR STATS")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("IVR CALLS")."</th><th class='thgraph' scope='col'>"._QXZ("CALL PATH")."</th></tr>";
$QUEUECALLS_graph="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>"._QXZ("IVR STATS")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("QUEUE CALLS")."</th><th class='thgraph' scope='col'>"._QXZ("CALL PATH")."</th></tr>";
$QUEUEDROPCALLS_graph="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>"._QXZ("IVR STATS")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("QUEUE DROP CALLS")."</th><th class='thgraph' scope='col'>"._QXZ("CALL PATH")."</th></tr>";
$QUEUEDROPPERCENT_graph="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>"._QXZ("IVR STATS")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("QUEUE DROP PERCENT")."</th><th class='thgraph' scope='col'>"._QXZ("CALL PATH")."</th></tr>";
$IVRAVGTIME_graph="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>"._QXZ("IVR STATS")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("IVR AVG TIME")."</th><th class='thgraph' scope='col'>"._QXZ("CALL PATH")."</th></tr>";
$TOTALAVGTIME_graph="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>"._QXZ("IVR STATS")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("TOTAL AVG TIME")."</th><th class='thgraph' scope='col'>"._QXZ("CALL PATH")."</th></tr>";
###########################
$CSV_text.="\"\",\""._QXZ("IVR CALLS")."\",\""._QXZ("QUEUE CALLS")."\",\""._QXZ("QUEUE DROP CALLS")."\",\""._QXZ("QUEUE DROP PERCENT")."\",\""._QXZ("IVR AVG TIME")."\",\""._QXZ("TOTAL AVG TIME")."\",\""._QXZ("CALL PATH")."\"\n";
@@ -925,41 +918,88 @@ else
$CSV_text.="\"\",\"$TOTALcalls\",\"$totFLOWtotal\",\"$totFLOWdrop\",\"$totFLOWdropPCT%\",\"$TavgFLOWivr_time\",\"$TavgFLOWtotal_time\"\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$IVRCALLS_graph.=" <tr><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_ivr_calls))."' height='16' />".$graph_stats[$d][1]."</td><td class='chart_td$class'>".$graph_stats[$d][0]."</td></tr>";
$QUEUECALLS_graph.=" <tr><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_queue_calls))."' height='16' />".$graph_stats[$d][2]."</td><td class='chart_td$class'>".$graph_stats[$d][0]."</td></tr>";
$QUEUEDROPCALLS_graph.=" <tr><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_queue_drops))."' height='16' />".$graph_stats[$d][3]."</td><td class='chart_td$class'>".$graph_stats[$d][0]."</td></tr>";
$QUEUEDROPPERCENT_graph.=" <tr><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][4], $max_queue_drops_percent))."' height='16' />".$graph_stats[$d][4]."%</td><td class='chart_td$class'>".$graph_stats[$d][0]."</td></tr>";
$IVRAVGTIME_graph.=" <tr><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][5], $max_ivr_avg))."' height='16' />".$graph_stats[$d][5]."</td><td class='chart_td$class'>".$graph_stats[$d][0]."</td></tr>";
$TOTALAVGTIME_graph.=" <tr><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][6], $max_total_avg))."' height='16' />".$graph_stats[$d][6]."</td><td class='chart_td$class'>".$graph_stats[$d][0]."</td></tr>";
}
$IVRCALLS_graph.="<tr><th class='thgraph' scope='col'>".trim($TOTALcalls)."</th><th class='thgraph' scope='col'>"._QXZ("TOTAL")."</th></tr></table>";
$QUEUECALLS_graph.="<tr><th class='thgraph' scope='col'>".trim($totFLOWtotal)."</th><th class='thgraph' scope='col'>"._QXZ("TOTAL")."</th></tr></table>";
$QUEUEDROPCALLS_graph.="<tr><th class='thgraph' scope='col'>".trim($totFLOWdrop)."</th><th class='thgraph' scope='col'>"._QXZ("TOTAL")."</th></tr></table>";
$QUEUEDROPPERCENT_graph.="<tr><th class='thgraph' scope='col'>".trim($totFLOWdropPCT)."%</th><th class='thgraph' scope='col'>"._QXZ("TOTAL")."</th></tr></table>";
$IVRAVGTIME_graph.="<tr><th class='thgraph' scope='col'>".trim($TavgFLOWivr_time)."</th><th class='thgraph' scope='col'>"._QXZ("TOTAL")."</th></tr></table>";
$TOTALAVGTIME_graph.="<tr><th class='thgraph' scope='col'>".trim($TavgFLOWtotal_time)."</th><th class='thgraph' scope='col'>"._QXZ("TOTAL")."</th></tr></table>";
$JS_onload.="\tDrawGraph('IVRCALLS', '1');\n";
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_text.=" var IVRCALLS_graph=\"$IVRCALLS_graph\";\n";
$JS_text.=" var QUEUECALLS_graph=\"$QUEUECALLS_graph\";\n";
$JS_text.=" var QUEUEDROPCALLS_graph=\"$QUEUEDROPCALLS_graph\";\n";
$JS_text.=" var QUEUEDROPPERCENT_graph=\"$QUEUEDROPPERCENT_graph\";\n";
$JS_text.=" var IVRAVGTIME_graph=\"$IVRAVGTIME_graph\";\n";
$JS_text.=" var TOTALAVGTIME_graph=\"$TOTALAVGTIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=6; i++) {\n";
$JS_text.=" var cellID=\"ivrgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"ivrgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('ivr_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$GRAPH_text.=$GRAPH;
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("IVRSTATS_IVRCALLSdata|1|IVR CALLS|integer|", "IVRSTATS_QUEUECALLSdata|2|QUEUE CALLS|integer|", "IVRSTATS_QUEUEDROPCALLSdata|3|QUEUE DROP CALLS|integer|", "IVRSTATS_QUEUEDROPPERCENTdata|4|QUEUE DROP PERCENT|percent|", "IVRSTATS_IVRAVGTIMEdata|5|IVR AVG TIME|time|", "IVRSTATS_TOTALAVGTIMEdata|6|TOTAL AVG TIME|time|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("CALL STATUS STATS");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
$JS_text.="</script>\n";
if ($report_display_type=="HTML")
{
$MAIN.=$GRAPH_text;
@@ -1145,6 +1185,11 @@ else
$MAIN.="</PRE>\n";
$MAIN.="</TD></TR></TABLE>\n";
if ($report_display_type=="HTML")
{
$MAIN.=$JS_text;
}
$MAIN.="</BODY></HTML>\n";
}
@@ -1187,12 +1232,8 @@ else
exit;
} else {
$JS_onload.="}\n";
if ($report_display_type=='HTML') {$JS_text.=$JS_onload;}
$JS_text.="</script>\n";
echo $HEADER;
echo $JS_text;
require("admin_header.php");
echo $MAIN;
}
@@ -25,6 +25,7 @@
# 150516-1302 - Fixed Javascript element problem, Issue #857
# 151229-2009 - Added archive search option
# 160227-1043 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -54,6 +55,7 @@ if (isset($_GET["search_archived_data"])) {$search_archived_data=$_GET["search
$report_name = 'Lists Campaign Statuses Report';
$db_source = 'M';
$JS_text="<script language='Javascript'>\n";
$JS_text.="function openNewWindow(url)\n";
$JS_text.=" {\n";
@@ -430,6 +432,9 @@ $HEADER.=" .purple {color: white; background-color: purple}\n";
$HEADER.="-->\n";
$HEADER.=" </STYLE>\n";
$HEADER.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HEADER.="<script src='chart/Chart.js'></script>\n";
$HEADER.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HEADER.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HEADER.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -515,13 +520,6 @@ else
$CSV_text1.="\""._QXZ("LIST")."\",\""._QXZ("LEADS")."\",\""._QXZ("ACTIVE")."\"\n";
$max_calls=1; $graph_stats=array();
$GRAPH="</PRE><table cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"white\" summary=\"DID Summary\" class=\"horizontalgraph\">\n";
$GRAPH.="<caption align='top'>"._QXZ("LIST ID SUMMARY")."</caption>";
$GRAPH.="<tr>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("LIST")."</th>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("LEADS")."</th>\n";
$GRAPH.="</tr>\n";
$lists_id_str="";
$list_stmt="SELECT list_id from vicidial_lists where active IN('Y','N') $group_SQLand";
$list_rslt=mysql_to_mysqli($list_stmt, $link);
@@ -585,19 +583,85 @@ else
$OUToutput .= "+------------------------------------------+------------+\n";
$CSV_text1.="\""._QXZ("TOTAL")."\",\"$TOTALleads\"\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td$class\">".$graph_stats[$d][1]."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$graph_stats[$d][0], $max_calls))."\" height=\"16\" />".$graph_stats[$d][0]."</td>\n";
$GRAPH.=" </tr>\n";
#########
$graph_array=array("LID_SUMMARYdata|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][1]."\",";
$data.="\"".$graph_stats[$d][0]."\",";
$current_graph_total+=$graph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL").":</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">".trim($TOTALleads)."</th>\n";
$GRAPH.=" </tr>\n";
$GRAPH.="</table><PRE>\n";
# $OUToutput.=$GRAPH;
$graph_count=count($graph_array);
$graph_title=_QXZ("LIST ID SUMMARY");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
##############################
@@ -621,13 +685,6 @@ else
$COMP_percent=0;
$max_calls=1; $graph_stats=array();
$GRAPH.="</PRE><table cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"white\" summary=\"DID Summary\" class=\"horizontalgraph\">\n";
$GRAPH.="<caption align='top'>"._QXZ("STATUS FLAG SUMMARY")."</caption>";
$GRAPH.="<tr>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("STATUS FLAG")."</th>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("CALLS")."</th>\n";
$GRAPH.="</tr>\n";
$stmt="select count(*) from ".$vicidial_list_table." where status IN($human_answered_statuses) and list_id IN($list_id_SQL);";
$rslt=mysql_to_mysqli($stmt, $link);
if ($DB) {$MAIN.="$stmt\n";}
@@ -743,6 +800,8 @@ else
$SC_count = sprintf("%10s", "$SC_count"); while(strlen($SC_count)>10) {$SC_count = substr("$SC_count", 0, -1);}
$COMP_count = sprintf("%10s", "$COMP_count"); while(strlen($COMP_count)>10) {$COMP_count = substr("$COMP_count", 0, -1);}
$graph_stats2=array(array("$HA_count", "Human Answer"), array("$SALE_count", "Sale"), array("$DNC_count", "DNC"), array("$CC_count", "Customer Contact"), array("$NI_count", "Not Interested"), array("$UW_count", "Unworkable"), array("$SC_count", "Scheduled Callbacks"), array("$COMP_count", "Completed"));
$OUToutput .= "\n";
$OUToutput .= "\n";
$OUToutput .= "---------- "._QXZ("STATUS FLAGS SUMMARY:",24)." ("._QXZ("and % of leads in selected lists").") <a href=\"$PHP_SELF?DB=$DB$groupQS&SUBMIT=$SUBMIT&file_download=2&search_archived_data=$search_archived_data\">"._QXZ("DOWNLOAD")."</a>\n";
@@ -768,43 +827,85 @@ else
$CSV_text2 .= "\""._QXZ("Scheduled Callbacks")."\",\"$SC_count\",\"$SC_percent%\"\n";
$CSV_text2 .= "\""._QXZ("Completed")."\",\"$COMP_count\",\"$COMP_percent%\"\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td first\">"._QXZ("Human Answer")."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value first\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$HA_count, $max_calls))."\" height=\"16\"/>".$HA_count." ($HA_percent%)</td>\n";
$GRAPH.=" </tr>\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td\">"._QXZ("Sale")."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$SALE_count, $max_calls))."\" height=\"16\" />".$SALE_count." ($SALE_percent%)</td>\n";
$GRAPH.=" </tr>\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td\">"._QXZ("DNC")."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$DNC_count, $max_calls))."\" height=\"16\" />".$DNC_count." ($DNC_percent%)</td>\n";
$GRAPH.=" </tr>\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td\">"._QXZ("Customer Contact")."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$CC_count, $max_calls))."\" height=\"16\" />".$CC_count." ($CC_percent%)</td>\n";
$GRAPH.=" </tr>\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td\">"._QXZ("Not Interested")."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$NI_count, $max_calls))."\" height=\"16\" />".$NI_count." ($NI_percent%)</td>\n";
$GRAPH.=" </tr>\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td\">"._QXZ("Unworkable")."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$UW_count, $max_calls))."\" height=\"16\" />".$UW_count." ($UW_percent%)</td>\n";
$GRAPH.=" </tr>\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td\">"._QXZ("Scheduled Callbacks")."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$SC_count, $max_calls))."\" height=\"16\" />".$SC_count." ($SC_percent%)</td>\n";
$GRAPH.=" </tr>\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td last\">"._QXZ("Completed")."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value last\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$COMP_count, $max_calls))."\" height=\"16\" />".$COMP_count." ($COMP_percent%)</td>\n";
$GRAPH.=" </tr>\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL").":</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">".trim($flag_count)."</th>\n";
$GRAPH.=" </tr>\n";
$GRAPH.="</table><PRE>\n";
#########
$graph_array=array("APDdata|||intpct|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats2); $d++) {
$labels.="\"".$graph_stats2[$d][1]."\",";
$data.="\"".$graph_stats2[$d][0]."\",";
$current_graph_total+=$graph_stats2[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("STATUS FLAG SUMMARY");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
# $OUToutput.=$GRAPH;
##############################
@@ -820,12 +921,6 @@ else
$CSV_text3.="\""._QXZ("CATEGORY")."\",\""._QXZ("CALLS")."\",\""._QXZ("DESCRIPTION")."\"\n";
$max_calls=1; $graph_stats=array();
$GRAPH.="</PRE><table cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"white\" summary=\"DID Summary\" class=\"horizontalgraph\">\n";
$GRAPH.="<caption align='top'>"._QXZ("CUSTOM STATUS CATEGORY STATS")."</caption>";
$GRAPH.="<tr>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("CATEGORY")."</th>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("CALLS")."</th>\n";
$GRAPH.="</tr>\n";
$TOTCATcalls=0;
$r=0; $i=0;
@@ -856,18 +951,86 @@ else
$OUToutput .= "+----------------------+------------+\n";
$CSV_text3.="\""._QXZ("TOTAL")."\",\"$TOTCATcalls\"\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td$class\">".$graph_stats[$d][1]."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$graph_stats[$d][0], $max_calls))."\" height=\"16\" />".$graph_stats[$d][0]."</td>\n";
$GRAPH.=" </tr>\n";
#########
$graph_array=array("CSCSdata|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][1]."\",";
$data.="\"".$graph_stats[$d][0]."\",";
$current_graph_total+=$graph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL").":</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">".trim($TOTCATcalls)."</th>\n";
$GRAPH.=" </tr>\n";
$GRAPH.="</table><PRE>\n";
$graph_count=count($graph_array);
$graph_title=_QXZ("CUSTOM STATUS CATEGORY STATS");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
#$OUToutput.=$GRAPH;
@@ -899,14 +1062,6 @@ else
$max_flags=1;
$max_status=1;
$graph_stats=array();
$GRAPH.="<BR><BR><a name='graph".$LISTIDlists[$i]."'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='50%' class='grey_graph_cell' id='graph".$LISTIDlists[$i]."1'><a href='#' onClick=\"Draw".$LISTIDlists[$i]."Graph('FLAGS', '1'); return false;\">"._QXZ("STATUS FLAG BREAKDOWN")."</a></th><th width='50%' class='grey_graph_cell' id='graph".$LISTIDlists[$i]."2'><a href='#' onClick=\"Draw".$LISTIDlists[$i]."Graph('STATUS', '2'); return false;\">"._QXZ("STATUS BREAKDOWN")."</a></th></tr>";
$GRAPH.="<tr><td colspan='4' class='graph_span_cell'><span id='status_".$LISTIDlists[$i]."_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='1' cellpadding='0' bgcolor='white' class='horizontalgraph'>";
$graph_header.="<caption align='top'>$LISTIDlists[$i] - $LISTIDlist_names[$i] ($LISTIDlist_active[$i])<br>"._QXZ("TOTAL LEADS").": $LISTIDcalls[$i]</caption>";
$FLAGS_graph=$graph_header."<tr><th class='thgraph' scope='col'>"._QXZ("FLAG")."</th><th class='thgraph' scope='col'>"._QXZ("COUNT")." / %</th></tr>";
$STATUS_graph=$graph_header."<tr><th class='thgraph' scope='col'>"._QXZ("STATUS")."</th><th class='thgraph' scope='col'>"._QXZ("COUNT")."</th></tr>";
$CSV_text4.="\""._QXZ("LIST ID").": $LISTIDlists[$i]\",\"$LISTIDlist_names[$i]\",\"$LISTIDlist_active[$i]\"\n";
$CSV_text4.="\""._QXZ("TOTAL LEADS").":\",\"$header_list_count\"\n\n";
@@ -1016,6 +1171,8 @@ else
}
if ($COMP_count>$max_flags) {$max_flags=$COMP_count;}
$graph_stats2=array(array("$HA_count", "Human Answer"), array("$SALE_count", "Sale"), array("$DNC_count", "DNC"), array("$CC_count", "Customer Contact"), array("$NI_count", "Not Interested"), array("$UW_count", "Unworkable"), array("$SC_count", "Scheduled Callbacks"), array("$COMP_count", "Completed"));
$HA_percent = sprintf("%6.2f", "$HA_percent"); while(strlen($HA_percent)>6) {$HA_percent = substr("$HA_percent", 0, -1);}
$SALE_percent = sprintf("%6.2f", "$SALE_percent"); while(strlen($SALE_percent)>6) {$SALE_percent = substr("$SALE_percent", 0, -1);}
$DNC_percent = sprintf("%6.2f", "$DNC_percent"); while(strlen($DNC_percent)>6) {$DNC_percent = substr("$DNC_percent", 0, -1);}
@@ -1107,25 +1264,103 @@ else
$CSV_text4.="\""._QXZ("TOTAL").":\",\"\",\"$TOTALleads\"\n\n\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$STATUS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_status))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
# USE THIS FOR COMBINED graphs, use pipe-delimited array elements, dataset_name|index|link_name|graph_override
# You have to hard code the graph name in where it is overridden and mind the data indices. No other way to do it.
$multigraph_text="";
$graph_id++;
$graph_array=array("ALCS_STATUSFLAG$LISTIDlists[$i]data|0|STATUS FLAG BREAKDOWN|intpct|graph_stats2", "ALCS_STATUS$LISTIDlists[$i]data|1|STATUS BREAKDOWN|integer|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$graph_override=$graph_info[4];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
if ($graph_override) {
for ($d=0; $d<count($graph_stats2); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats2[$d][1])."\",";
$data.="\"".$graph_stats2[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats2[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
} else {
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$STATUS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTALleads)."</th></tr></table>";
$JS_onload.="\tDraw".$LISTIDlists[$i]."Graph('FLAGS', '1');\n";
$JS_text.="function Draw".$LISTIDlists[$i]."Graph(graph, th_id) {\n";
$JS_text.=" var FLAGS_graph=\"$FLAGS_graph\";\n";
$JS_text.=" var STATUS_graph=\"$STATUS_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=2; i++) {\n";
$JS_text.=" var cellID=\"graph".$LISTIDlists[$i]."\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"graph".$LISTIDlists[$i]."\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('status_".$LISTIDlists[$i]."_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$graph_count=count($graph_array);
$graph_title="$LISTIDlists[$i] - $LISTIDlist_names[$i] ($LISTIDlist_active[$i])";
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
# $OUToutput.=$GRAPH;
$i++;
@@ -1181,9 +1416,9 @@ else
$JS_text.="</script>\n";
echo $HEADER;
echo $JS_text;
require("admin_header.php");
echo $MAIN;
echo $JS_text;
}
@@ -15,6 +15,7 @@
# 150516-1303 - Fixed Javascript element problem, Issue #857
# 151125-1640 - Added search archive option
# 160227-1138 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -47,6 +48,7 @@ if (isset($_GET["search_archived_data"])) {$search_archived_data=$_GET["search
$report_name = 'Lists Pass Report';
$db_source = 'M';
$JS_text="<script language='Javascript'>\n";
$JS_text.="function openNewWindow(url)\n";
$JS_text.=" {\n";
@@ -428,6 +430,9 @@ $HEADER.=" .purple {color: white; background-color: purple}\n";
$HEADER.="-->\n";
$HEADER.=" </STYLE>\n";
$HEADER.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HEADER.="<script src='chart/Chart.js'></script>\n";
$HEADER.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HEADER.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HEADER.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -634,187 +639,6 @@ else
$graph_stats=array();
$graph_stats2=array();
$max_stats2=array();
$GRAPH="</PRE><table cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"white\" summary=\"LIST ID Summary\" class=\"horizontalgraph\">\n";
$GRAPH.="<caption align='top'>"._QXZ("LIST ID SUMMARY")."</caption>";
$GRAPH.="<tr>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("LIST")."</th>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("LEADS")."</th>\n";
$GRAPH.="</tr>\n";
$GRAPH2="<tr>
<th class='column_header grey_graph_cell' id='callstatsgraph1' ><a href='#' onClick=\"DrawGraph('CONTACTS1', '1'); return false;\">"._QXZ("CONTACTS 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph2' ><a href='#' onClick=\"DrawGraph('CONTACTS2', '2'); return false;\">"._QXZ("CONTACTS 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph3' ><a href='#' onClick=\"DrawGraph('CONTACTS3', '3'); return false;\">"._QXZ("CONTACTS 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph4' ><a href='#' onClick=\"DrawGraph('CONTACTS4', '4'); return false;\">"._QXZ("CONTACTS 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph5' ><a href='#' onClick=\"DrawGraph('CONTACTS5', '5'); return false;\">"._QXZ("CONTACTS 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph6' ><a href='#' onClick=\"DrawGraph('CONTACTSALL', '6'); return false;\">"._QXZ("CONTACTS LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph7' ><a href='#' onClick=\"DrawGraph('CNTRATE1', '7'); return false;\">"._QXZ("CNT RATE 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph8' ><a href='#' onClick=\"DrawGraph('CNTRATE2', '8'); return false;\">"._QXZ("CNT RATE 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph9' ><a href='#' onClick=\"DrawGraph('CNTRATE3', '9'); return false;\">"._QXZ("CNT RATE 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph10'><a href='#' onClick=\"DrawGraph('CNTRATE4', '10'); return false;\">"._QXZ("CNT RATE 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph11'><a href='#' onClick=\"DrawGraph('CNTRATE5', '11'); return false;\">"._QXZ("CNT RATE 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph12'><a href='#' onClick=\"DrawGraph('CNTRATEALL', '12'); return false;\">"._QXZ("CNT RATE LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph13'><a href='#' onClick=\"DrawGraph('SALES1', '13'); return false;\">"._QXZ("SALES 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph14'><a href='#' onClick=\"DrawGraph('SALES2', '14'); return false;\">"._QXZ("SALES 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph15'><a href='#' onClick=\"DrawGraph('SALES3', '15'); return false;\">"._QXZ("SALES 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph16'><a href='#' onClick=\"DrawGraph('SALES4', '16'); return false;\">"._QXZ("SALES 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph17'><a href='#' onClick=\"DrawGraph('SALES5', '17'); return false;\">"._QXZ("SALES 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph18'><a href='#' onClick=\"DrawGraph('SALESALL', '18'); return false;\">"._QXZ("SALES LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph19'><a href='#' onClick=\"DrawGraph('CONVRATE1', '19'); return false;\">"._QXZ("CONV RATE 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph20'><a href='#' onClick=\"DrawGraph('CONVRATE2', '20'); return false;\">"._QXZ("CONV RATE 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph21'><a href='#' onClick=\"DrawGraph('CONVRATE3', '21'); return false;\">"._QXZ("CONV RATE 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph22'><a href='#' onClick=\"DrawGraph('CONVRATE4', '22'); return false;\">"._QXZ("CONV RATE 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph23'><a href='#' onClick=\"DrawGraph('CONVRATE5', '23'); return false;\">"._QXZ("CONV RATE 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph24'><a href='#' onClick=\"DrawGraph('CONVRATEALL', '24'); return false;\">"._QXZ("CONV RATE LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph25'><a href='#' onClick=\"DrawGraph('DNC1', '25'); return false;\">"._QXZ("DNC 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph26'><a href='#' onClick=\"DrawGraph('DNC2', '26'); return false;\">"._QXZ("DNC 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph27'><a href='#' onClick=\"DrawGraph('DNC3', '27'); return false;\">"._QXZ("DNC 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph28'><a href='#' onClick=\"DrawGraph('DNC4', '28'); return false;\">"._QXZ("DNC 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph29'><a href='#' onClick=\"DrawGraph('DNC5', '29'); return false;\">"._QXZ("DNC 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph30'><a href='#' onClick=\"DrawGraph('DNCALL', '30'); return false;\">"._QXZ("DNC LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph31'><a href='#' onClick=\"DrawGraph('DNCRATE1', '31'); return false;\">"._QXZ("DNC RATE 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph32'><a href='#' onClick=\"DrawGraph('DNCRATE2', '32'); return false;\">"._QXZ("DNC RATE 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph33'><a href='#' onClick=\"DrawGraph('DNCRATE3', '33'); return false;\">"._QXZ("DNC RATE 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph34'><a href='#' onClick=\"DrawGraph('DNCRATE4', '34'); return false;\">"._QXZ("DNC RATE 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph35'><a href='#' onClick=\"DrawGraph('DNCRATE5', '35'); return false;\">"._QXZ("DNC RATE 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph36'><a href='#' onClick=\"DrawGraph('DNCRATEALL', '36'); return false;\">"._QXZ("DNC RATE LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph37'><a href='#' onClick=\"DrawGraph('CUSTCNT1', '37'); return false;\">"._QXZ("CUST CNT 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph38'><a href='#' onClick=\"DrawGraph('CUSTCNT2', '38'); return false;\">"._QXZ("CUST CNT 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph39'><a href='#' onClick=\"DrawGraph('CUSTCNT3', '39'); return false;\">"._QXZ("CUST CNT 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph40'><a href='#' onClick=\"DrawGraph('CUSTCNT4', '40'); return false;\">"._QXZ("CUST CNT 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph41'><a href='#' onClick=\"DrawGraph('CUSTCNT5', '41'); return false;\">"._QXZ("CUST CNT 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph42'><a href='#' onClick=\"DrawGraph('CUSTCNTALL', '42'); return false;\">"._QXZ("CUST CNT LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph43'><a href='#' onClick=\"DrawGraph('CUSTCNTRATE1', '43'); return false;\">"._QXZ("CUST CUSTCNT RATE 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph44'><a href='#' onClick=\"DrawGraph('CUSTCNTRATE2', '44'); return false;\">"._QXZ("CUST CUSTCNT RATE 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph45'><a href='#' onClick=\"DrawGraph('CUSTCNTRATE3', '45'); return false;\">"._QXZ("CUST CUSTCNT RATE 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph46'><a href='#' onClick=\"DrawGraph('CUSTCNTRATE4', '46'); return false;\">"._QXZ("CUST CUSTCNT RATE 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph47'><a href='#' onClick=\"DrawGraph('CUSTCNTRATE5', '47'); return false;\">"._QXZ("CUST CUSTCNT RATE 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph48'><a href='#' onClick=\"DrawGraph('CUSTCNTRATEALL', '48'); return false;\">"._QXZ("CUST CUSTCNT RATE LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph49'><a href='#' onClick=\"DrawGraph('UNWRK1', '49'); return false;\">"._QXZ("UNWRK 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph50'><a href='#' onClick=\"DrawGraph('UNWRK2', '50'); return false;\">"._QXZ("UNWRK 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph51'><a href='#' onClick=\"DrawGraph('UNWRK3', '51'); return false;\">"._QXZ("UNWRK 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph52'><a href='#' onClick=\"DrawGraph('UNWRK4', '52'); return false;\">"._QXZ("UNWRK 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph53'><a href='#' onClick=\"DrawGraph('UNWRK5', '53'); return false;\">"._QXZ("UNWRK 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph54'><a href='#' onClick=\"DrawGraph('UNWRKALL', '54'); return false;\">"._QXZ("UNWRK LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph55'><a href='#' onClick=\"DrawGraph('UNWRKRATE1', '55'); return false;\">"._QXZ("UNWRK RATE 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph56'><a href='#' onClick=\"DrawGraph('UNWRKRATE2', '56'); return false;\">"._QXZ("UNWRK RATE 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph57'><a href='#' onClick=\"DrawGraph('UNWRKRATE3', '57'); return false;\">"._QXZ("UNWRK RATE 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph58'><a href='#' onClick=\"DrawGraph('UNWRKRATE4', '58'); return false;\">"._QXZ("UNWRK RATE 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph59'><a href='#' onClick=\"DrawGraph('UNWRKRATE5', '59'); return false;\">"._QXZ("UNWRK RATE 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph60'><a href='#' onClick=\"DrawGraph('UNWRKRATEALL', '60'); return false;\">"._QXZ("UNWRK RATE LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph61'><a href='#' onClick=\"DrawGraph('SCHDCLBK1', '61'); return false;\">"._QXZ("SCHD CLBK 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph62'><a href='#' onClick=\"DrawGraph('SCHDCLBK2', '62'); return false;\">"._QXZ("SCHD CLBK 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph63'><a href='#' onClick=\"DrawGraph('SCHDCLBK3', '63'); return false;\">"._QXZ("SCHD CLBK 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph64'><a href='#' onClick=\"DrawGraph('SCHDCLBK4', '64'); return false;\">"._QXZ("SCHD CLBK 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph65'><a href='#' onClick=\"DrawGraph('SCHDCLBK5', '65'); return false;\">"._QXZ("SCHD CLBK 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph66'><a href='#' onClick=\"DrawGraph('SCHDCLBKALL', '66'); return false;\">"._QXZ("SCHD CLBK LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph67'><a href='#' onClick=\"DrawGraph('SCHDCLBKRATE1', '67'); return false;\">"._QXZ("SCHD CLBK RATE 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph68'><a href='#' onClick=\"DrawGraph('SCHDCLBKRATE2', '68'); return false;\">"._QXZ("SCHD CLBK RATE 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph69'><a href='#' onClick=\"DrawGraph('SCHDCLBKRATE3', '69'); return false;\">"._QXZ("SCHD CLBK RATE 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph70'><a href='#' onClick=\"DrawGraph('SCHDCLBKRATE4', '70'); return false;\">"._QXZ("SCHD CLBK RATE 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph71'><a href='#' onClick=\"DrawGraph('SCHDCLBKRATE5', '71'); return false;\">"._QXZ("SCHD CLBK RATE 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph72'><a href='#' onClick=\"DrawGraph('SCHDCLBKRATEALL', '72'); return false;\">"._QXZ("SCHD CLBK RATE LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph73'><a href='#' onClick=\"DrawGraph('COMPLTD1', '73'); return false;\">"._QXZ("COMPLTD 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph74'><a href='#' onClick=\"DrawGraph('COMPLTD2', '74'); return false;\">"._QXZ("COMPLTD 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph75'><a href='#' onClick=\"DrawGraph('COMPLTD3', '75'); return false;\">"._QXZ("COMPLTD 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph76'><a href='#' onClick=\"DrawGraph('COMPLTD4', '76'); return false;\">"._QXZ("COMPLTD 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph77'><a href='#' onClick=\"DrawGraph('COMPLTD5', '77'); return false;\">"._QXZ("COMPLTD 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph78'><a href='#' onClick=\"DrawGraph('COMPLTDALL', '78'); return false;\">"._QXZ("COMPLTD LIFE")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph79'><a href='#' onClick=\"DrawGraph('COMPLTDRATE1', '79'); return false;\">"._QXZ("COMPLTD RATE 1st PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph80'><a href='#' onClick=\"DrawGraph('COMPLTDRATE2', '80'); return false;\">"._QXZ("COMPLTD RATE 2nd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph81'><a href='#' onClick=\"DrawGraph('COMPLTDRATE3', '81'); return false;\">"._QXZ("COMPLTD RATE 3rd PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph82'><a href='#' onClick=\"DrawGraph('COMPLTDRATE4', '82'); return false;\">"._QXZ("COMPLTD RATE 4th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph83'><a href='#' onClick=\"DrawGraph('COMPLTDRATE5', '83'); return false;\">"._QXZ("COMPLTD RATE 5th PASS")."</a></th>
<th class='column_header grey_graph_cell' id='callstatsgraph84'><a href='#' onClick=\"DrawGraph('COMPLTDRATEALL', '84'); return false;\">"._QXZ("COMPLTD RATE LIFE")."</a></th>
";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("LIST ID SUMMARY")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("LISTS")."</th>";
$CONTACTS1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONTACTS 1st PASS")."</th></tr>";
$CONTACTS2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONTACTS 2nd PASS")."</th></tr>";
$CONTACTS3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONTACTS 3rd PASS")."</th></tr>";
$CONTACTS4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONTACTS 4th PASS")."</th></tr>";
$CONTACTS5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONTACTS 5th PASS")."</th></tr>";
$CONTACTSALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONTACTS LIFE")."</th></tr>";
$CNTRATE1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CNT RATE 1st PASS")."</th></tr>";
$CNTRATE2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CNT RATE 2nd PASS")."</th></tr>";
$CNTRATE3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CNT RATE 3rd PASS")."</th></tr>";
$CNTRATE4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CNT RATE 4th PASS")."</th></tr>";
$CNTRATE5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CNT RATE 5th PASS")."</th></tr>";
$CNTRATEALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CNT RATE LIFE")."</th></tr>";
$SALES1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES 1st PASS")."</th></tr>";
$SALES2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES 2nd PASS")."</th></tr>";
$SALES3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES 3rd PASS")."</th></tr>";
$SALES4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES 4th PASS")."</th></tr>";
$SALES5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES 5th PASS")."</th></tr>";
$SALESALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES LIFE")."</th></tr>";
$CONVRATE1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONV RATE 1st PASS")."</th></tr>";
$CONVRATE2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONV RATE 2nd PASS")."</th></tr>";
$CONVRATE3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONV RATE 3rd PASS")."</th></tr>";
$CONVRATE4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONV RATE 4th PASS")."</th></tr>";
$CONVRATE5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONV RATE 5th PASS")."</th></tr>";
$CONVRATEALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONV RATE LIFE")."</th></tr>";
$DNC1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC 1st PASS")."</th></tr>";
$DNC2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC 2nd PASS")."</th></tr>";
$DNC3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC 3rd PASS")."</th></tr>";
$DNC4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC 4th PASS")."</th></tr>";
$DNC5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC 5th PASS")."</th></tr>";
$DNCALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC LIFE")."</th></tr>";
$DNCRATE1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC RATE 1st PASS")."</th></tr>";
$DNCRATE2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC RATE 2nd PASS")."</th></tr>";
$DNCRATE3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC RATE 3rd PASS")."</th></tr>";
$DNCRATE4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC RATE 4th PASS")."</th></tr>";
$DNCRATE5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC RATE 5th PASS")."</th></tr>";
$DNCRATEALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC RATE LIFE")."</th></tr>";
$CUSTCNT1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CNT 1st PASS")."</th></tr>";
$CUSTCNT2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CNT 2nd PASS")."</th></tr>";
$CUSTCNT3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CNT 3rd PASS")."</th></tr>";
$CUSTCNT4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CNT 4th PASS")."</th></tr>";
$CUSTCNT5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CNT 5th PASS")."</th></tr>";
$CUSTCNTALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CNT LIFE")."</th></tr>";
$CUSTCNTRATE1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CUSTCNT RATE 1st PASS")."</th></tr>";
$CUSTCNTRATE2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CUSTCNT RATE 2nd PASS")."</th></tr>";
$CUSTCNTRATE3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CUSTCNT RATE 3rd PASS")."</th></tr>";
$CUSTCNTRATE4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CUSTCNT RATE 4th PASS")."</th></tr>";
$CUSTCNTRATE5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CUSTCNT RATE 5th PASS")."</th></tr>";
$CUSTCNTRATEALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST CUSTCNT RATE LIFE")."</th></tr>";
$UNWRK1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK 1st PASS")."</th></tr>";
$UNWRK2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK 2nd PASS")."</th></tr>";
$UNWRK3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK 3rd PASS")."</th></tr>";
$UNWRK4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK 4th PASS")."</th></tr>";
$UNWRK5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK 5th PASS")."</th></tr>";
$UNWRKALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK LIFE")."</th></tr>";
$UNWRKRATE1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK RATE 1st PASS")."</th></tr>";
$UNWRKRATE2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK RATE 2nd PASS")."</th></tr>";
$UNWRKRATE3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK RATE 3rd PASS")."</th></tr>";
$UNWRKRATE4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK RATE 4th PASS")."</th></tr>";
$UNWRKRATE5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK RATE 5th PASS")."</th></tr>";
$UNWRKRATEALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("UNWRK RATE LIFE")."</th></tr>";
$SCHDCLBK1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK 1st PASS")."</th></tr>";
$SCHDCLBK2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK 2nd PASS")."</th></tr>";
$SCHDCLBK3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK 3rd PASS")."</th></tr>";
$SCHDCLBK4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK 4th PASS")."</th></tr>";
$SCHDCLBK5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK 5th PASS")."</th></tr>";
$SCHDCLBKALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK LIFE")."</th></tr>";
$SCHDCLBKRATE1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK RATE 1st PASS")."</th></tr>";
$SCHDCLBKRATE2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK RATE 2nd PASS")."</th></tr>";
$SCHDCLBKRATE3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK RATE 3rd PASS")."</th></tr>";
$SCHDCLBKRATE4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK RATE 4th PASS")."</th></tr>";
$SCHDCLBKRATE5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK RATE 5th PASS")."</th></tr>";
$SCHDCLBKRATEALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SCHD CLBK RATE LIFE")."</th></tr>";
$COMPLTD1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD 1st PASS")."</th></tr>";
$COMPLTD2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD 2nd PASS")."</th></tr>";
$COMPLTD3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD 3rd PASS")."</th></tr>";
$COMPLTD4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD 4th PASS")."</th></tr>";
$COMPLTD5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD 5th PASS")."</th></tr>";
$COMPLTDALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD LIFE")."</th></tr>";
$COMPLTDRATE1_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD RATE 1st PASS")."</th></tr>";
$COMPLTDRATE2_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD RATE 2nd PASS")."</th></tr>";
$COMPLTDRATE3_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD RATE 3rd PASS")."</th></tr>";
$COMPLTDRATE4_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD RATE 4th PASS")."</th></tr>";
$COMPLTDRATE5_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD RATE 5th PASS")."</th></tr>";
$COMPLTDRATEALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("COMPLTD RATE LIFE")."</th></tr>";
$lists_id_str="";
$list_stmt="SELECT list_id from vicidial_lists where active IN('Y','N') $group_SQLand";
$list_rslt=mysql_to_mysqli($list_stmt, $link);
@@ -2125,294 +1949,165 @@ else
$totals2[83]=$MR_five_count_totS;
$totals2[84]=$MR_count_totS;
for ($d=0; $d<count($graph_stats2); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats2)) {$class=" last";} else {$class="";}
$CONTACTS1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='MathZDC(800*".$graph_stats2[$d][1].", $max_stats2[$d])' width='".round(MathZDC(800*$graph_stats2[$d][1], $max_stats2[1]))."' height='16' />".$graph_stats2[$d][1]."</td></tr>";
$CONTACTS2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][2], $max_stats2[2]))."' height='16' />".$graph_stats2[$d][2]."</td></tr>";
$CONTACTS3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][3], $max_stats2[3]))."' height='16' />".$graph_stats2[$d][3]."</td></tr>";
$CONTACTS4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][4], $max_stats2[4]))."' height='16' />".$graph_stats2[$d][4]."</td></tr>";
$CONTACTS5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][5], $max_stats2[5]))."' height='16' />".$graph_stats2[$d][5]."</td></tr>";
$CONTACTSALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][6], $max_stats2[6]))."' height='16' />".$graph_stats2[$d][6]."</td></tr>";
$CNTRATE1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][7], $max_stats2[7]))."' height='16' />".$graph_stats2[$d][7]."</td></tr>";
$CNTRATE2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][8], $max_stats2[8]))."' height='16' />".$graph_stats2[$d][8]."</td></tr>";
$CNTRATE3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][9], $max_stats2[9]))."' height='16' />".$graph_stats2[$d][9]."</td></tr>";
$CNTRATE4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][10], $max_stats2[10]))."' height='16' />".$graph_stats2[$d][10]."</td></tr>";
$CNTRATE5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][11], $max_stats2[11]))."' height='16' />".$graph_stats2[$d][11]."</td></tr>";
$CNTRATEALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][12], $max_stats2[12]))."' height='16' />".$graph_stats2[$d][12]."</td></tr>";
$SALES1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][13], $max_stats2[13]))."' height='16' />".$graph_stats2[$d][13]."</td></tr>";
$SALES2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][14], $max_stats2[14]))."' height='16' />".$graph_stats2[$d][14]."</td></tr>";
$SALES3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][15], $max_stats2[15]))."' height='16' />".$graph_stats2[$d][15]."</td></tr>";
$SALES4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][16], $max_stats2[16]))."' height='16' />".$graph_stats2[$d][16]."</td></tr>";
$SALES5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][17], $max_stats2[17]))."' height='16' />".$graph_stats2[$d][17]."</td></tr>";
$SALESALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][18], $max_stats2[18]))."' height='16' />".$graph_stats2[$d][18]."</td></tr>";
$CONVRATE1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][19], $max_stats2[19]))."' height='16' />".$graph_stats2[$d][19]."</td></tr>";
$CONVRATE2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][20], $max_stats2[20]))."' height='16' />".$graph_stats2[$d][20]."</td></tr>";
$CONVRATE3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][21], $max_stats2[21]))."' height='16' />".$graph_stats2[$d][21]."</td></tr>";
$CONVRATE4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][22], $max_stats2[22]))."' height='16' />".$graph_stats2[$d][22]."</td></tr>";
$CONVRATE5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][23], $max_stats2[23]))."' height='16' />".$graph_stats2[$d][23]."</td></tr>";
$CONVRATEALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][24], $max_stats2[24]))."' height='16' />".$graph_stats2[$d][24]."</td></tr>";
$DNC1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][25], $max_stats2[25]))."' height='16' />".$graph_stats2[$d][25]."</td></tr>";
$DNC2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][26], $max_stats2[26]))."' height='16' />".$graph_stats2[$d][26]."</td></tr>";
$DNC3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][27], $max_stats2[27]))."' height='16' />".$graph_stats2[$d][27]."</td></tr>";
$DNC4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][28], $max_stats2[28]))."' height='16' />".$graph_stats2[$d][28]."</td></tr>";
$DNC5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][29], $max_stats2[29]))."' height='16' />".$graph_stats2[$d][29]."</td></tr>";
$DNCALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][30], $max_stats2[30]))."' height='16' />".$graph_stats2[$d][30]."</td></tr>";
$DNCRATE1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][31], $max_stats2[31]))."' height='16' />".$graph_stats2[$d][31]."</td></tr>";
$DNCRATE2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][32], $max_stats2[32]))."' height='16' />".$graph_stats2[$d][32]."</td></tr>";
$DNCRATE3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][33], $max_stats2[33]))."' height='16' />".$graph_stats2[$d][33]."</td></tr>";
$DNCRATE4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][34], $max_stats2[34]))."' height='16' />".$graph_stats2[$d][34]."</td></tr>";
$DNCRATE5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][35], $max_stats2[35]))."' height='16' />".$graph_stats2[$d][35]."</td></tr>";
$DNCRATEALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][36], $max_stats2[36]))."' height='16' />".$graph_stats2[$d][36]."</td></tr>";
$CUSTCNT1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][37], $max_stats2[37]))."' height='16' />".$graph_stats2[$d][37]."</td></tr>";
$CUSTCNT2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][38], $max_stats2[38]))."' height='16' />".$graph_stats2[$d][38]."</td></tr>";
$CUSTCNT3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][39], $max_stats2[39]))."' height='16' />".$graph_stats2[$d][39]."</td></tr>";
$CUSTCNT4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][40], $max_stats2[40]))."' height='16' />".$graph_stats2[$d][40]."</td></tr>";
$CUSTCNT5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][41], $max_stats2[41]))."' height='16' />".$graph_stats2[$d][41]."</td></tr>";
$CUSTCNTALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][42], $max_stats2[42]))."' height='16' />".$graph_stats2[$d][42]."</td></tr>";
$CUSTCNTRATE1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][43], $max_stats2[43]))."' height='16' />".$graph_stats2[$d][43]."</td></tr>";
$CUSTCNTRATE2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][44], $max_stats2[44]))."' height='16' />".$graph_stats2[$d][44]."</td></tr>";
$CUSTCNTRATE3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][45], $max_stats2[45]))."' height='16' />".$graph_stats2[$d][45]."</td></tr>";
$CUSTCNTRATE4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][46], $max_stats2[46]))."' height='16' />".$graph_stats2[$d][46]."</td></tr>";
$CUSTCNTRATE5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][47], $max_stats2[47]))."' height='16' />".$graph_stats2[$d][47]."</td></tr>";
$CUSTCNTRATEALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][48], $max_stats2[48]))."' height='16' />".$graph_stats2[$d][48]."</td></tr>";
$UNWRK1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][49], $max_stats2[49]))."' height='16' />".$graph_stats2[$d][49]."</td></tr>";
$UNWRK2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][50], $max_stats2[50]))."' height='16' />".$graph_stats2[$d][50]."</td></tr>";
$UNWRK3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][51], $max_stats2[51]))."' height='16' />".$graph_stats2[$d][51]."</td></tr>";
$UNWRK4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][52], $max_stats2[52]))."' height='16' />".$graph_stats2[$d][52]."</td></tr>";
$UNWRK5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][53], $max_stats2[53]))."' height='16' />".$graph_stats2[$d][53]."</td></tr>";
$UNWRKALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][54], $max_stats2[54]))."' height='16' />".$graph_stats2[$d][54]."</td></tr>";
$UNWRKRATE1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][55], $max_stats2[55]))."' height='16' />".$graph_stats2[$d][55]."</td></tr>";
$UNWRKRATE2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][56], $max_stats2[56]))."' height='16' />".$graph_stats2[$d][56]."</td></tr>";
$UNWRKRATE3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][57], $max_stats2[57]))."' height='16' />".$graph_stats2[$d][57]."</td></tr>";
$UNWRKRATE4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][58], $max_stats2[58]))."' height='16' />".$graph_stats2[$d][58]."</td></tr>";
$UNWRKRATE5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][59], $max_stats2[59]))."' height='16' />".$graph_stats2[$d][59]."</td></tr>";
$UNWRKRATEALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][60], $max_stats2[60]))."' height='16' />".$graph_stats2[$d][60]."</td></tr>";
$SCHDCLBK1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][61], $max_stats2[61]))."' height='16' />".$graph_stats2[$d][61]."</td></tr>";
$SCHDCLBK2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][62], $max_stats2[62]))."' height='16' />".$graph_stats2[$d][62]."</td></tr>";
$SCHDCLBK3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][63], $max_stats2[63]))."' height='16' />".$graph_stats2[$d][63]."</td></tr>";
$SCHDCLBK4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][64], $max_stats2[64]))."' height='16' />".$graph_stats2[$d][64]."</td></tr>";
$SCHDCLBK5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][65], $max_stats2[65]))."' height='16' />".$graph_stats2[$d][65]."</td></tr>";
$SCHDCLBKALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][66], $max_stats2[66]))."' height='16' />".$graph_stats2[$d][66]."</td></tr>";
$SCHDCLBKRATE1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][67], $max_stats2[67]))."' height='16' />".$graph_stats2[$d][67]."</td></tr>";
$SCHDCLBKRATE2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][68], $max_stats2[68]))."' height='16' />".$graph_stats2[$d][68]."</td></tr>";
$SCHDCLBKRATE3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][69], $max_stats2[69]))."' height='16' />".$graph_stats2[$d][69]."</td></tr>";
$SCHDCLBKRATE4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][70], $max_stats2[70]))."' height='16' />".$graph_stats2[$d][70]."</td></tr>";
$SCHDCLBKRATE5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][71], $max_stats2[71]))."' height='16' />".$graph_stats2[$d][71]."</td></tr>";
$SCHDCLBKRATEALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][72], $max_stats2[72]))."' height='16' />".$graph_stats2[$d][72]."</td></tr>";
$COMPLTD1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][73], $max_stats2[73]))."' height='16' />".$graph_stats2[$d][73]."</td></tr>";
$COMPLTD2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][74], $max_stats2[74]))."' height='16' />".$graph_stats2[$d][74]."</td></tr>";
$COMPLTD3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][75], $max_stats2[75]))."' height='16' />".$graph_stats2[$d][75]."</td></tr>";
$COMPLTD4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][76], $max_stats2[76]))."' height='16' />".$graph_stats2[$d][76]."</td></tr>";
$COMPLTD5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][77], $max_stats2[77]))."' height='16' />".$graph_stats2[$d][77]."</td></tr>";
$COMPLTDALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][78], $max_stats2[78]))."' height='16' />".$graph_stats2[$d][78]."</td></tr>";
$COMPLTDRATE1_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][79], $max_stats2[79]))."' height='16' />".$graph_stats2[$d][79]."</td></tr>";
$COMPLTDRATE2_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][80], $max_stats2[80]))."' height='16' />".$graph_stats2[$d][80]."</td></tr>";
$COMPLTDRATE3_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][81], $max_stats2[81]))."' height='16' />".$graph_stats2[$d][81]."</td></tr>";
$COMPLTDRATE4_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][82], $max_stats2[82]))."' height='16' />".$graph_stats2[$d][82]."</td></tr>";
$COMPLTDRATE5_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][83], $max_stats2[83]))."' height='16' />".$graph_stats2[$d][83]."</td></tr>";
$COMPLTDRATEALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats2[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(800*$graph_stats2[$d][84], $max_stats2[84]))."' height='16' />".$graph_stats2[$d][84]."</td></tr>";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("LIS_CONTACTS1data|1|CONTACTS 1st PASS|integer|", "LIS_CONTACTS2data|2|CONTACTS 2nd PASS|integer|", "LIS_CONTACTS3data|3|CONTACTS 3rd PASS|integer|", "LIS_CONTACTS4data|4|CONTACTS 4th PASS|integer|", "LIS_CONTACTS5data|5|CONTACTS 5th PASS|integer|", "LIS_CONTACTSLIFEdata|6|CONTACTS LIFE|integer|", "LIS_CNTRATE1data|7|CNT RATE 1st PASS|decimal|", "LIS_CNTRATE2data|8|CNT RATE 2nd PASS|decimal|", "LIS_CNTRATE3data|9|CNT RATE 3rd PASS|decimal|", "LIS_CNTRATE4data|10|CNT RATE 4th PASS|decimal|", "LIS_CNTRATE5data|11|CNT RATE 5th PASS|decimal|", "LIS_CNTRATELIFEdata|12|CNT RATE LIFE|decimal|", "LIS_SALES1data|13|SALES 1st PASS|integer|", "LIS_SALES2data|14|SALES 2nd PASS|integer|", "LIS_SALES3data|15|SALES 3rd PASS|integer|", "LIS_SALES4data|16|SALES 4th PASS|integer|", "LIS_SALES5data|17|SALES 5th PASS|integer|", "LIS_SALESLIFEdata|18|SALES LIFE|integer|", "LIS_CONVRATE1data|19|CONV RATE 1st PASS|decimal|", "LIS_CONVRATE2data|20|CONV RATE 2nd PASS|decimal|", "LIS_CONVRATE3data|21|CONV RATE 3rd PASS|decimal|", "LIS_CONVRATE4data|22|CONV RATE 4th PASS|decimal|", "LIS_CONVRATE5data|23|CONV RATE 5th PASS|decimal|", "LIS_CONVLIFE1data|24|CONV RATE LIFE|decimal|", "LIS_DNC1data|25|DNC 1st PASS|integer|", "LIS_DNC2data|26|DNC 2nd PASS|integer|", "LIS_DNC3data|27|DNC 3rd PASS|integer|", "LIS_DNC4data|28|DNC 4th PASS|integer|", "LIS_DNC5data|29|DNC 5th PASS|integer|", "LIS_DNCLIFEdata|30|DNC LIFE|integer|", "LIS_DNCRATE1data|31|DNC RATE 1st PASS|decimal|", "LIS_DNCRATE2data|32|DNC RATE 2nd PASS|decimal|", "LIS_DNCRATE3data|33|DNC RATE 3rd PASS|decimal|", "LIS_DNCRATE4data|34|DNC RATE 4th PASS|decimal|", "LIS_DNCRATE5data|35|DNC RATE 5th PASS|decimal|", "LIS_DNCRATELIFEdata|36|DNC RATE LIFE|decimal|", "LIS_CUSTCNT1data|37|CUST CNT 1st PASS|integer|", "LIS_CUSTCNT2data|38|CUST CNT 2nd PASS|integer|", "LIS_CUSTCNT3data|39|CUST CNT 3rd PASS|integer|", "LIS_CUSTCNT4data|40|CUST CNT 4th PASS|integer|", "LIS_CUSTCNT5data|41|CUST CNT 5th PASS|integer|", "LIS_CUSTCNTLIFEdata|42|CUST CNT LIFE|integer|", "LIS_CUSCNTRATE1data|43|CUST CUSTCNT RATE 1st PASS|decimal|", "LIS_CUSCNTRATE2data|44|CUST CUSTCNT RATE 2nd PASS|decimal|", "LIS_CUSCNTRATE3data|45|CUST CUSTCNT RATE 3rd PASS|decimal|", "LIS_CUSCNTRATE4data|46|CUST CUSTCNT RATE 4th PASS|decimal|", "LIS_CUSCNTRATE5data|47|CUST CUSTCNT RATE 5th PASS|decimal|", "LIS_CUSCNTRATELIFEdata|48|CUST CUSTCNT RATE LIFE|decimal|", "LIS_UNWRK1data|49|UNWRK 1st PASS|integer|", "LIS_UNWRK2data|50|UNWRK 2nd PASS|integer|", "LIS_UNWRK3data|51|UNWRK 3rd PASS|integer|", "LIS_UNWRK4data|52|UNWRK 4th PASS|integer|", "LIS_UNWRK5data|53|UNWRK 5th PASS|integer|", "LIS_UNWRKLIFEdata|54|UNWRK LIFE|integer|", "LIS_UNWRKRATE1data|55|UNWRK RATE 1st PASS|decimal|", "LIS_UNWRKRATE2data|56|UNWRK RATE 2nd PASS|decimal|", "LIS_UNWRKRATE3data|57|UNWRK RATE 3rd PASS|decimal|", "LIS_UNWRKRATE4data|58|UNWRK RATE 4th PASS|decimal|", "LIS_UNWRKRATE5data|59|UNWRK RATE 5th PASS|decimal|", "LIS_UNWRKRATELIFEdata|60|UNWRK RATE LIFE|decimal|", "LIS_SCHDCLBK1data|61|SCHD CLBK 1st PASS|integer|", "LIS_SCHDCLBK2data|62|SCHD CLBK 2nd PASS|integer|", "LIS_SCHDCLBK3data|63|SCHD CLBK 3rd PASS|integer|", "LIS_SCHDCLBK4data|64|SCHD CLBK 4th PASS|integer|", "LIS_SCHDCLBK5data|65|SCHD CLBK 5th PASS|integer|", "LIS_SCHDCLBKLIFEdata|66|SCHD CLBK LIFE|integer|", "LIS_SCHDCLBKRATE1data|67|SCHD CLBK RATE 1st PASS|decimal|", "LIS_SCHDCLBKRATE2data|68|SCHD CLBK RATE 2nd PASS|decimal|", "LIS_SCHDCLBKRATE3data|69|SCHD CLBK RATE 3rd PASS|decimal|", "LIS_SCHDCLBKRATE4data|70|SCHD CLBK RATE 4th PASS|decimal|", "LIS_SCHDCLBKRATE5data|71|SCHD CLBK RATE 5th PASS|decimal|", "LIS_SCHDCLBKRATELIFEdata|72|SCHD CLBK RATE LIFE|decimal|", "LIS_COMPLTD1data|73|COMPLTD 1st PASS|integer|", "LIS_COMPLTD2data|74|COMPLTD 2nd PASS|integer|", "LIS_COMPLTD3data|75|COMPLTD 3rd PASS|integer|", "LIS_COMPLTD4data|76|COMPLTD 4th PASS|integer|", "LIS_COMPLTD5data|77|COMPLTD 5th PASS|integer|", "LIS_COMPLTDLIFEdata|78|COMPLTD LIFE|integer|", "LIS_COMPLTDRATE1data|79|COMPLTD RATE 1st PASS|decimal|", "LIS_COMPLTDRATE2data|80|COMPLTD RATE 2nd PASS|decimal|", "LIS_COMPLTDRATE3data|81|COMPLTD RATE 3rd PASS|decimal|", "LIS_COMPLTDRATE4data|82|COMPLTD RATE 4th PASS|decimal|", "LIS_COMPLTDRATE5data|83|COMPLTD RATE 5th PASS|decimal|", "LIS_COMPLTDRATELIFEdata|84|COMPLTD RATE LIFE|decimal|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats2); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats2[$d][0])."\",";
$data.="\"".$graph_stats2[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats2[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$CONTACTS1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[1]."</th></tr>";
$CONTACTS2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[2]."</th></tr>";
$CONTACTS3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[3]."</th></tr>";
$CONTACTS4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[4]."</th></tr>";
$CONTACTS5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[5]."</th></tr>";
$CONTACTSALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[6]."</th></tr>";
$CNTRATE1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[7]."</th></tr>";
$CNTRATE2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[8]."</th></tr>";
$CNTRATE3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[9]."</th></tr>";
$CNTRATE4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[10]."</th></tr>";
$CNTRATE5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[11]."</th></tr>";
$CNTRATEALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[12]."</th></tr>";
$SALES1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[13]."</th></tr>";
$SALES2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[14]."</th></tr>";
$SALES3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[15]."</th></tr>";
$SALES4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[16]."</th></tr>";
$SALES5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[17]."</th></tr>";
$SALESALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[18]."</th></tr>";
$CONVRATE1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[19]."</th></tr>";
$CONVRATE2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[20]."</th></tr>";
$CONVRATE3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[21]."</th></tr>";
$CONVRATE4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[22]."</th></tr>";
$CONVRATE5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[23]."</th></tr>";
$CONVRATEALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[24]."</th></tr>";
$DNC1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[25]."</th></tr>";
$DNC2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[26]."</th></tr>";
$DNC3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[27]."</th></tr>";
$DNC4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[28]."</th></tr>";
$DNC5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[29]."</th></tr>";
$DNCALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[30]."</th></tr>";
$DNCRATE1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[31]."</th></tr>";
$DNCRATE2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[32]."</th></tr>";
$DNCRATE3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[33]."</th></tr>";
$DNCRATE4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[34]."</th></tr>";
$DNCRATE5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[35]."</th></tr>";
$DNCRATEALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[36]."</th></tr>";
$CUSTCNT1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[37]."</th></tr>";
$CUSTCNT2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[38]."</th></tr>";
$CUSTCNT3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[39]."</th></tr>";
$CUSTCNT4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[40]."</th></tr>";
$CUSTCNT5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[41]."</th></tr>";
$CUSTCNTALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[42]."</th></tr>";
$CUSTCNTRATE1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[43]."</th></tr>";
$CUSTCNTRATE2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[44]."</th></tr>";
$CUSTCNTRATE3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[45]."</th></tr>";
$CUSTCNTRATE4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[46]."</th></tr>";
$CUSTCNTRATE5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[47]."</th></tr>";
$CUSTCNTRATEALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[48]."</th></tr>";
$UNWRK1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[49]."</th></tr>";
$UNWRK2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[50]."</th></tr>";
$UNWRK3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[51]."</th></tr>";
$UNWRK4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[52]."</th></tr>";
$UNWRK5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[53]."</th></tr>";
$UNWRKALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[54]."</th></tr>";
$UNWRKRATE1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[55]."</th></tr>";
$UNWRKRATE2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[56]."</th></tr>";
$UNWRKRATE3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[57]."</th></tr>";
$UNWRKRATE4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[58]."</th></tr>";
$UNWRKRATE5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[59]."</th></tr>";
$UNWRKRATEALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[60]."</th></tr>";
$SCHDCLBK1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[61]."</th></tr>";
$SCHDCLBK2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[62]."</th></tr>";
$SCHDCLBK3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[63]."</th></tr>";
$SCHDCLBK4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[64]."</th></tr>";
$SCHDCLBK5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[65]."</th></tr>";
$SCHDCLBKALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[66]."</th></tr>";
$SCHDCLBKRATE1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[67]."</th></tr>";
$SCHDCLBKRATE2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[68]."</th></tr>";
$SCHDCLBKRATE3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[69]."</th></tr>";
$SCHDCLBKRATE4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[70]."</th></tr>";
$SCHDCLBKRATE5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[71]."</th></tr>";
$SCHDCLBKRATEALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[72]."</th></tr>";
$COMPLTD1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[73]."</th></tr>";
$COMPLTD2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[74]."</th></tr>";
$COMPLTD3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[75]."</th></tr>";
$COMPLTD4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[76]."</th></tr>";
$COMPLTD5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[77]."</th></tr>";
$COMPLTDALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[78]."</th></tr>";
$COMPLTDRATE1_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[79]."</th></tr>";
$COMPLTDRATE2_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[80]."</th></tr>";
$COMPLTDRATE3_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[81]."</th></tr>";
$COMPLTDRATE4_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[82]."</th></tr>";
$COMPLTDRATE5_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[83]."</th></tr>";
$COMPLTDRATEALL_graph.=" <tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".$totals2[84]."</th></tr>";
$graph_count=count($graph_array);
$graph_title=_QXZ("LIST ID SUMMARY");
include("graphcanvas.inc");
$GRAPH2.=$graphCanvas;
#########
$graph_array=array("ALRdata|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$JS_onload.="\tDrawGraph('CONTACTS1', '1');\n";
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_text.=" var graph_CONTACTS1=\"$CONTACTS1_graph\";\n";
$JS_text.=" var graph_CONTACTS2=\"$CONTACTS2_graph\";\n";
$JS_text.=" var graph_CONTACTS3=\"$CONTACTS3_graph\";\n";
$JS_text.=" var graph_CONTACTS4=\"$CONTACTS4_graph\";\n";
$JS_text.=" var graph_CONTACTS5=\"$CONTACTS5_graph\";\n";
$JS_text.=" var graph_CONTACTSALL=\"$CONTACTSALL_graph\";\n";
$JS_text.=" var graph_CNTRATE1=\"$CNTRATE1_graph\";\n";
$JS_text.=" var graph_CNTRATE2=\"$CNTRATE2_graph\";\n";
$JS_text.=" var graph_CNTRATE3=\"$CNTRATE3_graph\";\n";
$JS_text.=" var graph_CNTRATE4=\"$CNTRATE4_graph\";\n";
$JS_text.=" var graph_CNTRATE5=\"$CNTRATE5_graph\";\n";
$JS_text.=" var graph_CNTRATEALL=\"$CNTRATEALL_graph\";\n";
$JS_text.=" var graph_SALES1=\"$SALES1_graph\";\n";
$JS_text.=" var graph_SALES2=\"$SALES2_graph\";\n";
$JS_text.=" var graph_SALES3=\"$SALES3_graph\";\n";
$JS_text.=" var graph_SALES4=\"$SALES4_graph\";\n";
$JS_text.=" var graph_SALES5=\"$SALES5_graph\";\n";
$JS_text.=" var graph_SALESALL=\"$SALESALL_graph\";\n";
$JS_text.=" var graph_CONVRATE1=\"$CONVRATE1_graph\";\n";
$JS_text.=" var graph_CONVRATE2=\"$CONVRATE2_graph\";\n";
$JS_text.=" var graph_CONVRATE3=\"$CONVRATE3_graph\";\n";
$JS_text.=" var graph_CONVRATE4=\"$CONVRATE4_graph\";\n";
$JS_text.=" var graph_CONVRATE5=\"$CONVRATE5_graph\";\n";
$JS_text.=" var graph_CONVRATEALL=\"$CONVRATEALL_graph\";\n";
$JS_text.=" var graph_DNC1=\"$DNC1_graph\";\n";
$JS_text.=" var graph_DNC2=\"$DNC2_graph\";\n";
$JS_text.=" var graph_DNC3=\"$DNC3_graph\";\n";
$JS_text.=" var graph_DNC4=\"$DNC4_graph\";\n";
$JS_text.=" var graph_DNC5=\"$DNC5_graph\";\n";
$JS_text.=" var graph_DNCALL=\"$DNCALL_graph\";\n";
$JS_text.=" var graph_DNCRATE1=\"$DNCRATE1_graph\";\n";
$JS_text.=" var graph_DNCRATE2=\"$DNCRATE2_graph\";\n";
$JS_text.=" var graph_DNCRATE3=\"$DNCRATE3_graph\";\n";
$JS_text.=" var graph_DNCRATE4=\"$DNCRATE4_graph\";\n";
$JS_text.=" var graph_DNCRATE5=\"$DNCRATE5_graph\";\n";
$JS_text.=" var graph_DNCRATEALL=\"$DNCRATEALL_graph\";\n";
$JS_text.=" var graph_CUSTCNT1=\"$CUSTCNT1_graph\";\n";
$JS_text.=" var graph_CUSTCNT2=\"$CUSTCNT2_graph\";\n";
$JS_text.=" var graph_CUSTCNT3=\"$CUSTCNT3_graph\";\n";
$JS_text.=" var graph_CUSTCNT4=\"$CUSTCNT4_graph\";\n";
$JS_text.=" var graph_CUSTCNT5=\"$CUSTCNT5_graph\";\n";
$JS_text.=" var graph_CUSTCNTALL=\"$CUSTCNTALL_graph\";\n";
$JS_text.=" var graph_CUSTCNTRATE1=\"$CUSTCNTRATE1_graph\";\n";
$JS_text.=" var graph_CUSTCNTRATE2=\"$CUSTCNTRATE2_graph\";\n";
$JS_text.=" var graph_CUSTCNTRATE3=\"$CUSTCNTRATE3_graph\";\n";
$JS_text.=" var graph_CUSTCNTRATE4=\"$CUSTCNTRATE4_graph\";\n";
$JS_text.=" var graph_CUSTCNTRATE5=\"$CUSTCNTRATE5_graph\";\n";
$JS_text.=" var graph_CUSTCNTRATEALL=\"$CUSTCNTRATEALL_graph\";\n";
$JS_text.=" var graph_UNWRK1=\"$UNWRK1_graph\";\n";
$JS_text.=" var graph_UNWRK2=\"$UNWRK2_graph\";\n";
$JS_text.=" var graph_UNWRK3=\"$UNWRK3_graph\";\n";
$JS_text.=" var graph_UNWRK4=\"$UNWRK4_graph\";\n";
$JS_text.=" var graph_UNWRK5=\"$UNWRK5_graph\";\n";
$JS_text.=" var graph_UNWRKALL=\"$UNWRKALL_graph\";\n";
$JS_text.=" var graph_UNWRKRATE1=\"$UNWRKRATE1_graph\";\n";
$JS_text.=" var graph_UNWRKRATE2=\"$UNWRKRATE2_graph\";\n";
$JS_text.=" var graph_UNWRKRATE3=\"$UNWRKRATE3_graph\";\n";
$JS_text.=" var graph_UNWRKRATE4=\"$UNWRKRATE4_graph\";\n";
$JS_text.=" var graph_UNWRKRATE5=\"$UNWRKRATE5_graph\";\n";
$JS_text.=" var graph_UNWRKRATEALL=\"$UNWRKRATEALL_graph\";\n";
$JS_text.=" var graph_SCHDCLBK1=\"$SCHDCLBK1_graph\";\n";
$JS_text.=" var graph_SCHDCLBK2=\"$SCHDCLBK2_graph\";\n";
$JS_text.=" var graph_SCHDCLBK3=\"$SCHDCLBK3_graph\";\n";
$JS_text.=" var graph_SCHDCLBK4=\"$SCHDCLBK4_graph\";\n";
$JS_text.=" var graph_SCHDCLBK5=\"$SCHDCLBK5_graph\";\n";
$JS_text.=" var graph_SCHDCLBKALL=\"$SCHDCLBKALL_graph\";\n";
$JS_text.=" var graph_SCHDCLBKRATE1=\"$SCHDCLBKRATE1_graph\";\n";
$JS_text.=" var graph_SCHDCLBKRATE2=\"$SCHDCLBKRATE2_graph\";\n";
$JS_text.=" var graph_SCHDCLBKRATE3=\"$SCHDCLBKRATE3_graph\";\n";
$JS_text.=" var graph_SCHDCLBKRATE4=\"$SCHDCLBKRATE4_graph\";\n";
$JS_text.=" var graph_SCHDCLBKRATE5=\"$SCHDCLBKRATE5_graph\";\n";
$JS_text.=" var graph_SCHDCLBKRATEALL=\"$SCHDCLBKRATEALL_graph\";\n";
$JS_text.=" var graph_COMPLTD1=\"$COMPLTD1_graph\";\n";
$JS_text.=" var graph_COMPLTD2=\"$COMPLTD2_graph\";\n";
$JS_text.=" var graph_COMPLTD3=\"$COMPLTD3_graph\";\n";
$JS_text.=" var graph_COMPLTD4=\"$COMPLTD4_graph\";\n";
$JS_text.=" var graph_COMPLTD5=\"$COMPLTD5_graph\";\n";
$JS_text.=" var graph_COMPLTDALL=\"$COMPLTDALL_graph\";\n";
$JS_text.=" var graph_COMPLTDRATE1=\"$COMPLTDRATE1_graph\";\n";
$JS_text.=" var graph_COMPLTDRATE2=\"$COMPLTDRATE2_graph\";\n";
$JS_text.=" var graph_COMPLTDRATE3=\"$COMPLTDRATE3_graph\";\n";
$JS_text.=" var graph_COMPLTDRATE4=\"$COMPLTDRATE4_graph\";\n";
$JS_text.=" var graph_COMPLTDRATE5=\"$COMPLTDRATE5_graph\";\n";
$JS_text.=" var graph_COMPLTDRATEALL=\"$COMPLTDRATEALL_graph\";\n";
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.=" for (var i=1; i<=84; i++) {\n";
$JS_text.=" var cellID=\"callstatsgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"callstatsgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.="\n";
$JS_text.=" var graph_to_display=eval(\"graph_\"+graph);\n";
$JS_text.=" document.getElementById('call_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$GRAPH3="<tr><td colspan='84' class='graph_span_cell'><span id='call_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][1]."\",";
$data.="\"".$graph_stats[$d][0]."\",";
$current_graph_total+=$graph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td$class\">".$graph_stats[$d][1]."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$graph_stats[$d][0], $max_calls))."\" height=\"16\" />".$graph_stats[$d][0]."</td>\n";
$GRAPH.=" </tr>\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL").":</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">".trim($TOTALleads)."</th>\n";
$GRAPH.=" </tr>\n";
$GRAPH.="</table><PRE>\n";
$GRAPH.="<BR><BR><a name='callsgraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$graph_count=count($graph_array);
$graph_title=_QXZ("LIST ID SUMMARY 1");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
if ($report_display_type=="HTML")
@@ -2462,9 +2157,9 @@ else
$JS_text.="</script>\n";
echo $HEADER;
echo $JS_text;
require("admin_header.php");
echo $MAIN;
echo $JS_text;
}
@@ -26,6 +26,7 @@
# 150516-1305 - Fixed Javascript element problem, Issue #857
# 151125-1632 - Added search archive option
# 160227-1136 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -74,6 +75,7 @@ if (strlen($include_rollover)<2) {$include_rollover='NO';}
$report_name = 'Outbound Summary Interval Report';
$db_source = 'M';
$JS_text="<script language='Javascript'>\n";
$JS_text.="function openNewWindow(url)\n";
$JS_text.=" {\n";
@@ -520,6 +522,9 @@ $HEADER.=" </STYLE>\n";
$HEADER.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HEADER.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HEADER.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HEADER.="<script src='chart/Chart.js'></script>\n";
$HEADER.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HEADER.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HEADER.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -783,19 +788,7 @@ else
$max_login_time=1;
$max_pause_time=1;
$GRAPH="<BR><BR><a name='campbreakdown'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='11%' class='grey_graph_cell' id='campbreakdown1'><a href='#' onClick=\"DrawMultiCampaignGraph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown2'><a href='#' onClick=\"DrawMultiCampaignGraph('SYSTEMRELEASE', '2'); return false;\">"._QXZ("SYSTEM RELEASE CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown3'><a href='#' onClick=\"DrawMultiCampaignGraph('AGENTRELEASE', '3'); return false;\">"._QXZ("AGENT RELEASE CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown4'><a href='#' onClick=\"DrawMultiCampaignGraph('SALES', '4'); return false;\">"._QXZ("SALE CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown5'><a href='#' onClick=\"DrawMultiCampaignGraph('DNCS', '5'); return false;\">"._QXZ("DNC CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown6'><a href='#' onClick=\"DrawMultiCampaignGraph('NAS', '6'); return false;\">"._QXZ("NO ANSWER PERCENT")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown7'><a href='#' onClick=\"DrawMultiCampaignGraph('DROPS', '7'); return false;\">"._QXZ("DROP PERCENT")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown8'><a href='#' onClick=\"DrawMultiCampaignGraph('LOGINTIME', '8'); return false;\">"._QXZ("AGENT LOGIN TIME")."</a></th><th width='12%' class='grey_graph_cell' id='campbreakdown9'><a href='#' onClick=\"DrawMultiCampaignGraph('PAUSETIME', '9'); return false;\">"._QXZ("AGENT PAUSE TIME")."</a></th></tr>";
$GRAPH.="<tr><td colspan='9' class='graph_span_cell'><span id='multi_campaign_breakdown'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>"._QXZ("MULTI-CAMPAIGN BREAKDOWN")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("CAMPAIGNS")."</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL CALLS")."</th></tr>";
$SYSTEMRELEASE_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SYSTEM RELEASE CALLS")."</th></tr>";
$AGENTRELEASE_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AGENT RELEASE CALLS")."</th></tr>";
$SALES_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALE CALLS")."</th></tr>";
$DNCS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC CALLS")."</th></tr>";
$NAS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("NO ANSWER PERCENT")."</th></tr>";
$DROPS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DROP PERCENT")."</th></tr>";
$LOGINTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AGENT LOGIN TIME (H:M:S)")."</th></tr>";
$PAUSETIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AGENT PAUSE TIME (H:M:S)")."</th></tr>";
###########################
$i=0;
@@ -1290,31 +1283,6 @@ else
$CSV_subreports.="\""._QXZ("INTERVAL")."\",\""._QXZ("TOTAL CALLS")."\",\""._QXZ("SYSTEM RELEASE CALLS")."\",\""._QXZ("AGENT RELEASE CALLS")."\",\""._QXZ("SALE CALLS")."\",\""._QXZ("DNC CALLS")."\",\""._QXZ("NO ANSWER PERCENT")."\",\""._QXZ("DROP PERCENT")."\",\""._QXZ("AGENT LOGIN TIME (H:M:S)")."\",\""._QXZ("AGENT PAUSE TIME(H:M:S)")."\"\n";
######## GRAPHING #########
$SUBmax_calls=1;
$SUBmax_system_release=1;
$SUBmax_agent_release=1;
$SUBmax_sales=1;
$SUBmax_dncs=1;
$SUBmax_nas=1;
$SUBmax_drops=1;
$SUBmax_login_time=1;
$SUBmax_pause_time=1;
$SUBgraph_stats="";
$SUBrpt_campaign=$group[$i];
$SUBGRAPH="<BR><BR><a name='campbreakdown".$SUBrpt_campaign."'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$SUBGRAPH.="<tr><th width='11%' class='grey_graph_cell' id='campbreakdown".$SUBrpt_campaign."1'><a href='#' onClick=\"Draw".$SUBrpt_campaign."CampaignGraph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown".$SUBrpt_campaign."2'><a href='#' onClick=\"Draw".$SUBrpt_campaign."CampaignGraph('SYSTEMRELEASE', '2'); return false;\">"._QXZ("SYSTEM RELEASE CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown".$SUBrpt_campaign."3'><a href='#' onClick=\"Draw".$SUBrpt_campaign."CampaignGraph('AGENTRELEASE', '3'); return false;\">"._QXZ("AGENT RELEASE CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown".$SUBrpt_campaign."4'><a href='#' onClick=\"Draw".$SUBrpt_campaign."CampaignGraph('SALES', '4'); return false;\">"._QXZ("SALE CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown".$SUBrpt_campaign."5'><a href='#' onClick=\"Draw".$SUBrpt_campaign."CampaignGraph('DNCS', '5'); return false;\">"._QXZ("DNC CALLS")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown".$SUBrpt_campaign."6'><a href='#' onClick=\"Draw".$SUBrpt_campaign."CampaignGraph('NAS', '6'); return false;\">"._QXZ("NO ANSWER PERCENT")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown".$SUBrpt_campaign."7'><a href='#' onClick=\"Draw".$SUBrpt_campaign."CampaignGraph('DROPS', '7'); return false;\">"._QXZ("DROP PERCENT")."</a></th><th width='11%' class='grey_graph_cell' id='campbreakdown".$SUBrpt_campaign."8'><a href='#' onClick=\"Draw".$SUBrpt_campaign."CampaignGraph('LOGINTIME', '8'); return false;\">"._QXZ("AGENT LOGIN TIME")."</a></th><th width='12%' class='grey_graph_cell' id='campbreakdown".$SUBrpt_campaign."9'><a href='#' onClick=\"Draw".$SUBrpt_campaign."CampaignGraph('PAUSETIME', '9'); return false;\">"._QXZ("AGENT PAUSE TIME")."</a></th></tr>";
$SUBGRAPH.="<tr><td colspan='9' class='graph_span_cell'><span id='campaign_breakdown_".$SUBrpt_campaign."'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$SUBgraph_header="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>$SUBrpt_campaign - $group_cname[$i] "._QXZ("INTERVAL BREAKDOWN").":</caption><tr><th class='thgraph' scope='col'>"._QXZ("INTERVAL")."</th>";
$SUBCALLS_graph=$SUBgraph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL CALLS")."</th></tr>";
$SUBSYSTEMRELEASE_graph=$SUBgraph_header."<th class='thgraph' scope='col'>"._QXZ("SYSTEM RELEASE CALLS")."</th></tr>";
$SUBAGENTRELEASE_graph=$SUBgraph_header."<th class='thgraph' scope='col'>"._QXZ("AGENT RELEASE CALLS")."</th></tr>";
$SUBSALES_graph=$SUBgraph_header."<th class='thgraph' scope='col'>"._QXZ("SALE CALLS")."</th></tr>";
$SUBDNCS_graph=$SUBgraph_header."<th class='thgraph' scope='col'>"._QXZ("DNC CALLS")."</th></tr>";
$SUBNAS_graph=$SUBgraph_header."<th class='thgraph' scope='col'>"._QXZ("NO ANSWER PERCENT")."</th></tr>";
$SUBDROPS_graph=$SUBgraph_header."<th class='thgraph' scope='col'>"._QXZ("DROP PERCENT")."</th></tr>";
$SUBLOGINTIME_graph=$SUBgraph_header."<th class='thgraph' scope='col'>"._QXZ("AGENT LOGIN TIME (H:M:S)")."</th></tr>";
$SUBPAUSETIME_graph=$SUBgraph_header."<th class='thgraph' scope='col'>"._QXZ("AGENT PAUSE TIME (H:M:S)")."</th></tr>";
###########################
$h=0; $z=0;
@@ -1456,53 +1424,90 @@ else
$SUB_ASCII_text .= "| "._QXZ("TOTALS",19)." | $hTOTcalls_count | $hTOTsystem_count | $hTOTagent_count | $hTOTptp_count | $hTOTrtp_count | $hTOTna_percent%| $hTOTdrop_percent%| $hTOTagent_sec | $hTOTpause_sec |\n";
$SUB_ASCII_text .= "+---------------------+--------+--------+--------+--------+--------+--------+--------+------------+------------+\n";
$CSV_subreports.="\""._QXZ("TOTALS")."\",\"$hTOTcalls_count\",\"$hTOTsystem_count\",\"$hTOTagent_count\",\"$hTOTptp_count\",\"$hTOTrtp_count\",\"$hTOTna_percent%\",\"$hTOTdrop_percent%\",\"$hTOTagent_sec\",\"$hTOTpause_sec\"\n";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("OSI_CALLSdata$group[$i]|1|CALLS|integer|", "OSI_SYSTEMRELEASEdata$group[$i]|2|SYSTEM RELEASE CALLS|integer|", "OSI_AGENTRELEASEdata$group[$i]|3|AGENT RELEASE CALLS|integer|", "OSI_SALECALLSdata$group[$i]|4|SALE CALLS|integer|", "OSI_DNCCALLSdata$group[$i]|5|DNC CALLS|integer|", "OSI_NOANSWERPERCENTdata$group[$i]|6|NO ANSWER PERCENT|percent|", "OSI_DROPPERCENTdata$group[$i]|7|DROP PERCENT|percent|", "OSI_AGENTLOGINdata$group[$i]|8|AGENT LOGIN TIME|time|", "OSI_AGENTPAUSEdata$group[$i]|9|AGENT PAUSE TIME|time|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($SUBgraph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $SUBgraph_stats[$d][0])."\",";
$data.="\"".$SUBgraph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$SUBgraph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title="$group[$i] - $group_cname[$i] "._QXZ("INTERVAL BREAKDOWN");
include("graphcanvas.inc");
$SUB_HTML_text.=$graphCanvas;
$i++;
for ($d=0; $d<count($SUBgraph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($SUBgraph_stats)) {$class=" last";} else {$class="";}
$SUBCALLS_graph.=" <tr><td class='chart_td$class'>".$SUBgraph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$SUBgraph_stats[$d][1], $SUBmax_calls))."' height='16' />".$SUBgraph_stats[$d][1]."</td></tr>";
$SUBSYSTEMRELEASE_graph.=" <tr><td class='chart_td$class'>".$SUBgraph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$SUBgraph_stats[$d][2], $SUBmax_system_release))."' height='16' />".$SUBgraph_stats[$d][2]."</td></tr>";
$SUBAGENTRELEASE_graph.=" <tr><td class='chart_td$class'>".$SUBgraph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$SUBgraph_stats[$d][3], $SUBmax_agent_release))."' height='16' />".$SUBgraph_stats[$d][3]."</td></tr>";
$SUBSALES_graph.=" <tr><td class='chart_td$class'>".$SUBgraph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$SUBgraph_stats[$d][4], $SUBmax_sales))."' height='16' />".$SUBgraph_stats[$d][4]."</td></tr>";
$SUBDNCS_graph.=" <tr><td class='chart_td$class'>".$SUBgraph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$SUBgraph_stats[$d][5], $SUBmax_dncs))."' height='16' />".$SUBgraph_stats[$d][5]."</td></tr>";
$SUBNAS_graph.=" <tr><td class='chart_td$class'>".$SUBgraph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$SUBgraph_stats[$d][6], $SUBmax_nas))."' height='16' />".$SUBgraph_stats[$d][6]."%</td></tr>";
$SUBDROPS_graph.=" <tr><td class='chart_td$class'>".$SUBgraph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$SUBgraph_stats[$d][7], $SUBmax_drops))."' height='16' />".$SUBgraph_stats[$d][7]."%</td></tr>";
$SUBLOGINTIME_graph.=" <tr><td class='chart_td$class'>".$SUBgraph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$SUBgraph_stats[$d][8], $SUBmax_login_time))."' height='16' />".sec_convert($SUBgraph_stats[$d][8], 'H')."</td></tr>";
$SUBPAUSETIME_graph.=" <tr><td class='chart_td$class'>".$SUBgraph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$SUBgraph_stats[$d][9], $SUBmax_pause_time))."' height='16' />".sec_convert($SUBgraph_stats[$d][9], 'H')."</td></tr>";
}
$SUBCALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTcalls_count)."</th></tr></table>";
$SUBSYSTEMRELEASE_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTsystem_count)."</th></tr></table>";
$SUBAGENTRELEASE_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTagent_count)."</th></tr></table>";
$SUBSALES_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTptp_count)."</th></tr></table>";
$SUBDNCS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTrtp_count)."</th></tr></table>";
$SUBNAS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTna_percent)."%</th></tr></table>";
$SUBDROPS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTdrop_percent)."%</th></tr></table>";
$SUBLOGINTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTagent_sec)."</th></tr></table>";
$SUBPAUSETIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTpause_sec)."</th></tr></table>";
$JS_onload.="\tDraw".$SUBrpt_campaign."CampaignGraph('CALLS', '1');\n";
$JS_text.="function Draw".$SUBrpt_campaign."CampaignGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$SUBCALLS_graph\";\n";
$JS_text.=" var SYSTEMRELEASE_graph=\"$SUBSYSTEMRELEASE_graph\";\n";
$JS_text.=" var AGENTRELEASE_graph=\"$SUBAGENTRELEASE_graph\";\n";
$JS_text.=" var SALES_graph=\"$SUBSALES_graph\";\n";
$JS_text.=" var DNCS_graph=\"$SUBDNCS_graph\";\n";
$JS_text.=" var NAS_graph=\"$SUBNAS_graph\";\n";
$JS_text.=" var DROPS_graph=\"$SUBDROPS_graph\";\n";
$JS_text.=" var LOGINTIME_graph=\"$SUBLOGINTIME_graph\";\n";
$JS_text.=" var PAUSETIME_graph=\"$SUBPAUSETIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=9; i++) {\n";
$JS_text.=" var cellID=\"campbreakdown".$SUBrpt_campaign."\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"campbreakdown".$SUBrpt_campaign."\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('campaign_breakdown_".$SUBrpt_campaign."').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$SUB_HTML_text.=$SUBGRAPH;
}
}
$rawTOTtalk_sec = $TOTtalk_sec;
$rawTOTtalk_min = round(MathZDC($rawTOTtalk_sec, 60));
@@ -1574,49 +1579,87 @@ else
exit;
}
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$SYSTEMRELEASE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_system_release))."' height='16' />".$graph_stats[$d][2]."</td></tr>";
$AGENTRELEASE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_agent_release))."' height='16' />".$graph_stats[$d][3]."</td></tr>";
$SALES_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][4], $max_sales))."' height='16' />".$graph_stats[$d][4]."</td></tr>";
$DNCS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][5], $max_dncs))."' height='16' />".$graph_stats[$d][5]."</td></tr>";
$NAS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][6], $max_nas))."' height='16' />".$graph_stats[$d][6]."%</td></tr>";
$DROPS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][7], $max_drops))."' height='16' />".$graph_stats[$d][7]."%</td></tr>";
$LOGINTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][8], $max_login_time))."' height='16' />".sec_convert($graph_stats[$d][8], 'H')."</td></tr>";
$PAUSETIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][9], $max_pause_time))."' height='16' />".sec_convert($graph_stats[$d][9], 'H')."</td></tr>";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("OSI_CALLSdata|1|CALLS|integer|", "OSI_SYSTEMRELEASEdata|2|SYSTEM RELEASE CALLS|integer|", "OSI_AGENTRELEASEdata|3|AGENT RELEASE CALLS|integer|", "OSI_SALECALLSdata|4|SALE CALLS|integer|", "OSI_DNCCALLSdata|5|DNC CALLS|integer|", "OSI_NOANSWERPERCENTdata|6|NO ANSWER PERCENT|percent|", "OSI_DROPPERCENTdata|7|DROP PERCENT|percent|", "OSI_AGENTLOGINdata|8|AGENT LOGIN TIME|time|", "OSI_AGENTPAUSEdata|9|AGENT PAUSE TIME|time|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$CALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTcalls_count)."</th></tr></table>";
$SYSTEMRELEASE_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTsystem_count)."</th></tr></table>";
$AGENTRELEASE_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTagent_count)."</th></tr></table>";
$SALES_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTptp_count)."</th></tr></table>";
$DNCS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTrtp_count)."</th></tr></table>";
$NAS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTna_percent)."%</th></tr></table>";
$DROPS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTdrop_percent)."%</th></tr></table>";
$LOGINTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTagent_sec)."</th></tr></table>";
$PAUSETIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTpause_sec)."</th></tr></table>";
$JS_onload.="\tDrawMultiCampaignGraph('CALLS', '1');\n";
$JS_text.="function DrawMultiCampaignGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var SYSTEMRELEASE_graph=\"$SYSTEMRELEASE_graph\";\n";
$JS_text.=" var AGENTRELEASE_graph=\"$AGENTRELEASE_graph\";\n";
$JS_text.=" var SALES_graph=\"$SALES_graph\";\n";
$JS_text.=" var DNCS_graph=\"$DNCS_graph\";\n";
$JS_text.=" var NAS_graph=\"$NAS_graph\";\n";
$JS_text.=" var DROPS_graph=\"$DROPS_graph\";\n";
$JS_text.=" var LOGINTIME_graph=\"$LOGINTIME_graph\";\n";
$JS_text.=" var PAUSETIME_graph=\"$PAUSETIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=9; i++) {\n";
$JS_text.=" var cellID=\"campbreakdown\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"campbreakdown\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('multi_campaign_breakdown').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$GRAPH_text.=$GRAPH;
$graph_count=count($graph_array);
$graph_title=_QXZ("MULTI-CAMPAIGN BREAKDOWN");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
if ($file_download>0) {
# $CSV_report=fopen("AST_OUTBOUNDsummary_interval.csv", "w");
@@ -1676,10 +1719,10 @@ else
}
echo "$HEADER";
echo $JS_text;
require("admin_header.php");
echo "$MAIN";
echo "$SUBoutput";
echo $JS_text;
$ENDtime = date("U");
$RUNtime = ($ENDtime - $STARTtime);
echo "\n\n"._QXZ("Run Time").": $RUNtime "._QXZ("seconds")."|$db_source\n";
+473 -123
View File
@@ -48,6 +48,7 @@
# 151125-1615 - Added search archive option
# 160227-1101 - Uniform form format
# 160515-1412 - Added UK OFCOM feature
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -523,6 +524,9 @@ $NWE = "')\"><IMG SRC=\"help.gif\" WIDTH=20 HEIGHT=20 BORDER=0 ALT=\"HELP\" ALIG
echo "<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
echo "<link rel=\"stylesheet\" href=\"calendar.css\">\n";
echo "<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
echo "<script src='chart/Chart.js'></script>\n";
echo "<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
echo "<script language=\"JavaScript\">\n";
@@ -1106,13 +1110,6 @@ else
$ASCII_text .= "| "._QXZ("HANGUP REASON",20)." | "._QXZ("CALLS",10)." |\n";
$ASCII_text .= "+----------------------+------------+\n";
$GRAPH.="<BR/><BR/><table cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"white\" summary=\"DID Summary\" class=\"horizontalgraph\">\n";
$GRAPH.="<caption align='top'>"._QXZ("CALL HANGUP REASON STATS")."</caption>";
$GRAPH.="<tr>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("DID")."</th>\n";
$GRAPH.="<th class=\"thgraph\" scope=\"col\">"._QXZ("CALLS")."</th>\n";
$GRAPH.="</tr>\n";
$stmt="select count(*),term_reason from ".$vicidial_log_table." where call_date >= '$query_date_BEGIN' and call_date <= '$query_date_END' $group_SQLand $list_id_SQLand group by term_reason;";
if ($non_latin > 0) {$rslt=mysql_to_mysqli("SET NAMES 'UTF8'", $link);}
$rslt=mysql_to_mysqli($stmt, $link);
@@ -1144,20 +1141,84 @@ else
$ASCII_text .= "| "._QXZ("TOTAL",19).": | $TOTALcalls |\n";
$ASCII_text .= "+----------------------+------------+\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td$class\">".$graph_stats[$d][1]."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$graph_stats[$d][0], $max_calls))."\" height=\"16\" />".$graph_stats[$d][0]."</td>\n";
$GRAPH.=" </tr>\n";
}
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL").":</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">".trim($TOTALcalls)."</th>\n";
$GRAPH.=" </tr>\n";
$GRAPH.="</table><PRE>\n";
$GRAPH_text.=$GRAPH;
#########
$graph_array=array("CHRSdata|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1]; $dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][1]."\",";
$data.="\"".$graph_stats[$d][0]."\",";
$current_graph_total+=$graph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("CALL HANGUP REASON STATS");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
@@ -1357,38 +1418,86 @@ else
# $ASCII_text .= "| AGENT TIME | $aTOTALhours | | $aTOTALrate |\n";
$ASCII_text .= "+------------------------------------------------------+------------+------------+---------------------+----------+\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$TOTALTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_total_time))."' height='16' />".sec_convert($graph_stats[$d][2], 'H')."</td></tr>";
$AVGTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_avg_time))."' height='16' />".sec_convert($graph_stats[$d][3], 'H')."</td></tr>";
$CALLSHOUR_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][4], $max_callshr))."' height='16' />".$graph_stats[$d][4]."</td></tr>";
$CALLSHOUR_agent_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][5], $max_agentcallshr))."' height='16' />".$graph_stats[$d][5]."</td></tr>";
}
$CALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTALcalls)."</th></tr></table>";
$TOTALTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTALhours)."</th></tr></table>";
$AVGTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTALavg)."</th></tr></table>";
$CALLSHOUR_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTALrate)."</th></tr></table>";
$CALLSHOUR_agent_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($aTOTALrate)."</th></tr></table>";
$JS_onload.="\tDrawCSSGraph('CALLS', '1');\n";
$JS_text.="function DrawCSSGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var TOTALTIME_graph=\"$TOTALTIME_graph\";\n";
$JS_text.=" var AVGTIME_graph=\"$AVGTIME_graph\";\n";
$JS_text.=" var CALLSHOUR_graph=\"$CALLSHOUR_graph\";\n";
$JS_text.=" var CALLSHOUR_agent_graph=\"$CALLSHOUR_agent_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=5; i++) {\n";
$JS_text.=" var cellID=\"cssgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"cssgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('call_status_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("CSS_CALLSdata|1|CALLS|integer|", "CSS_TOTALTIMEdata|2|TOTAL TIME|time|", "CSS_AVGTIMEdata|3|AVG TIME|time|", "CSS_CALLSHOURdata|4|CALLS/HR|decimal|", "CSS_CALLSHOUR_agent|5|AGENT CALLS/HR|decimal|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("CALL STATUS STATS");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
$GRAPH_text.=$GRAPH;
@@ -1457,20 +1566,85 @@ else
$ASCII_text .= "| "._QXZ("TOTAL",39).": | $TOTALcalls |\n";
$ASCII_text .= "+------------------------------------------+------------+\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td$class\">".$graph_stats[$d][1]."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$graph_stats[$d][0], $max_calls))."\" height=\"16\" />".$graph_stats[$d][0]."</td>\n";
$GRAPH.=" </tr>\n";
}
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL").":</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">".trim($TOTALcalls)."</th>\n";
$GRAPH.=" </tr>\n";
$GRAPH.="</table><PRE>\n";
#########
$graph_array=array("LISdata|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$GRAPH_text.=$GRAPH;
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][1]."\",";
$data.="\"".$graph_stats[$d][0]."\",";
$current_graph_total+=$graph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("LIST ID STATS");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
if ( ($carrier_logging_active > 0) and ($carrier_stats == 'YES') )
@@ -1564,18 +1738,85 @@ else
$i++;
}
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td$class\">".$graph_stats[$d][1]."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$graph_stats[$d][0], $max_calls))."\" height=\"16\" />".$graph_stats[$d][0]."</td>\n";
$GRAPH.=" </tr>\n";
#########
$graph_array=array("APDdata|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][1]."\",";
$data.="\"".$graph_stats[$d][0]."\",";
$current_graph_total+=$graph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL CALLS").":</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">".trim($TOTPREcalls)."</th>\n";
$GRAPH.=" </tr>\n";
$GRAPH.="</table><PRE>\n";
$graph_count=count($graph_array);
$graph_title=_QXZ("AGENT PRESET DIALS");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
$TOTPREcalls = sprintf("%10s", $TOTPREcalls); while(strlen($TOTPREcalls)>10) {$TOTPREcalls = substr("$TOTPREcalls", 0, -1);}
@@ -1631,19 +1872,85 @@ else
$ASCII_text .= "| "._QXZ("TOTAL",20)." | $TOTCATcalls |\n";
$ASCII_text .= "+----------------------+------------+\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH.=" <tr>\n";
$GRAPH.=" <td class=\"chart_td$class\">".$graph_stats[$d][1]."</td>\n";
$GRAPH.=" <td nowrap class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$graph_stats[$d][0], $max_calls))."\" height=\"16\" />".$graph_stats[$d][0]."</td>\n";
$GRAPH.=" </tr>\n";
}
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL").":</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">".trim($TOTCATcalls)."</th>\n";
$GRAPH.=" </tr>\n";
$GRAPH.="</table><PRE>\n";
$GRAPH_text.=$GRAPH;
#########
$graph_array=array("CSCdata|||integer|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][1]."\",";
$data.="\"".$graph_stats[$d][0]."\",";
$current_graph_total+=$graph_stats[$d][0];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("CUSTOM STATUS CATEGORY STATS");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
##############################
@@ -1662,16 +1969,6 @@ else
######## GRAPHING #########
$graph_stats=array();
$max_calls=1;
$max_total_time=1;
$max_avg_time=1;
$GRAPH="<BR><BR><a name='AGENTgraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='33%' class='grey_graph_cell' id='AGENTgraph1'><a href='#' onClick=\"DrawAGENTGraph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th width='33%' class='grey_graph_cell' id='AGENTgraph2'><a href='#' onClick=\"DrawAGENTGraph('TOTALTIME', '2'); return false;\">"._QXZ("TOTAL TIME")."</a></th><th width='34%' class='grey_graph_cell' id='AGENTgraph3'><a href='#' onClick=\"DrawAGENTGraph('AVGTIME', '3'); return false;\">"._QXZ("AVG TIME")."</a></th></tr>";
$GRAPH.="<tr><td colspan='4' class='graph_span_cell'><span id='agent_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("AGENT STATS")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("STATUS")."</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")." </th></tr>";
$TOTALTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL TIME")."</th></tr>";
$AVGTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG TIME")."</th></tr>";
###########################
$stmt="select ".$vicidial_log_table.".user,full_name,count(*),sum(length_in_sec),avg(length_in_sec) from ".$vicidial_log_table.",vicidial_users where call_date >= '$query_date_BEGIN' and call_date <= '$query_date_END' $group_SQLand $list_id_SQLand and ".$vicidial_log_table.".user is not null and length_in_sec is not null and length_in_sec >= 0 and ".$vicidial_log_table.".user=vicidial_users.user group by ".$vicidial_log_table.".user;";
@@ -1800,32 +2097,85 @@ else
$ASCII_text .= "| "._QXZ("Average Wait time between calls",52)." $AVGwait |\n";
$ASCII_text .= "+-------------------------------------------------------------+\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$TOTALTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_total_time))."' height='16' />".sec_convert($graph_stats[$d][2], 'H')."</td></tr>";
$AVGTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_avg_time))."' height='16' />".sec_convert($graph_stats[$d][3], 'H')."</td></tr>";
}
$CALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTcalls)."</th></tr></table>";
$TOTALTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTtime)."</th></tr></table>";
$AVGTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTavg)."</th></tr></table>";
$JS_onload.="\tDrawAGENTGraph('CALLS', '1');\n";
$JS_text.="function DrawAGENTGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var TOTALTIME_graph=\"$TOTALTIME_graph\";\n";
$JS_text.=" var AVGTIME_graph=\"$AVGTIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=3; i++) {\n";
$JS_text.=" var cellID=\"AGENTgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"AGENTgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('agent_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$GRAPH_text.=$GRAPH;
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("AS_CALLSdata|1|CALLS|integer|", "AS_TOTALTIMEdata|2|TOTAL TIME|time|", "AS_AVGTIMEdata|3|AVG TIME|time|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title="AGENT STATS";
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
if ($costformat > 0)
{
@@ -29,6 +29,7 @@
# 151227-1718 - Added option to search archive records instead of main
# 160121-2216 - Added report title header, default report format, cleaned up formatting
# 160225-1625 - Fixed download issue where report was not printing properly
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -397,6 +398,9 @@ if ($file_download < 1)
echo "<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
echo "<link rel=\"stylesheet\" href=\"calendar.css\">\n";
echo "<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
echo "<script src='chart/Chart.js'></script>\n";
echo "<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
echo "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
echo "<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=white marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -447,8 +451,6 @@ else
{
$ASCII_text.=_QXZ("Agent Days Status Report",24).": $user $NOW_TIME ($db_source)\n";
$ASCII_text.=_QXZ("Time range").": $query_date_BEGIN "._QXZ("to")." $query_date_END\n\n";
$GRAPH_text.=_QXZ("Agent Days Status Report",24).": $user $NOW_TIME ($db_source)\n";
$GRAPH_text.=_QXZ("Time range").": $query_date_BEGIN "._QXZ("to")." $query_date_END\n\n";
}
else
{
@@ -512,7 +514,6 @@ else
$Sstatus=$statusesARY[$i];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
$GRAPH2.="<th class='column_header grey_graph_cell' id='callgraph".($i+4)."'><a href='#' onClick=\"DrawGraph('$Sstatus', '".($i+4)."'); return false;\">$SstatusTXT</a></th>";
}
}
@@ -530,12 +531,6 @@ else
$max_calls=1;
$max_cicalls=1;
$max_dncci=1;
$GRAPH="<BR><BR><a name='callgraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH2="<tr><th class='column_header grey_graph_cell' id='callgraph1'><a href='#' onClick=\"DrawGraph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th class='column_header grey_graph_cell' id='callgraph2'><a href='#' onClick=\"DrawGraph('CICALLS', '2'); return false;\">"._QXZ("CI/CALLS")."</a></th><th class='column_header grey_graph_cell' id='callgraph3'><a href='#' onClick=\"DrawGraph('DNCCI', '3'); return false;\">"._QXZ("DNC/CI")."</a></th>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("LEAD STATS BREAKDOWN")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("STATUS")."</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")."</th></tr>";
$CICALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CI CALLS")."</th></tr>";
$DNCCI_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DNC/CI")."%</th></tr>";
while ($m < $k)
{
@@ -760,59 +755,94 @@ else
$Sstatus=$statusesARY[$e];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
$GRAPH2.="<th class='column_header grey_graph_cell' id='callgraph".($e+4)."'><a href='#' onClick=\"DrawGraph('$Sstatus', '".($e+4)."'); return false;\">$SstatusTXT</a></th>";
}
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$CICALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_cicalls))."' height='16' />".$graph_stats[$d][2]."</td></tr>";
$DNCCI_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_dncci))."' height='16' />".$graph_stats[$d][3]."%</td></tr>";
for ($e=0; $e<count($statusesARY); $e++) {
$Sstatus=$statusesARY[$e];
$varname=$Sstatus."_graph";
$max_varname="max_".$Sstatus;
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("ADD_CALLSdata|1|CALLS|integer|", "ADD_CICALLSdata|2|CI/CALLS|integer|", "ADD_DNCCIdata|3|DNC/CI|percent|");
$default_graph="line"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
for ($e=0; $e<count($statusesARY); $e++) {
$Sstatus=$statusesARY[$e];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
array_push($graph_array, "ADD_SUBSTATUS".$e."data|".($e+4)."|".$SstatusTXT."|integer|");
}
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$$varname.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][($e+4)], $$max_varname))."' height='16' />".$graph_stats[$d][($e+4)]."</td></tr>";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("LEAD STATS BREAKDOWN");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
$CALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTcalls)."</th></tr></table>";
$CICALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($CIScountTOT)."</th></tr></table>";
$DNCCI_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($DNCcountPCT)."%</th></tr></table>";
for ($e=0; $e<count($statusesARY); $e++) {
$Sstatus=$statusesARY[$e];
$total_var=$Sstatus."_total";
$graph_var=$Sstatus."_graph";
$$graph_var.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($$total_var)."</th></tr></table>";
}
$JS_onload.="\tDrawGraph('CALLS', '1');\n";
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var CICALLS_graph=\"$CICALLS_graph\";\n";
$JS_text.=" var DNCCI_graph=\"$DNCCI_graph\";\n";
for ($e=0; $e<count($statusesARY); $e++) {
$Sstatus=$statusesARY[$e];
$graph_var=$Sstatus."_graph";
$JS_text.=" var ".$Sstatus."_graph=\"".$$graph_var."\";\n";
}
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=".(3+count($statusesARY))."; i++) {\n";
$JS_text.=" var cellID=\"callgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"callgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('agent_time_detail_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$GRAPH3="<tr><td colspan='".(3+count($statusesARY))."' class='graph_span_cell'><span id='agent_time_detail_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$GRAPH_text.=$GRAPH.$GRAPH2.$GRAPH3;
}
else
@@ -957,8 +987,8 @@ echo "</FORM>";
if ($report_display_type=="HTML")
{
echo $JS_text;
echo $GRAPH_text;
echo $JS_text;
}
else
{
@@ -55,6 +55,7 @@
# 151229-2015 - Added feature to break down agent stats by day
# 160121-2212 - Added report title header, default report format, cleaned up formatting
# 160503-2137 - Bug fix and inclusion of null sub_statuses in counts for "PAUSE CODE BREAKDOWN" section
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -479,6 +480,9 @@ $HTML_head.=" </STYLE>\n";
$HTML_head.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HTML_head.="<script src='chart/Chart.js'></script>\n";
$HTML_head.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HTML_head.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HTML_head.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -705,23 +709,6 @@ $max_dead=1;
$max_deadavg=1;
$max_customer=1;
$max_customeravg=1;
$GRAPH="<BR><BR><a name='callstatsgraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH2="<tr><th class='column_header grey_graph_cell' id='callstatsgraph1'><a href='#' onClick=\"DrawGraph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph2'><a href='#' onClick=\"DrawGraph('TIME', '2'); return false;\">"._QXZ("TIME")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph3'><a href='#' onClick=\"DrawGraph('PAUSE', '3'); return false;\">"._QXZ("PAUSE")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph4'><a href='#' onClick=\"DrawGraph('PAUSEAVG', '4'); return false;\">"._QXZ("PAUSE AVG")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph5'><a href='#' onClick=\"DrawGraph('WAIT', '5'); return false;\">"._QXZ("WAIT")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph6'><a href='#' onClick=\"DrawGraph('WAITAVG', '6'); return false;\">"._QXZ("WAIT AVG")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph7'><a href='#' onClick=\"DrawGraph('TALK', '7'); return false;\">"._QXZ("TALK")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph8'><a href='#' onClick=\"DrawGraph('TALKAVG', '8'); return false;\">"._QXZ("TALK AVG")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph9'><a href='#' onClick=\"DrawGraph('DISPO', '9'); return false;\">"._QXZ("DISPO")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph10'><a href='#' onClick=\"DrawGraph('DISPOAVG', '10'); return false;\">"._QXZ("DISPO AVG")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph11'><a href='#' onClick=\"DrawGraph('DEAD', '11'); return false;\">"._QXZ("DEAD")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph12'><a href='#' onClick=\"DrawGraph('DEADAVG', '12'); return false;\">"._QXZ("DEAD AVG")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph13'><a href='#' onClick=\"DrawGraph('CUST', '13'); return false;\">"._QXZ("CUST")."</a></th><th class='column_header grey_graph_cell' id='callstatsgraph14'><a href='#' onClick=\"DrawGraph('CUSTAVG', '14'); return false;\">"._QXZ("CUST AVG")."</a></th>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("CALL STATS BREAKDOWN").": ("._QXZ("Statistics related to handling of calls only").")</caption><tr><th class='thgraph' scope='col'>"._QXZ("USER")."</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")."</th></tr>";
$TIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TIME")."</th></tr>";
$PAUSE_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("PAUSE")."</th></tr>";
$PAUSEAVG_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("PAUSE AVG")."</th></tr>";
$WAIT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("WAIT")."</th></tr>";
$WAITAVG_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("WAIT AVG")."</th></tr>";
$TALK_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TALK")."</th></tr>";
$TALKAVG_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TALK AVG")."</th></tr>";
$DISPO_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DISPO")."</th></tr>";
$DISPOAVG_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DISPO AVG")."</th></tr>";
$DEAD_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DEAD")."</th></tr>";
$DEADAVG_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DEAD AVG")."</th></tr>";
$CUST_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST")."</th></tr>";
$CUSTAVG_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUST AVG")."</th></tr>";
if ($show_defunct_users=="checked")
{
@@ -1494,98 +1481,96 @@ if ($show_percentages) {
$ASCII_text.="+-----------------+----------+----------------------+----------------------+".$BBD_header."--------+-----------+----------+--------+----------+--------+----------+--------+----------+--------+----------+--------+----------+--------+$statusesHEAD\n";
}
# USE THIS FOR COMBINED graphs, use pipe-delimited array elements, dataset_name|index|link_name|graph_override
# You have to hard code the graph name in where it is overridden and mind the data indices. No other way to do it.
$multigraph_text="";
$graph_id++;
$graph_array=array("APD_CALLSdata|1|CALLS|integer|", "APD_TIMEdata|2|TIME|time|", "APD_PAUSEdata|3|PAUSE|time|", "APD_PAUSEdata|4|PAUSE AVG|time|", "APD_WAITdata|5|WAIT|time|", "APD_WAITdata|6|WAIT AVG|time|", "APD_TALKdata|7|TALK|time|", "APD_TALKdata|8|TALK AVG|time|", "APD_DISPOdata|9|DISPO|time|", "APD_DISPOdata|10|DISPO AVG|time|", "APD_DEADdata|11|DEAD|time|", "APD_DEADdata|12|DEAD AVG|time|", "APD_CUSTdata|13|CUST|time|", "APD_CUSTdata|14|CUST AVG|time|");
for ($e=0; $e<count($statusesARY); $e++) {
$Sstatus=$statusesARY[$e];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
$GRAPH2.="<th class='column_header grey_graph_cell' id='callstatsgraph".($e+15)."'><a href='#' onClick=\"DrawGraph('$Sstatus', '".($e+15)."'); return false;\">$SstatusTXT</a></th>";
array_push($graph_array, "APD_SUBSTATUS".$e."data|".($e+15)."|".$SstatusTXT."|integer|");
}
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$TIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_time))."' height='16' />".sec_convert($graph_stats[$d][2], $TIME_HF_agentperfdetail)."</td></tr>";
$PAUSE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_pause))."' height='16' />".sec_convert($graph_stats[$d][3], $TIME_HF_agentperfdetail)."</td></tr>";
$PAUSEAVG_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][4], $max_pauseavg))."' height='16' />".sec_convert($graph_stats[$d][4], $TIME_HF_agentperfdetail)."</td></tr>";
$WAIT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][5], $max_wait))."' height='16' />".sec_convert($graph_stats[$d][5], $TIME_HF_agentperfdetail)."</td></tr>";
$WAITAVG_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][6], $max_waitavg))."' height='16' />".sec_convert($graph_stats[$d][6], $TIME_HF_agentperfdetail)."</td></tr>";
$TALK_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][7], $max_talk))."' height='16' />".sec_convert($graph_stats[$d][7], $TIME_HF_agentperfdetail)."</td></tr>";
$TALKAVG_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][8], $max_talkavg))."' height='16' />".sec_convert($graph_stats[$d][8], $TIME_HF_agentperfdetail)."</td></tr>";
$DISPO_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][9], $max_dispo))."' height='16' />".sec_convert($graph_stats[$d][9], $TIME_HF_agentperfdetail)."</td></tr>";
$DISPOAVG_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][10], $max_dispoavg))."' height='16' />".sec_convert($graph_stats[$d][10], $TIME_HF_agentperfdetail)."</td></tr>";
$DEAD_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][11], $max_dead))."' height='16' />".sec_convert($graph_stats[$d][11], $TIME_HF_agentperfdetail)."</td></tr>";
$DEADAVG_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][12], $max_deadavg))."' height='16' />".sec_convert($graph_stats[$d][12], $TIME_HF_agentperfdetail)."</td></tr>";
$CUST_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][13], $max_customer))."' height='16' />".sec_convert($graph_stats[$d][13], $TIME_HF_agentperfdetail)."</td></tr>";
$CUSTAVG_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][14], $max_customeravg))."' height='16' />".sec_convert($graph_stats[$d][14], $TIME_HF_agentperfdetail)."</td></tr>";
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
for ($e=0; $e<count($statusesARY); $e++) {
$Sstatus=$statusesARY[$e];
$varname=$Sstatus."_graph";
$max_varname="max_".$Sstatus;
# $max.= "<!-- $max_varname => ".$$max_varname." //-->\n";
$$varname.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][($e+15)], $$max_varname))."' height='16' />".$graph_stats[$d][($e+15)]."</td></tr>";
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
}
$CALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTcalls)."</th></tr></table>";
$TIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTtime_MS)."</th></tr></table>";
$PAUSE_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTtotPAUSE_MS)."</th></tr></table>";
$PAUSEAVG_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTavgPAUSE_MS)."</th></tr></table>";
$WAIT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTtotWAIT_MS)."</th></tr></table>";
$WAITAVG_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTavgWAIT_MS)."</th></tr></table>";
$TALK_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTtotTALK_MS)."</th></tr></table>";
$TALKAVG_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTavgTALK_MS)."</th></tr></table>";
$DISPO_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTtotDISPO_MS)."</th></tr></table>";
$DISPOAVG_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTavgDISPO_MS)."</th></tr></table>";
$DEAD_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTtotDEAD_MS)."</th></tr></table>";
$DEADAVG_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTavgDEAD_MS)."</th></tr></table>";
$CUST_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTtotCUSTOMER_MS)."</th></tr></table>";
$CUSTAVG_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTavgCUSTOMER_MS)."</th></tr></table>";
for ($e=0; $e<count($statusesARY); $e++) {
$Sstatus=$statusesARY[$e];
$total_var=$Sstatus."_total";
$graph_var=$Sstatus."_graph";
$$graph_var.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($$total_var)."</th></tr></table>";
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$JS_onload.="\tDrawGraph('CALLS', '1');\n";
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_text.=" var graph_CALLS=\"$CALLS_graph\";\n";
$JS_text.=" var graph_TIME=\"$TIME_graph\";\n";
$JS_text.=" var graph_PAUSE=\"$PAUSE_graph\";\n";
$JS_text.=" var graph_PAUSEAVG=\"$PAUSEAVG_graph\";\n";
$JS_text.=" var graph_WAIT=\"$WAIT_graph\";\n";
$JS_text.=" var graph_WAITAVG=\"$WAITAVG_graph\";\n";
$JS_text.=" var graph_TALK=\"$TALK_graph\";\n";
$JS_text.=" var graph_TALKAVG=\"$TALKAVG_graph\";\n";
$JS_text.=" var graph_DISPO=\"$DISPO_graph\";\n";
$JS_text.=" var graph_DISPOAVG=\"$DISPOAVG_graph\";\n";
$JS_text.=" var graph_DEAD=\"$DEAD_graph\";\n";
$JS_text.=" var graph_DEADAVG=\"$DEADAVG_graph\";\n";
$JS_text.=" var graph_CUST=\"$CUST_graph\";\n";
$JS_text.=" var graph_CUSTAVG=\"$CUSTAVG_graph\";\n";
for ($e=0; $e<count($statusesARY); $e++) {
$Sstatus=$statusesARY[$e];
$graph_var=$Sstatus."_graph";
$JS_text.=" var graph_".$Sstatus."=\"".$$graph_var."\";\n";
}
$JS_text.=" for (var i=1; i<=".(count($statusesARY)+14)."; i++) {\n";
$JS_text.=" var cellID=\"callstatsgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"callstatsgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.="\n";
$JS_text.=" var graph_to_display=eval(\"graph_\"+graph);\n";
$JS_text.=" document.getElementById('call_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$JS_text.="</script>\n";
$GRAPH3="<tr><td colspan='".(14+count($statusesARY))."' class='graph_span_cell'><span id='call_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_count=count($graph_array);
$graph_title=_QXZ("CALL STATS BREAKDOWN: (Statistics related to handling of calls only)");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
$GRAPH_text.=$JS_text.$GRAPH.$GRAPH2.$GRAPH3;
@@ -1674,12 +1659,6 @@ $graph_stats=array();
$max_total=1;
$max_nonpause=1;
$max_pause=1;
$GRAPH="<BR><BR><a name='pausegraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH2="<tr><th class='column_header grey_graph_cell' id='pausegraph1'><a href='#' onClick=\"DrawPauseGraph('TOTAL', '1'); return false;\">"._QXZ("TOTAL")."</a></th><th class='column_header grey_graph_cell' id='pausegraph2'><a href='#' onClick=\"DrawPauseGraph('NONPAUSE', '2'); return false;\">"._QXZ("NONPAUSE")."</a></th><th class='column_header grey_graph_cell' id='pausegraph3'><a href='#' onClick=\"DrawPauseGraph('PAUSE', '3'); return false;\">"._QXZ("PAUSE")."</a></th>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("PAUSE CODE BREAKDOWN")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("STATUS")."</th>";
$TOTAL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL")." </th></tr>";
$NONPAUSE_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("NONPAUSE")."</th></tr>";
$PAUSE_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("PAUSE")."</th></tr>";
$sub_status_stmt="SELECT distinct if(sub_status is null, '*', sub_status) as all_subs from ".$agent_log_table." where event_time <= '$query_date_END' and event_time >= '$query_date_BEGIN' and pause_sec >= 0 and pause_sec < 65000 $group_SQL $user_agent_log_SQL order by all_subs asc limit 10000000;";
if ($DB) {$ASCII_text.="$sub_status_stmt\n";}
@@ -1986,67 +1965,96 @@ $ASCII_text.="+-----------------+----------+----------------------+-------------
$ASCII_text.="| "._QXZ("TOTALS",33)." "._QXZ("AGENTS",32,"r").":$TOT_AGENTS |$TOTtotTOTAL_MS|$TOTtotNONPAUSE_MS|$TOTtotPAUSE_MS| |$SUMstatusesHTML\n";
$ASCII_text.="+-----------------+----------+----------------------+----------------------+------------+----------+----------+ +$sub_statusesHEAD\n";
# USE THIS FOR COMBINED graphs, use pipe-delimited array elements, dataset_name|index|link_name|graph_override
# You have to hard code the graph name in where it is overridden and mind the data indices. No other way to do it.
$multigraph_text="";
$graph_id++;
$graph_array=array("APD_TOTALdata|1|TOTAL|time|", "APD_NONPAUSEdata|2|NONPAUSE|time|", "APD_PAUSEdata|3|PAUSE|time|");
for ($e=0; $e<count($sub_statusesARY); $e++) {
$Sstatus=$sub_statusesARY[$e];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="("._QXZ("blank").")";}
$GRAPH2.="<th class='column_header grey_graph_cell' id='pausegraph".($e+4)."'><a href='#' onClick=\"DrawPauseGraph('$Sstatus', '".($e+4)."'); return false;\">$SstatusTXT</a></th>";
array_push($graph_array, "APDP_SUBSTATUS".$e."data|".($e+4)."|".$sub_statusesARY[$e]."|time|");
}
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$TOTAL_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_total))."' height='16' />".sec_convert($graph_stats[$d][1], $TIME_H_agentperfdetail)."</td></tr>";
$NONPAUSE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_nonpause))."' height='16' />".sec_convert($graph_stats[$d][2], $TIME_H_agentperfdetail)."</td></tr>";
$PAUSE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_pause))."' height='16' />".sec_convert($graph_stats[$d][3], $TIME_H_agentperfdetail)."</td></tr>";
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
for ($e=0; $e<count($sub_statusesARY); $e++) {
$Sstatus=$sub_statusesARY[$e];
$varname=$Sstatus."_graph";
$max_varname="max_".$Sstatus;
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$$varname.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][($e+4)], $$max_varname))."' height='16' />".sec_convert($graph_stats[$d][($e+4)], $TIME_H_agentperfdetail)."</td></tr>";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$TOTAL_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("LOGIN TIME").":</th><th class='thgraph' scope='col'>".trim($TOTtotTOTAL_MS)."</th></tr></table>";
$NONPAUSE_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("LOGIN TIME").":</th><th class='thgraph' scope='col'>".trim($TOTtotNONPAUSE_MS)."</th></tr></table>";
$PAUSE_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("LOGIN TIME").":</th><th class='thgraph' scope='col'>".trim($TOTtotPAUSE_MS)."%</th></tr></table>";
for ($e=0; $e<count($sub_statusesARY); $e++) {
$Sstatus=$sub_statusesARY[$e];
$total_var=$Sstatus."_total";
$graph_var=$Sstatus."_graph";
$$graph_var.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim(sec_convert($$total_var, $TIME_H_agentperfdetail))."</th></tr></table>";
}
$JS_onload.="\tDrawPauseGraph('TOTAL', '1');\n";
$JS_text="<script language='Javascript'>\n";
$JS_text.="function DrawPauseGraph(graph, th_id) {\n";
$JS_text.=" var graph_TOTAL=\"$TOTAL_graph\";\n";
$JS_text.=" var graph_NONPAUSE=\"$NONPAUSE_graph\";\n";
$JS_text.=" var graph_PAUSE=\"$PAUSE_graph\";\n";
for ($e=0; $e<count($sub_statusesARY); $e++) {
$Sstatus=$sub_statusesARY[$e];
$graph_var=$Sstatus."_graph";
$JS_text.=" var graph_".$Sstatus."=\"".$$graph_var."\";\n";
}
$JS_text.=" for (var i=1; i<=".(3+count($sub_statusesARY))."; i++) {\n";
$JS_text.=" var cellID=\"pausegraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"pausegraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.="\n";
$JS_text.=" var graph_to_display=eval(\"graph_\"+graph);\n";
$JS_text.=" document.getElementById('pause_detail_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$JS_onload.="}\n";
if ($report_display_type=='HTML') {$JS_text.=$JS_onload;}
$graph_count=count($graph_array);
$graph_title=_QXZ("PAUSE CODE BREAKDOWN");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
$JS_text.="</script>\n";
$GRAPH3="<tr><td colspan='".(3+count($sub_statusesARY))."' class='graph_span_cell'><span id='pause_detail_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$GRAPH_text.=$JS_text.$GRAPH.$GRAPH2.$GRAPH3.$max;
$CSV_total=preg_replace('/\s/', '', "\"\",\"\",\""._QXZ("TOTALS")."\",\""._QXZ("AGENTS").":$TOT_AGENTS\",\"$TOTtotTOTAL_MS\",\"$TOTtotNONPAUSE_MS\",\"$TOTtotPAUSE_MS\",$CSVSUMstatuses");
@@ -2097,7 +2105,7 @@ fwrite($CSV_report, $CSV_total);
if ($report_display_type=="HTML")
{
$HTML_text.=$GRAPH_text;
$HTML_text.=$GRAPH.$JS_text;
}
else
{
@@ -32,6 +32,7 @@
# 160301-2051 - Expanded full name to 25 characters on text display
# 160310-2115 - Fixed bug in HTML display
# 160330-0648 - Fixed issue with names and non-latin setting
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -74,6 +75,7 @@ if ($search_archived_data=="checked") {$agent_log_table="vicidial_agent_log_arch
$report_name = 'Agent Status Detail';
$db_source = 'M';
$JS_text="<script language='Javascript'>\n";
$JS_onload="onload = function() {\n";
@@ -421,6 +423,9 @@ if ($file_download < 1)
echo "<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
echo "<link rel=\"stylesheet\" href=\"calendar.css\">\n";
echo "<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
echo "<script src='chart/Chart.js'></script>\n";
echo "<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
echo "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
echo "<TITLE>$report_name</TITLE></HEAD><BODY BGCOLOR=white marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -636,13 +641,6 @@ else
$ASCII_text.="| <a href=\"$LINKbase\">USER NAME</a> | <a href=\"$LINKbase&stage=ID\">ID</a> | <a href=\"$LINKbase&stage=LEADS\">CALLS</a> | <a href=\"$LINKbase&stage=CI\">CIcalls</a>| <a href=\"$LINKbase&stage=DNCCI\">DNC/CI%</a>|$statusesHTML\n";
$ASCII_text.="+---------------------------+----------+--------+--------+--------+$statusesHEAD\n";
for ($i=0; $i<count($sub_statusesARY); $i++) {
$Sstatus=$sub_statusesARY[$i];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
$GRAPH2.="<th class='column_header grey_graph_cell'><a href='#' onClick=\"DrawGraph('$Sstatus'); return false;\">$SstatusTXT</a></th>";
}
}
else
{
@@ -659,12 +657,6 @@ else
$max_calls=1;
$max_cicalls=1;
$max_dncci=1;
$GRAPH.="<BR><BR><a name='callgraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH2="<tr><th class='column_header grey_graph_cell' id='callgraph1'><a href='#' onClick=\"DrawGraph('CALLS', '1'); return false;\">CALLS</a></th><th class='column_header grey_graph_cell' id='callgraph2'><a href='#' onClick=\"DrawGraph('CICALLS', '2'); return false;\">CI/CALLS</a></th><th class='column_header grey_graph_cell' id='callgraph3'><a href='#' onClick=\"DrawGraph('DNCCI', '3'); return false;\">DNC/CI</a></th>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>CALL STATS BREAKDOWN</caption><tr><th class='thgraph' scope='col'>STATUS</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>CALLS </th></tr>";
$CICALLS_graph=$graph_header."<th class='thgraph' scope='col'>CI CALLS</th></tr>";
$DNCCI_graph=$graph_header."<th class='thgraph' scope='col'>DNC/CI%</th></tr>";
while ($m < $k)
{
@@ -899,64 +891,95 @@ else
$ASCII_text.="\n\n</PRE>";
# USE THIS FOR COMBINED graphs, use pipe-delimited array elements, dataset_name|index|link_name|graph_override
# You have to hard code the graph name in where it is overridden and mind the data indices. No other way to do it.
$multigraph_text="";
$graph_id++;
$graph_array=array("ASD_CALLSdata|1|CALLS|integer|", "ASD_CICALLSdata|2|CI/CALLS|integer|", "ASD_DNCCIdata|3|DNC/CI|percent|");
for ($e=0; $e<count($sub_statusesARY); $e++) {
$Sstatus=$sub_statusesARY[$e];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
$GRAPH2.="<th class='column_header grey_graph_cell' id='callgraph".($e+4)."'><a href='#' onClick=\"DrawGraph('$Sstatus', '".($e+4)."'); return false;\">$SstatusTXT</a></th>";
array_push($graph_array, "ASD_SUBSTATUS".$e."data|".($e+4)."|".$SstatusTXT."|integer|");
}
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$CICALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_cicalls))."' height='16' />".$graph_stats[$d][2]."</td></tr>";
$DNCCI_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_dncci))."' height='16' />".$graph_stats[$d][3]."%</td></tr>";
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
for ($e=0; $e<count($sub_statusesARY); $e++) {
$Sstatus=$sub_statusesARY[$e];
$varname=$Sstatus."_graph";
$max_varname="max_".$Sstatus;
# $max.= "<!-- $max_varname => ".$$max_varname." //-->\n";
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$$varname.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][($e+4)], $$max_varname))."' height='16' />".$graph_stats[$d][($e+4)]."</td></tr>";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
}
$CALLS_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($TOTcalls)."</th></tr></table>";
$CICALLS_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($CIScountTOT)."</th></tr></table>";
$DNCCI_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($DNCcountPCT)."%</th></tr></table>";
for ($e=0; $e<count($sub_statusesARY); $e++) {
$Sstatus=$sub_statusesARY[$e];
$total_var=$Sstatus."_total";
$graph_var=$Sstatus."_graph";
$$graph_var.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($$total_var)."</th></tr></table>";
}
$JS_onload.="\tDrawGraph('CALLS', '1');\n";
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var CICALLS_graph=\"$CICALLS_graph\";\n";
$JS_text.=" var DNCCI_graph=\"$DNCCI_graph\";\n";
for ($e=0; $e<count($sub_statusesARY); $e++) {
$Sstatus=$sub_statusesARY[$e];
$graph_var=$Sstatus."_graph";
$JS_text.=" var ".$Sstatus."_graph=\"".$$graph_var."\";\n";
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$JS_text.=" for (var i=1; i<=".(count($sub_statusesARY)+3)."; i++) {\n";
$JS_text.=" var cellID=\"callgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"callgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.="\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('agent_time_detail_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$GRAPH3="<tr><td colspan='".(3+$sub_status_count)."' class='graph_span_cell'><span id='agent_time_detail_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
# echo $GRAPH.$GRAPH2.$GRAPH3.$max;
$graph_count=count($graph_array);
$graph_title=_QXZ("AGENT STATUS DETAIL REPORT");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
}
else
{
@@ -1102,8 +1125,7 @@ echo "</FORM>";
if ($report_display_type=="HTML")
{
echo $GRAPH.$GRAPH2.$GRAPH3;
echo $JS_text;
echo $GRAPH.$JS_text;
}
else
{
@@ -49,6 +49,7 @@
# 160301-2051 - Expanded full name to 25 characters on text display
# 160330-0649 - Fixed issue with names and non-latin setting
# 160411-1958 - Fixed issue with download field order
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -476,6 +477,9 @@ if ($file_download < 1)
echo "<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
echo "<link rel=\"stylesheet\" href=\"calendar.css\">\n";
echo "<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
echo "<script src='chart/Chart.js'></script>\n";
echo "<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
echo "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
echo "<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=white marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -573,32 +577,7 @@ else
$max_pause=1;
$max_dead=1;
$max_customer=1;
$GRAPH.="<a name='timegraph'/><table border='0' cellpadding='0' cellspacing='2' width='1000'>";
$GRAPH2="<tr><th class='column_header grey_graph_cell' id='timegraph1'><a href='#' onClick=\"DrawGraph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th class='column_header grey_graph_cell' id='timegraph2'><a href='#' onClick=\"DrawGraph('TIMECLOCK', '2'); return false;\">"._QXZ("TIME CLOCK")."</a></th><th class='column_header grey_graph_cell' id='timegraph3'><a href='#' onClick=\"DrawGraph('AGENTTIME', '3'); return false;\">"._QXZ("LOGIN TIME")."</a></th>";
if ($show_parks) {
$GRAPH2.="<th class='column_header grey_graph_cell' id='timegraph15'><a href='#' onClick=\"DrawGraph('PARKS', '15'); return false;\">"._QXZ("PARKS")."</a></th><th class='column_header grey_graph_cell' id='timegraph16'><a href='#' onClick=\"DrawGraph('PARKTIME', '16'); return false;\">"._QXZ("PARKTIME")."</a></th><th class='column_header grey_graph_cell' id='timegraph17'><a href='#' onClick=\"DrawGraph('AVGPARK', '17'); return false;\">"._QXZ("AVGPARK")."</a></th><th class='column_header grey_graph_cell' id='timegraph18'><a href='#' onClick=\"DrawGraph('PARKSCALL', '18'); return false;\">"._QXZ("PARKS/CALL")."</a></th>";
}
$GRAPH2.="<th class='column_header grey_graph_cell' id='timegraph4'><a href='#' onClick=\"DrawGraph('WAIT', '4'); return false;\">"._QXZ("WAIT")."</a></th><th class='column_header grey_graph_cell' id='timegraph14'><a href='#' onClick=\"DrawGraph('WAITPCT', '14'); return false;\">"._QXZ("WAIT")." %</a></th><th class='column_header grey_graph_cell' id='timegraph5'><a href='#' onClick=\"DrawGraph('TALK', '5'); return false;\">"._QXZ("TALK")."</a></th><th class='column_header grey_graph_cell' id='timegraph10'><a href='#' onClick=\"DrawGraph('TALKPCT', '10'); return false;\">"._QXZ("TALKTIME")."%</a></th><th class='column_header grey_graph_cell' id='timegraph6'><a href='#' onClick=\"DrawGraph('DISPO', '6'); return false;\">"._QXZ("DISPO")."</a></th><th class='column_header grey_graph_cell' id='timegraph11'><a href='#' onClick=\"DrawGraph('DISPOPCT', '11'); return false;\">"._QXZ("DISPOTIME")."%</a></th><th class='column_header grey_graph_cell' id='timegraph7'><a href='#' onClick=\"DrawGraph('PAUSE', '7'); return false;\">"._QXZ("PAUSE")."</a></th><th class='column_header grey_graph_cell' id='timegraph12'><a href='#' onClick=\"DrawGraph('PAUSEPCT', '12'); return false;\">"._QXZ("PAUSETIME")."%</a></th><th class='column_header grey_graph_cell' id='timegraph8'><a href='#' onClick=\"DrawGraph('DEAD', '8'); return false;\">"._QXZ("DEAD")."</a></th><th class='column_header grey_graph_cell' id='timegraph13'><a href='#' onClick=\"DrawGraph('DEADPCT', '13'); return false;\">"._QXZ("DEADTIME")."%</a></th><th class='column_header grey_graph_cell' id='timegraph9'><a href='#' onClick=\"DrawGraph('CUSTOMER', '9'); return false;\">"._QXZ("CUSTOMER")."</a></th>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("AGENT TIME BREAKDOWN")."</caption><tr><th class='thgraph' scope='col'>STATUS</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")." </th></tr>";
$TIMECLOCK_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TIME CLOCK")."</th></tr>";
$AGENTTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("LOGIN TIME")."</th></tr>";
$WAIT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("WAIT")."</th></tr>";
$WAITPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("WAIT")." %</th></tr>";
$TALK_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TALK")."</th></tr>";
$TALKPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TALK TIME")." %</th></tr>";
$DISPO_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DISPO")."</th></tr>";
$DISPOPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DISPO TIME")." %</th></tr>";
$PAUSE_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("PAUSE")."</th></tr>";
$PAUSEPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("PAUSE TIME")." %</th></tr>";
$DEAD_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DEAD")."</th></tr>";
$DEADPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DEAD TIME")." %</th></tr>";
$CUSTOMER_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CUSTOMER")."</th></tr>";
$PARKS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("PARKS")."</th></tr>";
$PARKTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("PARKTIME")."</th></tr>";
$AVGPARK_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVGPARK")."</th></tr>";
$PARKSCALL_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("PARKSCALL")."</th></tr>";
while ($i < $users_to_print)
{
$row=mysqli_fetch_row($rslt);
@@ -951,12 +930,14 @@ else
### BEGIN loop through each status ###
$n=0;
$sub_status_array=array();
while ($n < $sub_status_count)
{
$Sstatus=$sub_statusesARY[$n];
$SstatusTXT='';
$varname=$Sstatus."_graph";
$$varname=$graph_header."<th class='thgraph' scope='col'>$Sstatus</th></tr>";
array_push($sub_status_array, "ATD_SUBSTATUS".$n."data|$n|$Sstatus|sub_status_array");
$max_varname="max_".$Sstatus;
### BEGIN loop through each stat line ###
$i=0; $status_found=0;
@@ -971,6 +952,9 @@ else
if ($PCpause_sec[$i]>$$max_varname) {$$max_varname=$PCpause_sec[$i];}
$graph_stats_sub[$m][$n]=$PCpause_sec[$i];
$n1=($n+19); # THIS IS FOR THE GRAPHING FURTHER DOWN; COULDN'T THINK OF A BETTER WAY TO DO THIS.
$graph_stats[$m][$n1]=$PCpause_sec[$i];
$SstatusTXT = sprintf("%10s", $pfUSERcodePAUSE_MS);
$SstatusesHTML .= " $SstatusTXT |";
$SstatusesFILE .= ",$USERcodePAUSE_MS";
@@ -1296,116 +1280,102 @@ else
$Sstatus=$sub_statusesARY[$e];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
$GRAPH2.="<th class='column_header grey_graph_cell' id='timegraph".(15+$e)."'><a href='#' onClick=\"DrawGraph('$Sstatus', '".(15+$e)."'); return false;\">$SstatusTXT</a></th>";
}
for ($d=0; $d<count($graph_stats); $d++)
{
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
if ($atdr_login_logout_user_link > 0)
{
$CALLS_graph.=" <tr><td class='chart_td$class'><a href=\'./user_stats.php?pause_code_rpt=1&begin_date=$query_date&end_date=$end_date&user=".$user_IDs[$d]."\'>".$graph_stats[$d][0]."</a></td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
}
else
{
$CALLS_graph.=" <tr><td class='chart_td$class'><a href=\'./user_stats.php?user=".$user_IDs[$d]."&begin_date=$query_date&end_date\'>".$graph_stats[$d][0]."</a></td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
}
$TIMECLOCK_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][2], $max_timeclock))."' height='16' />".sec_convert($graph_stats[$d][2], 'HF')."</td></tr>";
$AGENTTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][3], $max_agenttime))."' height='16' />".sec_convert($graph_stats[$d][3], 'HF')."</td></tr>";
$WAIT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][4], $max_wait))."' height='16' />".sec_convert($graph_stats[$d][4], 'HF')."</td></tr>";
$TALK_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][5], $max_talk))."' height='16' />".sec_convert($graph_stats[$d][5], 'HF')."</td></tr>";
$DISPO_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][6], $max_dispo))."' height='16' />".sec_convert($graph_stats[$d][6], 'HF')."</td></tr>";
$PAUSE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][7], $max_pause))."' height='16' />".sec_convert($graph_stats[$d][7], 'HF')."</td></tr>";
$DEAD_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][8], $max_dead))."' height='16' />".sec_convert($graph_stats[$d][8], 'HF')."</td></tr>";
$CUSTOMER_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][9], $max_customer))."' height='16' />".sec_convert($graph_stats[$d][9], 'HF')."</td></tr>";
$TALKPCT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][10], $max_talkpct))."' height='16' />".$graph_stats[$d][10]." %</td></tr>";
$DISPOPCT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][11], $max_dispopct))."' height='16' />".$graph_stats[$d][11]." %</td></tr>";
$PAUSEPCT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][12], $max_pausepct))."' height='16' />".$graph_stats[$d][12]." %</td></tr>";
$DEADPCT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][13], $max_deadpct))."' height='16' />".$graph_stats[$d][13]." %</td></tr>";
$WAITPCT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][14], $max_waitpct))."' height='16' />".$graph_stats[$d][14]." %</td></tr>";
$PARKS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][15], $max_user_holds))."' height='16' />".$graph_stats[$d][15]."</td></tr>";
$PARKTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][16], $max_total_hold_time))."' height='16' />".sec_convert($graph_stats[$d][16],'HF')."</td></tr>";
$AVGPARK_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][17], $max_avg_hold_time))."' height='17' />".sec_convert($graph_stats[$d][17],'HF')."</td></tr>";
$PARKSCALL_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats[$d][18], $max_user_hpc))."' height='16' />".$graph_stats[$d][18]."</td></tr>";
for ($e=0; $e<count($sub_statusesARY); $e++)
{
$Sstatus=$sub_statusesARY[$e];
$varname=$Sstatus."_graph";
$max_varname="max_".$Sstatus;
#$max.= "<!-- $max_varname => ".$$max_varname." //-->\n";
# USE THIS FOR COMBINED graphs, use pipe-delimited array elements, dataset_name|index|link_name|graph_override
# You have to hard code the graph name in where it is overridden and mind the data indices. No other way to do it.
$multigraph_text="";
$graph_id++;
$graph_array=array("ATD_CALLSdata|1|CALLS|integer|", "ATD_TIMECLOCKdata|2|TIME CLOCK|time|", "ATD_LOGINTIMEdata|3|LOGIN TIME|time|");
if ($show_parks) {
array_push($graph_array, "ATD_PARKSdata|15|PARKS|integer|", "ATD_PARKTIMEdata|16|PARKTIME|time|", "ATD_AVGPARKdata|17|AVGPARK|time|", "ATD_PARKSCALLdata|18|PARKS/CALL|decimal|");
}
array_push($graph_array, "ATD_WAITdata|4|WAIT|time|", "ATD_WAITPCTdata|14|WAIT %|percent|", "ATD_TALKdata|5|TALK|time|", "ATD_TALKTIMEPCTdata|10|TALKTIME%|percent|", "ATD_DISPOdata|6|DISPO|time|", "ATD_DISPOTIMEPCTdata|11|DISPOTIME%|percent|", "ATD_PAUSEdata|7|PAUSE|time|", "ATD_PAUSETIMEPCTdata|12|PAUSETIME%|percent|", "ATD_DEADdata|8|DEAD|time|", "ATD_DEADTIMEPCTdata|13|DEADTIME%|percent|", "ATD_CUSTOMERdata|9|CUSTOMER|time|");
for ($e=0; $e<count($sub_statusesARY); $e++) {
$Sstatus=$sub_statusesARY[$e];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
array_push($graph_array, "ATD_SUBSTATUS".$e."data|".($e+19)."|".$SstatusTXT."|time|");
}
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$$varname.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(1000*$graph_stats_sub[$d][$e], $$max_varname))."' height='16' />".sec_convert($graph_stats_sub[$d][$e], 'HF')."</td></tr>";
}
}
$CALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTcalls)."</th></tr></table>";
$TIMECLOCK_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTtimeTC)."</th></tr></table>";
$AGENTTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTALtime)."</th></tr></table>";
$WAIT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTwait)."</th></tr></table>";
$TALK_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTtalk)."</th></tr></table>";
$DISPO_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTdispo)."</th></tr></table>";
$PAUSE_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTpause)."</th></tr></table>";
$DEAD_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTdead)."</th></tr></table>";
$CUSTOMER_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTcustomer)."</th></tr></table>";
$WAITPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("AVERAGE").":</th><th class='thgraph' scope='col'>".trim($hTOTwaitpct)."</th></tr></table>";
$TALKPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("AVERAGE").":</th><th class='thgraph' scope='col'>".trim($hTOTtalkpct)."</th></tr></table>";
$DISPOPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("AVERAGE").":</th><th class='thgraph' scope='col'>".trim($hTOTdispopct)."</th></tr></table>";
$PAUSEPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("AVERAGE").":</th><th class='thgraph' scope='col'>".trim($hTOTpausepct)."</th></tr></table>";
$DEADPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("AVERAGE").":</th><th class='thgraph' scope='col'>".trim($hTOTdeadpct)."</th></tr></table>";
$PARKS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTuser_holds)."</th></tr></table>";
$PARKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($hTOTtotal_hold_time)."</th></tr></table>";
$AVGPARK_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("AVERAGE").":</th><th class='thgraph' scope='col'>".trim($hTOTavg_hold_time)."</th></tr></table>";
$PARKSCALL_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("AVERAGE").":</th><th class='thgraph' scope='col'>".trim($hTOTuser_hpc)."</th></tr></table>";
for ($e=0; $e<count($sub_statusesARY); $e++)
{
$Sstatus=$sub_statusesARY[$e];
$total_var=$Sstatus."_total";
$graph_var=$Sstatus."_graph";
$$graph_var.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($$total_var)."</th></tr></table>";
# $JS_text.="var ".$Sstatus."_graph=\"".$$graph_var."\";\n";
}
$JS_onload.="\tDrawGraph('CALLS', '1');\n";
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var TIMECLOCK_graph=\"$TIMECLOCK_graph\";\n";
$JS_text.=" var AGENTTIME_graph=\"$AGENTTIME_graph\";\n";
$JS_text.=" var WAIT_graph=\"$WAIT_graph\";\n";
$JS_text.=" var TALK_graph=\"$TALK_graph\";\n";
$JS_text.=" var DISPO_graph=\"$DISPO_graph\";\n";
$JS_text.=" var PAUSE_graph=\"$PAUSE_graph\";\n";
$JS_text.=" var DEAD_graph=\"$DEAD_graph\";\n";
$JS_text.=" var CUSTOMER_graph=\"$CUSTOMER_graph\";\n";
$JS_text.=" var WAITPCT_graph=\"$WAITPCT_graph\";\n";
$JS_text.=" var TALKPCT_graph=\"$TALKPCT_graph\";\n";
$JS_text.=" var DISPOPCT_graph=\"$DISPOPCT_graph\";\n";
$JS_text.=" var PAUSEPCT_graph=\"$PAUSEPCT_graph\";\n";
$JS_text.=" var DEADPCT_graph=\"$DEADPCT_graph\";\n";
$JS_text.=" var PARKS_graph=\"$PARKS_graph\";\n";
$JS_text.=" var PARKTIME_graph=\"$PARKTIME_graph\";\n";
$JS_text.=" var AVGPARK_graph=\"$AVGPARK_graph\";\n";
$JS_text.=" var PARKSCALL_graph=\"$PARKSCALL_graph\";\n";
for ($e=0; $e<count($sub_statusesARY); $e++)
{
$Sstatus=$sub_statusesARY[$e];
$graph_var=$Sstatus."_graph";
$JS_text.=" var graph_".$Sstatus."=\"".$$graph_var."\";\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$JS_text.=" for (var i=1; i<=".(14+count($sub_statusesARY))."; i++) {\n";
$JS_text.=" var cellID=\"timegraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"timegraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.="\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('agent_time_detail_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("AGENT TIME DETAIL REPORT");
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
$GRAPH3="<tr><td colspan='".(18+$sub_status_count)."' class='graph_span_cell'><span id='agent_time_detail_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
# echo $GRAPH.$GRAPH2.$GRAPH3.$max;
}
else
{
@@ -1569,8 +1539,8 @@ echo "</FORM>";
if ($report_display_type=="HTML")
{
echo $JS_text;
echo $GRAPH.$GRAPH2.$GRAPH3.$max;
echo $JS_text;
}
else
{
@@ -23,6 +23,7 @@
# 141114-0905 - Finalized adding QXZ translation to all admin files
# 141230-1520 - Added code for on-the-fly language translations display
# 160227-1934 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -374,6 +375,10 @@ if ($file_download < 1)
<script language="JavaScript" src="calendar_db.js"></script>
<link rel="stylesheet" href="calendar.css">
<link rel="stylesheet" href="horizontalbargraph.css">
<?php require("chart_button.php"); ?>
<script src="chart/Chart.js"></script>
<script language="JavaScript" src="vicidial_chart_functions.js"></script>
<script language='Javascript'>
function openNewWindow(url)
{
@@ -614,14 +619,6 @@ else
$ASCII_text.="| <a href=\"$LINKbase&stage=NAME\">"._QXZ("USER NAME",15)."</a> | <a href=\"$LINKbase&stage=ID\">"._QXZ("ID",8)."</a> | <a href=\"$LINKbase&stage=GROUP\">"._QXZ("USER GROUP",20)."</a> | <a href=\"$LINKbase&stage=TCLOCK\">"._QXZ("TIME CLOCK",10)."</a> | "._QXZ("TIME CLOCK PUNCHES",18)."\n";
$ASCII_text.="+-----------------+----------+----------------------+------------+--------------------\n";
$GRAPH.="<table cellspacing=\"0\" cellpadding=\"0\" summary=\"AGENT TIME-CLOCK DETAIL\" class=\"horizontalgraph\">\n";
$GRAPH.=" <caption align=\"top\">"._QXZ("AGENT TIME-CLOCK DETAIL")."</caption>\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("USER/USER GROUP")."</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\" nowrap>"._QXZ("TIME CLOCK")." </th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TIME CLOCK PUNCHES")."</th>\n";
$GRAPH.=" </tr>\n";
}
else
{
@@ -751,7 +748,7 @@ else
if ($file_download < 1)
{
$Toutput = "| $Sname[$m] | <a href=\"./user_stats.php?user=$RAWuser&begin_date=$query_date_D&end_date=$end_date_D\">$Suser[$m]</a> | $Sgroup[$m] | $StimeTC[$m]$TCuserAUTOLOGOUT| $TCdetail\n";
$graph_stats[$q][0]="$Sname[$m] - $Suser[$m] / $Sgroup[$m]";
$graph_stats[$q][0]=trim($Sname[$m])." - ".trim($Suser[$m])." / ".trim($Sgroup[$m]);
$graph_stats[$q][1]="$RAWtimeTCsec";
$graph_stats[$q][2]="$TCuserAUTOLOGOUT";
$graph_stats[$q][3]="$TCdetail";
@@ -799,15 +796,107 @@ else
$m++;
}
##### END loop through each user formatting data for output
for ($i=0; $i<count($graph_stats); $i++) {
if ($i==0) {$class=" first";} else if (($i+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph$class\" scope=\"col\">".$graph_stats[$i][0]."</th>\n";
$GRAPH.=" <th class=\"thgraph value$class\" scope=\"col\" nowrap><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(200*$graph_stats[$i][1], $max_time))."\" height=\"16\" />".sec_convert($graph_stats[$i][1], 'H').$graph_stats[$i][2]."</th>\n";
$GRAPH.=" <th class=\"thgraph$class\" scope=\"col\">".$graph_stats[$i][3]."</th>\n";
$GRAPH.=" </tr>\n";
$JS_text="<script language='Javascript'>\n";
#########
$graph_array=array("ATDdata|||time|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".$graph_stats[$d][0]." ".$graph_stats[$d][2]."\",";
$data.="\"".$graph_stats[$d][1]."\",";
$current_graph_total+=$graph_stats[$d][1];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("AGENT TIME-CLOCK DETAIL");
include("graphcanvas.inc");
$JS_text.="</script>\n";
# SPECIAL EXCEPTION FOR THIS GRAPH
$graphCanvas.="<table cellspacing=\"0\" cellpadding=\"1\" summary=\""._QXZ("TIME CLOCK PUNCHES")."\" class=\"horizontalgraph\" width=500>\n";
$graphCanvas.=" <caption align=\"top\">"._QXZ("TIME CLOCK PUNCHES")."</caption>\n";
$graphCanvas.=" <tr>\n";
$graphCanvas.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("USER/USER GROUP")."</th>\n";
$graphCanvas.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TIME CLOCK PUNCHES")."</th>\n";
$graphCanvas.=" </tr>\n";
for ($q=0; $q<count($graph_stats); $q++) {
if ($q==0) {$class=" first";} else if (($q+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$graphCanvas.=" <tr>\n";
$graphCanvas.=" <th class=\"thgraph$class\" scope=\"col\">".$graph_stats[$q][0]."</th>\n";
$graphCanvas.=" <th class=\"thgraph$class\" scope=\"col\">".$graph_stats[$q][3]."</th>\n";
$graphCanvas.=" </tr>\n";
}
$graphCanvas.="</table>\n";
$GRAPH_text.=$graphCanvas;
$TOT_AGENTS = sprintf("%4s", $m);
$k=$m;
@@ -865,19 +954,13 @@ else
$ASCII_text.="+-----------------+----------+----------------------+------------+--------------------\n";
$ASCII_text.="| "._QXZ("TOTALS",7,"r")." "._QXZ("AGENTS",13,"r").":$TOT_AGENTS | |$TOTtimeTC |\n";
$ASCII_text.="+----------------------------+ +------------+\n";
$GRAPH.=" <tr>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTALS")."</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("AGENTS").": $TOT_AGENTS</th>\n";
$GRAPH.=" <th class=\"thgraph\" scope=\"col\">$TOTtimeTC</th>\n";
$GRAPH.=" </tr>\n";
$GRAPH.=" </table>\n";
if ($AUTOLOGOUTflag > 0)
{
$ASCII_text.=" * "._QXZ("denotes AUTOLOGOUT from timeclock")."\n";
$GRAPH.=" * "._QXZ("denotes AUTOLOGOUT from timeclock")."\n";
$GRAPH_text.=" * "._QXZ("denotes AUTOLOGOUT from timeclock")."\n";
}
$ASCII_text.="</PRE>";
$GRAPH.="</PRE>";
$GRAPH_text.="</PRE>";
}
else
{
@@ -935,7 +1018,7 @@ if ($file_download > 0)
if ($report_display_type=="HTML")
{
echo $GRAPH;
echo $GRAPH_text.$JS_text;
}
else
{
@@ -22,6 +22,7 @@
# 150516-1312 - Fixed Javascript element problem, Issue #857
# 151219-0107 - Added option for searching archived data
# 160227-1059 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -326,6 +327,9 @@ $HTML_head.=" </STYLE>\n";
$HTML_head.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HTML_head.="<script src='chart/Chart.js'></script>\n";
$HTML_head.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HTML_head.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HTML_head.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>$group_S\n";
@@ -472,7 +476,6 @@ while($i < $group_ct)
$dispo_ary="";
$ASCII_text.="<FONT SIZE=2><B>"._QXZ("List ID")." #$list_id: $list_name</B>\n";
$GRAPH.="<FONT SIZE=2><B>"._QXZ("List ID")." #$list_id: $list_name</B>\n";
$CSV_text.="\""._QXZ("List ID")." #$list_id: $list_name\"\n";
@@ -482,13 +485,6 @@ while($i < $group_ct)
$stat_rslt=mysql_to_mysqli($stat_stmt, $link);
if (mysqli_num_rows($stat_rslt)>0)
{
$GRAPH.="<a name='list_".$list_id."_graph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='33%' class='grey_graph_cell' id='list_".$list_id."_graph1'><a href='#' onClick=\"Draw".$list_id."Graph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th width='33%' class='grey_graph_cell' id='list_".$list_id."_graph2'><a href='#' onClick=\"Draw".$list_id."Graph('DURATION', '2'); return false;\">"._QXZ("DURATION")."</a></th><th width='34%' class='grey_graph_cell' id='list_".$list_id."_graph3'><a href='#' onClick=\"Draw".$list_id."Graph('HANDLETIME', '3'); return false;\">"._QXZ("HANDLE TIME")."</a></th></tr>";
$GRAPH.="<tr><td colspan='3' class='graph_span_cell'><span id='stats_".$list_id."_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("List ID")." #$list_id: $list_name</caption><tr><th class='thgraph' scope='col'>"._QXZ("DISPOSITION")."</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")." </th></tr>";
$DURATION_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DURATION")."</th></tr>";
$HANDLETIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("HANDLE TIME")."</th></tr>";
$total_calls=0; $total_handle_time=0; $total_duration=0;
@@ -589,33 +585,86 @@ while($i < $group_ct)
$ASCII_text .= "| "._QXZ("Completed:",19)." $COMP_count $COMP_percent% |\n";
$ASCII_text .= "+--------------------------------------------------------------+\n";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("CSL_CALLS".$list_id."data|1|CALLS|integer|", "CSL_DURATION".$list_id."data|2|DURATION|time|", "CSL_HANDLETIME".$list_id."data|3|HANDLE TIME|time|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
for ($d=0; $d<count($graph_stats); $d++)
{
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$DURATION_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_duration))."' height='16' />".sec_convert($graph_stats[$d][2], 'H')."</td></tr>";
$HANDLETIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_handletime))."' height='16' />".sec_convert($graph_stats[$d][3], 'H')."</td></tr>";
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$CALLS_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".trim($total_calls)."</th></tr></table>";
$DURATION_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".sec_convert($total_duration, 'H')."</th></tr></table>";
$HANDLETIME_graph.="<tr><th class='thgraph' scope='col'>TOTAL:</th><th class='thgraph' scope='col'>".sec_convert($total_handle_time, 'H')."</th></tr></table>";
$JS_onload.="\tDraw".$list_id."Graph('CALLS', '1');\n";
$JS_text.="function Draw".$list_id."Graph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var DURATION_graph=\"$DURATION_graph\";\n";
$JS_text.=" var HANDLETIME_graph=\"$HANDLETIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=3; i++) {\n";
$JS_text.=" var cellID=\"list_".$list_id."_graph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"list_".$list_id."_graph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('stats_".$list_id."_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
#$HTML_text.=$GRAPH;
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=""._QXZ("List ID")." #$list_id: $list_name";
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
}
else
{
@@ -637,7 +686,7 @@ $JS_text.="</script>\n";
if ($report_display_type=="HTML")
{
$HTML_text.=$JS_text.$GRAPH;
$HTML_text.=$GRAPH.$JS_text;
}
else
{
@@ -26,6 +26,7 @@
# 150516-1313 - Fixed Javascript element problem, Issue #857
# 151125-1629 - Added search archive option
# 160227-1142 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -370,7 +371,6 @@ $HEADER.=" .red {color: black; background-color: #FF9999}\n";
$HEADER.=" .orange {color: black; background-color: #FFCC99}\n";
$HEADER.="-->\n";
$HEADER.=" </STYLE>\n";
#if (!preg_match("/\|$group\|/i",$groups_string))
# {
# $HEADER.="<!-- group not found: $group $groups_string -->\n";
@@ -380,6 +380,9 @@ $HEADER.=" </STYLE>\n";
$HEADER.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HEADER.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HEADER.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HEADER.="<script src='chart/Chart.js'></script>\n";
$HEADER.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HEADER.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HEADER.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -1108,23 +1111,6 @@ else
$max_qtd_totaltalktime=1;
$max_qtd_totalwraptime=1;
$max_qtd_totalcalltime=1;
$GRAPH="<a name='multigroup_graph'/><table border='0' cellpadding='0' cellspacing='2' width='800'><tr><th width='10%' class='grey_graph_cell' id='multigroup_graph1'><a href='#' onClick=\"DrawGraph('OFFERED', '1'); return false;\">"._QXZ("TOTAL CALLS OFFERED")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph2'><a href='#' onClick=\"DrawGraph('ANSWERED', '2'); return false;\">"._QXZ("TOTAL CALLS ANSWERED")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph11'><a href='#' onClick=\"DrawGraph('AGENTS', '11'); return false;\">"._QXZ("TOTAL AGENTS ANSWERED")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph3'><a href='#' onClick=\"DrawGraph('ABANDONED', '3'); return false;\">"._QXZ("TOTAL CALLS ABANDONED")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph4'><a href='#' onClick=\"DrawGraph('ABANDONPCT', '4'); return false;\">"._QXZ("TOTAL ABANDON PERCENT")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph5'><a href='#' onClick=\"DrawGraph('AVGABANDONTIME', '5'); return false;\">"._QXZ("AVG ABANDON TIME")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph6'><a href='#' onClick=\"DrawGraph('AVGANSWERSPEED', '6'); return false;\">"._QXZ("AVG ANSWER SPEED")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph7'><a href='#' onClick=\"DrawGraph('AVGTALKTIME', '7'); return false;\">"._QXZ("AVG TALK TIME")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph8'><a href='#' onClick=\"DrawGraph('TOTALTALKTIME', '8'); return false;\">"._QXZ("TOTAL TALK TIME")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph9'><a href='#' onClick=\"DrawGraph('TOTALWRAPTIME', '9'); return false;\">"._QXZ("TOTAL WRAP TIME")."</a></th><th width='10%' class='grey_graph_cell' id='multigroup_graph10'><a href='#' onClick=\"DrawGraph('TOTALCALLTIME', '10'); return false;\">"._QXZ("TOTAL CALL TIME")."</a></th></tr><tr><td colspan='11' class='graph_span_cell' align='center'><span id='stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$MTD_GRAPH="<BR><BR><a name='MTD_graph'/><table border='0' cellpadding='0' cellspacing='2' width='800'><tr><th width='10%' class='grey_graph_cell' id='MTD_graph1'><a href='#' onClick=\"DrawMTDGraph('OFFERED', '1'); return false;\">"._QXZ("TOTAL CALLS OFFERED")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph2'><a href='#' onClick=\"DrawMTDGraph('ANSWERED', '2'); return false;\">"._QXZ("TOTAL CALLS ANSWERED")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph11'><a href='#' onClick=\"DrawMTDGraph('AGENTS', '11'); return false;\">"._QXZ("TOTAL AGENTS ANSWERED")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph3'><a href='#' onClick=\"DrawMTDGraph('ABANDONED', '3'); return false;\">"._QXZ("TOTAL CALLS ABANDONED")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph4'><a href='#' onClick=\"DrawMTDGraph('ABANDONPCT', '4'); return false;\">"._QXZ("TOTAL ABANDON PERCENT")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph5'><a href='#' onClick=\"DrawMTDGraph('AVGABANDONTIME', '5'); return false;\">"._QXZ("AVG ABANDON TIME")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph6'><a href='#' onClick=\"DrawMTDGraph('AVGANSWERSPEED', '6'); return false;\">"._QXZ("AVG ANSWER SPEED")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph7'><a href='#' onClick=\"DrawMTDGraph('AVGTALKTIME', '7'); return false;\">"._QXZ("AVG TALK TIME")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph8'><a href='#' onClick=\"DrawMTDGraph('TOTALTALKTIME', '8'); return false;\">"._QXZ("TOTAL TALK TIME")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph9'><a href='#' onClick=\"DrawMTDGraph('TOTALWRAPTIME', '9'); return false;\">"._QXZ("TOTAL WRAP TIME")."</a></th><th width='10%' class='grey_graph_cell' id='MTD_graph10'><a href='#' onClick=\"DrawMTDGraph('TOTALCALLTIME', '10'); return false;\">"._QXZ("TOTAL CALL TIME")."</a></th></tr><tr><td colspan='11' class='graph_span_cell' align='center'><span id='MTD_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$WTD_GRAPH="<BR><BR><a name='WTD_graph'/><table border='0' cellpadding='0' cellspacing='2' width='800'><tr><th width='10%' class='grey_graph_cell' id='WTD_graph1'><a href='#' onClick=\"DrawWTDGraph('OFFERED', '1'); return false;\">"._QXZ("TOTAL CALLS OFFERED")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph2'><a href='#' onClick=\"DrawWTDGraph('ANSWERED', '2'); return false;\">"._QXZ("TOTAL CALLS ANSWERED")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph11'><a href='#' onClick=\"DrawWTDGraph('AGENTS', '11'); return false;\">"._QXZ("TOTAL AGENTS ANSWERED")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph3'><a href='#' onClick=\"DrawWTDGraph('ABANDONED', '3'); return false;\">"._QXZ("TOTAL CALLS ABANDONED")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph4'><a href='#' onClick=\"DrawWTDGraph('ABANDONPCT', '4'); return false;\">"._QXZ("TOTAL ABANDON PERCENT")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph5'><a href='#' onClick=\"DrawWTDGraph('AVGABANDONTIME', '5'); return false;\">"._QXZ("AVG ABANDON TIME")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph6'><a href='#' onClick=\"DrawWTDGraph('AVGANSWERSPEED', '6'); return false;\">"._QXZ("AVG ANSWER SPEED")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph7'><a href='#' onClick=\"DrawWTDGraph('AVGTALKTIME', '7'); return false;\">"._QXZ("AVG TALK TIME")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph8'><a href='#' onClick=\"DrawWTDGraph('TOTALTALKTIME', '8'); return false;\">"._QXZ("TOTAL TALK TIME")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph9'><a href='#' onClick=\"DrawWTDGraph('TOTALWRAPTIME', '9'); return false;\">"._QXZ("TOTAL WRAP TIME")."</a></th><th width='10%' class='grey_graph_cell' id='WTD_graph10'><a href='#' onClick=\"DrawWTDGraph('TOTALCALLTIME', '10'); return false;\">"._QXZ("TOTAL CALL TIME")."</a></th></tr><tr><td colspan='11' class='graph_span_cell' align='center'><span id='WTD_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$QTD_GRAPH="<BR><BR><a name='QTD_graph'/><table border='0' cellpadding='0' cellspacing='2' width='800'><tr><th width='10%' class='grey_graph_cell' id='QTD_graph1'><a href='#' onClick=\"DrawQTDGraph('OFFERED', '1'); return false;\">"._QXZ("TOTAL CALLS OFFERED")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph2'><a href='#' onClick=\"DrawQTDGraph('ANSWERED', '2'); return false;\">"._QXZ("TOTAL CALLS ANSWERED")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph11'><a href='#' onClick=\"DrawQTDGraph('AGENTS', '11'); return false;\">"._QXZ("TOTAL AGENTS ANSWERED")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph3'><a href='#' onClick=\"DrawQTDGraph('ABANDONED', '3'); return false;\">"._QXZ("TOTAL CALLS ABANDONED")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph4'><a href='#' onClick=\"DrawQTDGraph('ABANDONPCT', '4'); return false;\">"._QXZ("TOTAL ABANDON PERCENT")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph5'><a href='#' onClick=\"DrawQTDGraph('AVGABANDONTIME', '5'); return false;\">"._QXZ("AVG ABANDON TIME")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph6'><a href='#' onClick=\"DrawQTDGraph('AVGANSWERSPEED', '6'); return false;\">"._QXZ("AVG ANSWER SPEED")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph7'><a href='#' onClick=\"DrawQTDGraph('AVGTALKTIME', '7'); return false;\">"._QXZ("AVG TALK TIME")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph8'><a href='#' onClick=\"DrawQTDGraph('TOTALTALKTIME', '8'); return false;\">"._QXZ("TOTAL TALK TIME")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph9'><a href='#' onClick=\"DrawQTDGraph('TOTALWRAPTIME', '9'); return false;\">"._QXZ("TOTAL WRAP TIME")."</a></th><th width='10%' class='grey_graph_cell' id='QTD_graph10'><a href='#' onClick=\"DrawQTDGraph('TOTALCALLTIME', '10'); return false;\">"._QXZ("TOTAL CALL TIME")."</a></th></tr><tr><td colspan='11' class='graph_span_cell' align='center'><span id='QTD_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("DAILY RPT")." - $query_date_BEGIN "._QXZ("to")." $query_date_END</caption><tr><th class='thgraph' scope='col'>"._QXZ("DATE/TIME RANGE")."</th>";
$OFFERED_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL CALLS OFFERED")."</th></tr>";
$ANSWERED_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL CALLS ANSWERED")." </th></tr>";
$AGENTS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL AGENTS ANSWERED")." </th></tr>";
$ABANDONED_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL CALLS ABANDONED")."</th></tr>";
$ABANDONPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL ABANDON PERCENT")."</th></tr>";
$AVGABANDONTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG ABANDON TIME")."</th></tr>";
$AVGANSWERSPEED_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG ANSWER SPEED")."</th></tr>";
$AVGTALKTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG TALK TIME")."</th></tr>";
$TOTALTALKTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL TALK TIME")."</th></tr>";
$TOTALWRAPTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL WRAP TIME")."</th></tr>";
$TOTALCALLTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TOTAL CALL TIME")."</th></tr>";
##########################
$totCALLSwtd=0;
@@ -1593,32 +1579,87 @@ else
$wtd_graph_stats[$wa][9]=trim($totANSWERSwrapTIMEwtd);
$wtd_graph_stats[$wa][10]=trim($totANSWERStotTIMEwtd);
$wtd_graph_stats[$wa][17]=trim($totAGENTSwtd);
$wtd_OFFERED_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"), $OFFERED_graph);
$wtd_ANSWERED_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"),$ANSWERED_graph);
$wtd_AGENTS_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"), $AGENTS_graph);
$wtd_ABANDONED_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"),$ABANDONED_graph);
$wtd_ABANDONPCT_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"),$ABANDONPCT_graph);
$wtd_AVGABANDONTIME_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"),$AVGABANDONTIME_graph);
$wtd_AVGANSWERSPEED_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"),$AVGANSWERSPEED_graph);
$wtd_AVGTALKTIME_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"),$AVGTALKTIME_graph);
$wtd_TOTALTALKTIME_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"),$TOTALTALKTIME_graph);
$wtd_TOTALWRAPTIME_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"),$TOTALWRAPTIME_graph);
$wtd_TOTALCALLTIME_graph=preg_replace('/DAILY/', _QXZ("WEEK-TO-DATE"),$TOTALCALLTIME_graph);
for ($q=0; $q<count($wtd_graph_stats); $q++) {
if ($q==0) {$class=" first";} else if (($q+1)==count($wtd_graph_stats)) {$class=" last";} else {$class="";}
$wtd_OFFERED_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][1], $max_wtd_offered))."' height='16' />".$wtd_graph_stats[$q][1]."</td></tr>";
$wtd_ANSWERED_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][2], $max_wtd_answered))."' height='16' />".$wtd_graph_stats[$q][2]."</td></tr>";
$wtd_AGENTS_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][17], $max_wtd_agents))."' height='16' />".$wtd_graph_stats[$q][17]."</td></tr>";
$wtd_ABANDONED_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][3], $max_wtd_abandoned))."' height='16' />".$wtd_graph_stats[$q][3]."</td></tr>";
$wtd_ABANDONPCT_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][4], $max_wtd_abandonpct))."' height='16' />".$wtd_graph_stats[$q][4]."% </td></tr>";
$wtd_AVGABANDONTIME_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][11], $max_wtd_avgabandontime))."' height='16' />".$wtd_graph_stats[$q][5]."</td></tr>";
$wtd_AVGANSWERSPEED_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][12], $max_wtd_avganswerspeed))."' height='16' />".$wtd_graph_stats[$q][6]."</td></tr>";
$wtd_AVGTALKTIME_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][16], $max_wtd_avgtalktime))."' height='16' />".$wtd_graph_stats[$q][7]."</td></tr>";
$wtd_TOTALTALKTIME_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][15], $max_wtd_totaltalktime))."' height='16' />".$wtd_graph_stats[$q][8]."</td></tr>";
$wtd_TOTALWRAPTIME_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][13], $max_wtd_totalwraptime))."' height='16' />".$wtd_graph_stats[$q][9]."</td></tr>";
$wtd_TOTALCALLTIME_graph.=" <tr><td class='chart_td$class'>".$wtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$wtd_graph_stats[$q][14], $max_wtd_totalcalltime))."' height='16' />".$wtd_graph_stats[$q][10]."</td></tr>";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("IDR_wtd_TOTALCALLSOFFEREDdata|1|TOTAL CALLS OFFERED|integer|", "IDR_wtd_TOTALCALLSANSWEREDdata|2|TOTAL CALLS ANSWERED|integer|", "IDR_wtd_TOTALAGENTSANSWEREDdata|17|TOTAL AGENTS ANSWERED|integer|", "IDR_wtd_TOTALCALLSABANDONEDdata|3|TOTAL CALLS ABANDONED|integer|", "IDR_wtd_TOTALABANDONPERCENTdata|4|TOTAL ABANDON PERCENT|percent|", "IDR_wtd_AVGABANDONTIMEdata|11|AVG ABANDON TIME|time|", "IDR_wtd_AVGANSWERSPEEDdata|12|AVG ANSWER SPEED|time|", "IDR_wtd_AVGTALKTIMEdata|16|AVG TALK TIME|time|", "IDR_wtd_TOTALTALKTIMEdata|15|TOTAL TALK TIME|time|", "IDR_wtd_TOTALWRAPTIMEdata|13|TOTAL WRAP TIME|time|", "IDR_wtd_TOTALCALLTIMEdata|14|TOTAL CALL TIME|time|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($wtd_graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $wtd_graph_stats[$d][0])."\",";
$data.="\"".$wtd_graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$wtd_graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA=substr($graphConstantsA,0,-1)."],\n";
$graphConstantsB=substr($graphConstantsB,0,-1)."],\n";
$graphConstantsC=substr($graphConstantsC,0,-1)."],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("WEEKLY REPORT")." - $query_date_BEGIN "._QXZ("to")." $query_date_END";
include("graphcanvas.inc");
$WTD_GRAPH=$graphCanvas;
$ASCII_text.="$MAINH\n";
$ASCII_text.="| "._QXZ("Week to date",41,"r")." | $totCALLSwtd | $totANSWERSwtd | $totAGENTSwtd | $totABANDONSwtd | $totABANDONSpctwtd%| $totABANDONSavgTIMEwtd | $totANSWERSavgspeedTIMEwtd | $totANSWERSavgTIMEwtd | $totANSWERStalkTIMEwtd | $totANSWERSwrapTIMEwtd | $totANSWERStotTIMEwtd |";
$CSV_text.="\""._QXZ("WTD")."\",\"$totCALLSwtd\",\"$totANSWERSwtd\",\"$totAGENTSwtd\",\"$totABANDONSwtd\",\"$totABANDONSpctwtd%\",\"$totABANDONSavgTIMEwtd\",\"$totANSWERSavgspeedTIMEwtd\",\"$totANSWERSavgTIMEwtd\",\"$totANSWERStalkTIMEwtd\",\"$totANSWERSwrapTIMEwtd\",\"$totANSWERStotTIMEwtd\"";
@@ -1689,42 +1730,86 @@ else
$mtd_graph_stats[$ma][9]=trim($totANSWERSwrapTIMEmtd);
$mtd_graph_stats[$ma][10]=trim($totANSWERStotTIMEmtd);
$wtd_graph_stats[$ma][17]=trim($totAGENTSmtd);
$mtd_OFFERED_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$OFFERED_graph);
$mtd_ANSWERED_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$ANSWERED_graph);
$mtd_AGENTS_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"), $AGENTS_graph);
$mtd_ABANDONED_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$ABANDONED_graph);
$mtd_ABANDONPCT_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$ABANDONPCT_graph);
$mtd_AVGABANDONTIME_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$AVGABANDONTIME_graph);
$mtd_AVGANSWERSPEED_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$AVGANSWERSPEED_graph);
$mtd_AVGTALKTIME_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$AVGTALKTIME_graph);
$mtd_TOTALTALKTIME_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$TOTALTALKTIME_graph);
$mtd_TOTALWRAPTIME_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$TOTALWRAPTIME_graph);
$mtd_TOTALCALLTIME_graph=preg_replace('/DAILY/', _QXZ("MONTH-TO-DATE"),$TOTALCALLTIME_graph);
for ($q=0; $q<count($mtd_graph_stats); $q++) {
if ($q==0) {$class=" first";} else if (($q+1)==count($mtd_graph_stats)) {$class=" last";} else {$class="";}
$mtd_OFFERED_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][1], $max_mtd_offered))."' height='16' />".$mtd_graph_stats[$q][1]."</td></tr>";
$mtd_ANSWERED_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][2], $max_mtd_answered))."' height='16' />".$mtd_graph_stats[$q][2]."</td></tr>";
$mtd_AGENTS_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][17], $max_mtd_agents))."' height='16' />".$mtd_graph_stats[$q][17]."</td></tr>";
$mtd_ABANDONED_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][3], $max_mtd_abandoned))."' height='16' />".$mtd_graph_stats[$q][3]."</td></tr>";
$mtd_ABANDONPCT_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][4], $max_mtd_abandonpct))."' height='16' />".$mtd_graph_stats[$q][4]."%</td></tr>";
$mtd_AVGABANDONTIME_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][11], $max_mtd_avgabandontime))."' height='16' />".$mtd_graph_stats[$q][5]."</td></tr>";
$mtd_AVGANSWERSPEED_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][12], $max_mtd_avganswerspeed))."' height='16' />".$mtd_graph_stats[$q][6]."</td></tr>";
$mtd_AVGTALKTIME_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][16], $max_mtd_avgtalktime))."' height='16' />".$mtd_graph_stats[$q][7]."</td></tr>";
$mtd_TOTALTALKTIME_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][15], $max_mtd_totaltalktime))."' height='16' />".$mtd_graph_stats[$q][8]."</td></tr>";
$mtd_TOTALWRAPTIME_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][13], $max_mtd_totalwraptime))."' height='16' />".$mtd_graph_stats[$q][9]."</td></tr>";
$mtd_TOTALCALLTIME_graph.=" <tr><td class='chart_td$class'>".$mtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$mtd_graph_stats[$q][14], $max_mtd_totalcalltime))."' height='16' />".$mtd_graph_stats[$q][10]."</td></tr>";
$graph_totCALLSmtd+=$mtd_graph_stats[$q][1];
$graph_totANSWERSmtd+=$mtd_graph_stats[$q][2];
$graph_totAGENTSmtd+=$mtd_graph_stats[$q][17];
$graph_totABANDONSmtd+=$mtd_graph_stats[$q][3];
$graph_totABANDONSpctmtd+=$mtd_graph_stats[$q][4];
$graph_totABANDONSavgTIMEmtd+=$mtd_graph_stats[$q][5];
$graph_totANSWERSavgspeedTIMEmtd+=$mtd_graph_stats[$q][6];
$graph_totANSWERSavgTIMEmtd+=$mtd_graph_stats[$q][7];
$graph_totANSWERStalkTIMEmtd+=$mtd_graph_stats[$q][8];
$graph_totANSWERSwrapTIMEmtd+=$mtd_graph_stats[$q][9];
$graph_totANSWERStotTIMEmtd+=$mtd_graph_stats[$q][10];
}
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("IDR_mtd_TOTALCALLSOFFEREDdata|1|TOTAL CALLS OFFERED|integer|", "IDR_mtd_TOTALCALLSANSWEREDdata|2|TOTAL CALLS ANSWERED|integer|", "IDR_mtd_TOTALAGENTSANSWEREDdata|17|TOTAL AGENTS ANSWERED|integer|", "IDR_mtd_TOTALCALLSABANDONEDdata|3|TOTAL CALLS ABANDONED|integer|", "IDR_mtd_TOTALABANDONPERCENTdata|4|TOTAL ABANDON PERCENT|percent|", "IDR_mtd_AVGABANDONTIMEdata|11|AVG ABANDON TIME|time|", "IDR_mtd_AVGANSWERSPEEDdata|12|AVG ANSWER SPEED|time|", "IDR_mtd_AVGTALKTIMEdata|16|AVG TALK TIME|time|", "IDR_mtd_TOTALTALKTIMEdata|15|TOTAL TALK TIME|time|", "IDR_mtd_TOTALWRAPTIMEdata|13|TOTAL WRAP TIME|time|", "IDR_mtd_TOTALCALLTIMEdata|14|TOTAL CALL TIME|time|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($mtd_graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $mtd_graph_stats[$d][0])."\",";
$data.="\"".$mtd_graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$mtd_graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA=substr($graphConstantsA,0,-1)."],\n";
$graphConstantsB=substr($graphConstantsB,0,-1)."],\n";
$graphConstantsC=substr($graphConstantsC,0,-1)."],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("MONTHLY REPORT")." - $query_date_BEGIN "._QXZ("to")." $query_date_END";
include("graphcanvas.inc");
$MTD_GRAPH=$graphCanvas;
$ASCII_text.="$MAINH\n";
$ASCII_text.="| "._QXZ("Month to date",41,"r")." | $totCALLSmtd | $totANSWERSmtd | $totAGENTSmtd | $totABANDONSmtd | $totABANDONSpctmtd%| $totABANDONSavgTIMEmtd | $totANSWERSavgspeedTIMEmtd | $totANSWERSavgTIMEmtd | $totANSWERStalkTIMEmtd | $totANSWERSwrapTIMEmtd | $totANSWERStotTIMEmtd |";
@@ -1808,43 +1893,89 @@ else
$qtd_graph_stats[$qa][9]=trim($totANSWERSwrapTIMEqtd);
$qtd_graph_stats[$qa][10]=trim($totANSWERStotTIMEqtd);
$qtd_graph_stats[$qa][17]=trim($totAGENTSqtd);
$qtd_OFFERED_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$OFFERED_graph);
$qtd_ANSWERED_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$ANSWERED_graph);
$qtd_AGENTS_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$AGENTS_graph);
$qtd_ABANDONED_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$ABANDONED_graph);
$qtd_ABANDONPCT_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$ABANDONPCT_graph);
$qtd_AVGABANDONTIME_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$AVGABANDONTIME_graph);
$qtd_AVGANSWERSPEED_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$AVGANSWERSPEED_graph);
$qtd_AVGTALKTIME_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$AVGTALKTIME_graph);
$qtd_TOTALTALKTIME_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$TOTALTALKTIME_graph);
$qtd_TOTALWRAPTIME_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$TOTALWRAPTIME_graph);
$qtd_TOTALCALLTIME_graph=preg_replace('/DAILY/', _QXZ("QUARTER-TO-DATE"),$TOTALCALLTIME_graph);
for ($q=0; $q<count($qtd_graph_stats); $q++) {
if ($q==0) {$class=" first";} else if (($q+1)==count($qtd_graph_stats)) {$class=" last";} else {$class="";}
$qtd_OFFERED_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][1], $max_qtd_offered))."' height='16' />".$qtd_graph_stats[$q][1]."</td></tr>";
$qtd_ANSWERED_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][2], $max_qtd_answered))."' height='16' />".$qtd_graph_stats[$q][2]."</td></tr>";
$qtd_AGENTS_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][17], $max_qtd_agents))."' height='16' />".$qtd_graph_stats[$q][17]."</td></tr>";
$qtd_ABANDONED_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][3], $max_qtd_abandoned))."' height='16' />".$qtd_graph_stats[$q][3]."</td></tr>";
$qtd_ABANDONPCT_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][4], $max_qtd_abandonpct))."' height='16' />".$qtd_graph_stats[$q][4]."%</td></tr>";
$qtd_AVGABANDONTIME_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][11], $max_qtd_avgabandontime))."' height='16' />".$qtd_graph_stats[$q][5]."</td></tr>";
$qtd_AVGANSWERSPEED_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][12], $max_qtd_avganswerspeed))."' height='16' />".$qtd_graph_stats[$q][6]."</td></tr>";
$qtd_AVGTALKTIME_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][16], $max_qtd_avgtalktime))."' height='16' />".$qtd_graph_stats[$q][7]."</td></tr>";
$qtd_TOTALTALKTIME_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][15], $max_qtd_totaltalktime))."' height='16' />".$qtd_graph_stats[$q][8]."</td></tr>";
$qtd_TOTALWRAPTIME_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][13], $max_qtd_totalwraptime))."' height='16' />".$qtd_graph_stats[$q][9]."</td></tr>";
$qtd_TOTALCALLTIME_graph.=" <tr><td class='chart_td$class'>".$qtd_graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$qtd_graph_stats[$q][14], $max_qtd_totalcalltime))."' height='16' />".$qtd_graph_stats[$q][10]."</td></tr>";
$graph_totCALLSqtd+=$qtd_graph_stats[$q][1];
$graph_totANSWERSqtd+=$qtd_graph_stats[$q][2];
$graph_totAGENTSqtd+=$qtd_graph_stats[$q][17];
$graph_totABANDONSqtd+=$qtd_graph_stats[$q][3];
$graph_totABANDONSpctqtd+=$qtd_graph_stats[$q][4];
$graph_totABANDONSavgTIMEqtd+=$qtd_graph_stats[$q][5];
$graph_totANSWERSavgspeedTIMEqtd+=$qtd_graph_stats[$q][6];
$graph_totANSWERSavgTIMEqtd+=$qtd_graph_stats[$q][7];
$graph_totANSWERStalkTIMEqtd+=$qtd_graph_stats[$q][8];
$graph_totANSWERSwrapTIMEqtd+=$qtd_graph_stats[$q][9];
$graph_totANSWERStotTIMEqtd+=$qtd_graph_stats[$q][10];
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("IDR_qtd_TOTALCALLSOFFEREDdata|1|TOTAL CALLS OFFERED|integer|", "IDR_qtd_TOTALCALLSANSWEREDdata|2|TOTAL CALLS ANSWERED|integer|", "IDR_qtd_TOTALAGENTSANSWEREDdata|17|TOTAL AGENTS ANSWERED|integer|", "IDR_qtd_TOTALCALLSABANDONEDdata|3|TOTAL CALLS ABANDONED|integer|", "IDR_qtd_TOTALABANDONPERCENTdata|4|TOTAL ABANDON PERCENT|percent|", "IDR_qtd_AVGABANDONTIMEdata|11|AVG ABANDON TIME|time|", "IDR_qtd_AVGANSWERSPEEDdata|12|AVG ANSWER SPEED|time|", "IDR_qtd_AVGTALKTIMEdata|16|AVG TALK TIME|time|", "IDR_qtd_TOTALTALKTIMEdata|15|TOTAL TALK TIME|time|", "IDR_qtd_TOTALWRAPTIMEdata|13|TOTAL WRAP TIME|time|", "IDR_qtd_TOTALCALLTIMEdata|14|TOTAL CALL TIME|time|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($qtd_graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $qtd_graph_stats[$d][0])."\",";
$data.="\"".$qtd_graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$qtd_graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA=substr($graphConstantsA,0,-1)."],\n";
$graphConstantsB=substr($graphConstantsB,0,-1)."],\n";
$graphConstantsC=substr($graphConstantsC,0,-1)."],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$graph_count=count($graph_array);
$graph_title=_QXZ("QUARTERLY REPORT")." - $query_date_BEGIN "._QXZ("to")." $query_date_END";
include("graphcanvas.inc");
$QTD_GRAPH=$graphCanvas;
$ASCII_text.="$MAINH\n";
$ASCII_text.="| "._QXZ("Quarter to date",41,"r")." | $totCALLSqtd | $totANSWERSqtd | $totAGENTSqtd | $totABANDONSqtd | $totABANDONSpctqtd%| $totABANDONSavgTIMEqtd | $totANSWERSavgspeedTIMEqtd | $totANSWERSavgTIMEqtd | $totANSWERStalkTIMEqtd | $totANSWERSwrapTIMEqtd | $totANSWERStotTIMEqtd |";
$CSV_text.="\""._QXZ("Quarter to date")."\",\"$totCALLSqtd\",\"$totANSWERSqtd\",\"$totAGENTSqtd\",\"$totABANDONSqtd\",\"$totABANDONSpctqtd%\",\"$totABANDONSavgTIMEqtd\",\"$totANSWERSavgspeedTIMEqtd\",\"$totANSWERSavgTIMEqtd\",\"$totANSWERStalkTIMEqtd\",\"$totANSWERSwrapTIMEqtd\",\"$totANSWERStotTIMEqtd\"";
@@ -1865,156 +1996,87 @@ else
# }
}
for ($q=0; $q<count($graph_stats); $q++) {
if ($q==0) {$class=" first";} else if (($q+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$OFFERED_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][1], $max_offered))."' height='16' />".$graph_stats[$q][1]."</td></tr>";
$ANSWERED_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][2], $max_answered))."' height='16' />".$graph_stats[$q][2]."</td></tr>";
$AGENTS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][17], $max_agents))."' height='16' />".$graph_stats[$q][17]."</td></tr>";
$ABANDONED_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][3], $max_abandoned))."' height='16' />".$graph_stats[$q][3]."</td></tr>";
$ABANDONPCT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][4], $max_abandonpct))."' height='16' />".$graph_stats[$q][4]."%</td></tr>";
$AVGABANDONTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][11], $max_avgabandontime))."' height='16' />".$graph_stats[$q][5]."</td></tr>";
$AVGANSWERSPEED_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][12], $max_avganswerspeed))."' height='16' />".$graph_stats[$q][6]."</td></tr>";
$AVGTALKTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][16], $max_avgtalktime))."' height='16' />".$graph_stats[$q][7]."</td></tr>";
$TOTALTALKTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][15], $max_totaltalktime))."' height='16' />".$graph_stats[$q][8]."</td></tr>";
$TOTALWRAPTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][13], $max_totalwraptime))."' height='16' />".$graph_stats[$q][9]."</td></tr>";
$TOTALCALLTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$q][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$q][14], $max_totalcalltime))."' height='16' />".$graph_stats[$q][10]."</td></tr>";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("IDR_TOTALCALLSOFFEREDdata|1|TOTAL CALLS OFFERED|integer|", "IDR_TOTALCALLSANSWEREDdata|2|TOTAL CALLS ANSWERED|integer|", "IDR_TOTALAGENTSANSWEREDdata|17|TOTAL AGENTS ANSWERED|integer|", "IDR_TOTALCALLSABANDONEDdata|3|TOTAL CALLS ABANDONED|integer|", "IDR_TOTALABANDONPERCENTdata|4|TOTAL ABANDON PERCENT|percent|", "IDR_AVGABANDONTIMEdata|11|AVG ABANDON TIME|time|", "IDR_AVGANSWERSPEEDdata|12|AVG ANSWER SPEED|time|", "IDR_AVGTALKTIMEdata|16|AVG TALK TIME|time|", "IDR_TOTALTALKTIMEdata|15|TOTAL TALK TIME|time|", "IDR_TOTALWRAPTIMEdata|13|TOTAL WRAP TIME|time|", "IDR_TOTALCALLTIMEdata|14|TOTAL CALL TIME|time|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA=substr($graphConstantsA,0,-1)."],\n";
$graphConstantsB=substr($graphConstantsB,0,-1)."],\n";
$graphConstantsC=substr($graphConstantsC,0,-1)."],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$OFFERED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotCALLS)."</th></tr></table>";
$ANSWERED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERS)."</th></tr></table>";
$AGENTS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotAGENTS)."</th></tr></table>";
$ABANDONED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONS)."</th></tr></table>";
$ABANDONPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONSpct)."%</th></tr></table>";
$AVGABANDONTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONSavgTIME)."</th></tr></table>";
$AVGANSWERSPEED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSavgspeedTIME)."</th></tr></table>";
$AVGTALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSavgTIME)."</th></tr></table>";
$TOTALTALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERStalkTIME)."</th></tr></table>";
$TOTALWRAPTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSwrapTIME)."</th></tr></table>";
$TOTALCALLTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERStotTIME)."</th></tr></table>";
$JS_onload.="\tDrawGraph('OFFERED', '1');\n";
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_text.=" var OFFERED_graph=\"$OFFERED_graph\";\n";
$JS_text.=" var ANSWERED_graph=\"$ANSWERED_graph\";\n";
$JS_text.=" var AGENTS_graph=\"$AGENTS_graph\";\n";
$JS_text.=" var ABANDONED_graph=\"$ABANDONED_graph\";\n";
$JS_text.=" var ABANDONPCT_graph=\"$ABANDONPCT_graph\";\n";
$JS_text.=" var AVGABANDONTIME_graph=\"$AVGABANDONTIME_graph\";\n";
$JS_text.=" var AVGANSWERSPEED_graph=\"$AVGANSWERSPEED_graph\";\n";
$JS_text.=" var AVGTALKTIME_graph=\"$AVGTALKTIME_graph\";\n";
$JS_text.=" var TOTALTALKTIME_graph=\"$TOTALTALKTIME_graph\";\n";
$JS_text.=" var TOTALWRAPTIME_graph=\"$TOTALWRAPTIME_graph\";\n";
$JS_text.=" var TOTALCALLTIME_graph=\"$TOTALCALLTIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=10; i++) {\n";
$JS_text.=" var cellID=\"multigroup_graph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"multigroup_graph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$wtd_OFFERED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotCALLS)."</th></tr></table>";
$wtd_ANSWERED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERS)."</th></tr></table>";
$wtd_AGENTS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotAGENTS)."</th></tr></table>";
$wtd_ABANDONED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONS)."</th></tr></table>";
$wtd_ABANDONPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONSpct)."%</th></tr></table>";
$wtd_AVGABANDONTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONSavgTIME)."</th></tr></table>";
$wtd_AVGANSWERSPEED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSavgspeedTIME)."</th></tr></table>";
$wtd_AVGTALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSavgTIME)."</th></tr></table>";
$wtd_TOTALTALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERStalkTIME)."</th></tr></table>";
$wtd_TOTALWRAPTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSwrapTIME)."</th></tr></table>";
$wtd_TOTALCALLTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERStotTIME)."</th></tr></table>";
$JS_onload.="\tDrawWTDGraph('OFFERED', '1');\n";
$JS_text.="function DrawWTDGraph(graph, th_id) {\n";
$JS_text.=" var OFFERED_graph=\"$wtd_OFFERED_graph\";\n";
$JS_text.=" var ANSWERED_graph=\"$wtd_ANSWERED_graph\";\n";
$JS_text.=" var AGENTS_graph=\"$wtd_AGENTS_graph\";\n";
$JS_text.=" var ABANDONED_graph=\"$wtd_ABANDONED_graph\";\n";
$JS_text.=" var ABANDONPCT_graph=\"$wtd_ABANDONPCT_graph\";\n";
$JS_text.=" var AVGABANDONTIME_graph=\"$wtd_AVGABANDONTIME_graph\";\n";
$JS_text.=" var AVGANSWERSPEED_graph=\"$wtd_AVGANSWERSPEED_graph\";\n";
$JS_text.=" var AVGTALKTIME_graph=\"$wtd_AVGTALKTIME_graph\";\n";
$JS_text.=" var TOTALTALKTIME_graph=\"$wtd_TOTALTALKTIME_graph\";\n";
$JS_text.=" var TOTALWRAPTIME_graph=\"$wtd_TOTALWRAPTIME_graph\";\n";
$JS_text.=" var TOTALCALLTIME_graph=\"$wtd_TOTALCALLTIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=10; i++) {\n";
$JS_text.=" var cellID=\"WTD_graph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"WTD_graph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('WTD_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$mtd_OFFERED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotCALLS)."</th></tr></table>";
$mtd_ANSWERED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERS)."</th></tr></table>";
$mtd_AGENTS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotAGENTS)."</th></tr></table>";
$mtd_ABANDONED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONS)."</th></tr></table>";
$mtd_ABANDONPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONSpct)."%</th></tr></table>";
$mtd_AVGABANDONTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONSavgTIME)."</th></tr></table>";
$mtd_AVGANSWERSPEED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSavgspeedTIME)."</th></tr></table>";
$mtd_AVGTALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSavgTIME)."</th></tr></table>";
$mtd_TOTALTALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERStalkTIME)."</th></tr></table>";
$mtd_TOTALWRAPTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSwrapTIME)."</th></tr></table>";
$mtd_TOTALCALLTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERStotTIME)."</th></tr></table>";
$JS_onload.="\tDrawMTDGraph('OFFERED', '1');\n";
$JS_text.="function DrawMTDGraph(graph, th_id) {\n";
$JS_text.=" var OFFERED_graph=\"$mtd_OFFERED_graph\";\n";
$JS_text.=" var ANSWERED_graph=\"$mtd_ANSWERED_graph\";\n";
$JS_text.=" var AGENTS_graph=\"$mtd_AGENTS_graph\";\n";
$JS_text.=" var ABANDONED_graph=\"$mtd_ABANDONED_graph\";\n";
$JS_text.=" var ABANDONPCT_graph=\"$mtd_ABANDONPCT_graph\";\n";
$JS_text.=" var AVGABANDONTIME_graph=\"$mtd_AVGABANDONTIME_graph\";\n";
$JS_text.=" var AVGANSWERSPEED_graph=\"$mtd_AVGANSWERSPEED_graph\";\n";
$JS_text.=" var AVGTALKTIME_graph=\"$mtd_AVGTALKTIME_graph\";\n";
$JS_text.=" var TOTALTALKTIME_graph=\"$mtd_TOTALTALKTIME_graph\";\n";
$JS_text.=" var TOTALWRAPTIME_graph=\"$mtd_TOTALWRAPTIME_graph\";\n";
$JS_text.=" var TOTALCALLTIME_graph=\"$mtd_TOTALCALLTIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=10; i++) {\n";
$JS_text.=" var cellID=\"MTD_graph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"MTD_graph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('MTD_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$qtd_OFFERED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotCALLS)."</th></tr></table>";
$qtd_ANSWERED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERS)."</th></tr></table>";
$qtd_AGENTS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotAGENTS)."</th></tr></table>";
$qtd_ABANDONED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONS)."</th></tr></table>";
$qtd_ABANDONPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONSpct)."%</th></tr></table>";
$qtd_AVGABANDONTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotABANDONSavgTIME)."</th></tr></table>";
$qtd_AVGANSWERSPEED_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSavgspeedTIME)."</th></tr></table>";
$qtd_AVGTALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSavgTIME)."</th></tr></table>";
$qtd_TOTALTALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERStalkTIME)."</th></tr></table>";
$qtd_TOTALWRAPTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERSwrapTIME)."</th></tr></table>";
$qtd_TOTALCALLTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($FtotANSWERStotTIME)."</th></tr></table>";
$JS_onload.="\tDrawQTDGraph('OFFERED', '1');\n";
$JS_text.="function DrawQTDGraph(graph, th_id) {\n";
$JS_text.=" var OFFERED_graph=\"$qtd_OFFERED_graph\";\n";
$JS_text.=" var ANSWERED_graph=\"$qtd_ANSWERED_graph\";\n";
$JS_text.=" var AGENTS_graph=\"$qtd_AGENTS_graph\";\n";
$JS_text.=" var ABANDONED_graph=\"$qtd_ABANDONED_graph\";\n";
$JS_text.=" var ABANDONPCT_graph=\"$qtd_ABANDONPCT_graph\";\n";
$JS_text.=" var AVGABANDONTIME_graph=\"$qtd_AVGABANDONTIME_graph\";\n";
$JS_text.=" var AVGANSWERSPEED_graph=\"$qtd_AVGANSWERSPEED_graph\";\n";
$JS_text.=" var AVGTALKTIME_graph=\"$qtd_AVGTALKTIME_graph\";\n";
$JS_text.=" var TOTALTALKTIME_graph=\"$qtd_TOTALTALKTIME_graph\";\n";
$JS_text.=" var TOTALWRAPTIME_graph=\"$qtd_TOTALWRAPTIME_graph\";\n";
$JS_text.=" var TOTALCALLTIME_graph=\"$qtd_TOTALCALLTIME_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=10; i++) {\n";
$JS_text.=" var cellID=\"QTD_graph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"QTD_graph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('QTD_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$graph_count=count($graph_array);
$graph_title=_QXZ("DAILY REPORT")." - $query_date_BEGIN "._QXZ("to")." $query_date_END";
include("graphcanvas.inc");
$GRAPH=$graphCanvas;
$FtotAGENTS = sprintf("%8s", $FtotAGENTS);
$ASCII_text.="$MAINH\n";
@@ -2079,7 +2141,7 @@ else
if ($report_display_type=="HTML")
{
$MAIN.=$JS_text.$GRAPH.$WTD_GRAPH.$MTD_GRAPH.$QTD_GRAPH;
$MAIN.=$GRAPH.$WTD_GRAPH.$MTD_GRAPH.$QTD_GRAPH.$JS_text;
}
else
{
@@ -14,6 +14,7 @@
# 150516-1314 - Fixed Javascript element problem, Issue #857
# 151227-1746 - Added option for searching archived data
# 160121-2215 - Added report title header, default report format, cleaned up formatting
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -448,6 +449,9 @@ $HTML_head.=" </STYLE>\n";
$HTML_head.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HTML_head.="<script src='chart/Chart.js'></script>\n";
$HTML_head.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HTML_head.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HTML_head.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -638,35 +642,27 @@ else
$ASCII_header2.="+-----------------+----------+";
$ASCII_header3.="| <a href=\"$LINKbase\">"._QXZ("USER NAME",15)."</a> | <a href=\"$LINKbase&stage=ID\">"._QXZ("ID",8)."</a> |";
$GRAPH="</PRE><table cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"white\" summary=\"LIST ID Summary\" class=\"horizontalgraph\">\n";
$GRAPH.="<caption align='top'>"._QXZ("PERFORMANCE SUMMARY")."</caption>";
$GRAPH2="";
$master_graph_array=array();
for ($q=0; $q<count($rpt_date_array); $q++)
{
$rpt_subtitle=$rpt_subtitle_array[$q];
$rpt_date=$rpt_date_array[$q];
$rpt_date_numeric=preg_replace('/[^0-9]/', '', $rpt_date_array[$q]);
$array_offset=($q*5)+1;
$GRAPH2.="<tr><th colspan=5 class='column_header grey_graph_cell'>$rpt_subtitle, $rpt_date</th></tr>";
$GRAPH2.="<tr>";
$GRAPH2.="<th class='column_header grey_graph_cell' id='callstatsgraph".$array_offset."' nowrap width='20%'><a href='#' onClick=\"DrawGraph('CALLS_".$rpt_date_numeric."', '$array_offset'); return false;\">"._QXZ("CALLS")."</a></th>";
$GRAPH2.="<th class='column_header grey_graph_cell' id='callstatsgraph".($array_offset+1)."' nowrap width='20%'><a href='#' onClick=\"DrawGraph('SALES_".$rpt_date_numeric."', '".($array_offset+1)."'); return false;\">"._QXZ("SALES")."</a></th>";
$GRAPH2.="<th class='column_header grey_graph_cell' id='callstatsgraph".($array_offset+2)."' nowrap width='20%'><a href='#' onClick=\"DrawGraph('SALECONV_".$rpt_date_numeric."', '".($array_offset+2)."'); return false;\">"._QXZ("SALE CONV")." %</a></th>";
$GRAPH2.="<th class='column_header grey_graph_cell' id='callstatsgraph".($array_offset+3)."' nowrap width='20%'><a href='#' onClick=\"DrawGraph('SPH_".$rpt_date_numeric."', '".($array_offset+3)."'); return false;\">"._QXZ("SALES PER HOUR")."</a></th>";
$GRAPH2.="<th class='column_header grey_graph_cell' id='callstatsgraph".($array_offset+4)."' nowrap width='20%'><a href='#' onClick=\"DrawGraph('TIME_".$rpt_date_numeric."', '".($array_offset+4)."'); return false;\">"._QXZ("TIME")."</a></th>";
$GRAPH2.="</tr>";
$master_graph_array[$q]=array("APC_CALLSdata$rpt_date_numeric|1|CALLS|integer|", "APC_SALESdata$rpt_date_numeric|2|SALES|integer|", "APC_SALECONVdata$rpt_date_numeric|3|SALE CONV %|percent|", "APC_SPHdata$rpt_date_numeric|4|SALES PER HOUR|decimal|", "APC_TIMEdata$rpt_date_numeric|5|TIME|time|");
}
$TOTALS_array[0]=_QXZ("TOTALS");
$graph_TOTALS_array[0]+=_QXZ("TOTALS");
for ($q=0; $q<count($rpt_date_array); $q++)
$GRAPH="";
for ($y=0; $y<count($rpt_date_array); $y++)
{
$rpt_subtitle=$rpt_subtitle_array[$q];
$rpt_date=$rpt_date_array[$q];
$rpt_date_numeric=preg_replace('/[^0-9]/', '', $rpt_date_array[$q]);
$array_offset=($q*5)+1;
$rpt_subtitle=$rpt_subtitle_array[$y];
$rpt_date=$rpt_date_array[$y];
$rpt_date_numeric=preg_replace('/[^0-9]/', '', $rpt_date_array[$y]);
$array_offset=($y*5)+1;
$CSV_header1.="\"$rpt_subtitle\",\"\",\"\",\"\",\"\",";
$CSV_header2.='"'._QXZ("CALLS").'","'._QXZ("SALES").'","'._QXZ("CONVERSION RATE TO CALLS").'","'._QXZ("SALES PER HOUR").'","'._QXZ("TIME").'",';
@@ -683,12 +679,6 @@ else
$max_stats[$k]=0;
}
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>$rpt_subtitle "._QXZ("SUMMARY")."</caption><tr><th class='thgraph' scope='col'>USERS</th>";
$CALLS_graph[$q]=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")."</th></tr>";
$SALES_graph[$q]=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES")."</th></tr>";
$SALECONV_graph[$q]=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALE CONV")." %</th></tr>";
$SPH_graph[$q]=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES PER HOUR")."</th></tr>";
$TIME_graph[$q]=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TIME")."</th></tr>";
#########
@@ -734,47 +724,87 @@ else
}
reset($agent_performance_array);
for ($j=0; $j<count($graph_stats); $j++)
{
if ($j==0) {$class=" first";} else if (($j+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph[$q].=" <tr><td class='chart_td$class'>".$graph_stats[$j][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(600*$graph_stats[$j][1], $max_stats[1]))."' height='16' />".$graph_stats[$j][1]."</td></tr>";
$SALES_graph[$q].=" <tr><td class='chart_td$class'>".$graph_stats[$j][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(600*$graph_stats[$j][2], $max_stats[2]))."' height='16' />".$graph_stats[$j][2]."</td></tr>";
$SALECONV_graph[$q].=" <tr><td class='chart_td$class'>".$graph_stats[$j][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(600*$graph_stats[$j][3], $max_stats[3]))."' height='16' />".$graph_stats[$j][3]."</td></tr>";
$SPH_graph[$q].=" <tr><td class='chart_td$class'>".$graph_stats[$j][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(600*$graph_stats[$j][4], $max_stats[4]))."' height='16' />".$graph_stats[$j][4]."</td></tr>";
$TIME_graph[$q].=" <tr><td class='chart_td$class'>".$graph_stats[$j][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(600*$graph_stats[$j][5], $max_stats[5]))."' height='16' />".sec_convert($graph_stats[$j][5], 'H')."</td></tr>";
$multigraph_text="";
$graph_id++;
$graph_array=$master_graph_array[$y];
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$CALLS_graph[$q].=" <tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".$graph_TOTALS_array[($array_offset)]."</th></tr>";
$SALES_graph[$q].=" <tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".$graph_TOTALS_array[($array_offset+1)]."</th></tr>";
$SALECONV_graph[$q].=" <tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".$graph_TOTALS_array[($array_offset+2)]."</th></tr>";
$SPH_graph[$q].=" <tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".$graph_TOTALS_array[($array_offset+3)]."</th></tr>";
$TIME_graph[$q].=" <tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".sec_convert($graph_TOTALS_array[($array_offset+4)], 'H')."</th></tr>";
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$JS_text.="function DrawGraph(graph, th_id) {\n";
$JS_onload.="\tDrawGraph('CALLS_".preg_replace('/[^0-9]/', '', $rpt_date_array[0])."', '1');\n";
for ($q=0; $q<count($rpt_date_array); $q++)
{
$rpt_date_numeric=preg_replace('/[^0-9]/', '', $rpt_date_array[$q]);
$JS_text.=" var graph_CALLS_".$rpt_date_numeric."=\"".$CALLS_graph[$q]."\";\n";
$JS_text.=" var graph_SALES_".$rpt_date_numeric."=\"".$SALES_graph[$q]."\";\n";
$JS_text.=" var graph_SALECONV_".$rpt_date_numeric."=\"".$SALECONV_graph[$q]."\";\n";
$JS_text.=" var graph_SPH_".$rpt_date_numeric."=\"".$SPH_graph[$q]."\";\n";
$JS_text.=" var graph_TIME_".$rpt_date_numeric."=\"".$TIME_graph[$q]."\";\n";
$graph_count=count($graph_array);
$graph_title="$rpt_subtitle, $rpt_date";
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
}
$JS_text.=" for (var i=1; i<=35; i++) {\n";
$JS_text.=" var cellID=\"callstatsgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"callstatsgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.="\n";
$JS_text.=" var graph_to_display=eval(\"graph_\"+graph);\n";
$JS_text.=" document.getElementById('call_stats_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$GRAPH3="<tr><td colspan='35' class='graph_span_cell'><span id='call_stats_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$CSV_header1.="\n";
@@ -846,7 +876,7 @@ else
$CSV_text.='"","'._QXZ("TOTALS").'",';
$ASCII_text.="| ".sprintf("%26s", $TOTALS_array[0])." ||";
$GRAPH_text.=$GRAPH.$GRAPH2.$GRAPH3;
$GRAPH_text.=$GRAPH;
for ($i=1; $i<count($TOTALS_array); $i++)
{
@@ -944,11 +974,10 @@ if ($file_download == 0 || !$file_download)
$JS_onload.="}\n";
if ($report_display_type=='HTML') {$JS_text.=$JS_onload;}
$JS_text.="</script>\n";
$HTML_head.=$JS_text;
echo $HTML_head;
require("admin_header.php");
echo $HTML_text;
echo $HTML_text.$JS_text;
}
@@ -26,6 +26,7 @@
# 150516-1315 - Fixed Javascript element problem, Issue #857
# 151219-0139 - Added option for searching archived data
# 160121-2214 - Added report title header, default report format, cleaned up formatting
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -464,6 +465,9 @@ $end_date="$end_date_D $end_date_T";
$HTML_head.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HTML_head.="<script src='chart/Chart.js'></script>\n";
$HTML_head.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HTML_head.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HTML_head.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>$group_S\n";
@@ -657,30 +661,6 @@ if ( ($SUBMIT=="SUBMIT") or ($SUBMIT==_QXZ("SUBMIT")) )
$max_totalfirstcall=1;
$max_totalavgsaletime=1;
$max_totalavgcontacttime=1;
$TOTALGRAPH="<BR><BR><a name='teamTotalgraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$TOTALGRAPH2="<tr><th class='column_header grey_graph_cell' id='teamTotalgraph1'><a href='#' onClick=\"DrawTotalGraph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph2'><a href='#' onClick=\"DrawTotalGraph('LEADS', '2'); return false;\">"._QXZ("LEADS")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph3'><a href='#' onClick=\"DrawTotalGraph('CONTACTS', '3'); return false;\">"._QXZ("CONTACTS")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph4'><a href='#' onClick=\"DrawTotalGraph('CONTACTRATIO','4'); return false;\">"._QXZ("CONTACT RATIO")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph5'><a href='#' onClick=\"DrawTotalGraph('SYSTEMTIME', '5'); return false;\">"._QXZ("SYSTEM TIME")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph6'><a href='#' onClick=\"DrawTotalGraph('TALKTIME', '6'); return false;\">"._QXZ("TALK TIME")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph7'><a href='#' onClick=\"DrawTotalGraph('SALES', '7'); return false;\">"._QXZ("SALES")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph8'><a href='#' onClick=\"DrawTotalGraph('SALESLEADSRATIO', '8'); return false;\">"._QXZ("SALES TO LEADS RATIO")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph9'><a href='#' onClick=\"DrawTotalGraph('SALESCONTACTSRATIO', '9'); return false;\">"._QXZ("SALES TO CONTACTS RATIO")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph10'><a href='#' onClick=\"DrawTotalGraph('SALESPERHOUR', '10'); return false;\">"._QXZ("SALES PER HOUR")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph11'><a href='#' onClick=\"DrawTotalGraph('INCSALES', '11'); return false;\">"._QXZ("INCOMPLETE SALES")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph12'><a href='#' onClick=\"DrawTotalGraph('CANCELLEDSALES', '12'); return false;\">"._QXZ("CANCELLED SALES")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph13'><a href='#' onClick=\"DrawTotalGraph('CALLBACKS', '13'); return false;\">"._QXZ("CALLBACKS")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph14'><a href='#' onClick=\"DrawTotalGraph('FIRSTCALLS', '14'); return false;\">"._QXZ("FIRST CALLS")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph15'><a href='#' onClick=\"DrawTotalGraph('AVGSALETIME', '15'); return false;\">"._QXZ("AVG SALE TIME")."</a></th><th class='column_header grey_graph_cell' id='teamTotalgraph16'><a href='#' onClick=\"DrawTotalGraph('AVGCONTACTTIME', '16'); return false;\">"._QXZ("AVG CONTACT TIME")."</a></th>".$GRAPH2."</TR>";
$TOTALGRAPH3="<tr><td colspan='".(16+count($call_status))."' class='graph_span_cell'><span id='team_Total_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$TOTALGRAPH_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("CALL CENTER TOTAL")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("USER")."</th>";
$TOTALCALLS_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")."</th></tr>";
$TOTALLEADS_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("LEADS")."</th></tr>";
$TOTALCONTACTS_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("CONTACTS")."</th></tr>";
$TOTALCONTACTRATIO_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("CONTACT RATIO")."</th></tr>";
$TOTALSYSTEMTIME_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("SYSTEM TIME")."</th></tr>";
$TOTALTALKTIME_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("TALK TIME")."</th></tr>";
$TOTALSALES_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("SALES")."</th></tr>";
$TOTALSALESLEADSRATIO_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("SALES TO LEADS RATIO")."</th></tr>";
$TOTALSALESCONTACTSRATIO_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("SALES TO CONTACTS RATIO")."</th></tr>";
$TOTALSALESPERHOUR_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("SALES PER HOUR")."</th></tr>";
$TOTALINCSALES_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("INCOMPLETE SALES")."</th></tr>";
$TOTALCANCELLEDSALES_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("CANCELLED SALES")."</th></tr>";
$TOTALCALLBACKS_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("CALLBACKS")."</th></tr>";
$TOTALFIRSTCALLS_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("FIRST CALLS")."</th></tr>";
$TOTALAVGSALETIME_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("AVG SALE TIME")."</th></tr>";
$TOTALAVGCONTACTTIME_graph=$TOTALGRAPH_header."<th class='thgraph' scope='col'>"._QXZ("AVG CONTACT TIME")."</th></tr>";
for ($q=0; $q<count($call_status); $q++) {
$totalvar_name="TOTAL".$call_status[$q]."_graph";
$$totalvar_name=$TOTALGRAPH_header."<th class='thgraph' scope='col'>".$call_status[$q]."</th></tr>";
}
for($i=0; $i<$user_group_ct; $i++)
{
@@ -740,29 +720,6 @@ if ( ($SUBMIT=="SUBMIT") or ($SUBMIT==_QXZ("SUBMIT")) )
$$max_varname=1;
}
$GRAPH2="<tr><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph1'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph2'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('LEADS', '2'); return false;\">"._QXZ("LEADS")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph3' ><a href='#' onClick=\"Draw".$user_group[$i]."Graph('CONTACTS', '3'); return false;\">"._QXZ("CONTACTS")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph4'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('CONTACTRATIO', '4'); return false;\">"._QXZ("CONTACT RATIO")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph5'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('SYSTEMTIME', '5'); return false;\">"._QXZ("SYSTEM TIME")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph6'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('TALKTIME', '6'); return false;\">"._QXZ("TALK TIME")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph7'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('SALES', '7'); return false;\">"._QXZ("SALES")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph8'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('SALESLEADSRATIO', '8'); return false;\">"._QXZ("SALES TO LEADS RATIO")."</a></th><th class='column_header grey_graph_cell' width='7%' id='team".$user_group[$i]."graph9'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('SALESCONTACTSRATIO', '9'); return false;\">"._QXZ("SALES TO CONTACTS RATIO")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph10'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('SALESPERHOUR', '10'); return false;\">"._QXZ("SALES PER HOUR")."</a></th><th class='column_header grey_graph_cell' width='7%' id='team".$user_group[$i]."graph11'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('INCSALES', '11'); return false;\">"._QXZ("INCOMPLETE SALES")."</a></th><th class='column_header grey_graph_cell' width='7%' id='team".$user_group[$i]."graph12'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('CANCELLEDSALES', '12'); return false;\">"._QXZ("CANCELLED SALES")."</a></th><th class='column_header grey_graph_cell' width='7%' id='team".$user_group[$i]."graph13'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('CALLBACKS', '13'); return false;\">"._QXZ("CALLBACKS")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph14'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('FIRSTCALLS', '14'); return false;\">"._QXZ("FIRST CALLS")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph15'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('AVGSALETIME', '15'); return false;\">"._QXZ("AVG SALE TIME")."</a></th><th class='column_header grey_graph_cell' width='6%' id='team".$user_group[$i]."graph16'><a href='#' onClick=\"Draw".$user_group[$i]."Graph('AVGCONTACTTIME', '16'); return false;\">"._QXZ("AVG CONTACT TIME")."</a></th>".$STATGRAPH."</TR>";
$GRAPH3="<tr><td colspan='".(16+count($call_status))."' class='graph_span_cell'><span id='team_".$user_group[$i]."_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='0' cellpadding='0' class='horizontalgraph'><caption align='top'>"._QXZ("TEAM").": $user_group[$i] - $group_name</caption><tr><th class='thgraph' scope='col'>"._QXZ("USER")."</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")."</th></tr>";
$LEADS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("LEADS")."</th></tr>";
$CONTACTS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONTACTS")."</th></tr>";
$CONTACTRATIO_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONTACT RATIO")."</th></tr>";
$SYSTEMTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SYSTEM TIME")."</th></tr>";
$TALKTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("TALK TIME")."</th></tr>";
$SALES_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES")."</th></tr>";
$SALESLEADSRATIO_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES TO LEADS RATIO")."</th></tr>";
$SALESCONTACTSRATIO_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES TO CONTACTS RATIO")."</th></tr>";
$SALESPERHOUR_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES PER HOUR")."</th></tr>";
$INCSALES_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("INCOMPLETE SALES")."</th></tr>";
$CANCELLEDSALES_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CANCELLED SALES")."</th></tr>";
$CALLBACKS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLBACKS")."</th></tr>";
$FIRSTCALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("FIRST CALLS")."</th></tr>";
$AVGSALETIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG SALE TIME")."</th></tr>";
$AVGCONTACTTIME_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("AVG CONTACT TIME")."</th></tr>";
for ($q=0; $q<count($call_status); $q++) {
$varname=$call_status[$q]."_graph";
$$varname=$graph_header."<th class='thgraph' scope='col'>".$call_status[$q]."</th></tr>";
}
$j=0;
$ASCII_text.="+------------------------------------------+------------+-------+-------+----------+---------------+---------------+-------------+-----------+-------+------------------------+----------------------+-------------------------+----------------+------------------+-----------------+-----------+-----------------------+-------------------+----------------------+$HTMLborderheader\n";
@@ -1028,91 +985,97 @@ if ( ($SUBMIT=="SUBMIT") or ($SUBMIT==_QXZ("SUBMIT")) )
$total_sales_talk_time+=$group_sales_talk_time;
$total_contact_talk_time+=$group_contact_talk_time;
for ($d=1; $d<=count($graph_stats); $d++) {
if ($d==1) {$class=" first";} else if ($d==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$LEADS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_leads))."' height='16' />".$graph_stats[$d][2]."</td></tr>";
$CONTACTS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_contacts))."' height='16' />".$graph_stats[$d][3]."</td></tr>";
$CONTACTRATIO_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][4], $max_contactratio))."' height='16' />".$graph_stats[$d][4]."%</td></tr>";
$SYSTEMTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][5], $max_systemtime))."' height='16' />".sec_convert($graph_stats[$d][5], 'H')."</td></tr>";
$TALKTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][6], $max_talktime))."' height='16' />".sec_convert($graph_stats[$d][6], 'H')."</td></tr>";
$SALES_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][7], $max_sales))."' height='16' />".$graph_stats[$d][7]."</td></tr>";
$SALESLEADSRATIO_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][8], $max_salesleadsratio))."' height='16' />".$graph_stats[$d][8]."%</td></tr>";
$SALESCONTACTSRATIO_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][9], $max_salescontactsratio))."' height='16' />".$graph_stats[$d][9]."%</td></tr>";
$SALESPERHOUR_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][10], $max_salesperhour))."' height='16' />".$graph_stats[$d][10]."</td></tr>";
$INCSALES_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][11], $max_incsales))."' height='16' />".$graph_stats[$d][11]."</td></tr>";
$CANCELLEDSALES_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][12], $max_cancelledsales))."' height='16' />".$graph_stats[$d][12]."</td></tr>";
$CALLBACKS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][13], $max_callbacks))."' height='16' />".$graph_stats[$d][13]."</td></tr>";
$FIRSTCALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][14], $max_firstcall))."' height='16' />".$graph_stats[$d][14]."</td></tr>";
$AVGSALETIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][15], $max_avgsaletime))."' height='16' />".sec_convert($graph_stats[$d][15], 'H')."</td></tr>";
$AVGCONTACTTIME_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][16], $max_avgcontacttime))."' height='16' />".sec_convert($graph_stats[$d][16], 'H')."</td></tr>";
for ($e=0; $e<count($call_status); $e++) {
$Sstatus=$call_status[$e];
$varname=$Sstatus."_graph";
$max_varname="max_".$Sstatus;
# $max.= "<!-- $max_varname => ".$$max_varname." //-->\n";
$$varname.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][($e+17)], $$max_varname))."' height='16' />".$graph_stats[$d][($e+17)]."</td></tr>";
# USE THIS FOR COMBINED graphs, use pipe-delimited array elements, dataset_name|index|link_name|graph_override
# You have to hard code the graph name in where it is overridden and mind the data indices. No other way to do it.
$multigraph_text="";
$graph_id++;
$graph_array=array("ATPD_CALLSdata|1|CALLS|integer|", "ATPD_LEADSdata|2|LEADS|integer|", "ATPD_CONTACTSdata|3|CONTACTS|integer|", "ATPD_CONTACTRATIOdata|4|CONTACT RATIO|percent|", "ATPD_SYSTEMTIMEdata|5|SYSTEM TIME|time|", "ATPD_TALKTIMEdata|6|TALK TIME|time|", "ATPD_SALESdata|7|SALES|integer|", "ATPD_SALESTOLEADSdata|8|SALES TO LEADS RATIO|decimal|", "ATPD_SALESTOCONTACTSdata|9|SALES TO CONTACTS RATIO|decimal|", "ATPD_SALESPERHOURdata|10|SALES PER HOUR|decimal|", "ATPD_INCOMPLETESALESSdata|11|INCOMPLETE SALES|integer|", "ATPD_CANCELLEDSALESdata|12|CANCELLED SALES|integer|", "ATPD_CALLBACKSdata|13|CALLBACKS|integer|", "ATPD_FIRSTCALLSdata|14|FIRST CALLS|decimal|", "ATPD_AVGSALETIMEdata|15|AVG SALE TIME|time|", "ATPD_AVGCONTACTTIMEdata|16|AVG CONTACT TIME|time|");
for ($e=0; $e<count($call_status); $e++) {
$Sstatus=$call_status[$e];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
array_push($graph_array, "ATPD_SUBSTATUS".$e."data|".($e+19)."|".$SstatusTXT."|integer|");
}
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$GRAPH="";
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=1; $d<=count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$CALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_calls)."</th></tr></table>";
$LEADS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_leads)."</th></tr></table>";
$CONTACTS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_contacts)."</th></tr></table>";
$CONTACTRATIO_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_contact_ratio)."%</th></tr></table>";
$SYSTEMTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".sec_convert($group_system_time,'H')."</th></tr></table>";
$TALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".sec_convert($group_talk_time,'H')."</th></tr></table>";
$SALES_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_sales)."</th></tr></table>";
$SALESLEADSRATIO_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_sales_ratio)."%</th></tr></table>";
$SALESCONTACTSRATIO_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_sale_contact_ratio)."%</th></tr></table>";
$SALESPERHOUR_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_sales_per_hour)."</th></tr></table>";
$INCSALES_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_inc_sales)."</th></tr></table>";
$CANCELLEDSALES_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_cnc_sales)."</th></tr></table>";
$CALLBACKS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_callbacks)."</th></tr></table>";
$FIRSTCALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_stcall)."</th></tr></table>";
$AVGSALETIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_average_sale_time)."</th></tr></table>";
$AVGCONTACTTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($group_average_contact_time)."</th></tr></table>";
for ($e=0; $e<count($call_status); $e++) {
$Sstatus=$call_status[$e];
$total_var=$Sstatus."_total";
$graph_var=$Sstatus."_graph";
$$graph_var.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($$total_var)."</th></tr></table>";
}
$JS_onload.="\tDraw".$user_group[$i]."Graph('CALLS', '1');\n";
$JS_text.="function Draw".$user_group[$i]."Graph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var LEADS_graph=\"$LEADS_graph\";\n";
$JS_text.=" var CONTACTS_graph=\"$CONTACTS_graph\";\n";
$JS_text.=" var CONTACTRATIO_graph=\"$CONTACTRATIO_graph\";\n";
$JS_text.=" var SYSTEMTIME_graph=\"$SYSTEMTIME_graph\";\n";
$JS_text.=" var TALKTIME_graph=\"$TALKTIME_graph\";\n";
$JS_text.=" var SALES_graph=\"$SALES_graph\";\n";
$JS_text.=" var SALESLEADSRATIO_graph=\"$SALESLEADSRATIO_graph\";\n";
$JS_text.=" var SALESCONTACTSRATIO_graph=\"$SALESCONTACTSRATIO_graph\";\n";
$JS_text.=" var SALESPERHOUR_graph=\"$SALESPERHOUR_graph\";\n";
$JS_text.=" var INCSALES_graph=\"$INCSALES_graph\";\n";
$JS_text.=" var CANCELLEDSALES_graph=\"$CANCELLEDSALES_graph\";\n";
$JS_text.=" var CALLBACKS_graph=\"$CALLBACKS_graph\";\n";
$JS_text.=" var FIRSTCALLS_graph=\"$FIRSTCALLS_graph\";\n";
$JS_text.=" var AVGSALETIME_graph=\"$AVGSALETIME_graph\";\n";
$JS_text.=" var AVGCONTACTTIME_graph=\"$AVGCONTACTTIME_graph\";\n";
$JS_text.="\n";
for ($e=0; $e<count($call_status); $e++) {
$Sstatus=$call_status[$e];
$graph_var=$Sstatus."_graph";
$JS_text.=" var ".$Sstatus."_graph=\"".$$graph_var."\";\n";
}
$JS_text.=" for (var i=1; i<=".(16+count($call_status))."; i++) {\n";
$JS_text.=" var cellID=\"team".$user_group[$i]."graph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"team".$user_group[$i]."graph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('team_".$user_group[$i]."_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$graph_count=count($graph_array);
$graph_title="$user_group[$i] - $group_name";
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
$GRAPH_text.=$GRAPH.$GRAPH2.$GRAPH3;
$GRAPH_text.=$GRAPH;
#flush();
}
else
@@ -1178,93 +1141,99 @@ if ( ($SUBMIT=="SUBMIT") or ($SUBMIT==_QXZ("SUBMIT")) )
$CSV_text.="\"\",\""._QXZ("Team Name")."\",\""._QXZ("Team ID")."\",\""._QXZ("Calls")."\",\""._QXZ("Leads")."\",\""._QXZ("Contacts")."\",\""._QXZ("Contact Ratio")."\",\""._QXZ("Nonpause Time")."\",\""._QXZ("System Time")."\",\""._QXZ("Talk Time")."\",\""._QXZ("Sales")."\",\""._QXZ("Sales per Working Hour")."\",\""._QXZ("Sales to Leads Ratio")."\",\""._QXZ("Sales to Contacts Ratio")."\",\""._QXZ("Sales Per Hour")."\",\""._QXZ("Incomplete Sales")."\",\""._QXZ("Cancelled Sales")."\",\""._QXZ("Callbacks")."\",\""._QXZ("First Call Resolution")."\",\""._QXZ("Average Sale Time")."\",\""._QXZ("Average Contact Time")."\"$CSVstatusheader\n";
$CSV_text.=$GROUP_CSV_text;
$CSV_text.="\"\",\"\",\""._QXZ("TOTALS").":\",\"$total_calls\",\"$total_leads\",\"$total_contacts\",\"$total_contact_ratio %\",\"".sec_convert($total_nonpause_time,'H')."\",\"".sec_convert($total_system_time,'H')."\",\"".sec_convert($total_talk_time,'H')."\",\"$total_sales\",\"$sales_per_working_hours\",\"$total_sales_ratio\",\"$total_sale_contact_ratio\",\"$total_sales_per_hour\",\"$total_inc_sales\",\"$total_cnc_sales\",\"$total_callbacks\",\"$total_stcall\",\"$total_average_sale_time\",\"$total_average_contact_time\"$CSV_status_text\n";
for ($d=0; $d<count($total_graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($total_graph_stats)) {$class=" last";} else {$class="";}
$TOTALCALLS_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][1], $max_totalcalls))."' height='16' />".$total_graph_stats[$d][1]."</td></tr>";
$TOTALLEADS_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][2], $max_totalleads))."' height='16' />".$total_graph_stats[$d][2]."</td></tr>";
$TOTALCONTACTS_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][3], $max_totalcontacts))."' height='16' />".$total_graph_stats[$d][3]."</td></tr>";
$TOTALCONTACTRATIO_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][4], $max_totalcontactratio))."' height='16' />".$total_graph_stats[$d][4]."%</td></tr>";
$TOTALSYSTEMTIME_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][5], $max_totalsystemtime))."' height='16' />".sec_convert($total_graph_stats[$d][5], 'H')."</td></tr>";
$TOTALTALKTIME_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][6], $max_totaltalktime))."' height='16' />".sec_convert($total_graph_stats[$d][6], 'H')."</td></tr>";
$TOTALSALES_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][7], $max_totalsales))."' height='16' />".$total_graph_stats[$d][7]."</td></tr>";
$TOTALSALESLEADSRATIO_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][8], $max_totalsalesleadsratio))."' height='16' />".$total_graph_stats[$d][8]."%</td></tr>";
$TOTALSALESCONTACTSRATIO_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][9], $max_totalsalescontactsratio))."' height='16' />".$total_graph_stats[$d][9]."%</td></tr>";
$TOTALSALESPERHOUR_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][10], $max_totalsalesperhour))."' height='16' />".$total_graph_stats[$d][10]."</td></tr>";
$TOTALINCSALES_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][11], $max_totalincsales))."' height='16' />".$total_graph_stats[$d][11]."</td></tr>";
$TOTALCANCELLEDSALES_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][12], $max_totalcancelledsales))."' height='16' />".$total_graph_stats[$d][12]."</td></tr>";
$TOTALCALLBACKS_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][13], $max_totalcallbacks))."' height='16' />".$total_graph_stats[$d][13]."</td></tr>";
$TOTALFIRSTCALLS_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][14], $max_totalfirstcall))."' height='16' />".$total_graph_stats[$d][14]."</td></tr>";
$TOTALAVGSALETIME_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][15], $max_totalavgsaletime))."' height='16' />".sec_convert($total_graph_stats[$d][15], 'H')."</td></tr>";
$TOTALAVGCONTACTTIME_graph.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][16], $max_totalavgcontacttime))."' height='16' />".sec_convert($total_graph_stats[$d][16], 'H')."</td></tr>";
for ($e=0; $e<count($call_status); $e++) {
$Sstatus=$call_status[$e];
$varname="TOTAL".$Sstatus."_graph";
$max_varname="max_total".$Sstatus;
# $max.= "<!-- $max_varname => ".$$max_varname." //-->\n";
$$varname.=" <tr><td class='chart_td$class'>".$total_graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$total_graph_stats[$d][($e+17)], $$max_varname))."' height='16' />".$total_graph_stats[$d][($e+17)]."</td></tr>";
# USE THIS FOR COMBINED graphs, use pipe-delimited array elements, dataset_name|index|link_name|graph_override
# You have to hard code the graph name in where it is overridden and mind the data indices. No other way to do it.
$multigraph_text="";
$graph_id++;
$graph_array=array("ATPD_TOTALCALLSdata|1|CALLS|integer|", "ATPD_TOTALLEADSdata|2|LEADS|integer|", "ATPD_TOTALCONTACTSdata|3|CONTACTS|integer|", "ATPD_TOTALCONTACTRATIOdata|4|CONTACT RATIO|decimal|", "ATPD_TOTALSYSTEMTIMEdata|5|SYSTEM TIME|time|", "ATPD_TOTALTALKTIMEdata|6|TALK TIME|time|", "ATPD_TOTALSALESdata|7|SALES|integer|", "ATPD_TOTALSALESTOLEADSdata|8|SALES TO LEADS RATIO|decimal|", "ATPD_TOTALSALESTOCONTACTSdata|9|SALES TO CONTACTS RATIO|decimal|", "ATPD_TOTALSALESPERHOURdata|10|SALES PER HOUR|decimal|", "ATPD_TOTALINCOMPLETESALESSdata|11|INCOMPLETE SALES|integer|", "ATPD_TOTALCANCELLEDSALESdata|12|CANCELLED SALES|integer|", "ATPD_TOTALCALLBACKSdata|13|CALLBACKS|integer|", "ATPD_TOTALFIRSTCALLSdata|14|FIRST CALLS|decimal|", "ATPD_TOTALAVGSALETIMEdata|15|AVG SALE TIME|time|", "ATPD_TOTALAVGCONTACTTIMEdata|16|AVG CONTACT TIME|time|");
for ($e=0; $e<count($call_status); $e++) {
$Sstatus=$call_status[$e];
$SstatusTXT=$Sstatus;
if ($Sstatus=="") {$SstatusTXT="(blank)";}
array_push($graph_array, "ATPD_SUBSTATUSTOTAL".$e."data|".($e+19)."|".$SstatusTXT."|time|");
}
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$GRAPH="";
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($total_graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $total_graph_stats[$d][0])."\",";
$data.="\"".$total_graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$total_graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$TOTALCALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_calls)."</th></tr></table>";
$TOTALLEADS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_leads)."</th></tr></table>";
$TOTALCONTACTS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_contacts)."</th></tr></table>";
$TOTALCONTACTRATIO_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_contact_ratio)."%</th></tr></table>";
$TOTALSYSTEMTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".sec_convert($total_system_time,'H')."</th></tr></table>";
$TOTALTALKTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".sec_convert($total_talk_time,'H')."</th></tr></table>";
$TOTALSALES_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_sales)."</th></tr></table>";
$TOTALSALESLEADSRATIO_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_sales_ratio)."%</th></tr></table>";
$TOTALSALESCONTACTSRATIO_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_sale_contact_ratio)."%</th></tr></table>";
$TOTALSALESPERHOUR_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_sales_per_hour)."</th></tr></table>";
$TOTALINCSALES_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_inc_sales)."</th></tr></table>";
$TOTALCANCELLEDSALES_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_cnc_sales)."</th></tr></table>";
$TOTALCALLBACKS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_callbacks)."</th></tr></table>";
$TOTALFIRSTCALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_stcall)."</th></tr></table>";
$TOTALAVGSALETIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_average_sale_time)."</th></tr></table>";
$TOTALAVGCONTACTTIME_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($total_average_contact_time)."</th></tr></table>";
for ($e=0; $e<count($call_status); $e++) {
$Sstatus=$call_status[$e];
$total_var=$Sstatus."_total";
$graph_var="TOTAL".$Sstatus."_graph";
$$graph_var.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($$total_var)."</th></tr></table>";
}
$JS_onload.="\tDrawTotalGraph('CALLS', '1');\n";
$JS_text.="function DrawTotalGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$TOTALCALLS_graph\";\n";
$JS_text.=" var LEADS_graph=\"$TOTALLEADS_graph\";\n";
$JS_text.=" var CONTACTS_graph=\"$TOTALCONTACTS_graph\";\n";
$JS_text.=" var CONTACTRATIO_graph=\"$TOTALCONTACTRATIO_graph\";\n";
$JS_text.=" var SYSTEMTIME_graph=\"$TOTALSYSTEMTIME_graph\";\n";
$JS_text.=" var TALKTIME_graph=\"$TOTALTALKTIME_graph\";\n";
$JS_text.=" var SALES_graph=\"$TOTALSALES_graph\";\n";
$JS_text.=" var SALESLEADSRATIO_graph=\"$TOTALSALESLEADSRATIO_graph\";\n";
$JS_text.=" var SALESCONTACTSRATIO_graph=\"$TOTALSALESCONTACTSRATIO_graph\";\n";
$JS_text.=" var SALESPERHOUR_graph=\"$TOTALSALESPERHOUR_graph\";\n";
$JS_text.=" var INCSALES_graph=\"$TOTALINCSALES_graph\";\n";
$JS_text.=" var CANCELLEDSALES_graph=\"$TOTALCANCELLEDSALES_graph\";\n";
$JS_text.=" var CALLBACKS_graph=\"$TOTALCALLBACKS_graph\";\n";
$JS_text.=" var FIRSTCALLS_graph=\"$TOTALFIRSTCALLS_graph\";\n";
$JS_text.=" var AVGSALETIME_graph=\"$TOTALAVGSALETIME_graph\";\n";
$JS_text.=" var AVGCONTACTTIME_graph=\"$TOTALAVGCONTACTTIME_graph\";\n";
for ($e=0; $e<count($call_status); $e++) {
$Sstatus=$call_status[$e];
$graph_var="TOTAL".$Sstatus."_graph";
$JS_text.=" var ".$Sstatus."_graph=\"".$$graph_var."\";\n";
}
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=".(16+count($call_status))."; i++) {\n";
$JS_text.=" var cellID=\"teamTotalgraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"teamTotalgraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('team_Total_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$graph_count=count($graph_array);
$graph_title="CALL CENTER TOTAL";
include("graphcanvas.inc");
$GRAPH.=$graphCanvas;
$GRAPH_text.=$TOTALGRAPH.$TOTALGRAPH2.$TOTALGRAPH3;
$GRAPH_text.=$GRAPH;
$GRAPH_text.="</FONT></PRE>";
$GRAPH_text.="</BODY>\n";
$GRAPH_text.="</HTML>\n";
@@ -1308,10 +1277,10 @@ else
}
echo $HTML_head;
echo $JS_text;
$short_header=1;
require("admin_header.php");
echo $HTML_text;
echo $JS_text;
flush();
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,54 @@
<STYLE type="text/css">
<?php
$color_stmt="select menu_background, frame_background, std_row1_background, std_row2_background, std_row3_background, std_row4_background, std_row5_background from system_settings s, vicidial_screen_colors v where s.admin_screen_colors=v.colors_id and length(frame_background)=6 and length(menu_background)=6 limit 1;";
$color_rslt=mysql_to_mysqli($color_stmt, $link);
if (file_exists('options.php'))
{
require('options.php');
$init_height=$graph_canvas_size; # Chart has a minimum height/width of 600 by default
}
else
{
$init_height=600;
}
if(mysqli_num_rows($color_rslt) > 0) {
$color_row=mysqli_fetch_array($color_rslt);
$rgbbutton=hex2rgb("#$color_row[std_row1_background]");
$bcolor="#FFFFFF";
$scolor="#000000";
for ($cs=0; $cs<count($rgbbutton); $cs++) {
if ($rgbbutton[$cs]>=204) {
$bcolor="#000000";
$scolor="#FFFFFF";
}
}
echo ".ChartJSButton {\n";
echo "\tbackground-color:#".$color_row["std_row1_background"].";\n";
echo "\t-moz-border-radius:14px;\n";
echo "\t-webkit-border-radius:14px;\n";
echo "\tborder-radius:14px;\n";
echo "\tborder:4px solid #".$color_row["std_row2_background"].";\n";
echo "\tdisplay:inline-block;\n";
echo "\tcursor:pointer;\n";
echo "\tcolor:".$bcolor.";\n";
echo "\tfont-family:Arial;\n";
echo "\tfont-size:10px;\n";
echo "\tfont-weight:bold;\n";
echo "\tpadding:8px;\n";
echo "\twidth:".floor($init_height/5)."px;\n";
echo "\ttext-decoration:none;\n";
echo "\ttext-shadow:1px 1px 0px ".$scolor.";\n";
echo "}\n";
echo ".ChartJSButton:hover {\n";
echo "\tbackground-color:#".$color_row["std_row3_background"].";\n";
echo "}\n";
}
?>
</STYLE>
+164 -79
View File
@@ -33,6 +33,7 @@
# 151125-1642 - Added search archive option
# 160211-2249 - Overhauled report calculations and labeling to make the report more accurate and "universal"
# 160227-1131 - Uniform form format
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -67,6 +68,7 @@ if (strlen($shift)<2) {$shift='ALL';}
$report_name = 'Fronter - Closer Report';
$db_source = 'M';
$JS_text="<script language='Javascript'>\n";
$JS_text.="function openNewWindow(url)\n";
$JS_text.=" {\n";
@@ -319,6 +321,9 @@ $HTML_head.="\n";
$HTML_head.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HTML_head.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HTML_head.="<script src='chart/Chart.js'>Chart.defaults.global.defaultFontSize = 10;</script>\n";
$HTML_head.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HTML_head.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HTML_head.="<TITLE>"._QXZ("$report_name")."</TITLE></HEAD><BODY BGCOLOR=WHITE marginheight=0 marginwidth=0 leftmargin=0 topmargin=0>\n";
@@ -476,15 +481,6 @@ $max_success_pct=1;
$max_sales=1;
$max_drops=1;
$max_other=1;
$GRAPH="<a name='frontergraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='20%' class='grey_graph_cell' id='frontergraph1'><a href='#' onClick=\"DrawFronterGraph('XFERS', '1'); return false;\">"._QXZ("XFERS")."</a></th><th width='20%' class='grey_graph_cell' id='frontergraph2'><a href='#' onClick=\"DrawFronterGraph('SALEPCT', '2'); return false;\">"._QXZ("SALE")." %</a></th><th width='20%' class='grey_graph_cell' id='frontergraph3'><a href='#' onClick=\"DrawFronterGraph('SALE', '3'); return false;\">"._QXZ("SALE")."</a></th><th width='20%' class='grey_graph_cell' id='frontergraph4'><a href='#' onClick=\"DrawFronterGraph('DROP', '4'); return false;\">"._QXZ("DROP")."</a></th><th width='20%' class='grey_graph_cell' id='frontergraph5'><a href='#' onClick=\"DrawFronterGraph('OTHER', '5'); return false;\">"._QXZ("OTHER")."</a></th></tr>";
$GRAPH.="<tr><td colspan='5' class='graph_span_cell'><span id='fronter_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>"._QXZ("FRONTER STATS")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("AGENT")."</th>";
$XFERS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("XFERS")."</th></tr>";
$SALEPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALE")." %</th></tr>";
$SALE_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALE")."</th></tr>";
$DROP_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DROP")."</th></tr>";
$OTHER_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("OTHER")."</th></tr>";
###########################
$stmt="select user,count(*) from ".$vicidial_xfer_log_table." where call_date >= '$query_date_BEGIN' and call_date <= '$query_date_END' and campaign_id='" . mysqli_real_escape_string($link, $group) . "' and user is not null group by user;";
@@ -617,37 +613,87 @@ $ASCII_text.="+--------------------------+--------+--------+------+------+------
$CSV_fronter_footer.="\""._QXZ("TOTAL FRONTERS").": $TOTagents\",\"$TOTcalls\",\"$totSpct%\",\"$TOTsales\",\"$totDROP\",\"$totOTHER\"\n";
$CSV_fronter_footer.="\""._QXZ("Average time in Queue for customers").": $AVGwait\"\n\n\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$XFERS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_xfers))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$SALEPCT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_success_pct))."' height='16' />".$graph_stats[$d][2]."</td></tr>";
$SALE_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_sales))."' height='16' />".$graph_stats[$d][3]."</td></tr>";
$DROP_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][4], $max_drops))."' height='16' />".$graph_stats[$d][4]."</td></tr>";
$OTHER_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][5] ,$max_other))."' height='16' />".$graph_stats[$d][5]."</td></tr>";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("FCSF_XFERSdata|1|XFERS|integer|", "FCSF_SALEPCTdata|2|SALE %|percent|", "FCSF_SALESdata|3|SALES|integer|", "FCSF_DROPSdata|4|DROPS|integer|", "FCSF_OTHERdata|5|OTHER|integer|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$XFERS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTcalls)."</th></tr></table>";
$SALEPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($totSpct)."%</th></tr></table>";
$SALE_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTsales)."</th></tr></table>";
$DROP_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($totDROP)."</th></tr></table>";
$OTHER_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($totOTHER)."</th></tr></table>";
$JS_onload.="\tDrawFronterGraph('XFERS', '1');\n";
$JS_text.="function DrawFronterGraph(graph, th_id) {\n";
$JS_text.=" var XFERS_graph=\"$XFERS_graph\";\n";
$JS_text.=" var SALEPCT_graph=\"$SALEPCT_graph\";\n";
$JS_text.=" var SALE_graph=\"$SALE_graph\";\n";
$JS_text.=" var DROP_graph=\"$DROP_graph\";\n";
$JS_text.=" var OTHER_graph=\"$OTHER_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=5; i++) {\n";
$JS_text.=" var cellID=\"frontergraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"frontergraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('fronter_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$GRAPH_text.=$GRAPH;
$graph_count=count($graph_array);
$graph_title=_QXZ("FRONTER STATS");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
##############################
######### CLOSER STATS
@@ -678,15 +724,6 @@ $max_drops=1;
$max_other=1;
$max_sales2=1;
$max_conv_pct=1;
$GRAPH="<BR><BR><a name='closergraph'/><table border='0' cellpadding='0' cellspacing='2' width='800'>";
$GRAPH.="<tr><th width='20%' class='grey_graph_cell' id='closergraph1'><a href='#' onClick=\"DrawCloserGraph('CALLS', '1'); return false;\">"._QXZ("CALLS")."</a></th><th width='20%' class='grey_graph_cell' id='closergraph2'><a href='#' onClick=\"DrawCloserGraph('SALES', '2'); return false;\">"._QXZ("SALE")."S</a></th><th width='20%' class='grey_graph_cell' id='closergraph3'><a href='#' onClick=\"DrawCloserGraph('DROP', '3'); return false;\">"._QXZ("DROP")."</a></th><th width='20%' class='grey_graph_cell' id='closergraph4'><a href='#' onClick=\"DrawCloserGraph('OTHER', '4'); return false;\">"._QXZ("OTHER")."</a></th><th width='20%' class='grey_graph_cell' id='closergraph5'><a href='#' onClick=\"DrawCloserGraph('CONVPCT', '5'); return false;\">"._QXZ("CONV")." %</a></th></tr>";
$GRAPH.="<tr><td colspan='5' class='graph_span_cell'><span id='closer_graph'><BR>&nbsp;<BR></span></td></tr></table><BR><BR>";
$graph_header="<table cellspacing='0' cellpadding='0' summary='STATUS' class='horizontalgraph'><caption align='top'>"._QXZ("CLOSER STATS")."</caption><tr><th class='thgraph' scope='col'>"._QXZ("AGENT")."</th>";
$CALLS_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CALLS")." </th></tr>";
$SALES_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("SALES")."</th></tr>";
$DROP_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("DROP")."</th></tr>";
$OTHER_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("OTHER")."</th></tr>";
$CONVPCT_graph=$graph_header."<th class='thgraph' scope='col'>"._QXZ("CONV")." %</th></tr>";
###########################
$stmt="select user,count(*) from ".$vicidial_closer_log_table." where call_date >= '$query_date_BEGIN' and call_date <= '$query_date_END' and campaign_id='" . mysqli_real_escape_string($link, $group) . "' and user is not null group by user;";
@@ -835,37 +872,85 @@ $ASCII_text.="+--------------------------+--------+------+------+------+-------+
$CSV_closer_footer.="\""._QXZ("TOTAL CLOSERS").": $TOTagents\",\"$TOTcalls\",\"$totA1\",\"$totDROP\",\"$totOTHER\",\"$TOTsales\",\"$totCpct%\"\n";
for ($d=0; $d<count($graph_stats); $d++) {
if ($d==0) {$class=" first";} else if (($d+1)==count($graph_stats)) {$class=" last";} else {$class="";}
$CALLS_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][1], $max_calls))."' height='16' />".$graph_stats[$d][1]."</td></tr>";
$SALES_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][2], $max_sales))."' height='16' />".$graph_stats[$d][2]."</td></tr>";
$DROP_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][3], $max_drops))."' height='16' />".$graph_stats[$d][3]."</td></tr>";
$OTHER_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][4], $max_other))."' height='16' />".$graph_stats[$d][4]."</td></tr>";
$CONVPCT_graph.=" <tr><td class='chart_td$class'>".$graph_stats[$d][0]."</td><td nowrap class='chart_td value$class'><img src='images/bar.png' alt='' width='".round(MathZDC(400*$graph_stats[$d][5], $max_conv_pct))."' height='16' />".$graph_stats[$d][5]."%</td></tr>";
# USE THIS FOR multiple graphs, use pipe-delimited array elements, dataset_name|index|link_name
$multigraph_text="";
$graph_id++;
$graph_array=array("FCSC_CALLSdata|1|CALLS|integer|", "FCSC_SALESdata|2|SALES|integer|", "FCSC_DROPSdata|3|DROPS|integer|", "FCSC_OTHERdata|4|OTHER|integer|", "FCSC_CONVPCTdata|5|CONV %|percent|");
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($graph_stats); $d++) {
$labels.="\"".preg_replace('/ +/', ' ', $graph_stats[$d][0])."\",";
$data.="\"".$graph_stats[$d][$dataset_index]."\",";
$current_graph_total+=$graph_stats[$d][$dataset_index];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$CALLS_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTcalls)."</th></tr></table>";
$SALES_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($TOTsales)."</th></tr></table>";
$DROP_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($totDROP)."</th></tr></table>";
$OTHER_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($totOTHER)."</th></tr></table>";
$CONVPCT_graph.="<tr><th class='thgraph' scope='col'>"._QXZ("TOTAL").":</th><th class='thgraph' scope='col'>".trim($totCpct)."%</th></tr></table>";
$JS_onload.="\tDrawCloserGraph('CALLS', '1');\n";
$JS_text.="function DrawCloserGraph(graph, th_id) {\n";
$JS_text.=" var CALLS_graph=\"$CALLS_graph\";\n";
$JS_text.=" var SALES_graph=\"$SALES_graph\";\n";
$JS_text.=" var DROP_graph=\"$DROP_graph\";\n";
$JS_text.=" var OTHER_graph=\"$OTHER_graph\";\n";
$JS_text.=" var CONVPCT_graph=\"$CONVPCT_graph\";\n";
$JS_text.="\n";
$JS_text.=" for (var i=1; i<=5; i++) {\n";
$JS_text.=" var cellID=\"closergraph\"+i;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#DDDDDD';\n";
$JS_text.=" }\n";
$JS_text.=" var cellID=\"closergraph\"+th_id;\n";
$JS_text.=" document.getElementById(cellID).style.backgroundColor='#999999';\n";
$JS_text.=" var graph_to_display=eval(graph+\"_graph\");\n";
$JS_text.=" document.getElementById('closer_graph').innerHTML=graph_to_display;\n";
$JS_text.="}\n";
$GRAPH_text.=$GRAPH;
$graph_count=count($graph_array);
$graph_title=_QXZ("CLOSER STATS");
include("graphcanvas.inc");
$GRAPH_text.=$graphCanvas;
$ENDtime = date("U");
@@ -912,9 +997,9 @@ else
$JS_text.="</script>\n";
echo $HTML_head;
echo $JS_text;
require("admin_header.php");
echo $HTML_text;
echo $JS_text;
}
#$CSV_report=fopen("fcstats.csv", "w");
@@ -0,0 +1,101 @@
<?php
switch ($graph_color_schema) {
case "99999999": # RED/PALE RED
$backgroundColor=array("#FF9999", "#FFCCCC");
$hoverBackgroundColor=array("#FF6666", "#FF9999");
$hoverBorderColor=array("#FF0000", "#FF3333");
$graphConstants ="\t\t\t\thoverBorderWidth: 2,\n";
$graphConstants.="\t\t\t\ttension: 0,\n";
$graphConstants.="\t\t\t\tfillColor: \"rgba(255,102,102,0.5)\",\n";
# $graphConstants.="\t\t\t\tbackgroundColor: \"#f99\",\n";
$graphConstants.="\t\t\t\tborderColor: \"rgba(102,0,0,0.8)\",\n";
$graphConstants.="\t\t\t\tpointBorderColor: \"rgba(255,0,0,1)\",\n";
$graphConstants.="\t\t\t\tpointBackgroundColor: \"#f99\",\n";
$graphConstants.="\t\t\t\tpointHoverBackgroundColor: \"rgba(255,204,204,0.75)\",\n";
$graphConstants.="\t\t\t\tpointHoverBorderColor: \"rgba(255,102,102,1)\"\n";
break;
case "88888888": # BLUE
$backgroundColor=array("#9999FF");
$hoverBackgroundColor=array("#6666FF");
$hoverBorderColor=array("#0000FF");
$graphConstants ="\t\t\t\thoverBorderWidth: 2,\n";
$graphConstants.="\t\t\t\ttension: 0,\n";
$graphConstants.="\t\t\t\tfillColor: \"rgba(102,102,255,0.5)\",\n";
# $graphConstants.="\t\t\t\tbackgroundColor: \"#99f\",\n";
$graphConstants.="\t\t\t\tborderColor: \"rgba(0,0,102,0.8)\",\n";
$graphConstants.="\t\t\t\tpointBorderColor: \"rgba(0,0,255,1)\",\n";
$graphConstants.="\t\t\t\tpointBackgroundColor: \"#99f\",\n";
$graphConstants.="\t\t\t\tpointHoverBackgroundColor: \"rgba(204,204,255,0.75)\",\n";
$graphConstants.="\t\t\t\tpointHoverBorderColor: \"rgba(102,102,255,1)\"\n";
break;
case "7777777": # GREEN
$backgroundColor=array("#99FF99");
$hoverBackgroundColor=array("#66FF66");
$hoverBorderColor=array("#00FF00");
$graphConstants ="\t\t\t\thoverBorderWidth: 2,\n";
$graphConstants.="\t\t\t\ttension: 0,\n";
$graphConstants.="\t\t\t\tfillColor: \"rgba(102,255,102,0.5)\",\n";
# $graphConstants.="\t\t\t\tbackgroundColor: \"#9f9\",\n";
$graphConstants.="\t\t\t\tborderColor: \"rgba(0,102,0,0.8)\",\n";
$graphConstants.="\t\t\t\tpointBorderColor: \"rgba(0,255,0,1)\",\n";
$graphConstants.="\t\t\t\tpointBackgroundColor: \"#9f9\",\n";
$graphConstants.="\t\t\t\tpointHoverBackgroundColor: \"rgba(204,255,204,0.75)\",\n";
$graphConstants.="\t\t\t\tpointHoverBorderColor: \"rgba(102,255,102,1)\"\n";
break;
case "66666666": # RED
$backgroundColor=array("#FF9999");
$hoverBackgroundColor=array("#FF6666");
$hoverBorderColor=array("#FF0000");
$graphConstants ="\t\t\t\thoverBorderWidth: 2,\n";
$graphConstants.="\t\t\t\ttension: 0,\n";
$graphConstants.="\t\t\t\tfillColor: \"rgba(255,102,102,0.5)\",\n";
# $graphConstants.="\t\t\t\tbackgroundColor: \"#f99\",\n";
$graphConstants.="\t\t\t\tborderColor: \"rgba(102,0,0,0.8)\",\n";
$graphConstants.="\t\t\t\tpointBorderColor: \"rgba(255,0,0,1)\",\n";
$graphConstants.="\t\t\t\tpointBackgroundColor: \"#f99\",\n";
$graphConstants.="\t\t\t\tpointHoverBackgroundColor: \"rgba(255,204,204,0.75)\",\n";
$graphConstants.="\t\t\t\tpointHoverBorderColor: \"rgba(255,102,102,1)\"\n";
default:
$color_stmt="select menu_background, frame_background, std_row1_background, std_row2_background, std_row3_background, std_row4_background, std_row5_background from system_settings s, vicidial_screen_colors v where s.admin_screen_colors=v.colors_id and length(frame_background)=6 and length(menu_background)=6 limit 1;";
$color_rslt=mysql_to_mysqli($color_stmt, $link);
if(mysqli_num_rows($color_rslt) > 0) {
$color_row=mysqli_fetch_array($color_rslt);
$backgroundColor=array("$color_row[std_row1_background]", "$color_row[std_row2_background]", "$color_row[std_row3_background]", "$color_row[std_row4_background]", "$color_row[std_row5_background]");
array_filter($backgroundColor);
for ($ci=0; $ci<count($backgroundColor); $ci++) {
$backgroundColor[$ci]="#".$backgroundColor[$ci];
}
$rgbmenu=hex2rgb("#$color_row[menu_background]");
$rgbframe=hex2rgb("#$color_row[frame_background]");
$hoverBackgroundColor=$backgroundColor;
$hoverBorderColor=array("#$color_row[menu_background]");
$graphConstants ="\t\t\t\thoverBorderWidth: 2,\n";
$graphConstants.="\t\t\t\ttension: 0,\n";
$graphConstants.="\t\t\t\tfillColor: \"rgba(".implode(",", $rgbframe).",0.5)\",\n";
$graphConstants.="\t\t\t\tborderColor: \"rgba(".implode(",", $rgbmenu).",0.8)\",\n";
$graphConstants.="\t\t\t\tpointBorderColor: \"rgba(".implode(",", $rgbmenu).",1)\",\n";
$graphConstants.="\t\t\t\tpointBackgroundColor: \"".$backgroundColor[0]."\",\n";
$graphConstants.="\t\t\t\tpointHoverBackgroundColor: \"rgba(".implode(",", $rgbmenu).",0.75)\",\n";
$graphConstants.="\t\t\t\tpointHoverBorderColor: \"rgba(".implode(",", $rgbframe).",1)\"\n";
} else {
$backgroundColor=array("#9999FF");
$hoverBackgroundColor=array("#6666FF");
$hoverBorderColor=array("#0000FF");
$graphConstants ="\t\t\t\thoverBorderWidth: 2,\n";
$graphConstants.="\t\t\t\ttension: 0,\n";
$graphConstants.="\t\t\t\tfillColor: \"rgba(102,102,255,0.5)\",\n";
# $graphConstants.="\t\t\t\tbackgroundColor: \"#99f\",\n";
$graphConstants.="\t\t\t\tborderColor: \"rgba(0,0,102,0.8)\",\n";
$graphConstants.="\t\t\t\tpointBorderColor: \"rgba(0,0,255,1)\",\n";
$graphConstants.="\t\t\t\tpointBackgroundColor: \"#99f\",\n";
$graphConstants.="\t\t\t\tpointHoverBackgroundColor: \"rgba(204,204,255,0.75)\",\n";
$graphConstants.="\t\t\t\tpointHoverBorderColor: \"rgba(102,102,255,1)\"\n";
}
break;
}
?>
@@ -0,0 +1,93 @@
<?php
$graphCanvas="\n\n<form>";
$graphCanvas.="<table cellspacing=\"1\" cellpadding=\"1\" summary=\""._QXZ("$graph_title")."\" class=\"horizontalgraph\">\n";
$graphCanvas.=" <caption align=\"top\">"._QXZ("$graph_title")."</caption>\n";
if ($graph_count>1) {
$graphCanvas.=" <tr>\n";
for ($q=0; $q<$graph_count; $q++) {
$graph_info=explode("|", $graph_array[$q]);
$link_name=$graph_info[2];
$graphCanvas.="<th width='".($q==0 ? '*' : floor(100/$graph_count).'%')."' class='thgraph ".($q==0 ? 'selected_grey_graph_cell' : 'grey_graph_cell')."' id='LinkID".$graph_id."_".$q."'><a href='#' onClick=\"ToggleSpan('".$graph_id."', '".$q."', '".$graph_count."'); return false;\">"._QXZ("$link_name")."</a></th>";
}
$graphCanvas.=" </tr>\n";
}
$graphCanvas.=" <tr><td colspan='".$graph_count."'>\n";
for ($q=0; $q<$graph_count; $q++) {
# SET GRAPH size FOR READABILITY
if (file_exists('options.php'))
{
require('options.php');
$init_height=$graph_canvas_size; # Chart has a minimum height/width of 600 by default
}
else
{
$init_height=600;
}
$entry_width=($init_width<20 ? 20 : ($init_width>50 ? 50 : $init_width));
$init_width=(($graph_count*$entry_width)<$init_height ? $init_height : ($graph_count*$entry_width));
$graph_info=explode("|", $graph_array[$q]);
$dataset_name=$graph_info[0];
$dataset_type=$graph_info[3];
switch($dataset_type) {
case "time":
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$chart_options="options: { legend: { display: false }},";
break;
}
$graphCanvas.="<span id='SpanID".$graph_id."_".$q."' style='display:".($q==0 ? 'block' : 'none').";'>";
$graphCanvas.="<table width='$init_width'>";
$graphCanvas.=$graph_totals_array[$q];
$graphCanvas.="<tr>\n";
/*
$graphCanvas.="<td align='center'><input type='button' value='PIE' onClick=\"if(GraphID".$graph_id."_".$q."!=null){GraphID".$graph_id."_".$q.".destroy();}; prepChart('pie', $graph_id, $q, $dataset_name); var GraphID".$graph_id."_".$q." = new Chart(main_ctx, $dataset_name);\"></td>\n";
$graphCanvas.="<td align='center'><input type='button' value='LINE' onClick=\"if(GraphID".$graph_id."_".$q."!=null){GraphID".$graph_id."_".$q.".destroy();}; prepChart('line', $graph_id, $q, $dataset_name); var GraphID".$graph_id."_".$q." = new Chart(main_ctx, $dataset_name);\"></td>\n";
$graphCanvas.="<td align='center'><input type='button' value='BAR' onClick=\"if(GraphID".$graph_id."_".$q."!=null){GraphID".$graph_id."_".$q.".destroy();}; prepChart('bar', $graph_id, $q, $dataset_name); var GraphID".$graph_id."_".$q." = new Chart(main_ctx, $dataset_name);\"></td>\n";
$graphCanvas.="<td align='center'><input type='button' value='POLAR' onClick=\"if(GraphID".$graph_id."_".$q."!=null){GraphID".$graph_id."_".$q.".destroy();}; prepChart('polarArea', $graph_id, $q, $dataset_name); var GraphID".$graph_id."_".$q." = new Chart(main_ctx, $dataset_name);\"></td>\n";
var h = Math.floor(d / 3600); var m = Math.floor(d % 3600 / 60); var s = Math.floor(d % 3600 % 60); return ((h > 0 ? h + ":" + (m < 10 ? "0" : "") : "") + m + ":" + (s < 10 ? "0" : "") + s);
type: 'pie', options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; var label = data.labels[tooltipItem.index]; var percentage = Math.round(value / totalSessions * 100); return label + ' ' + percentage + '%';}}},}, data: topBrowsers
*/
$graphCanvas.="<td align='center' width='20%'><input type='button' class='ChartJSButton' value='PIE' onClick=\"if(GraphID".$graph_id."_".$q."!=null){GraphID".$graph_id."_".$q.".destroy();}; var main_ctx = document.getElementById('CanvasID".$graph_id."_".$q."'); GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: 'pie', options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; var label = data.labels[tooltipItem.index]; var percentage = Math.round(value / ".$graph_totals_rawdata[$q]." * 10000)/100; return label + ' ' + percentage + '%';}}}, legend: { display: false }}, data: $dataset_name});\"></td>\n";
$graphCanvas.="<td align='center' width='20%'><input type='button' class='ChartJSButton' value='LINE' onClick=\"if(GraphID".$graph_id."_".$q."!=null){GraphID".$graph_id."_".$q.".destroy(); var main_ctx = document.getElementById('CanvasID".$graph_id."_".$q."'); GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: 'line', $chart_options data: $dataset_name});}\"></td>\n";
$graphCanvas.="<td align='center' width='20%'><input type='button' class='ChartJSButton' value='HORIZ. BAR' onClick=\"if(GraphID".$graph_id."_".$q."!=null){GraphID".$graph_id."_".$q.".destroy();}; var main_ctx = document.getElementById('CanvasID".$graph_id."_".$q."'); GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: 'horizontalBar', $chart_options data: $dataset_name});\"></td>\n";
$graphCanvas.="<td align='center' width='20%'><input type='button' class='ChartJSButton' value='VERT. BAR' onClick=\"if(GraphID".$graph_id."_".$q."!=null){GraphID".$graph_id."_".$q.".destroy();}; var main_ctx = document.getElementById('CanvasID".$graph_id."_".$q."'); GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: 'bar', $chart_options data: $dataset_name});\"></td>\n";
$graphCanvas.="<td align='center' width='20%'><input type='button' class='ChartJSButton' value='POLAR' onClick=\"if(GraphID".$graph_id."_".$q."!=null){GraphID".$graph_id."_".$q.".destroy();}; var main_ctx = document.getElementById('CanvasID".$graph_id."_".$q."'); GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: 'polarArea', $chart_options data: $dataset_name});\"></td>\n";
$graphCanvas.="</tr>\n";
$graphCanvas.="<tr height='$init_height'>";
$graphCanvas.="<td id='chartContainer' colspan=5>";
$graphCanvas.="<canvas id=\"CanvasID".$graph_id."_".$q."\" width=\"".$init_width."\" height=\"".$init_height."\"></canvas></td>";
$graphCanvas.="<td width='100' id='LegendID".$graph_id."_".$q."' rowspan=2></td>";
$graphCanvas.="</tr>";
$graphCanvas.="</table>";
$graphCanvas.="</span>";
}
$graphCanvas.="</td></tr>\n";
$graphCanvas.="</table>\n";
$graphCanvas.="</form>\n\n";
?>
<script language="Javascript">
// global chart names
<?php
for ($q=0; $q<$graph_count; $q++) {
echo "var GraphID".$graph_id."_".$q."=null;\n";
}
?>
</script>
<?php
$allowed_graph="ALL";
$graph_count=1;
?>
@@ -20,6 +20,7 @@
# 150909-1417 - Added $active_only_default_campaigns option for admin.php
# 160102-1249 - Added htmlconvert option for modify lead pages
# 160106-1321 - Added disable_user_group_bulk_change option
# 160715-0752 - Added graph_canvas_size option for HTML reports
#
# used by the realtime_report.php script
@@ -97,4 +98,7 @@ $htmlconvert=1;
# disable the user_group_bulk_change.php utility
$disable_user_group_bulk_change=0;
# canvas size in pixels for Chartjs-style graphs (width and height)
$graph_canvas_size=600;
?>
+89 -19
View File
@@ -26,6 +26,7 @@
# 140328-0005 - Converted division calculations to use MathZDC function
# 141114-0028 - Finalized adding QXZ translation to all admin files
# 141230-0948 - Added code for on-the-fly language translations display
# 160714-2348 - Added and tested ChartJS features for more aesthetically appealing graphs
#
$startMS = microtime();
@@ -318,12 +319,16 @@ $HEADER.=" .header_white {font-size: 14px; font-family: sans-serif; font-weig
$HEADER.=" .data_records {font-size: 12px; font-family: sans-serif; color: black}\n";
$HEADER.=" .data_records_fix {font-size: 12px; font-family: monospace; color: black}\n";
$HEADER.=" .data_records_fix_small {font-size: 9px; font-family: monospace; color: black}\n";
$HEADER.="\n";
$HEADER.="\n";
$HEADER.="-->\n";
$HEADER.="</style>\n";
$HEADER.="<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
$HEADER.="<link rel=\"stylesheet\" href=\"calendar.css\">\n";
$HEADER.="<link rel=\"stylesheet\" href=\"horizontalbargraph.css\">\n";
require("chart_button.php");
$HEADER.="<script src='chart/Chart.js'></script>\n";
$HEADER.="<script language=\"JavaScript\" src=\"vicidial_chart_functions.js\"></script>\n";
$HEADER.="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n";
$HEADER.="<TITLE>\n";
@@ -601,24 +606,89 @@ else
}
if ($high_ct<1) {$high_ct*=10;}
$MAIN.="</PRE>\n";
$MAIN.="<table cellspacing=\"0\" cellpadding=\"0\" summary=\"CALL HANGUP REASON STATS\" class=\"horizontalgraph\">\n";
$MAIN.=" <caption align=\"top\">"._QXZ("USER TIMECLOCK DETAILS")."<br /><font size='-1'>"._QXZ("Time range").": $query_date to $end_date<br/>"._QXZ("These totals do NOT include any active sessions")."</font><br /></caption>\n";
$MAIN.=" <tr>\n";
$MAIN.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("USER")." </th>\n";
$MAIN.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("HOURS")." </th>\n";
$MAIN.=" </tr>\n";
for ($i=0; $i<count($ct_ary); $i++) {
if ($i==0) {$class=" first";} else if (($i+1)==count($ct_ary)) {$class=" last";} else {$class="";}
$MAIN.=" <tr>\n";
$MAIN.=" <td class=\"chart_td$class\">".$ct_ary[$i][0]."</td>\n";
$MAIN.=" <td class=\"chart_td value$class\"><img src=\"images/bar.png\" alt=\"\" width=\"".round(MathZDC(400*$ct_ary[$i][1], $high_ct))."\" height=\"16\" />".$ct_ary[$i][1]."</td>\n";
$MAIN.=" </tr>\n";
$JS_text="<script language='Javascript'>\n";
#########
$graph_array=array("TCdata|||decimal|");
$graph_id++;
$default_graph="bar"; # Graph that is initally displayed when page loads
include("graph_color_schemas.inc");
$graph_totals_array=array();
$graph_totals_rawdata=array();
for ($q=0; $q<count($graph_array); $q++) {
$graph_info=explode("|", $graph_array[$q]);
$current_graph_total=0;
$dataset_name=$graph_info[0];
$dataset_index=$graph_info[1];
$dataset_type=$graph_info[3];
if ($q==0) {$preload_dataset=$dataset_name;} # Used below to load initial graph
$JS_text.="var $dataset_name = {\n";
# $JS_text.="\ttype: \"\",\n";
# $JS_text.="\t\tdata: {\n";
$datasets="\t\tdatasets: [\n";
$datasets.="\t\t\t{\n";
$datasets.="\t\t\t\tlabel: \"\",\n";
$datasets.="\t\t\t\tfill: false,\n";
$labels="\t\tlabels:[";
$data="\t\t\t\tdata: [";
$graphConstantsA="\t\t\t\tbackgroundColor: [";
$graphConstantsB="\t\t\t\thoverBackgroundColor: [";
$graphConstantsC="\t\t\t\thoverBorderColor: [";
for ($d=0; $d<count($ct_ary); $d++) {
$labels.="\"".$ct_ary[$d][0]."\",";
$data.="\"".$ct_ary[$d][1]."\",";
$current_graph_total+=$ct_ary[$d][1];
$bgcolor=$backgroundColor[($d%count($backgroundColor))];
$hbgcolor=$hoverBackgroundColor[($d%count($hoverBackgroundColor))];
$hbcolor=$hoverBorderColor[($d%count($hoverBorderColor))];
$graphConstantsA.="\"$bgcolor\",";
$graphConstantsB.="\"$hbgcolor\",";
$graphConstantsC.="\"$hbcolor\",";
}
$graphConstantsA.="],\n";
$graphConstantsB.="],\n";
$graphConstantsC.="],\n";
$labels=preg_replace('/,$/', '', $labels)."],\n";
$data=preg_replace('/,$/', '', $data)."],\n";
$graph_totals_rawdata[$q]=$current_graph_total;
switch($dataset_type) {
case "time":
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." </caption>\n";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = Math.round(data.datasets[0].data[tooltipItem.index]); return value.toHHMMSS();}}}, legend: { display: false }},";
break;
case "percent":
$graph_totals_array[$q]="";
$chart_options="options: {tooltips: {callbacks: {label: function(tooltipItem, data) {var value = data.datasets[0].data[tooltipItem.index]; return value + '%';}}}, legend: { display: false }},";
break;
default:
$graph_totals_array[$q]=" <caption align=\"bottom\">"._QXZ("TOTAL").": $current_graph_total</caption>\n";
$chart_options="options: { legend: { display: false }},";
break;
}
$datasets.=$data;
$datasets.=$graphConstantsA.$graphConstantsB.$graphConstantsC.$graphConstants; # SEE TOP OF SCRIPT
$datasets.="\t\t\t}\n";
$datasets.="\t\t]\n";
$datasets.="\t}\n";
$JS_text.=$labels.$datasets;
# $JS_text.="}\n";
# $JS_text.="prepChart('$default_graph', $graph_id, $q, $dataset_name);\n";
$JS_text.="var main_ctx = document.getElementById(\"CanvasID".$graph_id."_".$q."\");\n";
$JS_text.="var GraphID".$graph_id."_".$q." = new Chart(main_ctx, {type: '$default_graph', $chart_options data: $dataset_name});\n";
}
$MAIN.=" <tr>\n";
$MAIN.=" <th class=\"thgraph\" scope=\"col\">"._QXZ("TOTAL HOURS").":</th>\n";
$MAIN.=" <th class=\"thgraph\" scope=\"col\">".trim($TOThours)."</th>\n";
$MAIN.=" </tr>\n";
$MAIN.="</table>\n";
$graph_count=count($graph_array);
$graph_title=_QXZ("USER TIMECLOCK DETAILS");
include("graphcanvas.inc");
$MAIN.=$graphCanvas;
$JS_text.="</script>\n";
$MAIN.="<PRE>\n";
###########################
}
@@ -650,7 +720,7 @@ $MAIN.="</BODY></HTML>\n";
} else {
echo $HEADER;
require("admin_header.php");
echo $MAIN;
echo $MAIN.$JS_text;
}
if ($db_source == 'S')
@@ -0,0 +1,81 @@
/*
Vicidial chart functions - put any and all Javascript functions
dealing with charts/graphs for Vicidial here.
var mainChart=null;
function drawChart(chart_type, graph_id, dataset_name, graph_name){
var canvasID="GraphDisplay"+graph_id;
var graphName="GraphID"+graph_id;
if(eval(graphName)==null){
// do nothing
} else {
graphName.destroy();
// main_data.type = chart_type;
// alert(main_data.type);
//mainChart.type = chart_type; // Would update the first dataset's value of 'March' to be 50
//mainChart.update();
//alert(mainChart.type);
}
dataset_name.type = chart_type;
dataset_name.data.datasets.forEach(function(dataset) {
dataset.type = chart_type
});
var main_ctx = document.getElementById(canvasID).getContext("2d");
eval(graphName) = new Chart(main_ctx, dataset_name);
}
*/
function ToggleSpan(span_family, selected_span, span_count) {
if (!span_count || span_count<1) {
return false;
} else {
for (var j=0; j<span_count; j++) {
var spanID="SpanID"+span_family+"_"+j;
var linkID="LinkID"+span_family+"_"+j;
if (j==selected_span || j==span_count) {
document.getElementById(spanID).style.display = 'block';
document.getElementById(linkID).className='thgraph selected_grey_graph_cell';
} else {
document.getElementById(spanID).style.display = 'none';
document.getElementById(linkID).className='thgraph grey_graph_cell';
}
}
}
}
var main_ctx='';
Number.prototype.toHHMMSS = function () {
var sec_num = parseInt(this, 10); // don't forget the second param
var hours = Math.floor(sec_num / 3600);
var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
var seconds = sec_num - (hours * 3600) - (minutes * 60);
if (hours > 0) {
if (hours < 10) {hours = "0"+hours;}
hours=hours+':';
} else {
hours='';
}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
return hours+minutes+':'+seconds;
}
/*
function prepChart(graph_type, graph_id, graph_count, dataset_name){
if (graph_type!="<?php echo $allowed_graph; ?>" && "<?php echo $allowed_graph; ?>"!="ALL") {alert("This graph type is not allowed."); return false;}
var canvasID="CanvasID"+graph_id+"_"+graph_count;
var graphID="GraphID"+graph_id+"_"+graph_count;
dataset_name.type = graph_type;
dataset_name.data.datasets.forEach(function(dataset) {
dataset.type = graph_type
});
main_ctx = document.getElementById(canvasID).getContext("2d");
}
*/