From 0d145ab94e8e35bc536e4da656258768e9ed8284 Mon Sep 17 00:00:00 2001 From: mattf Date: Thu, 24 Nov 2016 15:04:39 +0000 Subject: [PATCH] removal of quotes from display text added vdad debug report git-svn-id: svn://192.168.202.10@2627 3d104415-ff17-0410-8863-d5cf3c621b8a --- bin/ADMIN_www_languages.pl | 2 +- docs/OUTBOUND_OPTIMIZATIONS.txt | 11 + www/vicidial/AST_vdad_debug_log_report.php | 733 +++++++++++++++++++++ www/vicidial/admin_bulk_tools.php | 6 +- www/vicidial/admin_languages.php | 22 +- www/vicidial/callbacks_bulk_move.php | 2 +- www/vicidial/help.php | 50 +- www/vicidial/list_merge.php | 6 +- 8 files changed, 793 insertions(+), 39 deletions(-) create mode 100644 www/vicidial/AST_vdad_debug_log_report.php diff --git a/bin/ADMIN_www_languages.pl b/bin/ADMIN_www_languages.pl index cd899a30..ca09898a 100644 --- a/bin/ADMIN_www_languages.pl +++ b/bin/ADMIN_www_languages.pl @@ -63,7 +63,7 @@ if (length($ARGV[0])>1) if ($args =~ /--help/i) { - print "QXZanalyzer.pl - analyze php scripts for QXZ functions and contents\n"; + print "ADMIN_www_languages.pl - analyze php scripts for QXZ functions and contents\n"; print "\n"; print "options:\n"; print " [--help] = this help screen\n"; diff --git a/docs/OUTBOUND_OPTIMIZATIONS.txt b/docs/OUTBOUND_OPTIMIZATIONS.txt index b84cec62..e8a10479 100644 --- a/docs/OUTBOUND_OPTIMIZATIONS.txt +++ b/docs/OUTBOUND_OPTIMIZATIONS.txt @@ -102,6 +102,17 @@ The new script we will be testing changes on will be named "agi-VDAD_ALL_outboun To be added to dialplan +; BETA VICIDIAL_auto_dialer transfer script Load Balanced Survey: +exten => 8376,1,Playback(sip-silence) +exten => 8376,n,AGI(agi://127.0.0.1:4577/call_log) +exten => 8376,n,Set(LRct=1) +exten => 8376,n,While($[${LRct} < 100]) +exten => 8376,n,AGI(agi-VDAD_ALL_outboundBETA.agi,SURVEYCAMP-----LB) +exten => 8376,n,Set(LRct=$[${LRct} + 1]) +exten => 8376,n,EndWhile() +exten => 8376,n,AGI(agi-VDAD_ALL_outboundBETA.agi,SURVEYCAMP-----LB) +exten => 8376,n,Hangup() + ; BETA VICIDIAL_auto_dialer transfer script Load Balanced: exten => 8377,1,Playback(sip-silence) exten => 8377,n,AGI(agi://127.0.0.1:4577/call_log) diff --git a/www/vicidial/AST_vdad_debug_log_report.php b/www/vicidial/AST_vdad_debug_log_report.php new file mode 100644 index 00000000..dab68b50 --- /dev/null +++ b/www/vicidial/AST_vdad_debug_log_report.php @@ -0,0 +1,733 @@ + LICENSE: AGPLv2 +# +# CHANGES +# 161124-0737 - First build +# + +$startMS = microtime(); + +require("dbconnect_mysqli.php"); +require("functions.php"); + +$report_name='VDAD Debug Log Report'; + +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +if (isset($_GET["query_date"])) {$query_date=$_GET["query_date"];} + elseif (isset($_POST["query_date"])) {$query_date=$_POST["query_date"];} +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["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["stage"])) {$stage=$_GET["stage"];} + elseif (isset($_POST["stage"])) {$stage=$_POST["stage"];} +if (isset($_GET["file_download"])) {$file_download=$_GET["file_download"];} + elseif (isset($_POST["file_download"])) {$file_download=$_POST["file_download"];} +if (isset($_GET["lower_limit"])) {$lower_limit=$_GET["lower_limit"];} + elseif (isset($_POST["lower_limit"])) {$lower_limit=$_POST["lower_limit"];} +if (isset($_GET["upper_limit"])) {$upper_limit=$_GET["upper_limit"];} + elseif (isset($_POST["upper_limit"])) {$upper_limit=$_POST["upper_limit"];} +if (isset($_GET["DB"])) {$DB=$_GET["DB"];} + elseif (isset($_POST["DB"])) {$DB=$_POST["DB"];} +if (isset($_GET["DBX"])) {$DBX=$_GET["DBX"];} + elseif (isset($_POST["DBX"])) {$DBX=$_POST["DBX"];} +if (isset($_GET["archive"])) {$archive=$_GET["archive"];} + elseif (isset($_POST["archive"])) {$archive=$_POST["archive"];} +if (isset($_GET["submit"])) {$submit=$_GET["submit"];} + elseif (isset($_POST["submit"])) {$submit=$_POST["submit"];} +if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} + elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} + +############################################# +##### START SYSTEM_SETTINGS LOOKUP ##### +$stmt = "SELECT use_non_latin,outbound_autodial_active,slave_db_server,reports_use_slave_db,enable_languages,language_method FROM system_settings;"; +$rslt=mysql_to_mysqli($stmt, $link); +if ($DB) {$MAIN.="$stmt\n";} +$qm_conf_ct = mysqli_num_rows($rslt); +if ($qm_conf_ct > 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]; + } +##### END SETTINGS LOOKUP ##### +########################################### + +$NOW_DATE = date("Y-m-d"); + +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); + $stage = preg_replace('/[^-_0-9a-zA-Z]/', '', $stage); + } +else + { + $PHP_AUTH_PW = preg_replace("/'|\"|\\\\|;/","",$PHP_AUTH_PW); + $PHP_AUTH_USER = preg_replace("/'|\"|\\\\|;/","",$PHP_AUTH_USER); + $stage = preg_replace("/'|\"|\\\\|;/","",$stage); + } + +$stmt="SELECT selected_language from vicidial_users where user='$PHP_AUTH_USER';"; +if ($DB) {echo "|$stmt|\n";} +$rslt=mysql_to_mysqli($stmt, $link); +$sl_ct = mysqli_num_rows($rslt); +if ($sl_ct > 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); +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; + } + 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"); +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', 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"); + $MAIN.="\n"; + } + + +if (strlen($query_date_D) < 6) {$query_date_D = "00:00:00";} +if (strlen($query_date_T) < 6) {$query_date_T = "23:59:59";} +if (!isset($query_date)) {$query_date = $NOW_DATE;} +if (strlen($stage) < 2) {$stage = 'SUMMARY';} +$vicidial_vdad_log = 'vicidial_vdad_log'; +if ($archive > 0) {$vicidial_vdad_log = 'vicidial_vdad_log_archive';} + +/* +$server_ip_string='|'; +$server_ip_ct = count($server_ip); +$i=0; +while($i < $server_ip_ct) + { + $server_ip_string .= "$server_ip[$i]|"; + $i++; + } + +$server_stmt="select server_ip,server_description from servers where active_asterisk_server='Y' order by server_ip asc;"; +$server_rslt=mysql_to_mysqli($server_stmt, $link); +$servers_to_print=mysqli_num_rows($server_rslt); +$i=0; +while ($i < $servers_to_print) + { + $row=mysqli_fetch_row($server_rslt); + $LISTserverIPs[$i] = $row[0]; + $LISTserver_names[$i] = $row[1]; + if (preg_match('/\-ALL/',$server_ip_string) ) + { + $server_ip[$i] = $LISTserverIPs[$i]; + } + $i++; + } + +$i=0; +$server_ips_string='|'; +$server_ip_ct = count($server_ip); +while($i < $server_ip_ct) + { + if ( (strlen($server_ip[$i]) > 0) and (preg_match("/\|$server_ip[$i]\|/",$server_ip_string)) ) + { + $server_ips_string .= "$server_ip[$i]|"; + $server_ip_SQL .= "'$server_ip[$i]',"; + $server_ipQS .= "&server_ip[]=$server_ip[$i]"; + } + $i++; + } + +if ( (preg_match('/\-\-ALL\-\-/',$server_ip_string) ) or ($server_ip_ct < 1) ) + { + $server_ip_SQL = ""; + $server_rpt_string="- "._QXZ("ALL servers")." "; + if (preg_match('/\-\-ALL\-\-/',$server_ip_string)) {$server_ipQS="&server_ip[]=--ALL--";} + } +else + { + $server_ip_SQL = preg_replace('/,$/i', '',$server_ip_SQL); + $server_ip_SQL = "and server_ip IN($server_ip_SQL)"; + $server_rpt_string="- server(s) ".preg_replace('/\|/', ", ", substr($server_ip_string, 1, -1)); + } +if (strlen($server_ip_SQL)<3) {$server_ip_SQL="";} +*/ + +$HEADER.="\n"; +$HEADER.="\n"; +$HEADER.="\n"; +$HEADER.="\n"; +$HEADER.="\n"; +$HEADER.="\n"; +$HEADER.="\n"; +$HEADER.="\n"; +$HEADER.="\n"; +$HEADER.="\n"; +$HEADER.=""._QXZ("$report_name")."\n"; + +$short_header=1; + +$MAIN.="
"; +$MAIN.="
\n"; +$MAIN.="
\n"; +$MAIN.="\n"; +$MAIN.=_QXZ("Report Type").":\n"; +$MAIN.="       "; +$MAIN.=_QXZ("Date").":\n"; +$MAIN.=""; +$MAIN.="\n"; + +$MAIN.="         "; + +$MAIN.=" "._QXZ("to")."   "; + +/* +$MAIN.=""._QXZ("Server IP").":
\n"; +$MAIN.="
\n"; +*/ + +$MAIN.="
\n"; +$MAIN.="
\n"; + + +if ($SUBMIT) { + /* + $stmt="select hangup_cause, dialstatus, count(*) as ct From vicidial_carrier_log where call_date>='$query_date $query_date_D' and call_date<='$query_date $query_date_T' $server_ip_SQL group by hangup_cause, dialstatus order by hangup_cause, dialstatus"; + $rslt=mysql_to_mysqli($stmt, $link); + $MAIN.="
\n";
+	if ($DB) {$MAIN.=$stmt."\n";}
+	if (mysqli_num_rows($rslt)>0) {
+		$MAIN.="--- "._QXZ("DIAL STATUS BREAKDOWN FOR")." $query_date, $query_date_D "._QXZ("TO")." $query_date_T $server_rpt_string\n";
+		$MAIN.="+--------------+-------------+---------+\n";
+		$MAIN.="| "._QXZ("HANGUP CAUSE",12)." | "._QXZ("DIAL STATUS",11)." | "._QXZ("COUNT",7)." |\n";
+		$MAIN.="+--------------+-------------+---------+\n";
+		$total_count=0;
+		while ($row=mysqli_fetch_array($rslt)) {
+			$MAIN.="| ".sprintf("%-13s", $row["hangup_cause"]);
+			$MAIN.="| ".sprintf("%-12s", $row["dialstatus"]);
+			$MAIN.="| ".sprintf("%-8s", $row["ct"]);
+			$MAIN.="|\n";
+			$total_count+=$row["ct"];
+		}
+		$MAIN.="+--------------+-------------+---------+\n";
+		$MAIN.="| "._QXZ("TOTAL",26,"r")." | ".sprintf("%-8s", $total_count)."|\n";
+		$MAIN.="+--------------+-------------+---------+\n\n";
+
+		$stmt="select sip_hangup_cause,sip_hangup_reason,count(*) as ct From vicidial_carrier_log where call_date>='$query_date $query_date_D' and call_date<='$query_date $query_date_T' $server_ip_SQL group by sip_hangup_cause,sip_hangup_reason order by sip_hangup_cause,sip_hangup_reason";
+		$rslt=mysql_to_mysqli($stmt, $link);
+		$MAIN.="
\n";
+		if ($DB) {$MAIN.=$stmt."\n";}
+		if (mysqli_num_rows($rslt)>0) {
+			$MAIN.="--- "._QXZ("SIP ERROR REASON BREAKDOWN FOR")." $query_date, $query_date_D "._QXZ("TO")." $query_date_T $server_rpt_string\n";
+			$MAIN.="+----------+--------------------------------+---------+\n";
+			$MAIN.="| "._QXZ("SIP CODE",8)." | "._QXZ("SIP HANGUP REASON",30)." | "._QXZ("COUNT",7)." |\n";
+			$MAIN.="+----------+--------------------------------+---------+\n";
+			$total_count=0;
+			while ($row=mysqli_fetch_array($rslt)) {
+				$MAIN.="| ".sprintf("%8s", $row["sip_hangup_cause"])." ";
+				$MAIN.="| ".sprintf("%-31s", $row["sip_hangup_reason"]);
+				$MAIN.="| ".sprintf("%-8s", $row["ct"]);
+				$MAIN.="|\n";
+				$total_count+=$row["ct"];
+			}
+			$MAIN.="+----------+--------------------------------+---------+\n";
+			$MAIN.="| "._QXZ("TOTAL",41,"r")." | ".sprintf("%-8s", $total_count)."|\n";
+			$MAIN.="+-------------------------------------------+---------+\n\n\n";
+		}
+
+		CREATE TABLE vicidial_vdad_log (
+		caller_code VARCHAR(30) NOT NULL,
+		server_ip VARCHAR(15),
+		call_date DATETIME,
+		epoch_micro VARCHAR(20) default '',
+		db_time DATETIME NOT NULL,
+		run_time VARCHAR(20) default '0',
+		vdad_script VARCHAR(40) NOT NULL,
+		lead_id INT(10) UNSIGNED default '0',
+		stage VARCHAR(100) default '',
+		step SMALLINT(5) UNSIGNED default '0',
+		index (caller_code),
+		KEY vdad_dbtime_key (db_time)
+		) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
+	*/
+
+	##### BEGIN SUMMARY SECTION #####
+	if ($stage == 'SUMMARY')
+		{
+		$server_ct=0;
+		$server_array[0]='';
+		$server_calls[0]=0;
+		$server_LRERR[0]=0;
+		$server_preroute[0]=0;
+		$server_preroute_time[0]=0;
+		$MAIN.="
\n";
+
+		$stmt = "SELECT caller_code,server_ip,count(*) FROM $vicidial_vdad_log where db_time >= '$query_date $query_date_D' and db_time <= '$query_date $query_date_T' group by caller_code,server_ip order by caller_code limit 100000;";
+		$rslt=mysql_to_mysqli($stmt, $link);
+		if ($DB) {$MAIN.="$stmt\n";}
+		$cc_ct = mysqli_num_rows($rslt);
+		$i=0;
+		while ($cc_ct > $i)
+			{
+			$row=mysqli_fetch_row($rslt);
+			$Acaller_code[$i] =		$row[0];
+			$Aserver_ip[$i] =		$row[1];
+			$Acc_count[$i] =		$row[2];
+			if ($i==0) 
+				{
+				$server_ct++;
+				$server_array[0]=$Aserver_ip[$i];
+				$server_calls[0]++;
+				}
+			else
+				{
+				$k=0;
+				$server_found=0;
+				while ($k < $server_ct)
+					{
+					if ($Aserver_ip[$i] == $server_array[$k])
+						{
+						$server_calls[$k]++;
+						$server_found=1;
+						}
+					$k++;
+					}
+				if ($server_found < 1)
+					{
+					$server_array[$server_ct]=$Aserver_ip[$i];
+					$server_calls[$server_ct]++;
+					$server_ct++;
+					}
+				}
+			$i++;
+			}
+		if ($cc_ct < 1) 
+			{
+			$MAIN.="*** "._QXZ("NO RECORDS FOUND")." ***\n";
+			}
+		else
+			{
+			$MAIN.="$i "._QXZ("CALLS FOUND")."\n";
+			$MAIN.="$server_ct "._QXZ("SERVERS")."\n";
+			$MAIN.="\n";
+			}
+
+		$i=0;
+		$LRERR=0;
+		$preroute=0;
+		$preroute_total=0;
+		while ($cc_ct > $i)
+			{
+			if ($DBX > 0)
+				{$MAIN.= "$i  $Acaller_code[$i]  $Aserver_ip[$i]  $Acc_count[$i]\n";}
+
+			$start_epoch=0;
+			$last_epoch=0;
+			$last_runtime=0;
+			$preroute_time=0;
+			$found_preroute=0;
+
+			$stmt = "SELECT stage,step,epoch_micro,run_time FROM $vicidial_vdad_log where caller_code='$Acaller_code[$i]' and db_time >= '$query_date $query_date_D' and db_time <= '$query_date $query_date_T' order by epoch_micro;";
+			$rslt=mysql_to_mysqli($stmt, $link);
+			if ($DB) {$MAIN.="$stmt\n";}
+			$cd_ct = mysqli_num_rows($rslt);
+			$j=0;
+			while ($cd_ct > $j)
+				{
+				$row=mysqli_fetch_row($rslt);
+				$Astage[$j] =		$row[0];
+				$Astep[$j] =		$row[1];
+				$Aepoch_micro[$j] =	$row[2];
+				$Arun_time[$j] =	$row[3];
+				if ($Astage[$j] == 'LocalEXIT-8') 
+					{
+					$LRERR++;
+					$k=0;
+					while ($k < $server_ct)
+						{
+						if ($Aserver_ip[$i] == $server_array[$k])
+							{
+							$server_LRERR[$k]++;
+							}
+						$k++;
+						}
+					}
+				if ($j < 1) {$start_epoch=$row[2];}
+				$last_epoch=$row[2];
+				$last_runtime=$row[3];
+				if ($Astage[$j] == 'preroute')
+					{
+					$found_preroute=1;
+					$preroute++;
+					$preroute_time = ( ($last_epoch - $start_epoch) + $last_runtime);
+					$preroute_total = ($preroute_total + $preroute_time);
+					$k=0;
+					while ($k < $server_ct)
+						{
+						if ($Aserver_ip[$i] == $server_array[$k])
+							{
+							$server_preroute[$k]++;
+							$server_preroute_time[$k] = ($server_preroute_time[$k] + $preroute_time);
+							}
+						$k++;
+						}
+					}
+				if ($DBX > 0)
+					{$MAIN.= "          $j  $Aepoch_micro[$j]  $Arun_time[$j]  $Astep[$j]  $Astage[$j]\n";}
+				$j++;
+				}
+			$processing_time = ($last_epoch - $start_epoch);
+			$routing_time = ($processing_time + $last_runtime);
+			if ($DBX > 0)
+				{$MAIN.= "     PROCESSING TIME: $processing_time   ROUTING TIME: $routing_time   PRE-ROUTE TIME: $preroute_time\n";}
+
+			$i++;
+			}
+
+		$LRERR_pct=( ($LRERR / $i) * 100);
+		$LRERR_pct = sprintf("%01.2f", $LRERR_pct);
+
+		$preroute_avg = ($preroute_total / $preroute);
+		$preroute_avg = sprintf("%01.6f", $preroute_avg);
+
+		$MAIN.= "\nFINISHED - \n";
+		$MAIN.= "TOTAL ANSWERED CALLS:  $i\n";
+		$MAIN.= "LRERR:                 $LRERR  ($LRERR_pct%)\n";
+		$MAIN.= "preroute:              $preroute  (average $preroute_avg sec)\n";
+		$MAIN.= "SERVER SUMMARY - \n";
+
+		$k=0;
+		while ($k < $server_ct)
+			{
+			$server_description='';
+			$asterisk_version='';
+			$stmt = "SELECT asterisk_version,server_id,server_description FROM servers where server_ip='$server_array[$k]';";
+			$rslt=mysql_to_mysqli($stmt, $link);
+			if ($DB) {$MAIN.="$stmt\n";}
+			$srv_ct = mysqli_num_rows($rslt);
+			if ($srv_ct > 0)
+				{
+				$row=mysqli_fetch_row($rslt);
+				$asterisk_version =			"asterisk $row[0]";
+				$server_description =		"$row[1] - $row[2]";
+				}
+
+			$LRERR_pct=( ($server_LRERR[$k] / $server_calls[$k]) * 100);
+			$LRERR_pct = sprintf("%01.2f", $LRERR_pct);
+
+			$preroute_avg = ($server_preroute_time[$k] / $server_preroute[$k]);
+			$preroute_avg = sprintf("%01.6f", $preroute_avg);
+
+			$MAIN.= "     $server_array[$k] - $server_description - $asterisk_version\n";
+			$MAIN.= "          TOTAL:      $server_calls[$k]\n";
+			$MAIN.= "          LRERR:      $server_LRERR[$k]  ($LRERR_pct%)\n";
+			$MAIN.= "          preroute:   $server_preroute[$k]  (average $preroute_avg sec)\n";
+			$k++;
+			}
+
+		$MAIN.="
\n"; + + $MAIN.="\n"; + } + ##### END SUMMARY SECTION ##### + + + ##### BEGIN CALL SECTION ##### + if ($stage == 'CALL') + { + $MAIN.="
\n";
+		$stmt = "SELECT caller_code,server_ip,count(*) FROM $vicidial_vdad_log where db_time >= '$query_date $query_date_D' and db_time <= '$query_date $query_date_T' group by caller_code,server_ip order by caller_code;";
+		$rslt=mysql_to_mysqli($stmt, $link);
+		if ($DB) {$MAIN.="$stmt\n";}
+		$cc_ct = mysqli_num_rows($rslt);
+		$i=0;
+		while ($cc_ct > $i)
+			{
+			$row=mysqli_fetch_row($rslt);
+			$Acaller_code[$i] =		$row[0];
+			$Aserver_ip[$i] =		$row[1];
+			$Acc_count[$i] =		$row[2];
+			$i++;
+			}
+		if ($cc_ct < 1) 
+			{
+			$MAIN.="*** "._QXZ("NO RECORDS FOUND")." ***\n";
+			}
+
+		$i=0;
+		while ($cc_ct > $i)
+			{
+			if ($DB > 0)
+				{$MAIN.= "$i  $Acaller_code[$i]  $Aserver_ip[$i]  $Acc_count[$i]\n";}
+			$i++;
+			}
+
+		$MAIN.="
\n"; + + $MAIN.="\n"; + } + ##### END CALL SECTION ##### + + + ##### BEGIN DETAIL SECTION ##### + if ($stage == 'DETAIL') + { + $MAIN.="
\n";
+		$stageSQL='';
+		if (strlen($stage) > 1)
+			{$stageSQL = "and user='$stage'";}
+		$rpt_stmt="select caller_code,call_date,db_time,run_time,vdad_script,stage,lead_id,step,epoch_micro from $vicidial_vdad_log where db_time >= '$query_date $query_date_D' and db_time <= '$query_date $query_date_T' order by db_time desc, epoch_micro desc;";
+		$rpt_rslt=mysql_to_mysqli($rpt_stmt, $link);
+		if ($DB) {$MAIN.=$rpt_stmt."\n";}
+		if (mysqli_num_rows($rpt_rslt)>0) 
+			{
+			if (!$lower_limit) {$lower_limit=1;}
+			if ($lower_limit+999>=mysqli_num_rows($rpt_rslt)) {$upper_limit=($lower_limit+mysqli_num_rows($rpt_rslt)%1000)-1;} else {$upper_limit=$lower_limit+999;}
+			
+			$MAIN.="--- "._QXZ("VDAD DEBUG LOG DETAIL RECORDS FOR")." $query_date, $query_date_D "._QXZ("TO")." $query_date_T $server_rpt_string, "._QXZ("RECORDS")." #$lower_limit-$upper_limit               ["._QXZ("DOWNLOAD")."]\n";
+			$agntdb_rpt.="+----------------------+---------------------+---------------------+-------------------+------------+----------------------+--------------------------------+------------+-------+\n";
+			$agntdb_rpt.="| "._QXZ("CALL",20)." | "._QXZ("CALL DATE",19)." | "._QXZ("DB DATE",19)." | "._QXZ("EPOCH MICRO",17)." | "._QXZ("RUN TIME",10)." | "._QXZ("SCRIPT",20)." | "._QXZ("STAGE",30)." | "._QXZ("LEAD_ID",10)." | "._QXZ("STEP",5)." |\n";
+			$agntdb_rpt.="+----------------------+---------------------+---------------------+-------------------+------------+----------------------+--------------------------------+------------+-------+\n";
+			$CSV_text="\""._QXZ("CALL")."\",\""._QXZ("CALL DATE")."\",\""._QXZ("DB DATE")."\",\""._QXZ("EPOCH MICRO")."\",\""._QXZ("RUN TIME")."\",\""._QXZ("SCRIPT")."\",\""._QXZ("STAGE")."\",\""._QXZ("LEAD_ID")."\",\""._QXZ("STEP")."\"\n";
+
+			for ($i=1; $i<=mysqli_num_rows($rpt_rslt); $i++) 
+				{
+				$row=mysqli_fetch_array($rpt_rslt);
+
+				$CSV_text.="\"$row[caller_code]\",\"$row[call_date]\",\"$row[db_time]\",\"$row[epoch_micro]\",\"$row[run_time]\",\"$row[vdad_script]\",\"$row[stage]\",\"$row[lead_id]\",\"$row[step]\"\n";
+				if ($i>=$lower_limit && $i<=$upper_limit) 
+					{
+					$agntdb_rpt.="| ".sprintf("%-20s", $row["caller_code"]); 
+					$agntdb_rpt.=" | ".sprintf("%-19s", $row["call_date"]); 
+					$agntdb_rpt.=" | ".sprintf("%-19s", $row["db_time"]); 
+					$agntdb_rpt.=" | ".sprintf("%-17s", $row["epoch_micro"]); 
+					if (strlen($row["run_time"])>10) {$row["run_time"]=substr($row["run_time"],0,10)."";}
+					$run_color='color=black';
+					if ($row["run_time"] > 1) {$run_color='color=blue';} 
+					if ($row["run_time"] > 2) {$run_color='color=purple';} 
+					if ($row["run_time"] > 3) {$run_color='color=red';} 
+					$agntdb_rpt.=" | ".sprintf("%-10s", $row["run_time"]).""; 
+					if (strlen($row["vdad_script"])>20) {$row["vdad_script"]=substr($row["vdad_script"],-20)."";}
+					$agntdb_rpt.=" | ".sprintf("%-20s", $row["vdad_script"]); 
+					if (strlen($row["stage"])>27) {$row["stage"]=substr($row["stage"],0,27)."...";}
+					$agntdb_rpt.=" | ".sprintf("%-30s", $row["stage"]); 
+					$agntdb_rpt.=" | ".sprintf("%-10s", $row["lead_id"]); 
+					if (strlen($row["step"])>4) {$row["step"]=substr($row["step"],0,4)."...";}
+					$agntdb_rpt.=" | ".sprintf("%-5s", $row["step"])." |\n"; 
+					}
+				}
+			$agntdb_rpt.="+----------------------+---------------------+---------------------+-------------------+------------+----------------------+--------------------------------+------------+-------+\n";
+
+			$agntdb_rpt_hf="";
+			$ll=$lower_limit-1000;
+			if ($ll>=1) 
+				{
+				$agntdb_rpt_hf.="[<<< "._QXZ("PREV")." 1000 "._QXZ("records")."]";
+				} 
+			else 
+				{
+				$agntdb_rpt_hf.=sprintf("%-23s", " ");
+				}
+			$agntdb_rpt_hf.=sprintf("%-145s", " ");
+			if (($lower_limit+1000)=mysqli_num_rows($rpt_rslt)) {$max_limit=mysqli_num_rows($rpt_rslt)-$upper_limit;} else {$max_limit=1000;}
+				$agntdb_rpt_hf.="["._QXZ("NEXT")." $max_limit "._QXZ("records")." >>>]";
+				} 
+			else 
+				{
+				$agntdb_rpt_hf.=sprintf("%23s", " ");
+				}
+			$agntdb_rpt_hf.="\n";
+			$MAIN.=$agntdb_rpt_hf.$agntdb_rpt.$agntdb_rpt_hf;
+			}
+		else 
+			{
+			$MAIN.="*** "._QXZ("NO RECORDS FOUND")." ***\n";
+			}
+		$MAIN.="
\n"; + + $MAIN.="\n"; + } + ##### END DETAIL SECTION ##### + + } + +if ($file_download>0) + { + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "AST_vdad_debug_log_report_$US$FILE_TIME.csv"; + $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 + { + echo $HEADER; + require("admin_header.php"); + echo $MAIN; + } + +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; + +?> diff --git a/www/vicidial/admin_bulk_tools.php b/www/vicidial/admin_bulk_tools.php index 2cda6559..458798ab 100644 --- a/www/vicidial/admin_bulk_tools.php +++ b/www/vicidial/admin_bulk_tools.php @@ -245,7 +245,7 @@ if ($form_to_run == "help") echo "

"; echo "
"; - echo ""._QXZ("DID Bulk Delete")." - "._QXZ("This will delete the selected DIDs from your system. You cannot delete the 'default' DID. Doing so will break several parts of the system."); + echo ""._QXZ("DID Bulk Delete")." - "._QXZ("This will delete the selected DIDs from your system. You cannot delete the -default- DID. Doing so will break several parts of the system."); echo "

"; echo "

"; @@ -257,7 +257,7 @@ if ($form_to_run == "help") echo "

"; echo "

"; - echo ""._QXZ("AC-CID Bulk Add")." - "._QXZ("This will take a list of CIDs and insert them as Area Code Caller IDs into the selected campaign. The area code lookup is designed to work only with numbers in the North American Numbering Plan. The description will automatically be filled with the appropriate US state abbreviation corresponding to the given CID's 3-digit area code. CIDs must be between 6 and 20 digits in length and only digits 0-9 are allowed. Optionally, you can have the AC-CIDs set to active upon insertion."); + echo ""._QXZ("AC-CID Bulk Add")." - "._QXZ("This will take a list of CIDs and insert them as Area Code Caller IDs into the selected campaign. The area code lookup is designed to work only with numbers in the North American Numbering Plan. The description will automatically be filled with the appropriate US state abbreviation corresponding to the given CIDs 3-digit area code. CIDs must be between 6 and 20 digits in length and only digits 0-9 are allowed. Optionally, you can have the AC-CIDs set to active upon insertion."); echo "

"; echo "

"; @@ -376,7 +376,7 @@ if ($form_to_run == "ACCID") } else { - echo _QXZ("ATTENTION: You are about to add the following AC-CIDs to campaign $ACCIDcampaign")." :"; + echo _QXZ("ATTENTION, You are about to add the following AC-CIDs to this campaign").": $ACCIDcampaign"; $i = 0; while ($i < count($ACCIDto_insert)) { diff --git a/www/vicidial/admin_languages.php b/www/vicidial/admin_languages.php index 076a1e7f..e0abd8d0 100644 --- a/www/vicidial/admin_languages.php +++ b/www/vicidial/admin_languages.php @@ -15,10 +15,11 @@ # 160404-0935 - design changes # 160429-1124 - Added admin_row_click option # 160508-0210 - Added screen colors feature +# 161120-0919 - Added CHAT option # -$admin_version = '2.12-9'; -$build = '160508-0210'; +$admin_version = '2.12-10'; +$build = '161120-0919'; require("dbconnect_mysqli.php"); require("functions.php"); @@ -774,7 +775,14 @@ if ($ADD==163111111111) $rslt=mysql_to_mysqli($stmt, $link); $row=mysqli_fetch_row($rslt); $gathered_phrases_AGC = $row[0]; - $gathered_phrases_ADMIN = ($gathered_phrases_TOTAL - $gathered_phrases_AGC); + + $stmt="SELECT count(*) from www_phrases where php_directory LIKE \"%chat_customer%\";"; + if ($DB) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $gathered_phrases_CHAT = $row[0]; + + $gathered_phrases_ADMIN = ( ($gathered_phrases_TOTAL - $gathered_phrases_AGC) - $gathered_phrases_CHAT); echo "\n"; + echo "\n"; } else { @@ -994,13 +1002,15 @@ if ($ADD==263111111111) $rslt=mysql_to_mysqli($stmt, $link); $affected_rows = mysqli_affected_rows($link); - if (preg_match("/ALL|AGENT|ADMIN/",$stage)) + if (preg_match("/ALL|AGENT|CHAT|ADMIN/",$stage)) { $www_phraseSQL=''; if ($stage == 'AGENT') {$www_phraseSQL='where php_directory LIKE "%agc%"';} + if ($stage == 'CHAT') + {$www_phraseSQL='where php_directory LIKE "%chat_customer%"';} if ($stage == 'ADMIN') - {$www_phraseSQL='where php_directory NOT LIKE "%agc%"';} + {$www_phraseSQL='where ( (php_directory NOT LIKE "%agc%") and (php_directory NOT LIKE "%chat_customer%") )';} $stmtA="INSERT INTO vicidial_language_phrases (language_id,english_text) SELECT '$language_id',phrase_text from www_phrases $www_phraseSQL;"; if ($DB) {echo "$stmtA\n";} $rslt=mysql_to_mysqli($stmtA, $link); diff --git a/www/vicidial/callbacks_bulk_move.php b/www/vicidial/callbacks_bulk_move.php index 12998e87..23aa911f 100644 --- a/www/vicidial/callbacks_bulk_move.php +++ b/www/vicidial/callbacks_bulk_move.php @@ -1000,7 +1000,7 @@ else echo ""; echo ""; echo ""; diff --git a/www/vicidial/help.php b/www/vicidial/help.php index c0500e63..3547efc8 100644 --- a/www/vicidial/help.php +++ b/www/vicidial/help.php @@ -6039,7 +6039,7 @@ if ($SSqc_features_active > 0)
- -
+ -

@@ -6053,15 +6053,15 @@ if ($SSqc_features_active > 0) AVG ANSWER SPEED = Average amount of time a caller waited in queue before an agent answered."); ?>
AVG TALK TIME = Average amount of time an agent remained on the line with the caller before the call was hung up - does not include caller queue time."); ?>
TOTAL TALK TIME = Total amount of time agents remained on the line with callers before calls ended - does not include caller queue time."); ?>
-TOTAL WRAP TIME = Total amount of time agents used to 'wrap' the call - assumed to be 15 second per answered call."); ?>
+TOTAL WRAP TIME = Total amount of time agents used to -wrap- the call - assumed to be 15 second per answered call."); ?>
TOTAL CALL TIME = Total talk time plus total wrap time."); ?>

-
-IVR CALLS = Total calls taken by or made through the selected IVRs that follow the 'CALL PATH'."); ?>
-QUEUE CALLS = Total inbound calls taken by the selected IVRs that follow the 'CALL PATH'."); ?>
-QUEUE DROP CALLS = Total inbound calls taken by the selected IVRs that follow the 'CALL PATH' that were dropped."); ?>
+IVR CALLS = Total calls taken by or made through the selected IVRs that follow the -CALL PATH-."); ?>
+QUEUE CALLS = Total inbound calls taken by the selected IVRs that follow the -CALL PATH-."); ?>
+QUEUE DROP CALLS = Total inbound calls taken by the selected IVRs that follow the -CALL PATH- that were dropped."); ?>
QUEUE DROP PERCENT = Percentage of dropped inbound calls taken by the selected IVRs (QUEUE DROP CALLS / QUEUE CALLS)."); ?>
IVR AVG TIME = Average amount of time spent in-call, taken by dividing IVR CALLS by the total time spent in the selected IVRs."); ?>
TOTAL AVG TIME = Total call time spent in the selected IVRs."); ?>
@@ -6071,8 +6071,8 @@ if ($SSqc_features_active > 0)
-
LIST ID SUMMARY = Shows each list in the campaign(s) selected by the user, the count of leads in each list, and whether the list is active or inactive."); ?>
-STATUS FLAGS SUMMARY = Shows a breakdown of the status flags for all the selected lists in all the selected campaigns combined. Status flags are set in the 'Statuses' section of a campaign or the 'System Statuses'."); ?>
-CUSTOM STATUS CATEGORY STATS = Shows a breakdown of the custom status categories for all the selected lists in all the selected campaigns combined. Categories can be defined under the 'System Statuses' in the admin section."); ?>
+STATUS FLAGS SUMMARY = Shows a breakdown of the status flags for all the selected lists in all the selected campaigns combined. Status flags are set in the -Statuses- section of a campaign or the -System Statuses-."); ?>
+CUSTOM STATUS CATEGORY STATS = Shows a breakdown of the custom status categories for all the selected lists in all the selected campaigns combined. Categories can be defined under the -System Statuses- in the admin section."); ?>
PER LIST DETAIL STATS = Shows each list in the campaign(s) selected by the user, with a breakdown of each status flag (and percentage of each flag) and status within that list."); ?>
@@ -6083,27 +6083,27 @@ if ($SSqc_features_active > 0) CAMPAIGN = Campaign that the list currently belongs to."); ?>
LEAD COUNT = Number of leads in the list."); ?>
ACTIVE = Whether or not the lead was active."); ?>
-CONTACTS 1st-5th,LIFE PASS = Leads that were 'human answered' (dispoed a status where HUMAN ANSWER is set to 'Y' on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-CNT RATE 1st-5th PASS = Percentage of leads on the list that were 'human answered' on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-SALE 1st-5th,LIFE PASS = Leads that were sold to (dispoed a status where SALE is set to 'Y' on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+CONTACTS 1st-5th,LIFE PASS = Leads that were -human answered- (dispoed a status where HUMAN ANSWER is set to -Y- on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+CNT RATE 1st-5th PASS = Percentage of leads on the list that were -human answered- on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+SALE 1st-5th,LIFE PASS = Leads that were sold to (dispoed a status where SALE is set to -Y- on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
CNV RATE 1st-5th PASS = Percentage of leads on the list that were sold to on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-DNC 1st-5th,LIFE PASS = Leads that were dispositioned 'do not call' (dispoed a status where DNC is set to 'Y' on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-DNC RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were 'do not call' on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-CUST CONTACT 1st-5th,LIFE PASS = Leads that were 'customer contacted' (dispoed a status where CUSTOMER CONTACT is set to 'Y' on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-CUCT RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were 'customer contacted' on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-UNWORKABL 1st-5th,LIFE PASS = Leads that were 'unworkable' (dispoed a status where UNWORKABLE is set to 'Y' on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-UNWK RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were 'unworkable' on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-SCHEDL CB 1st-5th,LIFE PASS = Leads that were 'scheduled callbacks' (dispoed a status where SCHEDULED CALLBACK is set to 'Y' on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-SHCB RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were 'scheduled callbacks' on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-COMPLETED 1st-5th,LIFE PASS = Leads that were 'completed' (dispoed a status where COMPLETED is set to 'Y' on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
-COMP RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were 'completed' on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+DNC 1st-5th,LIFE PASS = Leads that were dispositioned -do not call- (dispoed a status where DNC is set to -Y- on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+DNC RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were -do not call- on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+CUST CONTACT 1st-5th,LIFE PASS = Leads that were -customer contacted- (dispoed a status where CUSTOMER CONTACT is set to -Y- on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+CUCT RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were -customer contacted- on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+UNWORKABL 1st-5th,LIFE PASS = Leads that were -unworkable- (dispoed a status where UNWORKABLE is set to -Y- on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+UNWK RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were -unworkable- on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+SCHEDL CB 1st-5th,LIFE PASS = Leads that were -scheduled callbacks- (dispoed a status where SCHEDULED CALLBACK is set to -Y- on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+SHCB RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were -scheduled callbacks- on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+COMPLETED 1st-5th,LIFE PASS = Leads that were -completed- (dispoed a status where COMPLETED is set to -Y- on the statuses section) on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>
+COMP RATE 1st-5th,LIFE PASS = Percentage of leads on the list that were -completed- on or after the first-fifth call attempt, or LIFE if contacted as such at any point ever."); ?>

-
TOTAL LIST ID SUMMARY = Shows each list selected by the user, the count of leads in the list, and whether the list is active or inactive."); ?>
-TOTAL STATUS FLAGS SUMMARY = Shows a breakdown of the status flags for all the selected lists combined. Status flags are set in the 'Statuses' section of a campaign or the 'System Statuses'."); ?>
+TOTAL STATUS FLAGS SUMMARY = Shows a breakdown of the status flags for all the selected lists combined. Status flags are set in the -Statuses- section of a campaign or the -System Statuses-."); ?>
LIST ID SUMMARY = Each list selected in the report will be listed separately after the TOTALS summaries. The list summary gives specific information about each particular list."); ?>
STATUS FLAGS BREAKDOWN = Same as TOTAL STATUS FLAGS SUMMARY, but only for one list."); ?>
STATUS BREAKDOWN = A breakdown of each status in the individual list, along with the status description, number of leads, and percentage relative to the total leads in the list."); ?>
@@ -6121,7 +6121,7 @@ if ($SSqc_features_active > 0) DROP PERCENT = The percentage of calls dispositioned as DROPs against the TOTAL CALLS."); ?>
AGENT LOGIN TIME (H:M:S) = The total pause, wait, talk, and dispo times logged by agents for the campaign/interval."); ?>
AGENT PAUSE TIME (H:M:S) = The total pause time logged by agents for the campaign/interval."); ?>
-INTERVAL = The interval (in 'HHii' format) being reported on under the campaign."); ?>
+INTERVAL = The interval (in -HHii- format) being reported on under the campaign."); ?>

@@ -6171,15 +6171,15 @@ if ($SSqc_features_active > 0) AGENT = The agent making the transfer (fronter)."); ?>
XFERS = The number of transfers the agent made."); ?>
SALE % = Percentage of transfers the agent made that resulted in a sale."); ?>
-SALE = Number of sales (dispos where sale='Y' in the 'Statuses' section) made on the agent's transfers."); ?>
+SALE = Number of sales (dispos where sale=Y in the -Statuses- section) made on the agents transfers."); ?>
DROP = Number of transfers that were dropped (did not make it to a live closer)."); ?>
OTHER = Number of transfers that were not dropped, but also not sold by the closer."); ?>
FRONTER STATS"); ?>
AGENT = The agent receiving the transfer (closer)."); ?>
CALLS = Total calls answered by the closer."); ?>
-SALE = Number of sales (dispos where sale='Y' in the 'Statuses' section) made on the transfers the closer fielded."); ?>
-DROP = Number of calls the closer received that were dispo'ed as dropped."); ?>
+SALE = Number of sales (dispos where sale=Y in the -Statuses- section) made on the transfers the closer fielded."); ?>
+DROP = Number of calls the closer received that were dispoed as dropped."); ?>
OTHER = Calls the closer fielded that did not result in sales."); ?>
CONV % = Percentage of transfers the closer received that resulted in sales."); ?>
diff --git a/www/vicidial/list_merge.php b/www/vicidial/list_merge.php index b412e736..cd26225f 100644 --- a/www/vicidial/list_merge.php +++ b/www/vicidial/list_merge.php @@ -343,7 +343,7 @@ if ($submit == "submit" ) $active=$list_row[4]; if (!preg_match("/ $campaign_id /", $allowed_campaigns)) { - echo "

"._QXZ("Cannot move leads - access is denied to the specified list ID $new_list_id.")."

\n"; + echo "

"._QXZ("Cannot move leads - access is denied to the specified list ID:")." $new_list_id

\n"; echo "

"._QXZ("Click here to start over.")."

\n"; exit; } @@ -537,12 +537,12 @@ if (($submit != "submit" ) && ($confirm != "CONFIRM")) echo "(Lists selected above will automatically populate here)\n"; # Destination List ID - echo "\n"; + echo "\n"; echo "\n"; - echo "\n"; + echo "\n"; echo "\n"; echo "\n"; echo "
\n"; echo ""; @@ -794,7 +802,7 @@ if ($ADD==163111111111) if ($gathered_phrases_TOTAL > 0) { - echo "
"._QXZ("Populate Language").": $NWB#languages-populate$NWE
"._QXZ("Populate Language").": $NWB#languages-populate$NWE
"; - echo " "._QXZ("Revert to last status")."
("._QXZ("overrides 'New Status'").")
"; + echo " "._QXZ("Revert to last status")."
("._QXZ("overrides -New Status-").")
"; echo "
"._QXZ("Alternate list information - only required if 'ALTERNATE LIST' is selected above")."
"._QXZ("Alternate list information - only required if -ALTERNATE LIST- is selected above")."
"._QXZ("Alternate list ID:")."\n"; echo " (digits only)\n"; echo "
"._QXZ("Below fields are required ONLY if \"Alternate list ID\" is filled out and not an already-existing list")."
"._QXZ("Below fields are required ONLY if -Alternate list ID- is filled out and not an already-existing list")."
"._QXZ("List Name").": $NWB#lists-list_name$NWE
"._QXZ("List Description").": $NWB#lists-list_description$NWE
"._QXZ("Campaign").":