, Joe Johnson 0) { $row=mysqli_fetch_row($rslt); $non_latin = $row[0]; $outbound_autodial_active = $row[1]; $slave_db_server = $row[2]; $reports_use_slave_db = $row[3]; $SSenable_languages = $row[4]; $SSlanguage_method = $row[5]; $SSreport_default_format = $row[6]; $SSallow_web_debug = $row[7]; } if ($SSallow_web_debug < 1) {$DB=0;} if (strlen($report_display_type)<2) {$report_display_type = $SSreport_default_format;} ##### END SETTINGS LOOKUP ##### ########################################### $query_date = preg_replace('/[^- \:\_0-9a-zA-Z]/', '', $query_date); $end_date = preg_replace('/[^- \:\_0-9a-zA-Z]/', '', $end_date); $SUBMIT = preg_replace('/[^-_0-9a-zA-Z]/', '', $SUBMIT); $submit = preg_replace('/[^-_0-9a-zA-Z]/', '', $submit); $report_display_type = preg_replace('/[^-_0-9a-zA-Z]/', '', $report_display_type); $file_download = preg_replace('/[^-_0-9a-zA-Z]/', '', $file_download); $search_archived_data = preg_replace('/[^-_0-9a-zA-Z]/', '', $search_archived_data); $stage = preg_replace('/[^-_0-9a-zA-Z]/', '', $stage); $show_percentages = preg_replace('/[^-_0-9a-zA-Z]/', '', $show_percentages); # Variables filtered further down in the code # $users # $user_group # $group if ($non_latin < 1) { $PHP_AUTH_USER = preg_replace('/[^-_0-9a-zA-Z]/', '', $PHP_AUTH_USER); $PHP_AUTH_PW = preg_replace('/[^-_0-9a-zA-Z]/', '', $PHP_AUTH_PW); $shift = preg_replace('/[^-_0-9a-zA-Z]/', '', $shift); } else { $PHP_AUTH_USER = preg_replace('/[^-_0-9\p{L}]/u', '', $PHP_AUTH_USER); $PHP_AUTH_PW = preg_replace('/[^-_0-9\p{L}]/u', '', $PHP_AUTH_PW); $shift = preg_replace('/[^-_0-9\p{L}]/u', '', $shift); } ### ARCHIVED DATA CHECK CONFIGURATION $archives_available="N"; $log_tables_array=array("vicidial_agent_log"); for ($t=0; $t 0) { $row=mysqli_fetch_row($rslt); $VUselected_language = $row[0]; } $auth=0; $reports_auth=0; $admin_auth=0; $auth_message = user_authorization($PHP_AUTH_USER,$PHP_AUTH_PW,'REPORTS',1,0); if ($auth_message == 'GOOD') {$auth=1;} if ($auth > 0) { $stmt="SELECT count(*) from vicidial_users where user='$PHP_AUTH_USER' and user_level > 7 and view_reports='1';"; if ($DB) {echo "|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); $row=mysqli_fetch_row($rslt); $admin_auth=$row[0]; $stmt="SELECT count(*) from vicidial_users where user='$PHP_AUTH_USER' and user_level > 6 and view_reports='1';"; if ($DB) {echo "|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); $row=mysqli_fetch_row($rslt); $reports_auth=$row[0]; if ($reports_auth < 1) { $VDdisplayMESSAGE = _QXZ("You are not allowed to view reports"); Header ("Content-type: text/html; charset=utf-8"); echo "$VDdisplayMESSAGE: |$PHP_AUTH_USER|$auth_message|\n"; exit; } if ( ($reports_auth > 0) and ($admin_auth < 1) ) { $ADD=999999; $reports_only_user=1; } } else { $VDdisplayMESSAGE = _QXZ("Login incorrect, please try again"); if ($auth_message == 'LOCK') { $VDdisplayMESSAGE = _QXZ("Too many login attempts, try again in 15 minutes"); Header ("Content-type: text/html; charset=utf-8"); echo "$VDdisplayMESSAGE: |$PHP_AUTH_USER|$auth_message|\n"; exit; } if ($auth_message == 'IPBLOCK') { $VDdisplayMESSAGE = _QXZ("Your IP Address is not allowed") . ": $ip"; Header ("Content-type: text/html; charset=utf-8"); echo "$VDdisplayMESSAGE: |$PHP_AUTH_USER|$auth_message|\n"; exit; } Header("WWW-Authenticate: Basic realm=\"CONTACT-CENTER-ADMIN\""); Header("HTTP/1.0 401 Unauthorized"); echo "$VDdisplayMESSAGE: |$PHP_AUTH_USER|$PHP_AUTH_PW|$auth_message|\n"; exit; } ##### BEGIN log visit to the vicidial_report_log table ##### $LOGip = getenv("REMOTE_ADDR"); $LOGbrowser = getenv("HTTP_USER_AGENT"); $LOGscript_name = getenv("SCRIPT_NAME"); $LOGserver_name = getenv("SERVER_NAME"); $LOGserver_port = getenv("SERVER_PORT"); $LOGrequest_uri = getenv("REQUEST_URI"); $LOGhttp_referer = getenv("HTTP_REFERER"); $LOGbrowser=preg_replace("/<|>|\'|\"|\\\\/","",$LOGbrowser); $LOGrequest_uri=preg_replace("/<|>|\'|\"|\\\\/","",$LOGrequest_uri); $LOGhttp_referer=preg_replace("/<|>|\'|\"|\\\\/","",$LOGhttp_referer); if (preg_match("/443/i",$LOGserver_port)) {$HTTPprotocol = 'https://';} else {$HTTPprotocol = 'http://';} if (($LOGserver_port == '80') or ($LOGserver_port == '443') ) {$LOGserver_port='';} else {$LOGserver_port = ":$LOGserver_port";} $LOGfull_url = "$HTTPprotocol$LOGserver_name$LOGserver_port$LOGrequest_uri"; $LOGhostname = php_uname('n'); if (strlen($LOGhostname)<1) {$LOGhostname='X';} if (strlen($LOGserver_name)<1) {$LOGserver_name='X';} $stmt="SELECT webserver_id FROM vicidial_webservers where webserver='$LOGserver_name' and hostname='$LOGhostname' LIMIT 1;"; $rslt=mysql_to_mysqli($stmt, $link); if ($DB) {echo "$stmt\n";} $webserver_id_ct = mysqli_num_rows($rslt); if ($webserver_id_ct > 0) { $row=mysqli_fetch_row($rslt); $webserver_id = $row[0]; } else { ##### insert webserver entry $stmt="INSERT INTO vicidial_webservers (webserver,hostname) values('$LOGserver_name','$LOGhostname');"; if ($DB) {echo "$stmt\n";} $rslt=mysql_to_mysqli($stmt, $link); $affected_rows = mysqli_affected_rows($link); $webserver_id = mysqli_insert_id($link); } $stmt="INSERT INTO vicidial_report_log set event_date=NOW(), user='$PHP_AUTH_USER', ip_address='$LOGip', report_name='$report_name', browser='$LOGbrowser', referer='$LOGhttp_referer', notes='$LOGserver_name:$LOGserver_port $LOGscript_name |$query_date, $end_date, $shift, $file_download, $report_display_type|', url='$LOGfull_url', webserver='$webserver_id';"; if ($DB) {echo "|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); $report_log_id = mysqli_insert_id($link); ##### END log visit to the vicidial_report_log table ##### if ( (strlen($slave_db_server)>5) and (preg_match("/$report_name/",$reports_use_slave_db)) ) { mysqli_close($link); $use_slave_server=1; $db_source = 'S'; require("dbconnect_mysqli.php"); $HTML_text.="\n"; } $stmt="SELECT user_group from vicidial_users where user='$PHP_AUTH_USER';"; if ($DB) {$HTML_text.="|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); $row=mysqli_fetch_row($rslt); $LOGuser_group = $row[0]; $stmt="SELECT allowed_campaigns,allowed_reports,admin_viewable_groups,admin_viewable_call_times from vicidial_user_groups where user_group='$LOGuser_group';"; if ($DB) {$HTML_text.="|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); $row=mysqli_fetch_row($rslt); $LOGallowed_campaigns = $row[0]; $LOGallowed_reports = $row[1]; $LOGadmin_viewable_groups = $row[2]; $LOGadmin_viewable_call_times = $row[3]; if ( (!preg_match("/$report_name/",$LOGallowed_reports)) and (!preg_match("/ALL REPORTS/",$LOGallowed_reports)) ) { Header("WWW-Authenticate: Basic realm=\"CONTACT-CENTER-ADMIN\""); Header("HTTP/1.0 401 Unauthorized"); echo _QXZ("You are not allowed to view this report").": |$PHP_AUTH_USER|$report_name|\n"; exit; } $LOGallowed_campaignsSQL=''; $whereLOGallowed_campaignsSQL=''; if ( (!preg_match('/\-ALL/i', $LOGallowed_campaigns)) ) { $rawLOGallowed_campaignsSQL = preg_replace("/ -/",'',$LOGallowed_campaigns); $rawLOGallowed_campaignsSQL = preg_replace("/ /","','",$rawLOGallowed_campaignsSQL); $LOGallowed_campaignsSQL = "and campaign_id IN('$rawLOGallowed_campaignsSQL')"; $whereLOGallowed_campaignsSQL = "where campaign_id IN('$rawLOGallowed_campaignsSQL')"; } $regexLOGallowed_campaigns = " $LOGallowed_campaigns "; $LOGadmin_viewable_groupsSQL=''; $whereLOGadmin_viewable_groupsSQL=''; if ( (!preg_match('/\-\-ALL\-\-/i',$LOGadmin_viewable_groups)) and (strlen($LOGadmin_viewable_groups) > 3) ) { $rawLOGadmin_viewable_groupsSQL = preg_replace("/ -/",'',$LOGadmin_viewable_groups); $rawLOGadmin_viewable_groupsSQL = preg_replace("/ /","','",$rawLOGadmin_viewable_groupsSQL); $LOGadmin_viewable_groupsSQL = "and user_group IN('---ALL---','$rawLOGadmin_viewable_groupsSQL')"; $whereLOGadmin_viewable_groupsSQL = "where user_group IN('---ALL---','$rawLOGadmin_viewable_groupsSQL')"; } $LOGadmin_viewable_call_timesSQL=''; $whereLOGadmin_viewable_call_timesSQL=''; if ( (!preg_match('/\-\-ALL\-\-/i', $LOGadmin_viewable_call_times)) and (strlen($LOGadmin_viewable_call_times) > 3) ) { $rawLOGadmin_viewable_call_timesSQL = preg_replace("/ -/",'',$LOGadmin_viewable_call_times); $rawLOGadmin_viewable_call_timesSQL = preg_replace("/ /","','",$rawLOGadmin_viewable_call_timesSQL); $LOGadmin_viewable_call_timesSQL = "and call_time_id IN('---ALL---','$rawLOGadmin_viewable_call_timesSQL')"; $whereLOGadmin_viewable_call_timesSQL = "where call_time_id IN('---ALL---','$rawLOGadmin_viewable_call_timesSQL')"; } $today=$query_date; $date_ary=explode("-", $today); $yesterday=date("Y-m-d", mktime(0, 0, 0, $date_ary[1], $date_ary[2]-1, $date_ary[0])); $twodaysago=date("Y-m-d", mktime(0, 0, 0, $date_ary[1], $date_ary[2]-2, $date_ary[0])); $threedaysago=date("Y-m-d", mktime(0, 0, 0, $date_ary[1], $date_ary[2]-3, $date_ary[0])); $fivedaysago=date("Y-m-d", mktime(0, 0, 0, $date_ary[1], $date_ary[2]-5, $date_ary[0])); $tendaysago=date("Y-m-d", mktime(0, 0, 0, $date_ary[1], $date_ary[2]-10, $date_ary[0])); $thirtydaysago=date("Y-m-d", mktime(0, 0, 0, $date_ary[1], $date_ary[2]-30, $date_ary[0])); $rpt_date_array=array(); $rpt_subtitle_array=array(); array_push($rpt_date_array, "$today", "$yesterday", "$twodaysago", "$threedaysago", "$fivedaysago", "$tendaysago", "$thirtydaysago"); array_push($rpt_subtitle_array, _QXZ("TODAY"), _QXZ("YESTERDAY"), _QXZ("2 DAYS AGO"), _QXZ("3 DAYS AGO"), _QXZ("5 DAYS AGO"), _QXZ("10 DAYS AGO"), _QXZ("30 DAYS AGO")); $i=0; $group_string='|'; $group_ct = count($group); while($i < $group_ct) { $group[$i] = preg_replace('/[^-_0-9\p{L}]/u', '', $group[$i]); $group_string .= "$group[$i]|"; $i++; } $i=0; $users_string='|'; $users_ct = count($users); while($i < $users_ct) { $users[$i] = preg_replace('/[^-_0-9\p{L}]/u', '', $users[$i]); $users_string .= "$users[$i]|"; $i++; } $stmt="select campaign_id from vicidial_campaigns $whereLOGallowed_campaignsSQL order by campaign_id;"; $rslt=mysql_to_mysqli($stmt, $link); if ($DB) {$HTML_text.="$stmt\n";} $campaigns_to_print = mysqli_num_rows($rslt); $i=0; $groups=array(); while ($i < $campaigns_to_print) { $row=mysqli_fetch_row($rslt); $groups[$i] =$row[0]; if (preg_match('/\-ALL/',$group_string) ) {$group[$i] = $groups[$i];} $i++; } #for ($i=0; $i\"HELP\""; $NWB = "\"HELP\""; $HTML_head.="\n"; $HTML_head.="\n"; $HTML_head.="\n"; $HTML_head.="\n"; $HTML_head.="\n"; $HTML_head.=""; $HTML_head.="\n"; $HTML_head.="\n"; $HTML_head.="\n"; require("chart_button.php"); $HTML_head.="\n"; $HTML_head.="\n"; $HTML_head.="\n"; $HTML_head.=""._QXZ("$report_name")."\n"; $short_header=1; # require("admin_header.php"); $HTML_text.="\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="$rpt_subtitle, $rpt_date"; include("graphcanvas.inc"); $HTML_head.=$HTML_graph_head; $GRAPH.=$graphCanvas; } $CSV_header1.="\n"; $CSV_header2.="\n"; $CSV_text=$CSV_header1.$CSV_header2; $ASCII_header1.="|\n"; $ASCII_header2.="|\n"; $ASCII_header3.="|\n"; $ASCII_text.=$ASCII_header2.$ASCII_header1.$ASCII_header2.$ASCII_header3; $CSV_lines=''; # PRINT OUT RESULTS #while (list($key, $val)=each($agent_performance_array)) { foreach ($agent_performance_array as $key => $val) { $user=$key; $full_name=$val[0]; $ASCII_text.="|"; if ($non_latin < 1) { $full_name= sprintf("%-15s", $full_name); while(strlen($full_name)>15) {$full_name = substr("$full_name", 0, -1);} $user = sprintf("%-8s", $user); while(strlen($user)>8) {$user = substr("$user", 0, -1);} } else { $full_name= sprintf("%-45s", $full_name); while(mb_strlen($full_name,'utf-8')>15) {$full_name = mb_substr("$full_name", 0, -1,'utf-8');} $user = sprintf("%-24s", $user); while(mb_strlen($user,'utf-8')>8) {$user = mb_substr("$user", 0, -1,'utf-8');} } $CSV_text.="\"$full_name\",\"$user\","; $ASCII_text.=" ".$full_name." | ".$user." ||"; for ($q=0; $q
"; $HTML_text.=""._QXZ("$report_name")." $NWB#performance_comparison_report$NWE\n"; $HTML_text.="
\n"; $HTML_text.="
"._QXZ("Date").":
"; $HTML_text.="\n"; $HTML_text.=""; $HTML_text.="\n"; /* $HTML_text.="
to
"; $HTML_text.="\n"; */ $HTML_text.="
"._QXZ("Campaigns").":
"; $HTML_text.="\n"; $HTML_text.="
"._QXZ("User Groups").":
"; $HTML_text.="\n"; $HTML_text.="
"._QXZ("Users").":
"; $HTML_text.="\n"; $HTML_text.="
"._QXZ("Shift").":
"; $HTML_text.="\n"; $HTML_text.="
"; $HTML_text.=_QXZ("Display as").":
"; $HTML_text.="\n"; if ($archives_available=="Y") { $HTML_text.=""._QXZ("Search archived data")."\n"; } $HTML_text.="

$NWB#agent_performance_detail$NWE\n"; $HTML_text.="
        "; $HTML_text.="          \n"; $HTML_text.=" "._QXZ("REPORTS")." \n"; $HTML_text.="\n"; $HTML_text.="
"; $HTML_text.="
\n"; $HTML_text.="
";


if (!$group)
	{
#	$HTML_text.="\n";
	$HTML_text.=_QXZ("PLEASE SELECT A CAMPAIGN AND DATE-TIME ABOVE AND CLICK SUBMIT")."\n";
	$HTML_text.=" "._QXZ("NOTE: stats taken from shift specified")."\n";
	}
else
	{
	if ($shift == 'AM') 
		{
		$time_BEGIN=$AM_shift_BEGIN;
		$time_END=$AM_shift_END;
		if (strlen($time_BEGIN) < 6) {$time_BEGIN = "03:45:00";}   
		if (strlen($time_END) < 6) {$time_END = "15:14:59";}
		}
	if ($shift == 'PM') 
		{
		$time_BEGIN=$PM_shift_BEGIN;
		$time_END=$PM_shift_END;
		if (strlen($time_BEGIN) < 6) {$time_BEGIN = "15:15:00";}
		if (strlen($time_END) < 6) {$time_END = "23:15:00";}
		}
	if ($shift == 'ALL') 
		{
		if (strlen($time_BEGIN) < 6) {$time_BEGIN = "00:00:00";}
		if (strlen($time_END) < 6) {$time_END = "23:59:59";}
		}
	$query_date_BEGIN = "$query_date $time_BEGIN";   
	$query_date_END = "$end_date $time_END";


	#########################



	$HTML_text.=_QXZ("Agent Performance Comparison",50)." $NOW_TIME\n";
	$HTML_text.=""._QXZ("Starting date",15,"r").": $query_date                         ["._QXZ("DOWNLOAD")."]\n\n";

	$CSV_header1.="\""._QXZ("Agent Performance Comparison",50)." $NOW_TIME\"\n";
	$CSV_header1.="\""._QXZ("Starting date",15,"r").": $query_date\"\n\n";



	# Get full list of agents for the past 30 days
	$initial_user_stmt="select distinct ".$vicidial_agent_log_table.".user, full_name from ".$vicidial_agent_log_table.", vicidial_users where event_time <= '$query_date $time_END' and event_time >= '$thirtydaysago $time_BEGIN' $group_SQL $user_group_SQL $user_SQL and ".$vicidial_agent_log_table.".user=vicidial_users.user order by full_name asc";
	if ($DB) {echo $initial_user_stmt;}
	$initial_user_rslt=mysql_to_mysqli($initial_user_stmt, $link);
	$agent_performance_array=array();
	while ($user_row=mysqli_fetch_array($initial_user_rslt)) 
		{
		$agent_performance_array[$user_row[0]][0]=$user_row[1];
		}

	# Get full list of sale dispositions for selected campaigns/system
	$sale_stmt="select distinct status from vicidial_campaign_statuses where sale='Y' $group_SQL UNION select distinct status from vicidial_statuses where sale='Y' order by status asc";
	$sale_rslt=mysql_to_mysqli($sale_stmt, $link);
	$sale_status_str="|";
	while ($sale_row=mysqli_fetch_row($sale_rslt)) 
		{
		$sale_status_str.="$sale_row[0]|";
		}

	$CSV_header1.='"","",';
	$CSV_header2.='"'._QXZ("USER NAME").'","'._QXZ("ID").'",';

	$ASCII_header1.="|                            |";
	$ASCII_header2.="+-----------------+----------+";
	$ASCII_header3.="| "._QXZ("USER NAME",15)." | "._QXZ("ID",8)." |";


	$master_graph_array=array();
	for ($q=0; $q= '$rpt_date $time_BEGIN' and vicidial_users.user=".$vicidial_agent_log_table.".user and pause_sec<65000 and wait_sec<65000 and talk_sec<65000 and dispo_sec<65000 $group_SQL $user_group_SQL $user_SQL group by user,full_name,user_group,status, sub_status order by full_name,user,status, sub_status desc limit 500000;";
		if ($DB) {print "\n";}
		$rslt=mysql_to_mysqli($stmt, $link);
		$rows_to_print = mysqli_num_rows($rslt);
		$i=0;

		while ($i < $rows_to_print)
			{
			$row=mysqli_fetch_row($rslt);
			if ($row[7]!="") {$agent_performance_array[$row[3]][$array_offset]+=$row[0];} # CALLS FOR TIME RANGE, MUST HAVE DISPO TO COUNT AS A CALL
			if(preg_match("/\|$row[7]\|/", $sale_status_str)) 
				{
				$agent_performance_array[$row[3]][($array_offset+1)]+=$row[0]; # SALES FOR TIME RANGE
				}
			# if ($row[10]=="BREAK") {$row[4]=0;}
			$agent_performance_array[$row[3]][($array_offset+4)]+=($row[4]+$row[1]+$row[6]+$row[5]); # TIME - pause, talk, disp, wait
			$i++;
			}

		$j=0;
#		while (list($key, $val)=each($agent_performance_array)) { # CYCLE THROUGH EACH USER
		foreach ($agent_performance_array as $key => $val) {
			for ($k=0; $k<2; $k++) 
				{
				$agent_performance_array[$key][($array_offset+$k)]+=0; # Add zero so there are no null values;
				}
			$agent_performance_array[$key][($array_offset+2)]=sprintf("%0.2f", MathZDC(100*$agent_performance_array[$key][($array_offset+1)], $agent_performance_array[$key][$array_offset]));
			$agent_performance_array[$key][($array_offset+3)]=sprintf("%0.2f", MathZDC($agent_performance_array[$key][($array_offset+1)], MathZDC($agent_performance_array[$key][($array_offset+4)], 3600)));
			$agent_performance_array[$key][($array_offset+4)]+=0;

			$graph_stats[$j][0]="$key - ".$val[0];
			for ($k=0; $k<5; $k++) 
				{
				$graph_stats[$j][($k+1)]=$agent_performance_array[$key][($array_offset+$k)];
				}
			for ($k=0; $k<5; $k++) 
				{ # Cycle through and check for max values
				if ($agent_performance_array[$key][($array_offset+$k)]>$max_stats[($k+1)]) {$max_stats[($k+1)]=$agent_performance_array[$key][($array_offset+$k)];}
				$graph_TOTALS_array[($array_offset+$k)]+=$agent_performance_array[$key][($array_offset+$k)];
				}
			$j++;
			}
		reset($agent_performance_array);

		$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"._QXZ("TOTAL")." - ".sec_convert($current_graph_total, 'H')." \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]="  
"._QXZ("TOTAL").": $current_graph_total