LICENSE: AGPLv2 # # CHANGES # # 110802-2041 - First build # 110804-0049 - Added First Call Resolution # 111104-1259 - Added user_group restrictions for selecting in-groups # 120224-1424 - Added new colums and PRECAL to System Time # 120307-1926 - Added additional statuses option and HTML display option # 130414-0142 - Added report logging # 130610-0958 - Finalized changing of all ereg instances to preg # 130621-0723 - Added filtering of input to prevent SQL injection attacks and new user auth # 130901-2011 - Changed to mysqli PHP functions # 140108-0733 - Added webserver and hostname to report logging # 140328-0005 - Converted division calculations to use MathZDC function # 141114-0728 - Finalized adding QXZ translation to all admin files # 141230-1424 - Added code for on-the-fly language translations display # 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 # 160718-0054 - Fixed ChartJS bug # 170409-1542 - Added IP List validation code # 170829-0040 - Added screen color settings # 171012-2015 - Fixed javascript/apache errors with graphs # 180507-2315 - Added new help display # 191013-0825 - Fixes for PHP7 # 200917-1720 - Modified for sale counts to be campaign-specific # 210222-1508 - Added option to show all users # $startMS = microtime(); require("dbconnect_mysqli.php"); require("functions.php"); $PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; $PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; $PHP_SELF=$_SERVER['PHP_SELF']; $PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); if (isset($_GET["query_date_D"])) {$query_date_D=$_GET["query_date_D"];} elseif (isset($_POST["query_date_D"])) {$query_date_D=$_POST["query_date_D"];} if (isset($_GET["end_date_D"])) {$end_date_D=$_GET["end_date_D"];} elseif (isset($_POST["end_date_D"])) {$end_date_D=$_POST["end_date_D"];} if (isset($_GET["query_date_T"])) {$query_date_T=$_GET["query_date_T"];} elseif (isset($_POST["query_date_T"])) {$query_date_T=$_POST["query_date_T"];} if (isset($_GET["end_date_T"])) {$end_date_T=$_GET["end_date_T"];} elseif (isset($_POST["end_date_T"])) {$end_date_T=$_POST["end_date_T"];} if (isset($_GET["group"])) {$group=$_GET["group"];} elseif (isset($_POST["group"])) {$group=$_POST["group"];} if (isset($_GET["call_status"])) {$call_status=$_GET["call_status"];} elseif (isset($_POST["call_status"])) {$call_status=$_POST["call_status"];} if (isset($_GET["user_group"])) {$user_group=$_GET["user_group"];} elseif (isset($_POST["user_group"])) {$user_group=$_POST["user_group"];} if (isset($_GET["file_download"])) {$file_download=$_GET["file_download"];} elseif (isset($_POST["file_download"])) {$file_download=$_POST["file_download"];} if (isset($_GET["DB"])) {$DB=$_GET["DB"];} elseif (isset($_POST["DB"])) {$DB=$_POST["DB"];} if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} if (isset($_GET["report_display_type"])) {$report_display_type=$_GET["report_display_type"];} elseif (isset($_POST["report_display_type"])) {$report_display_type=$_POST["report_display_type"];} if (isset($_GET["search_archived_data"])) {$search_archived_data=$_GET["search_archived_data"];} elseif (isset($_POST["search_archived_data"])) {$search_archived_data=$_POST["search_archived_data"];} if (isset($_GET["show_all_users"])) {$show_all_users=$_GET["show_all_users"];} elseif (isset($_POST["show_all_users"])) {$show_all_users=$_POST["show_all_users"];} $DB=preg_replace("/[^0-9a-zA-Z]/","",$DB); $report_name = 'Team Performance Detail'; $db_source = 'M'; $JS_text.="\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")."$group_S\n"; $HTML_text.="
"; $HTML_text.=""._QXZ("$report_name")." $NWB#team_performance_detail$NWE\n"; $HTML_text.="
\n"; $HTML_text.="\n"; $HTML_text.="\n"; $HTML_text.="
"; $HTML_text.="\n"; $HTML_text.="\n"; $HTML_text.=_QXZ("Date Range").":
\n"; $HTML_text.="\n"; $HTML_text.="\n"; $HTML_text.=""; $HTML_text.="\n"; $HTML_text.="   "; $HTML_text.="
"._QXZ("to")."
"; $HTML_text.="\n"; $HTML_text.="   "; $HTML_text.="
"._QXZ("Campaigns").":
"; $HTML_text.="\n"; $HTML_text.="
"._QXZ("Teams/User Groups").":
"; $HTML_text.="\n"; $HTML_text.="
"._QXZ("Show additional statuses").":
"; $HTML_text.="
\n"; $HTML_text.=_QXZ("Display as").":
"; $HTML_text.="\n

"; if ($archives_available=="Y") { $HTML_text.=""._QXZ("Search archived data")."
\n"; } $HTML_text.="Show all users
"; $HTML_text.="(includes inactive agents/agents with no calls)"; $HTML_text.="
"; $HTML_text.="
         

\n"; $HTML_text.="\n"; $HTML_text.="         "._QXZ("DOWNLOAD")." |"; $HTML_text.=" "._QXZ("REPORTS")." \n"; $HTML_text.="\n"; $HTML_text.="
"; $HTML_text.="
\n\n"; $report_sale_array=array(); $dispo_sale_stmt="select status, campaign_id from vicidial_campaign_statuses where sale='Y' $group_SQL UNION select status, 'VICIDIAL_SALE' from vicidial_statuses where sale='Y'"; $dispo_sale_rslt=mysql_to_mysqli($dispo_sale_stmt, $link); while ($dispo_sale_row=mysqli_fetch_row($dispo_sale_rslt)) { $status=$dispo_sale_row[0]; $campaign=strtoupper($dispo_sale_row[1]); if (!$report_sale_array["$campaign"]) {$report_sale_array["$campaign"]="|";} $report_sale_array["$campaign"].="$status|"; } # print_r($report_sale_array); if ( ($SUBMIT=="SUBMIT") or ($SUBMIT==_QXZ("SUBMIT")) ) { # Sale counts per rep $stmt="select max(event_time), ".$vicidial_agent_log_table.".user, ".$vicidial_agent_log_table.".lead_id, ".$vicidial_list_table.".status as current_status, ".$vicidial_agent_log_table.".campaign_id, ".$vicidial_agent_log_table.".status from ".$vicidial_agent_log_table.", ".$vicidial_list_table." where event_time>='$query_date' and event_time<='$end_date' $group_SQL and ".$vicidial_agent_log_table.".status in (select status from vicidial_campaign_statuses where sale='Y' $group_SQL UNION select status from vicidial_statuses where sale='Y') and ".$vicidial_agent_log_table.".lead_id=".$vicidial_list_table.".lead_id group by ".$vicidial_agent_log_table.".user, ".$vicidial_agent_log_table.".lead_id"; if ($DB) {$ASCII_text.="$stmt\n";} $rslt=mysql_to_mysqli($stmt, $link); $cancel_array=array(); $incomplete_array=array(); $sale_array=array(); while ($row=mysqli_fetch_array($rslt)) { $lead_id=$row["lead_id"]; $user=$row["user"]; $current_status=$row["current_status"]; $campaign_id=strtoupper($row["campaign_id"]); $agent_status=$row["status"]; if (preg_match("/QCCANC/i", $current_status)) { $cancel_array[$row["user"]]++; } else if (preg_match("/QCFAIL/i", $current_status)) { $incomplete_array[$row["user"]]++; } else { if (preg_match("/\|$agent_status\|/i", $report_sale_array["$campaign_id"]) || preg_match("/\|$agent_status\|/i", $report_sale_array["VICIDIAL_SALE"])) { $sale_array[$row["user"]]++; # Get actual talk time for all calls made by the user for this particular lead. If cancelled and incomplete sales are to have their times # counted towards sales talk time, move the below lines OUTSIDE the curly bracket below, so the query runs regardless of what "type" of # sale it is. $sale_time_stmt="select sum(talk_sec)-sum(dead_sec) from ".$vicidial_agent_log_table." where user='$user' and lead_id='$lead_id' $group_SQL"; if ($DB) {$ASCII_text.="$sale_time_stmt\n";} $sale_time_rslt=mysql_to_mysqli($sale_time_stmt, $link); $sale_time_row=mysqli_fetch_row($sale_time_rslt); $sales_talk_time_array[$row["user"]]+=$sale_time_row[0]; } } } $HTML_text.="
";
	$total_average_sale_time=0;
	$total_average_contact_time=0;
	$total_talk_time=0; 
	$total_system_time=0; 
	$total_calls=0;	
	$total_leads=0;
	$total_contacts=0;
	$total_sales=0;
	$total_inc_sales=0;
	$total_cnc_sales=0;
	$total_callbacks=0;
	$total_stcall=0;
	$call_status_totals_grand_total=array();
	for ($q=0; $q".$call_status[$q]."";
	}
	$total_graph_stats=array();
	$max_totalcalls=1;
	$max_totalleads=1;
	$max_totalcontacts=1;
	$max_totalcontactratio=1;
	$max_totalsystemtime=1;
	$max_totaltalktime=1;
	$max_totalsales=1;
	$max_totalsalesleadsratio=1;
	$max_totalsalescontactsratio=1;
	$max_totalsalesperhour=1;
	$max_totalincsales=1;
	$max_totalcancelledsales=1;
	$max_totalcallbacks=1;
	$max_totalfirstcall=1;
	$max_totalavgsaletime=1;
	$max_totalavgcontacttime=1;

	for($i=0; $i<$user_group_ct; $i++) 
		{
		$group_average_sale_time=0;
		$group_average_contact_time=0;
		$group_talk_time=0; 
		$group_system_time=0; 
		$group_nonpause_time=0;
		$group_calls=0;	
		$group_leads=0;
		$group_contacts=0;
		$group_sales=0;
		$group_inc_sales=0;
		$group_cnc_sales=0;
		$group_callbacks=0;
		$group_stcall=0;
		$name_stmt="select group_name from vicidial_user_groups where user_group='$user_group[$i]'";
		$name_rslt=mysql_to_mysqli($name_stmt, $link);
		$name_row=mysqli_fetch_row($name_rslt);
		$group_name=$name_row[0];
		$call_status_group_totals=array();
		for ($q=0; $q\n";
		$CSV_text.="\"\",\""._QXZ("TEAM").": $user_group[$i] - $group_name\"\n";
		$GRAPH_text.=""._QXZ("TEAM").": $user_group[$i] - $group_name";

		#### USER COUNTS
		if ($show_all_users)
			{
			$user_stmt="select full_name, user from vicidial_users where user_group='$user_group[$i]' order by full_name, user";
			}
		else 
			{
			$user_stmt="select distinct vicidial_users.full_name, vicidial_users.user from vicidial_users, ".$vicidial_agent_log_table." where vicidial_users.user_group='$user_group[$i]' and vicidial_users.user=".$vicidial_agent_log_table.".user and ".$vicidial_agent_log_table.".user_group='$user_group[$i]'  and ".$vicidial_agent_log_table.".event_time>='$query_date' and ".$vicidial_agent_log_table.".event_time<='$end_date' and ".$vicidial_agent_log_table.".campaign_id in ($group_SQL_str) order by full_name, user";
			}
		if ($DB) {$ASCII_text.="$user_stmt\n";}
		$user_rslt=mysql_to_mysqli($user_stmt, $link);
		if (mysqli_num_rows($user_rslt)>0) 
			{
			$graph_stats=array();
			$max_calls=1;
			$max_leads=1;
			$max_contacts=1;
			$max_contactratio=1;
			$max_systemtime=1;
			$max_talktime=1;
			$max_sales=1;
			$max_salesleadsratio=1;
			$max_salescontactsratio=1;
			$max_salesperhour=1;
			$max_incsales=1;
			$max_cancelledsales=1;
			$max_callbacks=1;
			$max_firstcall=1;
			$max_avgsaletime=1;
			$max_avgcontacttime=1;
			$GRAPH="

"; $STATGRAPH=""; for ($q=0; $q".$call_status[$q].""; $max_varname="max_".$call_status[$q]; $$max_varname=1; } $j=0; $ASCII_text.="+------------------------------------------+------------+-------+-------+----------+---------------+---------------+-------------+-----------+-------+------------------------+----------------------+-------------------------+----------------+------------------+-----------------+-----------+-----------------------+-------------------+----------------------+$HTMLborderheader\n"; $ASCII_text.="| "._QXZ("Agent Name",40)." | "._QXZ("Agent ID",10)." | "._QXZ("Calls",5)." | "._QXZ("Leads",5)." | "._QXZ("Contacts",8)." | "._QXZ("Contact Ratio",13)." | "._QXZ("Nonpause Time",13)." | "._QXZ("System Time",11)." | "._QXZ("Talk Time",9)." | "._QXZ("Sales",5)." | "._QXZ("Sales per Working Hour",22)." | "._QXZ("Sales to Leads Ratio",20)." | "._QXZ("Sales to Contacts Ratio",23)." | "._QXZ("Sales Per Hour",14)." | "._QXZ("Incomplete Sales",16)." | "._QXZ("Cancelled Sales",15)." | "._QXZ("Callbacks",9)." | "._QXZ("First Call Resolution",21)." | "._QXZ("Average Sale Time",17)." | "._QXZ("Average Contact Time",20)." |$HTMLstatusheader\n"; $ASCII_text.="+------------------------------------------+------------+-------+-------+----------+---------------+---------------+-------------+-----------+-------+------------------------+----------------------+-------------------------+----------------+------------------+-----------------+-----------+-----------------------+-------------------+----------------------+$HTMLborderheader\n"; $CSV_text.="\"\",\""._QXZ("Agent Name")."\",\""._QXZ("Agent 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"; while ($user_row=mysqli_fetch_array($user_rslt)) { # For each user $user=$user_row["user"]; $sale_array[$user]+=0; # For agents with no sales logged $incomplete_array[$user]+=0; # For agents with no QCFAIL logged $cancel_array[$user]+=0; # For agents with no QCCANC logged $j++; $contacts=0; $callbacks=0; $stcall=0; $calls=0; $leads=0; $system_time=0; $talk_time=0; $nonpause_time=0; # Leads $lead_stmt="select count(distinct lead_id) from ".$vicidial_agent_log_table." where lead_id is not null and event_time>='$query_date' and event_time<='$end_date' $group_SQL and user='$user' and user_group='$user_group[$i]'"; if ($DB) {$ASCII_text.="$lead_stmt\n";} $lead_rslt=mysql_to_mysqli($lead_stmt, $link); $lead_row=mysqli_fetch_row($lead_rslt); $leads=$lead_row[0]; # Callbacks $callback_stmt="select count(*) from vicidial_callbacks where status in ('ACTIVE', 'LIVE') $group_SQL and user='$user' and user_group='$user_group[$i]'"; if ($DB) {$ASCII_text.="$callback_stmt\n";} $callback_rslt=mysql_to_mysqli($callback_stmt, $link); $callback_row=mysqli_fetch_row($callback_rslt); $callbacks=$callback_row[0]; $stat_stmt="select val.status, val.sub_status, vs.customer_contact, sum(val.talk_sec), sum(val.pause_sec), sum(val.wait_sec), sum(val.dispo_sec), sum(val.dead_sec), count(*) from ".$vicidial_agent_log_table." val, vicidial_statuses vs where val.user='$user' and val.user_group='$user_group[$i]' and val.event_time>='$query_date' and val.event_time<='$end_date' and val.status=vs.status and vs.status in (select status from vicidial_statuses) and val.campaign_id in ($group_SQL_str) group by status, customer_contact UNION select val.status, val.sub_status, vs.customer_contact, sum(val.talk_sec), sum(val.pause_sec), sum(val.wait_sec), sum(val.dispo_sec), sum(val.dead_sec), count(*) from ".$vicidial_agent_log_table." val, vicidial_campaign_statuses vs where val.campaign_id in ($group_SQL_str) and val.user='$user' and val.user_group='$user_group[$i]' and val.event_time>='$query_date' and val.event_time<='$end_date' and val.status=vs.status and val.campaign_id=vs.campaign_id and vs.status in (select distinct status from vicidial_campaign_statuses where ".substr($group_SQL, 4).") group by status, customer_contact"; if ($DB) {$ASCII_text.="$stat_stmt\n";} $stat_rslt=mysql_to_mysqli($stat_stmt, $link); while ($stat_row=mysqli_fetch_row($stat_rslt)) { if ($stat_row[2]=="Y") { $contacts+=$stat_row[8]; $contact_talk_time+=($stat_row[3]-$stat_row[7]); $group_contact_talk_time+=($stat_row[3]-$stat_row[7]); } # if ($stat_row[2]=="Y") {$callbacks+=$stat_row[8];} $calls+=$stat_row[8]; $talk_time+=($stat_row[3]-$stat_row[7]); $system_time+=($stat_row[3]+$stat_row[5]+$stat_row[6]); $nonpause_time+=($stat_row[3]+$stat_row[5]+$stat_row[6]); if ($stat_row[1]=="PRECAL") { $nonpause_time+=$stat_row[4]; } } $user_talk_time = sec_convert($talk_time,'H'); $group_talk_time+=$talk_time; $user_system_time = sec_convert($system_time,'H'); $talk_hours=MathZDC($talk_time, 3600); $group_system_time+=$system_time; $user_nonpause_time = sec_convert($nonpause_time,'H'); $group_nonpause_time+=$nonpause_time; if ($sale_array[$user]>0) {$average_sale_time=sec_convert(round(MathZDC($sales_talk_time_array[$user], $sale_array[$user])), 'H');} else {$average_sale_time="00:00";} $group_sales_talk_time+=$sales_talk_time_array[$user]; if ($contacts>0) {$average_contact_time=sec_convert(round(MathZDC($contact_talk_time, $contacts)), 'H');} else {$average_contact_time="00:00";} $ASCII_text.="| ".sprintf("%-40s", $user_row["full_name"]); $ASCII_text.=" | ".sprintf("%10s", substr("$user", 0, 10)).""; $ASCII_text.=" | ".sprintf("%5s", $calls); $group_calls+=$calls; $ASCII_text.=" | ".sprintf("%5s", $leads); $group_leads+=$leads; $ASCII_text.=" | ".sprintf("%8s", $contacts); $group_contacts+=$contacts; $contact_ratio=sprintf("%.2f", MathZDC(100*$contacts,$leads)); $ASCII_text.=" | ".sprintf("%12s", $contact_ratio)."%"; $ASCII_text.=" | ".sprintf("%13s", $user_nonpause_time); $ASCII_text.=" | ".sprintf("%11s", $user_system_time); $ASCII_text.=" | ".sprintf("%9s", $user_talk_time); $ASCII_text.=" | ".sprintf("%5s", $sale_array[$user]); $group_sales+=$sale_array[$user]; $sales_per_working_hours=sprintf("%.2f", (MathZDC($sale_array[$user], MathZDC($nonpause_time, 3600)))); $ASCII_text.=" | ".sprintf("%22s", $sales_per_working_hours); $sales_ratio=sprintf("%.2f", MathZDC(100*$sale_array[$user], $leads)); $ASCII_text.=" | ".sprintf("%19s", $sales_ratio)."%"; $sale_contact_ratio=sprintf("%.2f", MathZDC(100*$sale_array[$user], $contacts)); $ASCII_text.=" | ".sprintf("%22s", $sale_contact_ratio)."%"; $sales_per_hour=sprintf("%.2f", MathZDC($sale_array[$user], $talk_hours)); $stcall=sprintf("%.2f", MathZDC($calls, $leads)); $avg_sale_time=round(MathZDC($sales_talk_time_array[$user], $sale_array[$user])); $avg_contact_time=round(MathZDC($contact_talk_time, $contacts)); $graph_stats[$j][0]=$user_row["full_name"]." - $user"; $graph_stats[$j][1]=trim($calls); $graph_stats[$j][2]=trim($leads); $graph_stats[$j][3]=trim($contacts); $graph_stats[$j][4]=trim($contact_ratio); $graph_stats[$j][5]=trim($system_time); $graph_stats[$j][6]=trim($talk_time); $graph_stats[$j][7]=trim($sale_array[$user]); $graph_stats[$j][8]=trim($sales_ratio); $graph_stats[$j][9]=trim($sale_contact_ratio); $graph_stats[$j][10]=trim($sales_per_hour); $graph_stats[$j][11]=trim($incomplete_array[$user]); $graph_stats[$j][12]=trim($cancel_array[$user]); $graph_stats[$j][13]=trim($callbacks); $graph_stats[$j][14]=trim($stcall); $graph_stats[$j][15]=trim($avg_sale_time); $graph_stats[$j][16]=trim($avg_contact_time); if (trim($calls)>$max_calls) {$max_calls=trim($calls);} if (trim($leads)>$max_leads) {$max_leads=trim($leads);} if (trim($contacts)>$max_contacts) {$max_contacts=trim($contacts);} if (trim($contact_ratio)>$max_contactratio) {$max_contactratio=trim($contact_ratio);} if (trim($system_time)>$max_systemtime) {$max_systemtime=trim($system_time);} if (trim($talk_time)>$max_talktime) {$max_talktime=trim($talk_time);} if (trim($sale_array[$user])>$max_sales) {$max_sales=trim($sale_array[$user]);} if (trim($sales_ratio)>$max_salesleadsratio) {$max_salesleadsratio=trim($sales_ratio);} if (trim($sale_contact_ratio)>$max_salescontactsratio) {$max_salescontactsratio=trim($sale_contact_ratio);} if (trim($sales_per_hour)>$max_salesperhour) {$max_salesperhour=trim($sales_per_hour);} if (trim($incomplete_array[$user])>$max_incsales) {$max_incsales=trim($incomplete_array[$user]);} if (trim($cancel_array[$user])>$max_cancelledsales) {$max_cancelledsales=trim($cancel_array[$user]);} if (trim($callbacks)>$max_callbacks) {$max_callbacks=trim($callbacks);} if (trim($stcall)>$max_firstcall) {$max_firstcall=trim($stcall);} if (trim($avg_sale_time)>$max_avgsaletime) {$max_avgsaletime=trim($avg_sale_time);} if (trim($avg_contact_time)>$max_avgcontacttime) {$max_avgcontacttime=trim($avg_contact_time);} $ASCII_text.=" | ".sprintf("%14s", $sales_per_hour); $ASCII_text.=" | ".sprintf("%16s", $incomplete_array[$user]); $group_inc_sales+=$incomplete_array[$user]; $ASCII_text.=" | ".sprintf("%15s", $cancel_array[$user]); $group_cnc_sales+=$cancel_array[$user]; $ASCII_text.=" | ".sprintf("%9s", $callbacks); $group_callbacks+=$callbacks; $ASCII_text.=" | ".sprintf("%21s", $stcall); # first call resolution $ASCII_text.=" | ".sprintf("%17s", $average_sale_time); $ASCII_text.=" | ".sprintf("%20s", $average_contact_time)." |"; $CSV_status_text=""; for ($q=0; $q='$query_date' and val.event_time<='$end_date' and val.status=vs.status and vs.status='$call_status[$q]' and val.campaign_id in ($group_SQL_str) UNION select count(distinct uniqueid) as stat_ct From ".$vicidial_agent_log_table." val, vicidial_campaign_statuses vs where val.user='$user' and val.user_group='$user_group[$i]' and val.event_time>='$query_date' and val.event_time<='$end_date' and val.status=vs.status and vs.status='$call_status[$q]' and val.campaign_id in ($group_SQL_str)) as counts"; $stat_rslt=mysql_to_mysqli($stat_stmt, $link); $stat_row=mysqli_fetch_row($stat_rslt); $ASCII_text.=" ".sprintf("%6s", $stat_row[0])." |"; $CSV_status_text.=",\"$stat_row[0]\""; $call_status_group_totals[$q]+=$stat_row[0]; $graph_stats[$j][(17+$q)]=$stat_row[0]; $varname=$Sstatus."_graph"; $$varname=$graph_header.""; $max_varname="max_".$call_status[$q]; if ($stat_row[0]>$$max_varname) {$$max_varname=$stat_row[0];} } $ASCII_text.="\n"; $CSV_text.="\"$j\",\"$user_row[full_name]\",\"$user\",\"$calls\",\"$leads\",\"$contacts\",\"$contact_ratio %\",\"$user_nonpause_time\",\"$user_system_time\",\"$user_talk_time\",\"$sale_array[$user]\",\"$sales_per_working_hours\",\"$sales_ratio\",\"$sale_contact_ratio\",\"$sales_per_hour\",\"$incomplete_array[$user]\",\"$cancel_array[$user]\",\"$callbacks\",\"$stcall\",\"$average_sale_time\",\"$average_contact_time\"$CSV_status_text\n"; } ##### GROUP TOTALS ############# $group_average_sale_time=sec_convert(round(MathZDC($group_sales_talk_time, $group_sales)), 'H'); $group_average_contact_time=sec_convert(round(MathZDC($group_contact_talk_time, $group_contacts)), 'H'); $group_talk_hours=MathZDC($group_talk_time, 3600); $GROUP_text.="| ".sprintf("%40s", "$group_name"); $GROUP_text.=" | ".sprintf("%20s", "$user_group[$i]"); $total_graph_stats[$i][0]="$user_group[$i] - $group_name"; $ASCII_text.="+------------------------------------------+------------+-------+-------+----------+---------------+---------------+-------------+-----------+-------+------------------------+----------------------+-------------------------+----------------+------------------+-----------------+-----------+-----------------------+-------------------+----------------------+$HTMLborderheader\n"; $ASCII_text.="| ".sprintf("%40s", ""); $ASCII_text.=" | ".sprintf("%10s", _QXZ("TOTALS:",10)); $TOTAL_text=" | ".sprintf("%5s", $group_calls); $TOTAL_text.=" | ".sprintf("%5s", $group_leads); $TOTAL_text.=" | ".sprintf("%8s", $group_contacts); $group_contact_ratio=sprintf("%.2f", MathZDC(100*$group_contacts, $group_leads)); $TOTAL_text.=" | ".sprintf("%12s", $group_contact_ratio)."%"; $TOTAL_text.=" | ".sprintf("%13s", sec_convert($group_nonpause_time,'H')); $TOTAL_text.=" | ".sprintf("%11s", sec_convert($group_system_time,'H')); $TOTAL_text.=" | ".sprintf("%9s", sec_convert($group_talk_time,'H')); $TOTAL_text.=" | ".sprintf("%5s", $group_sales); $sales_per_working_hours=sprintf("%.2f", (MathZDC($group_sales, MathZDC($group_nonpause_time, 3600)))); $TOTAL_text.=" | ".sprintf("%22s", $sales_per_working_hours); $group_sales_ratio=sprintf("%.2f", MathZDC(100*$group_sales, $group_leads)); $TOTAL_text.=" | ".sprintf("%19s", $group_sales_ratio)."%"; $group_sale_contact_ratio=sprintf("%.2f", MathZDC(100*$group_sales, $group_contacts)); $TOTAL_text.=" | ".sprintf("%22s", $group_sale_contact_ratio)."%"; $group_sales_per_hour=sprintf("%.2f", MathZDC($group_sales, $group_talk_hours)); $group_stcall=sprintf("%.2f", MathZDC($group_calls, $group_leads)); $TOTAL_text.=" | ".sprintf("%14s", $group_sales_per_hour); $TOTAL_text.=" | ".sprintf("%16s", $group_inc_sales); $TOTAL_text.=" | ".sprintf("%15s", $group_cnc_sales); $TOTAL_text.=" | ".sprintf("%9s", $group_callbacks); $TOTAL_text.=" | ".sprintf("%21s", $group_stcall); # first call resolution $TOTAL_text.=" | ".sprintf("%17s", $group_average_sale_time); $TOTAL_text.=" | ".sprintf("%20s", $group_average_contact_time)." |"; $CSV_status_text=""; for ($q=0; $q$$max_varname) {$$max_varname=$call_status_group_totals[$q];} } $TOTAL_text.="\n"; if (trim($group_calls)>$max_totalcalls) {$max_totalcalls=trim($group_calls);} if (trim($group_leads)>$max_totalleads) {$max_totalleads=trim($group_leads);} if (trim($group_contacts)>$max_totalcontacts) {$max_totalcontacts=trim($group_contacts);} if (trim($group_contact_ratio)>$max_totalcontactratio) {$max_totalcontactratio=trim($group_contact_ratio);} if (trim($group_system_time)>$max_totalsystemtime) {$max_totalsystemtime=trim($group_system_time);} if (trim($group_talk_time)>$max_totaltalktime) {$max_totaltalktime=trim($group_talk_time);} if (trim($group_sales)>$max_totalsales) {$max_totalsales=trim($group_sales);} if (trim($group_sales_ratio)>$max_totalsalesleadsratio) {$max_totalsalesleadsratio=trim($group_sales_ratio);} if (trim($group_sale_contact_ratio)>$max_totalsalescontactsratio) {$max_totalsalescontactsratio=trim($group_sale_contact_ratio);} if (trim($group_sales_per_hour)>$max_totalsalesperhour) {$max_totalsalesperhour=trim($group_sales_per_hour);} if (trim($group_inc_sales)>$max_totalincsales) {$max_totalincsales=trim($group_inc_sales);} if (trim($group_cnc_sales)>$max_totalcancelledsales) {$max_totalcancelledsales=trim($group_cnc_sales);} if (trim($group_callbacks)>$max_totalcallbacks) {$max_totalcallbacks=trim($group_callbacks);} if (trim($group_stcall)>$max_totalfirstcall) {$max_totalfirstcall=trim($group_stcall);} if (trim($group_avg_sale_time)>$max_totalavgsaletime) {$max_totalavgsaletime=trim($group_avg_sale_time);} if (trim($group_avg_contact_time)>$max_totalavgcontacttime) {$max_totalavgcontacttime=trim($group_avg_contact_time);} $total_graph_stats[$i][1]=$group_calls; $total_graph_stats[$i][2]=$group_leads; $total_graph_stats[$i][3]=$group_contacts; $total_graph_stats[$i][4]=$group_contact_ratio; $total_graph_stats[$i][5]=$group_system_time; $total_graph_stats[$i][6]=$group_talk_time; $total_graph_stats[$i][7]=$group_sales; $total_graph_stats[$i][8]=$group_sales_ratio; $total_graph_stats[$i][9]=$group_sale_contact_ratio; $total_graph_stats[$i][10]=$group_sales_per_hour; $total_graph_stats[$i][11]=$group_inc_sales; $total_graph_stats[$i][12]=$group_cnc_sales; $total_graph_stats[$i][13]=$group_callbacks; $total_graph_stats[$i][14]=$group_stcall; $total_graph_stats[$i][15]=$group_avg_sale_time; $total_graph_stats[$i][16]=$group_avg_contact_time; $ASCII_text.=$TOTAL_text; $GROUP_text.=$TOTAL_text; $ASCII_text.="+------------------------------------------+------------+-------+-------+----------+---------------+---------------+-------------+-----------+-------+------------------------+----------------------+-------------------------+----------------+------------------+-----------------+-----------+-----------------------+-------------------+----------------------+$HTMLborderheader\n"; $ASCII_text.="\n\n"; $CSV_text.="\"\",\"\",\""._QXZ("TOTALS").":\",\"$group_calls\",\"$group_leads\",\"$group_contacts\",\"$group_contact_ratio %\",\"".sec_convert($group_nonpause_time,'H')."\",\"".sec_convert($group_system_time,'H')."\",\"".sec_convert($group_talk_time,'H')."\",\"$group_sales\",\"$sales_per_working_hours\",\"$group_sales_ratio\",\"$group_sale_contact_ratio\",\"$group_sales_per_hour\",\"$group_inc_sales\",\"$group_cnc_sales\",\"$group_callbacks\",\"$group_stcall\",\"$group_average_sale_time\",\"$group_average_contact_time\"$CSV_status_text\n"; $GROUP_CSV_text.="\"$i\",\"$group_name\",\"$user_group[$i]\",\"$group_calls\",\"$group_leads\",\"$group_contacts\",\"$group_contact_ratio %\",\"".sec_convert($group_nonpause_time,'H')."\",\"".sec_convert($group_system_time,'H')."\",\"".sec_convert($group_talk_time,'H')."\",\"$group_sales\",\"$sales_per_working_hours\",\"$group_sales_ratio\",\"$group_sale_contact_ratio\",\"$group_sales_per_hour\",\"$group_inc_sales\",\"$group_cnc_sales\",\"$group_callbacks\",\"$group_stcall\",\"$group_average_sale_time\",\"$group_average_contact_time\"$CSV_status_text\n"; $CSV_text.="\n\n"; $total_calls+=$group_calls; $total_leads+=$group_leads; $total_contacts+=$group_contacts; $total_system_time+=$group_system_time; $total_nonpause_time+=$group_nonpause_time; $total_talk_time+=$group_talk_time; $total_sales+=$group_sales; $total_inc_sales+=$group_inc_sales; $total_cnc_sales+=$group_cnc_sales; $total_callbacks+=$group_callbacks; $total_stcall+=$group_stcall; # first call resolution $total_sales_talk_time+=$group_sales_talk_time; $total_contact_talk_time+=$group_contact_talk_time; # 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++; $dataset_ID="_".$user_group[$i]; # VERY IMPORTANT $graph_array=array("ATPD_CALLSdata$dataset_ID|1|CALLS|integer|", "ATPD_LEADSdata$dataset_ID|2|LEADS|integer|", "ATPD_CONTACTSdata$dataset_ID|3|CONTACTS|integer|", "ATPD_CONTACTRATIOdata$dataset_ID|4|CONTACT RATIO|percent|", "ATPD_SYSTEMTIMEdata$dataset_ID|5|SYSTEM TIME|time|", "ATPD_TALKTIMEdata$dataset_ID|6|TALK TIME|time|", "ATPD_SALESdata$dataset_ID|7|SALES|integer|", "ATPD_SALESTOLEADSdata$dataset_ID|8|SALES TO LEADS RATIO|decimal|", "ATPD_SALESTOCONTACTSdata$dataset_ID|9|SALES TO CONTACTS RATIO|decimal|", "ATPD_SALESPERHOURdata$dataset_ID|10|SALES PER HOUR|decimal|", "ATPD_INCOMPLETESALESSdata$dataset_ID|11|INCOMPLETE SALES|integer|", "ATPD_CANCELLEDSALESdata$dataset_ID|12|CANCELLED SALES|integer|", "ATPD_CALLBACKSdata$dataset_ID|13|CALLBACKS|integer|", "ATPD_FIRSTCALLSdata$dataset_ID|14|FIRST CALLS|decimal|", "ATPD_AVGSALETIMEdata$dataset_ID|15|AVG SALE TIME|time|", "ATPD_AVGCONTACTTIMEdata$dataset_ID|16|AVG CONTACT TIME|time|"); for ($e=0; $e"._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]=" \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="$user_group[$i] - $group_name"; include("graphcanvas.inc"); $HTML_head.=$HTML_graph_head; $GRAPH.=$graphCanvas; $GRAPH_text.=$GRAPH; #flush(); } else { if ($show_all_users) {$msg="NO AGENTS CURRENTLY IN THIS USER GROUP";} else {$msg="NO AGENTS FOUND UNDER THESE REPORT PARAMETERS";} $ASCII_text.=" **** "._QXZ("$msg")." ****\n\n"; $CSV_text.="\"\",\"**** "._QXZ("$msg")." ****\"\n\n"; $GRAPH_text.=" **** "._QXZ("$msg")." ****

\n\n"; $total_graph_stats[$i][0]="$user_group[$i] - $group_name"; } } $ASCII_text.="--- CALL CENTER TOTAL\n"; $ASCII_text.="+------------------------------------------+----------------------+-------+-------+----------+---------------+---------------+-------------+-----------+-------+------------------------+----------------------+-------------------------+----------------+------------------+-----------------+-----------+-----------------------+-------------------+----------------------+$HTMLborderheader\n"; $ASCII_text.="| "._QXZ("Team Name",40)." | "._QXZ("Team ID",20)." | "._QXZ("Calls",5)." | "._QXZ("Leads",5)." | "._QXZ("Contacts",8)." | "._QXZ("Contact Ratio",13)." | "._QXZ("Nonpause Time",13)." | "._QXZ("System Time",11)." | "._QXZ("Talk Time",9)." | "._QXZ("Sales",5)." | "._QXZ("Sales per Working Hour",22)." | "._QXZ("Sales to Leads Ratio",20)." | "._QXZ("Sales to Contacts Ratio",23)." | "._QXZ("Sales Per Hour",14)." | "._QXZ("Incomplete Sales",16)." | "._QXZ("Cancelled Sales",15)." | "._QXZ("Callbacks",9)." | "._QXZ("First Call Resolution",21)." | "._QXZ("Average Sale Time",17)." | "._QXZ("Average Contact Time",20)." |$HTMLstatusheader\n"; $ASCII_text.="+------------------------------------------+----------------------+-------+-------+----------+---------------+---------------+-------------+-----------+-------+------------------------+----------------------+-------------------------+----------------+------------------+-----------------+-----------+-----------------------+-------------------+----------------------+$HTMLborderheader\n"; $ASCII_text.=$GROUP_text; $ASCII_text.="+------------------------------------------+----------------------+-------+-------+----------+---------------+---------------+-------------+-----------+-------+------------------------+----------------------+-------------------------+----------------+------------------+-----------------+-----------+-----------------------+-------------------+----------------------+$HTMLborderheader\n"; $total_average_sale_time=sec_convert(round(MathZDC($total_sales_talk_time,$total_sales)), 'H'); $total_average_contact_time=sec_convert(round(MathZDC($total_contact_talk_time,$total_contacts)), 'H'); $total_talk_hours=MathZDC($total_talk_time, 3600); $ASCII_text.="| ".sprintf("%40s", ""); $ASCII_text.=" | ".sprintf("%20s", _QXZ("TOTALS:")); $ASCII_text.=" | ".sprintf("%5s", $total_calls); $ASCII_text.=" | ".sprintf("%5s", $total_leads); $ASCII_text.=" | ".sprintf("%8s", $total_contacts); $total_contact_ratio=sprintf("%.2f", MathZDC(100*$total_contacts, $total_leads)); $ASCII_text.=" | ".sprintf("%12s", $total_contact_ratio)."%"; $ASCII_text.=" | ".sprintf("%13s", sec_convert($total_nonpause_time,'H')); $ASCII_text.=" | ".sprintf("%11s", sec_convert($total_system_time,'H')); $ASCII_text.=" | ".sprintf("%9s", sec_convert($total_talk_time,'H')); $ASCII_text.=" | ".sprintf("%5s", $total_sales); $sales_per_working_hours=sprintf("%.2f", MathZDC($total_sales, MathZDC($total_nonpause_time, 3600))); $ASCII_text.=" | ".sprintf("%22s", $sales_per_working_hours); $total_sales_ratio=sprintf("%.2f", MathZDC(100*$total_sales, $total_leads)); $ASCII_text.=" | ".sprintf("%19s", $total_sales_ratio)."%"; $total_sale_contact_ratio=sprintf("%.2f", MathZDC(100*$total_sales, $total_contacts)); $ASCII_text.=" | ".sprintf("%22s", $total_sale_contact_ratio)."%"; $total_sales_per_hour=sprintf("%.2f", MathZDC($total_sales, $total_talk_hours)); $total_stcall=sprintf("%.2f", MathZDC($total_calls, $total_leads)); $ASCII_text.=" | ".sprintf("%14s", $total_sales_per_hour); $ASCII_text.=" | ".sprintf("%16s", $total_inc_sales); $ASCII_text.=" | ".sprintf("%15s", $total_cnc_sales); $ASCII_text.=" | ".sprintf("%9s", $total_callbacks); $ASCII_text.=" | ".sprintf("%21s", $total_stcall); # first call resolution $ASCII_text.=" | ".sprintf("%17s", $total_average_sale_time); $ASCII_text.=" | ".sprintf("%20s", $total_average_contact_time)." |"; $CSV_status_text=""; 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]=" \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="CALL CENTER TOTAL"; include("graphcanvas.inc"); $HTML_head.=$HTML_graph_head; $GRAPH.=$graphCanvas; $GRAPH_text.=$GRAPH; $GRAPH_text.=""; $GRAPH_text.="\n"; $GRAPH_text.="\n"; } if ($file_download>0) { $FILE_TIME = date("Ymd-His"); $CSVfilename = "AST_team_performance_detail_$US$FILE_TIME.csv"; $CSV_text=preg_replace('/\n +,/', ',', $CSV_text); $CSV_text=preg_replace('/ +\"/', '"', $CSV_text); $CSV_text=preg_replace('/\" +/', '"', $CSV_text); // We'll be outputting a TXT file header('Content-type: application/octet-stream'); // It will be called LIST_101_20090209-121212.txt header("Content-Disposition: attachment; filename=\"$CSVfilename\""); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); ob_clean(); flush(); echo "$CSV_text"; } else { header("Content-type: text/html; charset=utf-8"); $JS_onload.="}\n"; if ($report_display_type=='HTML') {$JS_text.=$JS_onload;} $JS_text.="\n"; if ($report_display_type=="HTML") { $HTML_text.=$GRAPH_text; $HTML_text.=$JS_text; } else { $HTML_text.=$ASCII_text; } echo $HTML_head; $short_header=1; require("admin_header.php"); echo $HTML_text; flush(); } if ($db_source == 'S') { mysqli_close($link); $use_slave_server=0; $db_source = 'M'; require("dbconnect_mysqli.php"); } $endMS = microtime(); $startMSary = explode(" ",$startMS); $endMSary = explode(" ",$endMS); $runS = ($endMSary[0] - $startMSary[0]); $runM = ($endMSary[1] - $startMSary[1]); $TOTALrun = ($runS + $runM); $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; if ($DB) {echo "|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); exit; ?>
$Sstatus
"._QXZ("TOTAL").": $current_graph_total"._QXZ("TOTAL").": $current_graph_total