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 00000000..e5684f42 Binary files /dev/null and b/www/agc/images/agc_live_chat_DEAD.gif differ diff --git a/www/agc/images/agc_live_chat_ON.gif b/www/agc/images/agc_live_chat_ON.gif new file mode 100644 index 00000000..fa19b6c0 Binary files /dev/null and b/www/agc/images/agc_live_chat_ON.gif differ diff --git a/www/agc/images/agc_live_email_ON.gif b/www/agc/images/agc_live_email_ON.gif new file mode 100644 index 00000000..846de337 Binary files /dev/null and b/www/agc/images/agc_live_email_ON.gif differ diff --git a/www/agc/vicidial.php b/www/agc/vicidial.php index 6b59239d..be04ad16 100644 --- a/www/agc/vicidial.php +++ b/www/agc/vicidial.php @@ -514,10 +514,11 @@ # 151229-2331 - Added campaign setting for manual_dial_timeout, Issue #903 # 151230-0911 - Fixed transfer of parked call logging issue #901 # 160101-1131 - Added code to handle routing initiated recordings +# 160104-1237 - Added images for live chat and email, and dead chat # -$version = '2.12-483c'; -$build = '160101-1131'; +$version = '2.12-484c'; +$build = '160104-1237'; $mel=1; # Mysql Error Log enabled = 1 $mysql_log_count=85; $one_mysql_log=0; @@ -4360,6 +4361,12 @@ if ($enable_fast_refresh < 1) {echo "\tvar refresh_interval = 1000;\n";} image_livecall_ON.src="./images/"; 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