From 3314e62b24221aa4dedf12c574f916308f69511c Mon Sep 17 00:00:00 2001 From: mattf Date: Mon, 27 Aug 2018 18:47:45 +0000 Subject: [PATCH] Added new campaign feature to allow agents to select a specific timezone to use when scheduling callbacks. git-svn-id: svn://192.168.202.10@3020 3d104415-ff17-0410-8863-d5cf3c621b8a --- UPGRADE | 5 + bin/ADMIN_area_code_populate.pl | 6 +- extras/MySQL_AST_CREATE_tables.sql | 14 ++- extras/upgrade_2.12.sql | 2 +- extras/upgrade_2.14.sql | 20 ++- www/agc/vdc_db_query.php | 184 ++++++++++++++++++++++++++-- www/agc/vicidial.php | 113 +++++++++++++++-- www/vicidial/admin.php | 125 +++++++++++++++++-- www/vicidial/help_documentation.txt | 3 +- 9 files changed, 433 insertions(+), 39 deletions(-) diff --git a/UPGRADE b/UPGRADE index 6379b98b..f588058e 100644 --- a/UPGRADE +++ b/UPGRADE @@ -343,6 +343,11 @@ OTHER CHANGES: 94. Added new campaign feature to automatically reschedule ANYONE callbacks when they are dispositioned as a non-Human-Answered status flag status. +95. Added new campaign feature to allow agents to select a specific timezone to + use when scheduling callbacks. For this to work, the Phone Codes must be + updated on your system using the following command: + /usr/share/astguiclient/ADMIN_area_code_populate.pl --purge-table --debug + diff --git a/bin/ADMIN_area_code_populate.pl b/bin/ADMIN_area_code_populate.pl index 6a94eabc..0c535ddd 100644 --- a/bin/ADMIN_area_code_populate.pl +++ b/bin/ADMIN_area_code_populate.pl @@ -2,7 +2,7 @@ # # ADMIN_area_code_populate.pl version 2.14 # -# Copyright (C) 2017 Matt Florell LICENSE: AGPLv2 +# Copyright (C) 2018 Matt Florell LICENSE: AGPLv2 # # Description: # server application that allows load areacodes into to asterisk list database @@ -24,6 +24,7 @@ # 151228-1043 - Added ISO-TLD table and import # 160611-0933 - Added more documentation # 170614-2146 - Added some dirty input filtering and more debug output +# 180825-2038 - Added php_tz field to vicidial_phone_codes table # @@ -359,6 +360,7 @@ else if ($codefile[$pc] !~ /GEOGRAPHIC DESCRIPTION/) { $pc++; + $row[9] =~ s/\r|\n|\t| $//gi; $row[8] =~ s/\r|\n|\t| $//gi; $row[7] =~ s/\r|\n|\t| $//gi; $row[6] =~ s/\r|\n|\t| $//gi; @@ -368,7 +370,7 @@ else $row[2] =~ s/\r|\n|\t| $//gi; $row[1] =~ s/\r|\n|\t| $//gi; $row[0] =~ s/\r|\n|\t| $//gi; - $ins_stmt.="('$row[0]', '$row[1]', '$row[2]', '$row[3]', '$row[4]', '$row[5]', '$row[6]', '$row[7]', '$row[8]'), "; + $ins_stmt.="('$row[0]', '$row[1]', '$row[2]', '$row[3]', '$row[4]', '$row[5]', '$row[6]', '$row[7]', '$row[8]', '$row[9]'), "; if ($pc =~ /00$/) { chop($ins_stmt); diff --git a/extras/MySQL_AST_CREATE_tables.sql b/extras/MySQL_AST_CREATE_tables.sql index 1040596c..67e1fbd0 100644 --- a/extras/MySQL_AST_CREATE_tables.sql +++ b/extras/MySQL_AST_CREATE_tables.sql @@ -1009,7 +1009,8 @@ dead_trigger_repeat ENUM('NO','REPEAT_ALL','REPEAT_AUDIO','REPEAT_URL') default dead_trigger_filename TEXT, dead_trigger_url TEXT, scheduled_callbacks_force_dial ENUM('N','Y') default 'N', -scheduled_callbacks_auto_reschedule VARCHAR(10) default 'DISABLED' +scheduled_callbacks_auto_reschedule VARCHAR(10) default 'DISABLED', +scheduled_callbacks_timezones_container VARCHAR(40) default 'DISABLED' ) ENGINE=MyISAM; CREATE TABLE vicidial_lists ( @@ -1110,7 +1111,8 @@ GMT_offset VARCHAR(6), DST enum('Y','N'), DST_range VARCHAR(8), geographic_description VARCHAR(100), -tz_code VARCHAR(4) default '' +tz_code VARCHAR(4) default '', +php_tz VARCHAR(100) default '' ) ENGINE=MyISAM; CREATE TABLE vicidial_inbound_groups ( @@ -1423,6 +1425,9 @@ user_group VARCHAR(20), lead_status VARCHAR(6) default 'CALLBK', email_alert datetime, email_result ENUM('SENT','FAILED','NOT AVAILABLE'), +customer_timezone VARCHAR(100) default '', +customer_timezone_diff VARCHAR(6) default '', +customer_time DATETIME, index (lead_id), index (status), index (callback_time) @@ -4283,7 +4288,10 @@ INSERT INTO vicidial_configuration (id, name, value) VALUES (NULL, 'qc_database_ UPDATE vicidial_configuration set value='1766' where name='qc_database_version'; INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('AGENT_CALLBACK_EMAIL ','Scheduled callback email alert settings','OTHER','---ALL---','; sending email address\r\nemail_from => vicidial@local.server\r\n\r\n; subject of the email\r\nemail_subject => Scheduled callback alert for --A--agent_name--B--\r\n\r\nemail_body_begin => \r\nThis is a reminder that you have a scheduled callback right now for the following lead:\r\n\r\nName: --A--first_name--B-- --A--last_name--B--\r\nPhone: --A--phone_number--B--\r\nAlt. phone: --A--alt_phone--B--\r\nEmail: --A--email--B--\r\nCB Comments: --A--callback_comments--B--\r\nLead Comments: --A--comments--B--\r\n\r\nPlease don\'t respond to this, fool.\r\n\r\nemail_body_end'); +INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('TIMEZONES_USA','USA Timezone List','TIMEZONE_LIST','---ALL---','USA,AST,N,Atlantic Time Zone\nUSA,EST,Y,Eastern Time Zone\nUSA,CST,Y,Central Time Zone\nUSA,MST,Y,Mountain Time Zone\nUSA,MST,N,Arizona Time Zone\nUSA,PST,Y,Pacific Time Zone\nUSA,AKST,Y,Alaska Time Zone\nUSA,HST,N,Hawaii Time Zone\n'); +INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('TIMEZONES_CANADA','Canadian Timezone List','TIMEZONE_LIST','---ALL---','CAN,NST,Y,Newfoundland Time Zone\nCAN,AST,Y,Atlantic Time Zone\nCAN,EST,Y,Eastern Time Zone\nCAN,CST,Y,Central Time Zone\nCAN,CST,N,Saskatchewan Time Zone\nCAN,MST,Y,Mountain Time Zone\nCAN,PST,Y,Pacific Time Zone\n'); +INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('TIMEZONES_AUSTRALIA','Australian Timezone List','TIMEZONE_LIST','---ALL---','AUS,AEST,Y,Eastern Australia Time Zone\nAUS,AEST,N,Queensland Time Zone\nAUS,ACST,Y,Central Australia Time Zone\nAUS,ACST,N,Northern Territory Time Zone\nAUS,AWST,N,Western Australia Time Zone\n'); UPDATE system_settings set vdc_agent_api_active='1'; -UPDATE system_settings SET db_schema_version='1553',db_schema_update_date=NOW(),reload_timestamp=NOW(); +UPDATE system_settings SET db_schema_version='1554',db_schema_update_date=NOW(),reload_timestamp=NOW(); diff --git a/extras/upgrade_2.12.sql b/extras/upgrade_2.12.sql index 42bcc4d9..9e7fcd42 100644 --- a/extras/upgrade_2.12.sql +++ b/extras/upgrade_2.12.sql @@ -265,7 +265,7 @@ UPDATE system_settings SET db_schema_version='1426',db_schema_update_date=NOW() CREATE TABLE vicidial_settings_containers ( container_id VARCHAR(40) PRIMARY KEY NOT NULL, container_notes VARCHAR(255) default '', -container_type ENUM('OTHER','PERL_CLI','EMAIL_TEMPLATE') default 'OTHER', +container_type VARCHAR(40) default 'OTHER', user_group VARCHAR(20) default '---ALL---', container_entry MEDIUMTEXT ) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_unicode_ci; diff --git a/extras/upgrade_2.14.sql b/extras/upgrade_2.14.sql index 417f61ec..2d7e6486 100644 --- a/extras/upgrade_2.14.sql +++ b/extras/upgrade_2.14.sql @@ -2,7 +2,7 @@ UPDATE system_settings SET db_schema_version='1479',version='2.13rc1tk',db_schem UPDATE system_settings SET db_schema_version='1480',version='2.14b0.5',db_schema_update_date=NOW() where db_schema_version < 1480; -ALTER TABLE vicidial_settings_containers MODIFY container_type ENUM('OTHER','PERL_CLI','EMAIL_TEMPLATE','AGI') default 'OTHER'; +ALTER TABLE vicidial_settings_containers MODIFY container_type VARCHAR(40) default 'OTHER'; UPDATE system_settings SET db_schema_version='1481',db_schema_update_date=NOW() where db_schema_version < 1481; @@ -725,3 +725,21 @@ index (lead_id) CREATE TABLE vicidial_recent_ascb_calls_archive LIKE vicidial_recent_ascb_calls; UPDATE system_settings SET db_schema_version='1553',db_schema_update_date=NOW() where db_schema_version < 1553; + +ALTER TABLE vicidial_phone_codes ADD php_tz VARCHAR(100) default ''; + +ALTER TABLE vicidial_campaigns ADD scheduled_callbacks_timezones_container VARCHAR(40) default 'DISABLED'; + +ALTER TABLE vicidial_callbacks ADD customer_timezone VARCHAR(100) default ''; +ALTER TABLE vicidial_callbacks ADD customer_timezone_diff VARCHAR(6) default ''; +ALTER TABLE vicidial_callbacks ADD customer_time DATETIME; + +ALTER TABLE vicidial_callbacks_archive ADD customer_timezone VARCHAR(100) default ''; +ALTER TABLE vicidial_callbacks_archive ADD customer_timezone_diff VARCHAR(6) default ''; +ALTER TABLE vicidial_callbacks_archive ADD customer_time DATETIME; + +INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('TIMEZONES_USA','USA Timezone List','TIMEZONE_LIST','---ALL---','USA,AST,N,Atlantic Time Zone\nUSA,EST,Y,Eastern Time Zone\nUSA,CST,Y,Central Time Zone\nUSA,MST,Y,Mountain Time Zone\nUSA,MST,N,Arizona Time Zone\nUSA,PST,Y,Pacific Time Zone\nUSA,AKST,Y,Alaska Time Zone\nUSA,HST,N,Hawaii Time Zone\n'); +INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('TIMEZONES_CANADA','Canadian Timezone List','TIMEZONE_LIST','---ALL---','CAN,NST,Y,Newfoundland Time Zone\nCAN,AST,Y,Atlantic Time Zone\nCAN,EST,Y,Eastern Time Zone\nCAN,CST,Y,Central Time Zone\nCAN,CST,N,Saskatchewan Time Zone\nCAN,MST,Y,Mountain Time Zone\nCAN,PST,Y,Pacific Time Zone\n'); +INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('TIMEZONES_AUSTRALIA','Australian Timezone List','TIMEZONE_LIST','---ALL---','AUS,AEST,Y,Eastern Australia Time Zone\nAUS,AEST,N,Queensland Time Zone\nAUS,ACST,Y,Central Australia Time Zone\nAUS,ACST,N,Northern Territory Time Zone\nAUS,AWST,N,Western Australia Time Zone\n'); + +UPDATE system_settings SET db_schema_version='1554',db_schema_update_date=NOW() where db_schema_version < 1554; diff --git a/www/agc/vdc_db_query.php b/www/agc/vdc_db_query.php index 4049d1f9..1158b701 100644 --- a/www/agc/vdc_db_query.php +++ b/www/agc/vdc_db_query.php @@ -459,10 +459,11 @@ # 180522-1920 - Added Routing Initiated Recording ability for manual dial calls # 180610-2308 - Added code for Dead Call Trigger features # 180818-2147 - Added code for scheduled_callbacks_auto_reschedule +# 180827-1225 - Added code for scheduled_callbacks_timezones_... features # -$version = '2.14-353'; -$build = '180818-2147'; +$version = '2.14-354'; +$build = '180827-1225'; $php_script = 'vdc_db_query.php'; $mel=1; # Mysql Error Log enabled = 1 $mysql_log_count=762; @@ -755,6 +756,10 @@ if (isset($_GET["routing_initiated_recording"])) {$routing_initiated_recording elseif (isset($_POST["routing_initiated_recording"])) {$routing_initiated_recording=$_POST["routing_initiated_recording"];} if (isset($_GET["dead_time"])) {$dead_time=$_GET["dead_time"];} elseif (isset($_POST["dead_time"])) {$dead_time=$_POST["dead_time"];} +if (isset($_GET["callback_gmt_offset"])) {$callback_gmt_offset=$_GET["callback_gmt_offset"];} + elseif (isset($_POST["callback_gmt_offset"])) {$callback_gmt_offset=$_POST["callback_gmt_offset"];} +if (isset($_GET["callback_timezone"])) {$callback_timezone=$_GET["callback_timezone"];} + elseif (isset($_POST["callback_timezone"])) {$callback_timezone=$_POST["callback_timezone"];} header ("Content-type: text/html; charset=utf-8"); header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 @@ -1084,6 +1089,9 @@ $url_link = preg_replace("/\'|\"|\\\\|;/","",$url_link); $user_group = preg_replace('/[^-_0-9a-zA-Z]/','',$user_group); $routing_initiated_recording = preg_replace('/[^-_0-9a-zA-Z]/','',$routing_initiated_recording); $dead_time = preg_replace('/[^0-9]/','',$dead_time); +$callback_gmt_offset = preg_replace('/[^- \._0-9a-zA-Z]/','',$callback_gmt_offset); +$callback_timezone = preg_replace('/[^-, _0-9a-zA-Z]/','',$callback_timezone); + # default optional vars if not set if (!isset($format)) {$format="text";} @@ -12150,11 +12158,22 @@ if ($ACTION == 'updateDISPO') ### CALLBACK ENTRY if ( ($dispo_choice == 'CBHOLD') and (strlen($CallBackDatETimE)>10) ) { + $customer_time = $CallBackDatETimE; + if ( ($callback_gmt_offset <> '0') and (strlen($callback_gmt_offset) > 0) and (strlen($callback_timezone) > 0) ) + { + $CBdatetime_array = explode(" ",$CallBackDatETimE); + $CBdate_array = explode("-",$CBdatetime_array[0]); + $CBtime_array = explode(":",$CBdatetime_array[1]); + + $CBserver_epoch = mktime($CBtime_array[0],$CBtime_array[1],$CBtime_array[2],$CBdate_array[1],$CBdate_array[2],$CBdate_array[0]); + $CBserver_epoch = ($CBserver_epoch + ($callback_gmt_offset * 3600)); + $CallBackDatETimE = date("Y-m-d H:i:s", $CBserver_epoch); + } $comments = preg_replace('/"/i','',$comments); $comments = preg_replace("/'/i",'',$comments); $comments = preg_replace('/;/i','',$comments); $comments = preg_replace("/\\\\/i",' ',$comments); - $stmt="INSERT INTO vicidial_callbacks (lead_id,list_id,campaign_id,status,entry_time,callback_time,user,recipient,comments,user_group,lead_status) values('$lead_id','$list_id','$campaign','ACTIVE','$NOW_TIME','$CallBackDatETimE','$user','$recipient','$comments','$user_group','$CallBackLeadStatus');"; + $stmt="INSERT INTO vicidial_callbacks (lead_id,list_id,campaign_id,status,entry_time,callback_time,user,recipient,comments,user_group,lead_status,customer_timezone,customer_timezone_diff,customer_time) values('$lead_id','$list_id','$campaign','ACTIVE','$NOW_TIME','$CallBackDatETimE','$user','$recipient','$comments','$user_group','$CallBackLeadStatus','$callback_timezone','$callback_gmt_offset','$customer_time');"; if ($DB) {echo "$stmt\n";} $rslt=mysql_to_mysqli($stmt, $link); if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00154',$user,$server_ip,$session_name,$one_mysql_log);} @@ -15074,6 +15093,131 @@ if ($ACTION == 'PauseCodeMgrApr') } +################################################################################ +### SBC_timezone_build - Build scheduled callbacks timezone select content +################################################################################ +if ($ACTION == 'SBC_timezone_build') + { + $orig_zone = date_default_timezone_get(); + $cust_timezones_enabled=0; + $cust_timezones_HTML=''; + + ### Grab Server GMT value from the database + $stmt="SELECT local_gmt FROM servers where server_ip='$server_ip' limit 1;"; + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00XXX',$user,$server_ip,$session_name,$one_mysql_log);} + $gmt_recs = mysqli_num_rows($rslt); + if ($gmt_recs > 0) + { + $row=mysqli_fetch_row($rslt); + $DBSERVER_GMT = $row[0]; + if (strlen($DBSERVER_GMT)>0) {$SERVER_GMT = $DBSERVER_GMT;} + if ($isdst) {$SERVER_GMT++;} + } + + ### Grab current GMT value of the lead that was called + $stmt="SELECT gmt_offset_now from vicidial_list where lead_id='$lead_id';"; + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00XXX',$user,$server_ip,$session_name,$one_mysql_log);} + $scb_lead_recs = mysqli_num_rows($rslt); + if ($scb_lead_recs > 0) + { + $row=mysqli_fetch_row($rslt); + $LEAD_gmt_offset_now = $row[0]; + } + + $LEAD_gmt_diff = ($SERVER_GMT - $LEAD_gmt_offset_now); + $SERVER_datetime = date("Y-m-d H:i:s"); + $LEAD_datetime = date("Y-m-d H:i:s", mktime(date("H")-$LEAD_gmt_diff,date("i"),date("s"),date("m"),date("d"),date("Y"))); + $cust_timezones_HTML .= "
\n"; + $cust_timezones_HTML .= "\n"; + $cust_timezones_HTML .= "\n"; + $cust_timezones_HTML .= "\n"; + $cust_timezones_HTML .= "\n"; + + ### Grab campaign setting for scheduled_callbacks_timezones_container + $stmt="SELECT scheduled_callbacks_timezones_container from vicidial_campaigns where campaign_id='$campaign';"; + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00XXX',$user,$server_ip,$session_name,$one_mysql_log);} + $scb_lead_recs = mysqli_num_rows($rslt); + if ($scb_lead_recs > 0) + { + $row=mysqli_fetch_row($rslt); + $scheduled_callbacks_timezones_container = $row[0]; + } + + if ( ($scheduled_callbacks_timezones_container != 'DISABLED') and (strlen($scheduled_callbacks_timezones_container) > 0) ) + { + ### Gather container entry (example: "USA,EST,Y,Eastern Time Zone") + $stmt = "SELECT container_entry from vicidial_settings_containers where container_id='$scheduled_callbacks_timezones_container' limit 1;"; + if ($DB) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00XXX',$user,$server_ip,$session_name,$one_mysql_log);} + $VSC_ct = mysqli_num_rows($rslt); + if ($VSC_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $container_entry = $row[0]; + if (strlen($container_entry) > 10) + { + $container_entry = preg_replace("/\r|\t|\'|\"/",'',$container_entry); + $cust_timezones = explode("\n",$container_entry); + $cust_timezones_ct = count($cust_timezones); + if ($DB) {echo "DF-Debug 1: $cust_timezones_ct|$dispo_filter_enabled|$container_entry|\n";} + $tzl=0; + while ($cust_timezones_ct >= $tzl) + { + $cust_timezome_line = explode(",",$cust_timezones[$tzl]); + $line_country = $cust_timezome_line[0]; + $line_zone = $cust_timezome_line[1]; + $line_dst = $cust_timezome_line[2]; + $line_name = preg_replace('/[^-, _0-9a-zA-Z]/','',$cust_timezome_line[3]); + $stmt = "SELECT php_tz from vicidial_phone_codes where country='$line_country' and DST='$line_dst' and tz_code='$line_zone' limit 1;"; + if ($DB) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00XXX',$user,$server_ip,$session_name,$one_mysql_log);} + $VPC_ct = mysqli_num_rows($rslt); + if ($VPC_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $line_php_tz = $row[0]; + $cust_timezones_enabled++; + + date_default_timezone_set($line_php_tz); + $TEMP_gmt = date("Z"); + $TEMP_gmt = ($TEMP_gmt / 3600); + $TEMP_gmt_diff = ($SERVER_GMT - $TEMP_gmt); + $TEMP_datetime = date("Y-m-d H:i:s"); + + $cust_timezones_HTML .= "\n"; + } + else + {if ($DB) {echo "NO MATCH FOUND: country='$line_country', DST='$line_dst', tz_code='$line_zone'\n";}} + + $tzl++; + } + date_default_timezone_set($orig_zone); + } + } + $cust_timezones_HTML .= "
Select a Customer Timezone:                 "._QXZ("close")."
"._QXZ("SERVER TIME").": $SERVER_datetime
"._QXZ("LEAD TIME").": $LEAD_datetime ($LEAD_gmt_diff "._QXZ("hours difference").")
$line_name: $TEMP_datetime ($TEMP_gmt_diff "._QXZ("hours difference").")
"; + } + else + { + echo "TIMEZONES NOT AVAILABLE\n"; + } + + if ($cust_timezones_enabled > 0) + { + echo "$cust_timezones_HTML\n"; + } + else + { + echo "TIMEZONES NOT AVAILABLE\n"; + } + $stage .= "|cust_timezones_enabled"; + } + + ################################################################################ ### AGENTSview - List statuses of other agents in sidebar or xfer frame ################################################################################ @@ -16516,7 +16660,7 @@ if ($ACTION == 'LEADINFOview') $callback_id = preg_replace('/\D/','',$callback_id); if (strlen($callback_id) > 0) { - $stmt="SELECT status,entry_time,callback_time,modify_date,user,recipient,comments,lead_status from vicidial_callbacks where lead_id='$lead_id' and callback_id='$callback_id' limit 1;"; + $stmt="SELECT status,entry_time,callback_time,modify_date,user,recipient,comments,lead_status,customer_timezone,customer_timezone_diff,customer_time from vicidial_callbacks where lead_id='$lead_id' and callback_id='$callback_id' limit 1;"; $rslt=mysql_to_mysqli($stmt, $link); if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00397',$user,$server_ip,$session_name,$one_mysql_log);} $cb_to_print = mysqli_num_rows($rslt); @@ -16529,6 +16673,12 @@ if ($ACTION == 'LEADINFOview') echo ""._QXZ("Callback Lead Status:")."   $row[7]"; echo ""._QXZ("Callback Entry Time:")."   $row[1]"; echo ""._QXZ("Callback Trigger Time:")."   $row[2]"; + if ( (strlen($row[8]) > 8) and (strlen($row[9]) > 0) ) + { + $temp_timezone = preg_replace("/.*,/",'',$row[8]); + echo ""._QXZ("Callback Customer Timezone:")."   $temp_timezone"; + echo ""._QXZ("Callback Customer Time:")."   $row[10]"; + } echo ""._QXZ("Callback Comments:")."   $row[6]"; echo ""; echo "
"; @@ -17296,7 +17446,7 @@ if ($ACTION == 'CalLBacKLisT') if ($agentonly_callback_campaign_lock > 0) {$campaignCBsql = "and campaign_id='$campaign'";} - $stmt = "SELECT callback_id,lead_id,campaign_id,status,entry_time,callback_time,comments from vicidial_callbacks where recipient='USERONLY' and user='$user' $campaignCBsql $campaignCBhoursSQL $campaignCBdisplaydaysSQL and status NOT IN('INACTIVE','DEAD') order by callback_time;"; + $stmt = "SELECT callback_id,lead_id,campaign_id,status,entry_time,callback_time,comments,customer_timezone,customer_time,customer_timezone_diff from vicidial_callbacks where recipient='USERONLY' and user='$user' $campaignCBsql $campaignCBhoursSQL $campaignCBdisplaydaysSQL and status NOT IN('INACTIVE','DEAD') order by callback_time;"; if ($DB) {echo "$stmt\n";} $rslt=mysql_to_mysqli($stmt, $link); if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00178',$user,$server_ip,$session_name,$one_mysql_log);} @@ -17306,13 +17456,16 @@ if ($ACTION == 'CalLBacKLisT') while ($callbacks_count>$loop_count) { $row=mysqli_fetch_row($rslt); - $callback_id[$loop_count] = $row[0]; - $lead_id[$loop_count] = $row[1]; - $campaign_id[$loop_count] = $row[2]; - $status[$loop_count] = $row[3]; - $entry_time[$loop_count] = $row[4]; - $callback_time[$loop_count] = $row[5]; - $comments[$loop_count] = $row[6]; + $callback_id[$loop_count] = $row[0]; + $lead_id[$loop_count] = $row[1]; + $campaign_id[$loop_count] = $row[2]; + $status[$loop_count] = $row[3]; + $entry_time[$loop_count] = $row[4]; + $callback_time[$loop_count] = $row[5]; + $comments[$loop_count] = $row[6]; + $customer_timezone[$loop_count] = preg_replace("/.*,/",'',$row[7]); + $customer_time[$loop_count] = $row[8]; + $customer_timezone_diff[$loop_count] = $row[9]; $loop_count++; } $loop_count=0; @@ -17368,7 +17521,12 @@ if ($ACTION == 'CalLBacKLisT') $PHONEdialable = dialable_gmt($DB,$link,$local_call_time,$row[3],$row[4]); } } - $CBoutput = "$row[0]-!T-$row[1]-!T-$row[2]-!T-$callback_id[$loop_count]-!T-$lead_id[$loop_count]-!T-$campaign_id[$loop_count]-!T-"._QXZ("$status[$loop_count]")."-!T-$entry_time[$loop_count]-!T-$callback_time[$loop_count]-!T-$comments[$loop_count]-!T-$PHONEdialable-!T-$alt_phone"; + $customer_time_CB_output = '-!T--!T-'; + if ( (strlen($customer_timezone[$loop_count]) > 0) and (strlen($customer_timezone_diff[$loop_count]) > 0) and ($customer_timezone_diff[$loop_count] <> 0) ) + { + $customer_time_CB_output = "-!T-$customer_timezone[$loop_count]-!T-$customer_time[$loop_count]"; + } + $CBoutput = "$row[0]-!T-$row[1]-!T-$row[2]-!T-$callback_id[$loop_count]-!T-$lead_id[$loop_count]-!T-$campaign_id[$loop_count]-!T-"._QXZ("$status[$loop_count]")."-!T-$entry_time[$loop_count]-!T-$callback_time[$loop_count]-!T-$comments[$loop_count]-!T-$PHONEdialable-!T-$alt_phone$customer_time_CB_output"; echo "$CBoutput\n"; $loop_count++; } diff --git a/www/agc/vicidial.php b/www/agc/vicidial.php index ba8b31bd..db673624 100644 --- a/www/agc/vicidial.php +++ b/www/agc/vicidial.php @@ -601,10 +601,11 @@ # 180727-2044 - Small fix for pause code issue # 180807-1703 - Added agent_logout_link credentials system setting # 180809-1649 - Added scheduled_callbacks_force_dial campaign feature +# 180827-1224 - Added scheduled_callbacks_timezones_... features # -$version = '2.14-570c'; -$build = '180809-1649'; +$version = '2.14-571c'; +$build = '180827-1224'; $mel=1; # Mysql Error Log enabled = 1 $mysql_log_count=87; $one_mysql_log=0; @@ -1882,7 +1883,7 @@ else $HKstatusnames = substr("$HKstatusnames", 0, -1); ##### grab the campaign settings - $stmt="SELECT park_ext,park_file_name,web_form_address,allow_closers,auto_dial_level,dial_timeout,dial_prefix,campaign_cid,campaign_vdad_exten,campaign_rec_exten,campaign_recording,campaign_rec_filename,campaign_script,get_call_launch,am_message_exten,xferconf_a_dtmf,xferconf_a_number,xferconf_b_dtmf,xferconf_b_number,alt_number_dialing,scheduled_callbacks,wrapup_seconds,wrapup_message,closer_campaigns,use_internal_dnc,allcalls_delay,omit_phone_code,agent_pause_codes_active,no_hopper_leads_logins,campaign_allow_inbound,manual_dial_list_id,default_xfer_group,xfer_groups,disable_alter_custphone,display_queue_count,manual_dial_filter,agent_clipboard_copy,use_campaign_dnc,three_way_call_cid,dial_method,three_way_dial_prefix,web_form_target,vtiger_screen_login,agent_allow_group_alias,default_group_alias,quick_transfer_button,prepopulate_transfer_preset,view_calls_in_queue,view_calls_in_queue_launch,call_requeue_button,pause_after_each_call,no_hopper_dialing,agent_dial_owner_only,agent_display_dialable_leads,web_form_address_two,agent_select_territories,crm_popup_login,crm_login_address,timer_action,timer_action_message,timer_action_seconds,start_call_url,dispo_call_url,xferconf_c_number,xferconf_d_number,xferconf_e_number,use_custom_cid,scheduled_callbacks_alert,scheduled_callbacks_count,manual_dial_override,blind_monitor_warning,blind_monitor_message,blind_monitor_filename,timer_action_destination,enable_xfer_presets,hide_xfer_number_to_dial,manual_dial_prefix,customer_3way_hangup_logging,customer_3way_hangup_seconds,customer_3way_hangup_action,ivr_park_call,manual_preview_dial,api_manual_dial,manual_dial_call_time_check,my_callback_option,per_call_notes,agent_lead_search,agent_lead_search_method,queuemetrics_phone_environment,auto_pause_precall,auto_pause_precall_code,auto_resume_precall,manual_dial_cid,custom_3way_button_transfer,callback_days_limit,disable_dispo_screen,disable_dispo_status,screen_labels,status_display_fields,pllb_grouping,pllb_grouping_limit,in_group_dial,in_group_dial_select,pause_after_next_call,owner_populate,manual_dial_lead_id,dead_max,dispo_max,pause_max,dead_max_dispo,dispo_max_dispo,max_inbound_calls,manual_dial_search_checkbox,hide_call_log_info,timer_alt_seconds,wrapup_bypass,wrapup_after_hotkey,callback_active_limit,callback_active_limit_override,comments_all_tabs,comments_dispo_screen,comments_callback_screen,qc_comment_history,show_previous_callback,clear_script,manual_dial_search_filter,web_form_address_three,manual_dial_override_field,status_display_ingroup,customer_gone_seconds,agent_display_fields,manual_dial_timeout,manual_auto_next,manual_auto_show,allow_required_fields,dead_to_dispo,agent_xfer_validation,ready_max_logout,callback_display_days,three_way_record_stop,hangup_xfer_record_start,max_inbound_calls_outcome,manual_auto_next_options,agent_screen_time_display,pause_max_dispo,script_top_dispo,routing_initiated_recordings,dead_trigger_seconds,dead_trigger_action,dead_trigger_repeat,dead_trigger_filename,scheduled_callbacks_force_dial,callback_hours_block,callback_display_days FROM vicidial_campaigns where campaign_id = '$VD_campaign';"; + $stmt="SELECT park_ext,park_file_name,web_form_address,allow_closers,auto_dial_level,dial_timeout,dial_prefix,campaign_cid,campaign_vdad_exten,campaign_rec_exten,campaign_recording,campaign_rec_filename,campaign_script,get_call_launch,am_message_exten,xferconf_a_dtmf,xferconf_a_number,xferconf_b_dtmf,xferconf_b_number,alt_number_dialing,scheduled_callbacks,wrapup_seconds,wrapup_message,closer_campaigns,use_internal_dnc,allcalls_delay,omit_phone_code,agent_pause_codes_active,no_hopper_leads_logins,campaign_allow_inbound,manual_dial_list_id,default_xfer_group,xfer_groups,disable_alter_custphone,display_queue_count,manual_dial_filter,agent_clipboard_copy,use_campaign_dnc,three_way_call_cid,dial_method,three_way_dial_prefix,web_form_target,vtiger_screen_login,agent_allow_group_alias,default_group_alias,quick_transfer_button,prepopulate_transfer_preset,view_calls_in_queue,view_calls_in_queue_launch,call_requeue_button,pause_after_each_call,no_hopper_dialing,agent_dial_owner_only,agent_display_dialable_leads,web_form_address_two,agent_select_territories,crm_popup_login,crm_login_address,timer_action,timer_action_message,timer_action_seconds,start_call_url,dispo_call_url,xferconf_c_number,xferconf_d_number,xferconf_e_number,use_custom_cid,scheduled_callbacks_alert,scheduled_callbacks_count,manual_dial_override,blind_monitor_warning,blind_monitor_message,blind_monitor_filename,timer_action_destination,enable_xfer_presets,hide_xfer_number_to_dial,manual_dial_prefix,customer_3way_hangup_logging,customer_3way_hangup_seconds,customer_3way_hangup_action,ivr_park_call,manual_preview_dial,api_manual_dial,manual_dial_call_time_check,my_callback_option,per_call_notes,agent_lead_search,agent_lead_search_method,queuemetrics_phone_environment,auto_pause_precall,auto_pause_precall_code,auto_resume_precall,manual_dial_cid,custom_3way_button_transfer,callback_days_limit,disable_dispo_screen,disable_dispo_status,screen_labels,status_display_fields,pllb_grouping,pllb_grouping_limit,in_group_dial,in_group_dial_select,pause_after_next_call,owner_populate,manual_dial_lead_id,dead_max,dispo_max,pause_max,dead_max_dispo,dispo_max_dispo,max_inbound_calls,manual_dial_search_checkbox,hide_call_log_info,timer_alt_seconds,wrapup_bypass,wrapup_after_hotkey,callback_active_limit,callback_active_limit_override,comments_all_tabs,comments_dispo_screen,comments_callback_screen,qc_comment_history,show_previous_callback,clear_script,manual_dial_search_filter,web_form_address_three,manual_dial_override_field,status_display_ingroup,customer_gone_seconds,agent_display_fields,manual_dial_timeout,manual_auto_next,manual_auto_show,allow_required_fields,dead_to_dispo,agent_xfer_validation,ready_max_logout,callback_display_days,three_way_record_stop,hangup_xfer_record_start,max_inbound_calls_outcome,manual_auto_next_options,agent_screen_time_display,pause_max_dispo,script_top_dispo,routing_initiated_recordings,dead_trigger_seconds,dead_trigger_action,dead_trigger_repeat,dead_trigger_filename,scheduled_callbacks_force_dial,callback_hours_block,callback_display_days,scheduled_callbacks_timezones_container FROM vicidial_campaigns where campaign_id = '$VD_campaign';"; $rslt=mysql_to_mysqli($stmt, $link); if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'01013',$VD_login,$server_ip,$session_name,$one_mysql_log);} if ($DB) {echo "$stmt\n";} @@ -2041,6 +2042,11 @@ else $scheduled_callbacks_force_dial = $row[151]; $callback_hours_block = $row[152]; $callback_display_days = $row[153]; + $scheduled_callbacks_timezones_container = $row[154]; + + $scheduled_callbacks_timezones_enabled=0; + if ( ($scheduled_callbacks_timezones_container != 'DISABLED') and (strlen($scheduled_callbacks_timezones_container) > 0) ) + {$scheduled_callbacks_timezones_enabled++;} $MI_PAUSE = 0; if (preg_match("/MI_PAUSE/",$max_inbound_calls_outcome)) @@ -4773,6 +4779,10 @@ if ($enable_fast_refresh < 1) {echo "\tvar refresh_interval = 1000;\n";} var scheduled_callbacks_force_dial=''; var launch_scb_force_dial=''; var liveCBcounT=0; + var scheduled_callbacks_timezones_container=''; + var scheduled_callbacks_timezones_enabled=''; + var callback_timezone=''; + var callback_gmt_offset=''; var DiaLControl_auto_HTML = "\" border=\"0\" alt=\"You are paused\" />"; var DiaLControl_auto_HTML_ready = "\" border=\"0\" alt=\"You are active\" />"; var DiaLControl_auto_HTML_OFF = "\" border=\"0\" alt=\"pause button disabled\" />"; @@ -5941,6 +5951,7 @@ function set_length(SLnumber,SLlength_goal,SLdirection) CallBackLeadStatus = APIcbSTATUS; CallBackCommenTs = APIcbCOMMENTS; hideDiv('CallBackSelectBox'); + hideDiv('SBC_timezone_span'); document.vicidial_form.DispoSelection.value = 'CBHOLD'; } else @@ -7402,7 +7413,14 @@ function set_length(SLnumber,SLlength_goal,SLdirection) var CB_comments = call_array[9]; var CB_dialable = call_array[10]; var CB_alt_phone = call_array[11]; + var CB_cust_timezone = call_array[12]; + var CB_cust_time = call_array[13]; var CB_comments_ten = CB_comments; + var CB_cust_content=''; + if (CB_cust_timezone.length > 0) + { + CB_cust_content = "   : " + CB_cust_time + "   : " + CB_cust_timezone + ""; + } if (CB_comments_ten.length > 10) { CB_comments_ten = CB_comments_ten.substr(0,10); @@ -7413,11 +7431,11 @@ function set_length(SLnumber,SLlength_goal,SLdirection) var alt_link = " "; if (CB_alt_phone.length < 3) {alt_link = " ";} - CB_HTML = CB_HTML + "" + loop_ct + "" + CB_callback_time + "" + CB_phone + "" + CB_comments_ten + " - " + CB_name + "" + CB_status + "" + CB_campaign + "" + CB_lastcall_time + "  " + alt_link + ""; + CB_HTML = CB_HTML + "" + loop_ct + "" + CB_callback_time + "" + CB_phone + "" + CB_comments_ten + " - " + CB_name + "" + CB_status + "" + CB_campaign + "" + CB_lastcall_time + "  " + alt_link + "" + CB_cust_content; } else { - CB_HTML = CB_HTML + "" + loop_ct + "" + CB_callback_time + "" + CB_phone + "" + CB_comments_ten + " - INFO" + CB_name + "" + CB_status + "" + CB_campaign + "" + CB_lastcall_time + "  "; + CB_HTML = CB_HTML + "" + loop_ct + "" + CB_callback_time + "" + CB_phone + "" + CB_comments_ten + " - INFO" + CB_name + "" + CB_status + "" + CB_campaign + "" + CB_lastcall_time + "   + CB_cust_content"; } } CB_HTML = CB_HTML + ""; @@ -13520,6 +13538,50 @@ function set_length(SLnumber,SLlength_goal,SLdirection) document.getElementById("CBCommentsContent").innerHTML = ""; } + // BEGIN customer timezones code + if (scheduled_callbacks_timezones_enabled > 0) + { + var xmlhttp=false; + /*@cc_on @*/ + /*@if (@_jscript_version >= 5) + // JScript gives us Conditional compilation, we can cope with old IE versions. + // and security blocked creation of the objects. + try { + xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + try { + xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } catch (E) { + xmlhttp = false; + } + } + @end @*/ + if (!xmlhttp && typeof XMLHttpRequest!='undefined') + { + xmlhttp = new XMLHttpRequest(); + } + if (xmlhttp) + { + SCB_timezone_query = "server_ip=" + server_ip + "&session_name=" + session_name + "&user=" + user + "&pass=" + pass + "&ACTION=SBC_timezone_build&format=text&lead_id=" + document.vicidial_form.lead_id.value + "&campaign=" + campaign + "&stage=" + scheduled_callbacks_timezones_container; + xmlhttp.open('POST', 'vdc_db_query.php'); + xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8'); + xmlhttp.send(SCB_timezone_query); + xmlhttp.onreadystatechange = function() + { + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) + { + document.getElementById("SBC_timezone_span").innerHTML = xmlhttp.responseText; + // showDiv('SBC_timezone_span'); + + // alert(SCB_timezone_query); + // alert(xmlhttp.responseText + "\n|" + check_PC_array[1] + "\n|" + check_PC_array[2] + "|" + agent_log_id + "|" + pause_code_counter); + } + } + delete xmlhttp; + } + } + // END customer timezones code + showDiv('CallBackSelectBox'); agent_events('callback_select_open', '', aec); aec++; @@ -13547,7 +13609,7 @@ function set_length(SLnumber,SLlength_goal,SLdirection) } if (xmlhttp) { - DSupdate_query = "server_ip=" + server_ip + "&session_name=" + session_name + "&ACTION=updateDISPO&format=text&user=" + user + "&pass=" + pass + "&orig_pass=" + orig_pass + "&dispo_choice=" + DispoChoice + "&lead_id=" + document.vicidial_form.lead_id.value + "&campaign=" + campaign + "&auto_dial_level=" + auto_dial_level + "&agent_log_id=" + agent_log_id + "&CallBackDatETimE=" + CallBackDatETimE + "&list_id=" + document.vicidial_form.list_id.value + "&recipient=" + CallBackrecipient + "&use_internal_dnc=" + use_internal_dnc + "&use_campaign_dnc=" + use_campaign_dnc + "&MDnextCID=" + LasTCID + "&stage=" + group + "&vtiger_callback_id=" + vtiger_callback_id + "&phone_number=" + document.vicidial_form.phone_number.value + "&phone_code=" + document.vicidial_form.phone_code.value + "&dial_method=" + dial_method + "&uniqueid=" + document.vicidial_form.uniqueid.value + "&CallBackLeadStatus=" + CallBackLeadStatus + "&comments=" + encodeURIComponent(CallBackCommenTs) + "&custom_field_names=" + custom_field_names + "&call_notes=" + encodeURIComponent(document.vicidial_form.call_notes_dispo.value) + "&dispo_comments=" + encodeURIComponent(document.vicidial_form.dispo_comments.value) + "&cbcomment_comments=" + encodeURIComponent(document.vicidial_form.cbcomment_comments.value) + "&qm_dispo_code=" + DispoQMcsCODE + "&email_enabled=" + email_enabled + "&recording_id=" + VDDCU_recording_id + "&recording_filename=" + VDDCU_recording_filename + "&called_count=" + document.vicidial_form.called_count.value + "&parked_hangup=" + parked_hangup + "&phone_login=" + phone_login + "&agent_email=" + LOGemail + "&conf_exten=" + session_id + "&camp_script=" + campaign_script + '' + "&in_script=" + CalL_ScripT_id + "&customer_server_ip=" + lastcustserverip + "&exten=" + extension + "&original_phone_login=" + original_phone_login + "&phone_pass=" + phone_pass; + DSupdate_query = "server_ip=" + server_ip + "&session_name=" + session_name + "&ACTION=updateDISPO&format=text&user=" + user + "&pass=" + pass + "&orig_pass=" + orig_pass + "&dispo_choice=" + DispoChoice + "&lead_id=" + document.vicidial_form.lead_id.value + "&campaign=" + campaign + "&auto_dial_level=" + auto_dial_level + "&agent_log_id=" + agent_log_id + "&CallBackDatETimE=" + CallBackDatETimE + "&list_id=" + document.vicidial_form.list_id.value + "&recipient=" + CallBackrecipient + "&use_internal_dnc=" + use_internal_dnc + "&use_campaign_dnc=" + use_campaign_dnc + "&MDnextCID=" + LasTCID + "&stage=" + group + "&vtiger_callback_id=" + vtiger_callback_id + "&phone_number=" + document.vicidial_form.phone_number.value + "&phone_code=" + document.vicidial_form.phone_code.value + "&dial_method=" + dial_method + "&uniqueid=" + document.vicidial_form.uniqueid.value + "&CallBackLeadStatus=" + CallBackLeadStatus + "&comments=" + encodeURIComponent(CallBackCommenTs) + "&custom_field_names=" + custom_field_names + "&call_notes=" + encodeURIComponent(document.vicidial_form.call_notes_dispo.value) + "&dispo_comments=" + encodeURIComponent(document.vicidial_form.dispo_comments.value) + "&cbcomment_comments=" + encodeURIComponent(document.vicidial_form.cbcomment_comments.value) + "&qm_dispo_code=" + DispoQMcsCODE + "&email_enabled=" + email_enabled + "&recording_id=" + VDDCU_recording_id + "&recording_filename=" + VDDCU_recording_filename + "&called_count=" + document.vicidial_form.called_count.value + "&parked_hangup=" + parked_hangup + "&phone_login=" + phone_login + "&agent_email=" + LOGemail + "&conf_exten=" + session_id + "&camp_script=" + campaign_script + '' + "&in_script=" + CalL_ScripT_id + "&customer_server_ip=" + lastcustserverip + "&exten=" + extension + "&original_phone_login=" + original_phone_login + "&phone_pass=" + phone_pass + "&callback_gmt_offset=" + callback_gmt_offset + "&callback_timezone=" + callback_timezone; xmlhttp.open('POST', 'vdc_db_query.php'); xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8'); xmlhttp.send(DSupdate_query); @@ -13702,10 +13764,13 @@ function set_length(SLnumber,SLlength_goal,SLdirection) active_ingroup_dial=''; CalL_ScripT_id=''; CalL_ScripT_color=''; + callback_gmt_offset=''; + callback_timezone=''; + document.getElementById("SBC_timezone_span").innerHTML = '...'; + document.getElementById("CallBackTimezone").innerHTML = ''; nocall_dial_flag='DISABLED'; document.vicidial_form.CallBackDatESelectioN.value = ''; document.vicidial_form.CallBackCommenTsField.value = ''; - document.vicidial_form.search_phone_number.value=''; document.vicidial_form.search_lead_id.value=''; document.vicidial_form.search_vendor_lead_code.value=''; @@ -13893,6 +13958,19 @@ function set_length(SLnumber,SLlength_goal,SLdirection) } +// ################################################################################ +// Agent has selected a timezone + function SBC_timezone_choose(temp_offset,temp_timezone,temp_timezone_name) + { + callback_gmt_offset = temp_offset; + callback_timezone = temp_timezone; + + document.getElementById("CallBackTimezone").innerHTML = temp_timezone_name; + + hideDiv('SBC_timezone_span'); + } + + // ################################################################################ // Send AJAX request to trigger the Dead Trigger URL function dead_trigger_url_send() @@ -17356,6 +17434,7 @@ function phone_number_format(formatphone) { document.vicidial_form.DispoSelection.value = 'CBHOLD'; hideDiv('CallBackSelectBox'); + hideDiv('SBC_timezone_span'); DispoSelect_submit(); } } @@ -17541,6 +17620,7 @@ function phone_number_format(formatphone) { hideDiv('TransferMain'); hideDiv('WelcomeBoxA'); hideDiv('CallBackSelectBox'); + hideDiv('SBC_timezone_span'); hideDiv('DispoButtonHideA'); hideDiv('DispoButtonHideB'); hideDiv('DispoButtonHideC'); @@ -18979,8 +19059,8 @@ function phone_number_format(formatphone) {