From a4160e7096519d8b2bb5e8e00f7b5441ce525de1 Mon Sep 17 00:00:00 2001 From: mattf Date: Mon, 4 Jan 2016 19:11:44 +0000 Subject: [PATCH] Added chat dead detection in agent screen, real-time report and API Added chat/email live images for agent screen git-svn-id: svn://192.168.202.10@2455 3d104415-ff17-0410-8863-d5cf3c621b8a --- extras/MySQL_AST_CREATE_tables.sql | 5 +- extras/upgrade_2.12.sql | 4 + www/agc/conf_exten_check.php | 185 +++++++++++++++----------- www/agc/images/agc_live_chat_DEAD.gif | Bin 0 -> 1153 bytes www/agc/images/agc_live_chat_ON.gif | Bin 0 -> 1564 bytes www/agc/images/agc_live_email_ON.gif | Bin 0 -> 1088 bytes www/agc/vicidial.php | 35 ++++- www/vicidial/AST_timeonVDADall.php | 35 ++++- www/vicidial/non_agent_api.php | 125 ++++++++++++++--- www/vicidial/user_stats.php | 25 +++- 10 files changed, 303 insertions(+), 111 deletions(-) create mode 100644 www/agc/images/agc_live_chat_DEAD.gif create mode 100644 www/agc/images/agc_live_chat_ON.gif create mode 100644 www/agc/images/agc_live_email_ON.gif diff --git a/extras/MySQL_AST_CREATE_tables.sql b/extras/MySQL_AST_CREATE_tables.sql index 252c76fc..90f69f13 100644 --- a/extras/MySQL_AST_CREATE_tables.sql +++ b/extras/MySQL_AST_CREATE_tables.sql @@ -3206,7 +3206,8 @@ poster VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, chat_member_name VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, chat_level ENUM('0','1') COLLATE utf8_unicode_ci DEFAULT '0', PRIMARY KEY (message_row_id), -KEY vicidial_chat_log_user_key (poster) +KEY vicidial_chat_log_user_key (poster), +KEY vicidial_chat_log_chat_id (chat_id) ) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE vicidial_chat_log_archive ( @@ -3688,4 +3689,4 @@ UPDATE vicidial_configuration set value='1766' where name='qc_database_version'; UPDATE system_settings set vdc_agent_api_active='1'; -UPDATE system_settings SET db_schema_version='1446',db_schema_update_date=NOW(),reload_timestamp=NOW(); +UPDATE system_settings SET db_schema_version='1447',db_schema_update_date=NOW(),reload_timestamp=NOW(); diff --git a/extras/upgrade_2.12.sql b/extras/upgrade_2.12.sql index 3592dac8..3721b9f9 100644 --- a/extras/upgrade_2.12.sql +++ b/extras/upgrade_2.12.sql @@ -465,3 +465,7 @@ index(processed) ) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_unicode_ci; UPDATE system_settings SET db_schema_version='1446',db_schema_update_date=NOW() where db_schema_version < 1446; + +CREATE INDEX live_chat_id on vicidial_chat_log (chat_id); + +UPDATE system_settings SET db_schema_version='1447',db_schema_update_date=NOW() where db_schema_version < 1447; diff --git a/www/agc/conf_exten_check.php b/www/agc/conf_exten_check.php index 59a60e4b..ca8db2e4 100644 --- a/www/agc/conf_exten_check.php +++ b/www/agc/conf_exten_check.php @@ -1,7 +1,7 @@ LICENSE: AGPLv2 +# Copyright (C) 2016 Matt Florell LICENSE: AGPLv2 # # This script is designed purely to send whether the meetme conference has live channels connected and which they are # This script depends on the server_ip being sent and also needs to have a valid user/pass from the vicidial_users table @@ -69,13 +69,14 @@ # 141228-0053 - Found missing phrase for QXZ # 150723-1708 - Added ajax logging and agent screen click logging # 150904-2138 - Added SQL features for chats started via agent invite, modified output +# 160104-1232 - Added proper detection of dead chats, disabled dead detection of emails # -$version = '2.12-44'; -$build = '150904-2138'; +$version = '2.12-45'; +$build = '160104-1232'; $php_script = 'conf_exten_check.php'; $mel=1; # Mysql Error Log enabled = 1 -$mysql_log_count=43; +$mysql_log_count=44; $one_mysql_log=0; $DB=0; $SSagent_debug_logging=0; @@ -115,6 +116,10 @@ if (isset($_GET["bcrypt"])) {$bcrypt=$_GET["bcrypt"];} elseif (isset($_POST["bcrypt"])) {$bcrypt=$_POST["bcrypt"];} if (isset($_GET["clicks"])) {$clicks=$_GET["clicks"];} elseif (isset($_POST["clicks"])) {$clicks=$_POST["clicks"];} +if (isset($_GET["customer_chat_id"])) {$customer_chat_id=$_GET["customer_chat_id"];} + elseif (isset($_POST["customer_chat_id"])) {$customer_chat_id=$_POST["customer_chat_id"];} +if (isset($_GET["live_call_seconds"])) {$live_call_seconds=$_GET["live_call_seconds"];} + elseif (isset($_POST["live_call_seconds"])) {$live_call_seconds=$_POST["live_call_seconds"];} if ($bcrypt == 'OFF') {$bcrypt=0;} @@ -279,7 +284,7 @@ if ($ACTION == 'refresh') if ($Acount > 0) { - $stmt="SELECT status,callerid,agent_log_id,campaign_id,lead_id from vicidial_live_agents where user='$user' and server_ip='$server_ip';"; + $stmt="SELECT status,callerid,agent_log_id,campaign_id,lead_id,comments from vicidial_live_agents where user='$user' and server_ip='$server_ip';"; if ($DB) {echo "|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03004',$user,$server_ip,$session_name,$one_mysql_log);} @@ -289,6 +294,7 @@ if ($ACTION == 'refresh') $Aagent_log_id = $row[2]; $Acampaign_id = $row[3]; $Alead_id = $row[4]; + $Acomments = $row[5]; $api_manual_dial='STANDARD'; $stmt = "SELECT api_manual_dial FROM vicidial_campaigns where campaign_id='$Acampaign_id';"; @@ -367,7 +373,7 @@ if ($ACTION == 'refresh') $stmt="SELECT status,campaign_id,closer_campaigns,comments from vicidial_live_agents where user='$user' and server_ip='$server_ip';"; if ($DB) {echo "|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03043',$user,$server_ip,$session_name,$one_mysql_log);} + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03043',$user,$server_ip,$session_name,$one_mysql_log);} $row=mysqli_fetch_row($rslt); $Alogin=$row[0]; $Acampaign=$row[1]; @@ -440,48 +446,71 @@ if ($ACTION == 'refresh') $retry_count++; } - ##### BEGIN DEAD logging section ##### - ### find whether the call the agent is on is hung up - $stmt="SELECT count(*) from vicidial_auto_calls where callerid='$Acallerid';"; - if ($DB) {echo "|$stmt|\n";} - $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03018',$user,$server_ip,$session_name,$one_mysql_log);} - $row=mysqli_fetch_row($rslt); - $AcalleridCOUNT=$row[0]; - - if ( ($AcalleridCOUNT > 0) and (preg_match("/INCALL/i",$Astatus)) and (preg_match("/^M/",$Acallerid)) ) + if ( ( ($Acomments != 'CHAT') and ($Acomments != 'EMAIL') ) or ($live_call_seconds > 4) ) { - $updateNOW_TIME = date("Y-m-d H:i:s"); - $stmt="UPDATE vicidial_auto_calls set last_update_time='$updateNOW_TIME' where callerid='$Acallerid';"; - if ($format=='debug') {echo "\n";} - $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03038',$user,$server_ip,$session_name,$one_mysql_log);} - } - - if ( ($AcalleridCOUNT < 1) and (preg_match("/INCALL/i",$Astatus)) and (strlen($Aagent_log_id) > 0) ) - { - $DEADcustomer++; - ### find whether the agent log record has already logged DEAD - $stmt="SELECT count(*) from vicidial_agent_log where agent_log_id='$Aagent_log_id' and ( (dead_epoch IS NOT NULL) or (dead_epoch > 10000) );"; - if ($DB) {echo "|$stmt|\n";} - $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03019',$user,$server_ip,$session_name,$one_mysql_log);} - $row=mysqli_fetch_row($rslt); - $Aagent_log_idCOUNT=$row[0]; - - if ($Aagent_log_idCOUNT < 1) + ##### BEGIN DEAD logging section ##### + if ( ( (strlen($customer_chat_id > 0) ) and ($customer_chat_id > 0) ) or ($Acomments == 'EMAIL') ) { - $NEWdead_epoch = date("U"); - $deadNOW_TIME = date("Y-m-d H:i:s"); - $stmt="UPDATE vicidial_agent_log set dead_epoch='$NEWdead_epoch' where agent_log_id='$Aagent_log_id';"; + if ($Acomments == 'EMAIL') + {$AcalleridCOUNT=1;} + else + { + ### find whether the call the agent is on is hung up + $stmt="SELECT count(*) from vicidial_chat_log where chat_id='$customer_chat_id' and message LIKE \"%has left chat\";"; + if ($DB) {echo "|$stmt|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03044',$user,$server_ip,$session_name,$one_mysql_log);} + $row=mysqli_fetch_row($rslt); + $AchatendCOUNT=$row[0]; + $AcalleridCOUNT=1; + if ($AchatendCOUNT > 0) + {$AcalleridCOUNT=0;} + } + } + else + { + ### find whether the call the agent is on is hung up + $stmt="SELECT count(*) from vicidial_auto_calls where callerid='$Acallerid';"; + if ($DB) {echo "|$stmt|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03018',$user,$server_ip,$session_name,$one_mysql_log);} + $row=mysqli_fetch_row($rslt); + $AcalleridCOUNT=$row[0]; + } + if ( ($AcalleridCOUNT > 0) and (preg_match("/INCALL/i",$Astatus)) and (preg_match("/^M/",$Acallerid)) ) + { + $updateNOW_TIME = date("Y-m-d H:i:s"); + $stmt="UPDATE vicidial_auto_calls set last_update_time='$updateNOW_TIME' where callerid='$Acallerid';"; if ($format=='debug') {echo "\n";} $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03020',$user,$server_ip,$session_name,$one_mysql_log);} + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03038',$user,$server_ip,$session_name,$one_mysql_log);} + } - $stmt="UPDATE vicidial_live_agents set last_state_change='$deadNOW_TIME' where agent_log_id='$Aagent_log_id';"; - if ($format=='debug') {echo "\n";} + if ( ($AcalleridCOUNT < 1) and (preg_match("/INCALL/i",$Astatus)) and (strlen($Aagent_log_id) > 0) ) + { + $DEADcustomer++; + ### find whether the agent log record has already logged DEAD + $stmt="SELECT count(*) from vicidial_agent_log where agent_log_id='$Aagent_log_id' and ( (dead_epoch IS NOT NULL) or (dead_epoch > 10000) );"; + if ($DB) {echo "|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03021',$user,$server_ip,$session_name,$one_mysql_log);} + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03019',$user,$server_ip,$session_name,$one_mysql_log);} + $row=mysqli_fetch_row($rslt); + $Aagent_log_idCOUNT=$row[0]; + + if ($Aagent_log_idCOUNT < 1) + { + $NEWdead_epoch = date("U"); + $deadNOW_TIME = date("Y-m-d H:i:s"); + $stmt="UPDATE vicidial_agent_log set dead_epoch='$NEWdead_epoch' where agent_log_id='$Aagent_log_id';"; + if ($format=='debug') {echo "\n";} + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03020',$user,$server_ip,$session_name,$one_mysql_log);} + + $stmt="UPDATE vicidial_live_agents set last_state_change='$deadNOW_TIME' where agent_log_id='$Aagent_log_id';"; + if ($format=='debug') {echo "\n";} + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03021',$user,$server_ip,$session_name,$one_mysql_log);} + } } } ##### END DEAD logging section ##### @@ -502,48 +531,52 @@ if ($ACTION == 'refresh') $one_mysql_log=0; $retry_count++; } + ##### BEGIN DEAD logging section ##### - ### find whether the call the agent is on is hung up - $stmt="SELECT count(*) from vicidial_auto_calls where callerid='$Acallerid';"; - if ($DB) {echo "|$stmt|\n";} - $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03029',$user,$server_ip,$session_name,$one_mysql_log);} - $row=mysqli_fetch_row($rslt); - $AcalleridCOUNT=$row[0]; - - if ( ($AcalleridCOUNT > 0) and (preg_match("/INCALL/i",$Astatus)) ) + if ($Acomments != 'EMAIL') { - $updateNOW_TIME = date("Y-m-d H:i:s"); - $stmt="UPDATE vicidial_auto_calls set last_update_time='$updateNOW_TIME' where callerid='$Acallerid';"; - if ($format=='debug') {echo "\n";} - $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03037',$user,$server_ip,$session_name,$one_mysql_log);} - } - - if ( ($AcalleridCOUNT < 1) and (preg_match("/INCALL/i",$Astatus)) and (strlen($Aagent_log_id) > 0) ) - { - $DEADcustomer++; - ### find whether the agent log record has already logged DEAD - $stmt="SELECT count(*) from vicidial_agent_log where agent_log_id='$Aagent_log_id' and ( (dead_epoch IS NOT NULL) or (dead_epoch > 10000) );"; + ### find whether the call the agent is on is hung up + $stmt="SELECT count(*) from vicidial_auto_calls where callerid='$Acallerid';"; if ($DB) {echo "|$stmt|\n";} $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03030',$user,$server_ip,$session_name,$one_mysql_log);} + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03029',$user,$server_ip,$session_name,$one_mysql_log);} $row=mysqli_fetch_row($rslt); - $Aagent_log_idCOUNT=$row[0]; - - if ($Aagent_log_idCOUNT < 1) - { - $NEWdead_epoch = date("U"); - $deadNOW_TIME = date("Y-m-d H:i:s"); - $stmt="UPDATE vicidial_agent_log set dead_epoch='$NEWdead_epoch' where agent_log_id='$Aagent_log_id';"; - if ($format=='debug') {echo "\n";} - $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03031',$user,$server_ip,$session_name,$one_mysql_log);} + $AcalleridCOUNT=$row[0]; - $stmt="UPDATE vicidial_live_agents set last_state_change='$deadNOW_TIME' where agent_log_id='$Aagent_log_id';"; + if ( ($AcalleridCOUNT > 0) and (preg_match("/INCALL/i",$Astatus)) ) + { + $updateNOW_TIME = date("Y-m-d H:i:s"); + $stmt="UPDATE vicidial_auto_calls set last_update_time='$updateNOW_TIME' where callerid='$Acallerid';"; if ($format=='debug') {echo "\n";} $rslt=mysql_to_mysqli($stmt, $link); - if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03032',$user,$server_ip,$session_name,$one_mysql_log);} + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03037',$user,$server_ip,$session_name,$one_mysql_log);} + } + + if ( ($AcalleridCOUNT < 1) and (preg_match("/INCALL/i",$Astatus)) and (strlen($Aagent_log_id) > 0) ) + { + $DEADcustomer++; + ### find whether the agent log record has already logged DEAD + $stmt="SELECT count(*) from vicidial_agent_log where agent_log_id='$Aagent_log_id' and ( (dead_epoch IS NOT NULL) or (dead_epoch > 10000) );"; + if ($DB) {echo "|$stmt|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03030',$user,$server_ip,$session_name,$one_mysql_log);} + $row=mysqli_fetch_row($rslt); + $Aagent_log_idCOUNT=$row[0]; + + if ($Aagent_log_idCOUNT < 1) + { + $NEWdead_epoch = date("U"); + $deadNOW_TIME = date("Y-m-d H:i:s"); + $stmt="UPDATE vicidial_agent_log set dead_epoch='$NEWdead_epoch' where agent_log_id='$Aagent_log_id';"; + if ($format=='debug') {echo "\n";} + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03031',$user,$server_ip,$session_name,$one_mysql_log);} + + $stmt="UPDATE vicidial_live_agents set last_state_change='$deadNOW_TIME' where agent_log_id='$Aagent_log_id';"; + if ($format=='debug') {echo "\n";} + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'03032',$user,$server_ip,$session_name,$one_mysql_log);} + } } } ##### END DEAD logging section ##### diff --git a/www/agc/images/agc_live_chat_DEAD.gif b/www/agc/images/agc_live_chat_DEAD.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5684f424c2f61d143753e8fc01ed3e0a080081b GIT binary patch literal 1153 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"; var image_livecall_DEAD = new Image(); image_livecall_DEAD.src="./images/"; + var image_livechat_ON = new Image(); + image_livechat_ON.src="./images/"; + var image_livechat_DEAD = new Image(); + image_livechat_DEAD.src="./images/"; + var image_liveemail_ON = new Image(); + image_liveemail_ON.src="./images/"; var image_LB_dialnextnumber = new Image(); image_LB_dialnextnumber.src="./images/"; var image_LB_hangupcustomer = new Image(); @@ -5154,7 +5161,7 @@ function set_length(SLnumber,SLlength_goal,SLdirection) } if (xmlhttprequestcheckconf) { - checkconf_query = "server_ip=" + server_ip + "&session_name=" + session_name + "&user=" + user + "&pass=" + pass + "&client=vdc&conf_exten=" + taskconfnum + "&auto_dial_level=" + auto_dial_level + "&campagentstdisp=" + campagentstdisp + "&clicks=" + button_click_log; + checkconf_query = "server_ip=" + server_ip + "&session_name=" + session_name + "&user=" + user + "&pass=" + pass + "&client=vdc&conf_exten=" + taskconfnum + "&auto_dial_level=" + auto_dial_level + "&campagentstdisp=" + campagentstdisp + "&customer_chat_id=" + document.vicidial_form.customer_chat_id.value + "&live_call_seconds=" + VD_live_call_secondS +"&clicks=" + button_click_log; button_click_log=''; xmlhttprequestcheckconf.open('POST', 'conf_exten_check.php'); xmlhttprequestcheckconf.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8'); @@ -5270,7 +5277,7 @@ function set_length(SLnumber,SLlength_goal,SLdirection) var APIManualDialQueue_array = check_time_array[24].split("APIManualDialQueue: "); APIManualDialQueue = APIManualDialQueue_array[1]; var CheckDEADcall_array = check_time_array[10].split("DEADcall: "); - var CheckDEADcall = CheckDEADcall_array[1]; + CheckDEADcall = CheckDEADcall_array[1]; var InGroupChange_array = check_time_array[11].split("InGroupChange: "); var InGroupChange = InGroupChange_array[1]; var InGroupChangeBlend = check_time_array[12]; @@ -5591,7 +5598,7 @@ function set_length(SLnumber,SLlength_goal,SLdirection) } } - if ( (CheckDEADcall > 0) && (VD_live_customer_call==1) ) + if ( (CheckDEADcall > 0) && (VD_live_customer_call==1) && (currently_in_email_or_chat < 1) ) { if (CheckDEADcallON < 1) { @@ -5612,6 +5619,17 @@ function set_length(SLnumber,SLlength_goal,SLdirection) } } } + if ( (CheckDEADcall > 0) && (VD_live_customer_call==1) && (VD_live_call_secondS > 5) && ((CalL_AutO_LauncH == 'CHAT')) && (currently_in_email_or_chat > 0) ) + { + if (CheckDEADcallON < 1) + { + if( document.images ) + { document.images['livecall'].src = image_livechat_DEAD.src;} + CheckDEADcallON=1; + CheckDEADcallCOUNT++; + customer_sec = VD_live_call_secondS; + } + } if (InGroupChange > 0) { var external_blended = InGroupChangeBlend; @@ -10403,10 +10421,12 @@ function set_length(SLnumber,SLlength_goal,SLdirection) VDIC_web_form_address_two = VICIDiaL_web_form_address_two; VDIC_web_form_address_three = VICIDiaL_web_form_address_three; CalL_AutO_LauncH = VDIC_data_VDAC[3]; + if( document.images ) { document.images['livecall'].src = image_livecall_ON.src;} if (CalL_AutO_LauncH=='EMAIL') { document.vicidial_form.email_row_id.value= VDIC_data_VDAC[4]; document.getElementById("EmailAudioAlertFile").play(); + if( document.images ) { document.images['livecall'].src = image_liveemail_ON.src;} } else if (CalL_AutO_LauncH=='CHAT') { @@ -10415,6 +10435,8 @@ function set_length(SLnumber,SLlength_goal,SLdirection) document.images['CustomerChatImg'].src=image_customer_chat_ON.src; document.getElementById("ChatAudioAlertFile").play(); document.vicidial_form.chat_id.value= VDIC_data_VDAC[4]; + document.vicidial_form.customer_chat_id.value= VDIC_data_VDAC[4]; + if( document.images ) { document.images['livecall'].src = image_livechat_ON.src;} } } var VDIC_fronter=''; @@ -10514,7 +10536,6 @@ function set_length(SLnumber,SLlength_goal,SLdirection) lastcustchannel = VDIC_data_VDAC[3]; document.vicidial_form.callserverip.value = VDIC_data_VDAC[4]; lastcustserverip = VDIC_data_VDAC[4]; - if( document.images ) { document.images['livecall'].src = image_livecall_ON.src;} document.vicidial_form.SecondS.value = 0; document.getElementById("SecondSDISP").innerHTML = '0'; @@ -12399,6 +12420,7 @@ function set_length(SLnumber,SLlength_goal,SLdirection) document.vicidial_form.call_notes_dispo.value =''; document.vicidial_form.email_row_id.value =''; document.vicidial_form.chat_id.value =''; + document.vicidial_form.customer_chat_id.value =''; document.vicidial_form.dispo_comments.value =''; document.vicidial_form.cbcomment_comments.value =''; VDCL_group_id = ''; @@ -17250,6 +17272,7 @@ $zi=2; + diff --git a/www/vicidial/AST_timeonVDADall.php b/www/vicidial/AST_timeonVDADall.php index a01c3648..77860f59 100644 --- a/www/vicidial/AST_timeonVDADall.php +++ b/www/vicidial/AST_timeonVDADall.php @@ -1,7 +1,7 @@ LICENSE: AGPLv2 +# Copyright (C) 2016 Matt Florell LICENSE: AGPLv2 # # live real-time stats for the VICIDIAL Auto-Dialer all servers # @@ -95,10 +95,11 @@ # 150804-0956 - Added WHISPER option agent monitoring # 150919-0238 - Added display for chats in queue # 150925-2223 - Added User option to hide users from real-time report +# 160104-1059 - Added detection of dead chat sessions # -$version = '2.12-83'; -$build = '150925-2223'; +$version = '2.12-84'; +$build = '160104-1059'; header ("Content-type: text/html; charset=utf-8"); @@ -2683,6 +2684,7 @@ $talking_to_print = mysqli_num_rows($rslt); if (preg_match("/INCALL/i",$Lstatus)) { $stmtP="SELECT count(*) from parked_channels where channel_group='$Acallerid[$i]';"; + if ($DB) {echo "$stmtP\n";} $rsltP=mysql_to_mysqli($stmtP,$link); $rowP=mysqli_fetch_row($rsltP); $parked_channel = $rowP[0]; @@ -2703,6 +2705,33 @@ $talking_to_print = mysqli_num_rows($rslt); $Lstatus = 'DEAD'; $status = ' DEAD '; } + if (preg_match("/CHAT/i",$comments)) + { + $stmtCT="SELECT chat_id from vicidial_live_chats where chat_creator='$Auser[$i]' and lead_id='$Alead_id[$i]' order by chat_start_time desc limit 1;"; + if ($DB) {echo "$stmtCT\n";} + $rsltCT=mysql_to_mysqli($stmtCT,$link); + $chatting_to_print = mysqli_num_rows($rslt); + if ($chatting_to_print > 0) + { + $rowCT=mysqli_fetch_row($rsltCT); + $Achat_id = $rowCT[0]; + + $stmtCL="SELECT count(*) from vicidial_chat_log where chat_id='$Achat_id' and message LIKE \"%has left chat\";"; + if ($DB) {echo "$stmtCL\n";} + $rsltCL=mysql_to_mysqli($stmtCL,$link); + $rowCL=mysqli_fetch_row($rsltCL); + $left_chat = $rowCL[0]; + + if ($left_chat > 0) + { + $Acall_time[$i]=$Astate_change[$i]; + + $Astatus[$i] = 'DEAD'; + $Lstatus = 'DEAD'; + $status = 'DEAD C'; + } + } + } } if ( (preg_match("/AUTO/i",$comments)) or (strlen($comments)<1) ) diff --git a/www/vicidial/non_agent_api.php b/www/vicidial/non_agent_api.php index 4dc5a3cf..cc1882bf 100644 --- a/www/vicidial/non_agent_api.php +++ b/www/vicidial/non_agent_api.php @@ -1,7 +1,7 @@ LICENSE: AGPLv2 +# Copyright (C) 2016 Matt Florell LICENSE: AGPLv2 # # This script is designed as an API(Application Programming Interface) to allow # other programs to interact with all non-agent-screen VICIDIAL functions @@ -104,10 +104,11 @@ # 150804-0948 - Added WHISPER option for blind_monitor function # 150808-1438 - Added compatibility for custom fields data option # 151226-0954 - Added session_id(conf_exten) field to output of agent_status, and added logged_in_agents function +# 160104-1229 - Added detection of dead chats to a few functions # -$version = '2.12-80'; -$build = '151226-0954'; +$version = '2.12-81'; +$build = '160104-1229'; $api_url_log = 0; $startMS = microtime(); @@ -4984,8 +4985,36 @@ if ($function == 'user_group_status') {$row[1] = 'PARK';} else { - if (!preg_match("/$row[5]\|/",$callerids)) - {$row[1] = 'DEAD';} + if (preg_match("/CHAT/i",$row[4])) + { + $stmtCT="SELECT chat_id from vicidial_live_chats where chat_creator='$row[0]' and lead_id='$row[6]' order by chat_start_time desc limit 1;"; + if ($DB) {echo "$stmtCT\n";} + $rsltCT=mysql_to_mysqli($stmtCT,$link); + $chatting_to_print = mysqli_num_rows($rslt); + if ($chatting_to_print > 0) + { + $rowCT=mysqli_fetch_row($rsltCT); + $Achat_id = $rowCT[0]; + + $stmtCL="SELECT count(*) from vicidial_chat_log where chat_id='$Achat_id' and message LIKE \"%has left chat\";"; + if ($DB) {echo "$stmtCL\n";} + $rsltCL=mysql_to_mysqli($stmtCL,$link); + $rowCL=mysqli_fetch_row($rsltCL); + $left_chat = $rowCL[0]; + + if ($left_chat > 0) + { + $row[1] = 'DEAD'; + } + } + } + elseif (preg_match("/EMAIL/i",$row[4])) + {$do_nothing=1;} + else + { + if (!preg_match("/$row[5]\|/",$callerids)) + {$row[1] = 'DEAD';} + } } } @@ -5347,7 +5376,7 @@ if ($function == 'agent_status') $user_group = $row[1]; $user_level = $row[2]; - $stmt="SELECT status,callerid,lead_id,campaign_id,calls_today,agent_log_id,on_hook_agent,ring_callerid,preview_lead_id,conf_exten from vicidial_live_agents $agent_search_SQL;"; + $stmt="SELECT status,callerid,lead_id,campaign_id,calls_today,agent_log_id,on_hook_agent,ring_callerid,preview_lead_id,conf_exten,comments from vicidial_live_agents $agent_search_SQL;"; $rslt=mysql_to_mysqli($stmt, $link); if ($DB) {echo "$stmt\n";} $agent_to_list = mysqli_num_rows($rslt); @@ -5364,6 +5393,7 @@ if ($function == 'agent_status') $ring_callerid = $row[7]; $preview_lead_id = $row[8]; $conf_exten = $row[9]; + $comments = $row[10]; $pause_code = ''; $rtr_status = ''; @@ -5407,12 +5437,40 @@ if ($function == 'agent_status') {$rtr_status = 'PARK';} else { - $stmt="SELECT count(*) from vicidial_auto_calls where callerid='$callerid';"; - $rslt=mysql_to_mysqli($stmt,$link); - $row=mysqli_fetch_row($rslt); - $live_channel = $row[0]; - if ($live_channel < 1) - {$rtr_status = 'DEAD';} + if (preg_match("/CHAT/i",$comments)) + { + $stmtCT="SELECT chat_id from vicidial_live_chats where chat_creator='$agent_user' and lead_id='$lead_id' order by chat_start_time desc limit 1;"; + if ($DB) {echo "$stmtCT\n";} + $rsltCT=mysql_to_mysqli($stmtCT,$link); + $chatting_to_print = mysqli_num_rows($rslt); + if ($chatting_to_print > 0) + { + $rowCT=mysqli_fetch_row($rsltCT); + $Achat_id = $rowCT[0]; + + $stmtCL="SELECT count(*) from vicidial_chat_log where chat_id='$Achat_id' and message LIKE \"%has left chat\";"; + if ($DB) {echo "$stmtCL\n";} + $rsltCL=mysql_to_mysqli($stmtCL,$link); + $rowCL=mysqli_fetch_row($rsltCL); + $left_chat = $rowCL[0]; + + if ($left_chat > 0) + { + $rtr_status = 'DEAD'; + } + } + } + elseif (preg_match("/EMAIL/i",$comments)) + {$do_nothing=1;} + else + { + $stmt="SELECT count(*) from vicidial_auto_calls where callerid='$callerid';"; + $rslt=mysql_to_mysqli($stmt,$link); + $row=mysqli_fetch_row($rslt); + $live_channel = $row[0]; + if ($live_channel < 1) + {$rtr_status = 'DEAD';} + } } } @@ -7854,7 +7912,7 @@ if ($function == 'logged_in_agents') $output .= 'user' . $DL . 'campaign_id' . $DL . 'session_id' . $DL . 'status' . $DL . 'lead_id' . $DL . 'callerid' . $DL . 'calls_today' . $DL . 'full_name' . $DL . 'user_group' . $DL . 'user_level' . $header_sub_status . "\n"; } - $stmt="SELECT status,callerid,lead_id,campaign_id,calls_today,agent_log_id,on_hook_agent,ring_callerid,preview_lead_id,conf_exten,user from vicidial_live_agents $whereLOGallowed_campaignsSQL $search_CAMP_SQL;"; + $stmt="SELECT status,callerid,lead_id,campaign_id,calls_today,agent_log_id,on_hook_agent,ring_callerid,preview_lead_id,conf_exten,user,comments from vicidial_live_agents $whereLOGallowed_campaignsSQL $search_CAMP_SQL;"; $rslt=mysql_to_mysqli($stmt, $link); if ($DB) {echo "$stmt\n";} $agents_to_list = mysqli_num_rows($rslt); @@ -7873,6 +7931,7 @@ if ($function == 'logged_in_agents') $Apreview_lead_id[$i] = $row[8]; $Aconf_exten[$i] = $row[9]; $Auser[$i] = $row[10]; + $Acomments[$i] = $row[11]; $Apause_code[$i] = ''; $Artr_status[$i] = ''; $i++; @@ -7938,12 +7997,40 @@ if ($function == 'logged_in_agents') {$rtr_status = 'PARK';} else { - $stmt="SELECT count(*) from vicidial_auto_calls where callerid='$Acallerid[$i]';"; - $rslt=mysql_to_mysqli($stmt,$link); - $row=mysqli_fetch_row($rslt); - $live_channel = $row[0]; - if ($live_channel < 1) - {$rtr_status = 'DEAD';} + if (preg_match("/CHAT/i",$Acomments[$i])) + { + $stmtCT="SELECT chat_id from vicidial_live_chats where chat_creator='$Auser[$i]' and lead_id='$Alead_id[$i]' order by chat_start_time desc limit 1;"; + if ($DB) {echo "$stmtCT\n";} + $rsltCT=mysql_to_mysqli($stmtCT,$link); + $chatting_to_print = mysqli_num_rows($rslt); + if ($chatting_to_print > 0) + { + $rowCT=mysqli_fetch_row($rsltCT); + $Achat_id = $rowCT[0]; + + $stmtCL="SELECT count(*) from vicidial_chat_log where chat_id='$Achat_id' and message LIKE \"%has left chat\";"; + if ($DB) {echo "$stmtCL\n";} + $rsltCL=mysql_to_mysqli($stmtCL,$link); + $rowCL=mysqli_fetch_row($rsltCL); + $left_chat = $rowCL[0]; + + if ($left_chat > 0) + { + $rtr_status = 'DEAD'; + } + } + } + elseif (preg_match("/EMAIL/i",$Acomments[$i])) + {$do_nothing=1;} + else + { + $stmt="SELECT count(*) from vicidial_auto_calls where callerid='$Acallerid[$i]';"; + $rslt=mysql_to_mysqli($stmt,$link); + $row=mysqli_fetch_row($rslt); + $live_channel = $row[0]; + if ($live_channel < 1) + {$rtr_status = 'DEAD';} + } } } $agent_sub_status = "$DL$pause_code$DL$rtr_status"; diff --git a/www/vicidial/user_stats.php b/www/vicidial/user_stats.php index c5c92c1d..ca80f0f4 100644 --- a/www/vicidial/user_stats.php +++ b/www/vicidial/user_stats.php @@ -1,7 +1,7 @@ LICENSE: AGPLv2 +# Copyright (C) 2016 Matt Florell LICENSE: AGPLv2 # # CHANGES # @@ -48,6 +48,7 @@ # 141229-1836 - Added code for on-the-fly language translations display # 150804-0749 - Added call status as option, Issue #883 # 151227-1839 - Added option to search archived data +# 160104-1226 - Added call type field to the agent activity table # $startMS = microtime(); @@ -1142,11 +1143,11 @@ else $MAIN.=""._QXZ("AGENT ACTIVITY FOR THIS TIME PERIOD: (10000 record limit)")."     ["._QXZ("DOWNLOAD")."]\n"; $MAIN.="
\n"; $MAIN.="\n"; - $MAIN.="\n"; + $MAIN.="\n"; $CSV_text7.="\""._QXZ("AGENT ACTIVITY FOR THIS TIME PERIOD: (10000 record limit)")."\"\n"; - $CSV_text7.="\"\",\"#\",\""._QXZ("DATE/TIME")."\",\""._QXZ("PAUSE")."\",\""._QXZ("WAIT")."\",\""._QXZ("TALK")."\",\""._QXZ("DISPO")."\",\""._QXZ("DEAD")."\",\""._QXZ("CUSTOMER")."\",\""._QXZ("STATUS")."\",\""._QXZ("LEAD")."\",\""._QXZ("CAMPAIGN")."\",\""._QXZ("PAUSE CODE")."\"\n"; + $CSV_text7.="\"\",\"#\",\""._QXZ("DATE/TIME")."\",\""._QXZ("PAUSE")."\",\""._QXZ("WAIT")."\",\""._QXZ("TALK")."\",\""._QXZ("DISPO")."\",\""._QXZ("DEAD")."\",\""._QXZ("CUSTOMER")."\",\""._QXZ("STATUS")."\",\""._QXZ("LEAD")."\",\""._QXZ("TYPE")."\",\""._QXZ("CAMPAIGN")."\",\""._QXZ("PAUSE CODE")."\"\n"; - $stmt="SELECT event_time,lead_id,campaign_id,pause_sec,wait_sec,talk_sec,dispo_sec,dead_sec,status,sub_status,user_group from ".$vicidial_agent_log_table." where user='" . mysqli_real_escape_string($link, $user) . "' and event_time >= '" . mysqli_real_escape_string($link, $begin_date) . " 0:00:01' and event_time <= '" . mysqli_real_escape_string($link, $end_date) . " 23:59:59' and ( (pause_sec > 0) or (wait_sec > 0) or (talk_sec > 0) or (dispo_sec > 0) ) $query_call_status order by event_time desc limit 10000;"; + $stmt="SELECT event_time,lead_id,campaign_id,pause_sec,wait_sec,talk_sec,dispo_sec,dead_sec,status,sub_status,user_group,comments from ".$vicidial_agent_log_table." where user='" . mysqli_real_escape_string($link, $user) . "' and event_time >= '" . mysqli_real_escape_string($link, $begin_date) . " 0:00:01' and event_time <= '" . mysqli_real_escape_string($link, $end_date) . " 23:59:59' and ( (pause_sec > 0) or (wait_sec > 0) or (talk_sec > 0) or (dispo_sec > 0) ) $query_call_status order by event_time desc limit 10000;"; if ($DB) {$MAIN.="agent activity|$stmt|";} $rslt=mysql_to_mysqli($stmt, $link); $logs_to_print = mysqli_num_rows($rslt); @@ -1172,6 +1173,7 @@ else $status = $row[8]; $pause_code = $row[9]; $user_group = $row[10]; + $comments = $row[11]; $customer_sec = ($talk_sec - $dead_sec); if ($customer_sec < 0) {$customer_sec=0;} @@ -1209,6 +1211,7 @@ else $MAIN.="\n"; $MAIN.="\n"; $MAIN.="\n"; + $MAIN.="\n"; $MAIN.="\n"; } @@ -1224,9 +1227,21 @@ else $MAIN.="\n"; $MAIN.="\n"; $MAIN.="\n"; + $call_type=''; + if (strlen($lead_id) > 0) + { + $call_type='A'; + if ($comments == 'INBOUND') {$call_type='I';} + if ($comments == 'EMAIL') {$call_type='E';} + if ($comments == 'CHAT') {$call_type='C';} + if ($comments == 'MANUAL') {$call_type='M';} + $MAIN.="\n"; + } + else + {$MAIN.="\n";} $MAIN.="\n"; $MAIN.="\n"; - $CSV_text7.="\"\",\"$u\",\"$event_time\",\"$pause_sec\",\"$wait_sec\",\"$talk_sec\",\"$dispo_sec\",\"$dead_sec\",\"$customer_sec\",\"$status\",\"$lead_id\",\"$campaign_id\",\"$pause_code \"\n"; + $CSV_text7.="\"\",\"$u\",\"$event_time\",\"$pause_sec\",\"$wait_sec\",\"$talk_sec\",\"$dispo_sec\",\"$dead_sec\",\"$customer_sec\",\"$status\",\"$lead_id\",\"$call_type\",\"$campaign_id\",\"$pause_code \"\n"; } $MAIN.="";
  "._QXZ("these fields are in seconds")."  
# "._QXZ("DATE/TIME")." "._QXZ("PAUSE")." "._QXZ("WAIT")." "._QXZ("TALK")." "._QXZ("DISPO")." "._QXZ("DEAD")." "._QXZ("CUSTOMER")." "._QXZ("STATUS")." "._QXZ("LEAD")." "._QXZ("CAMPAIGN")." "._QXZ("PAUSE CODE")."
# "._QXZ("DATE/TIME")." "._QXZ("PAUSE")." "._QXZ("WAIT")." "._QXZ("TALK")." "._QXZ("DISPO")." "._QXZ("DEAD")." "._QXZ("CUSTOMER")." "._QXZ("STATUS")." "._QXZ("LEAD")." "._QXZ("TYPE")." "._QXZ("CAMPAIGN")." "._QXZ("PAUSE CODE")."
         
$customer_sec $status $lead_id $call_type   $campaign_id $pause_code