From cc6b8fe539307b060636c743d4006e2aca8a9165 Mon Sep 17 00:00:00 2001 From: mattf Date: Fri, 2 Dec 2016 04:11:00 +0000 Subject: [PATCH] updates to outbound routing optimization and testing git-svn-id: svn://192.168.202.10@2639 3d104415-ff17-0410-8863-d5cf3c621b8a --- agi/agi-VDAD_ALL_outbound.agi | 53 +- agi/agi-VDAD_ALL_outboundBETA.agi | 83 +- agi/agi-VDAD_ALL_outboundBETA2.agi | 2691 ++++++++++++++++++++ docs/OUTBOUND_OPTIMIZATIONS.txt | 34 +- www/vicidial/AST_vdad_debug_log_report.php | 236 +- 5 files changed, 3036 insertions(+), 61 deletions(-) create mode 100644 agi/agi-VDAD_ALL_outboundBETA2.agi diff --git a/agi/agi-VDAD_ALL_outbound.agi b/agi/agi-VDAD_ALL_outbound.agi index 4a875098..ddb2a4f6 100644 --- a/agi/agi-VDAD_ALL_outbound.agi +++ b/agi/agi-VDAD_ALL_outbound.agi @@ -115,12 +115,13 @@ # 150928-1822 - Added dnc logging # 160101-1528 - Added routing_initiated_recordings # 161102-1037 - Fixed QM partition problem +# 161201-1003 - Fixed LRERR logging issue # $script = 'agi-VDAD_ALL_outbound.agi'; $AGILOG = '0'; $mel=1; # Mysql Error Log enabled = 1 -$mysql_log_count=119; +$mysql_log_count=136; $one_mysql_log=0; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second @@ -398,7 +399,7 @@ if ( ($channel =~ /Local/i) && ($AST_ver !~ /^1\.0\.8|^1\.0\.9/) ) $xCLlist_id=0; $called_count=0; - $stmtA = "SELECT list_id,security_phrase,called_count from vicidial_list where lead_id='$CIDlead_id' limit 1;"; + $stmtA = "SELECT list_id,security_phrase,called_count,phone_number,phone_code from vicidial_list where lead_id='$CIDlead_id' limit 1;"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArowsLI=$sthA->rows; @@ -409,6 +410,8 @@ if ( ($channel =~ /Local/i) && ($AST_ver !~ /^1\.0\.8|^1\.0\.9/) ) $xCLlist_id = $aryA[0]; $security_phrase = $aryA[1]; $called_count = $aryA[2]; + $VDADphone = $aryA[3]; + $VDADphone_code = $aryA[4]; } $sthA->finish(); @@ -429,6 +432,20 @@ if ( ($channel =~ /Local/i) && ($AST_ver !~ /^1\.0\.8|^1\.0\.9/) ) $VDADqueue_priority = $aryA[6]; } $sthA->finish(); + if ($sthArows < 1) + { + $stmtA = "SELECT campaign_id FROM vicidial_lists where list_id='$xCLlist_id' limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01120'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $VDADcampaign = $aryA[0]; + } + $sthA->finish(); + } $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed,alt_dial,list_id,called_count) values('$uniqueid','$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','LRERR','$VDADphone_code','$VDADphone','VDAD','N','$VDADalt_dial','$xCLlist_id','$called_count')"; if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} @@ -2592,7 +2609,7 @@ while ($drop_timer <= $DROP_TIME) $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArowsVUrec=$sthA->rows; - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01121'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; if ($sthArowsVUrec > 0) { @aryA = $sthA->fetchrow_array; @@ -2611,7 +2628,7 @@ while ($drop_timer <= $DROP_TIME) $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01122'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; @@ -2652,12 +2669,12 @@ while ($drop_timer <= $DROP_TIME) ### insert a record into the recording_log table $stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channelrec','$VDADserver_ip','$campaign_rec_exten','$now_date','$now_date_epoch','$campaign_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02123'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;"; $sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02124'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; @@ -2671,20 +2688,20 @@ while ($drop_timer <= $DROP_TIME) $stmtA = "UPDATE recording_log SET filename='$campaign_rec_filename' where recording_id='$recording_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02125'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; } $stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VDADserver_ip','','Originate','$campaign_rec_filename','Channel: $channelrec','Context: $ext_context','Exten: $campaign_rec_exten','Priority: 1','Callerid: $campaign_rec_filename','','','','','');"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02126'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed) values('$recording_id','$campaign_rec_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0')"; $affected_rowsB = $dbhA->do($stmtB); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02127'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging; $stmtC = "UPDATE vicidial_live_agents SET external_recording='$recording_id' where user='$VDADuser';"; $affected_rowsC = $dbhA->do($stmtC); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02128'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- ROUTING INITIATED RECORDING STARTED : |$affected_rows|$recording_id|$campaign_rec_filename|$stmtA| |$affected_rowsB|$stmtB| |$affected_rowsC|$stmtC|"; &agi_output;} } @@ -3306,7 +3323,7 @@ while ($drop_timer <= $DROP_TIME) $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArowsVUrec=$sthA->rows; - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01129'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; if ($sthArowsVUrec > 0) { @aryA = $sthA->fetchrow_array; @@ -3325,7 +3342,7 @@ while ($drop_timer <= $DROP_TIME) $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01130'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; @@ -3366,12 +3383,12 @@ while ($drop_timer <= $DROP_TIME) ### insert a record into the recording_log table $stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channelrec','$VDADserver_ip','$campaign_rec_exten','$now_date','$now_date_epoch','$campaign_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02131'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;"; $sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02132'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; @@ -3385,20 +3402,20 @@ while ($drop_timer <= $DROP_TIME) $stmtA = "UPDATE recording_log SET filename='$campaign_rec_filename' where recording_id='$recording_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02133'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; } $stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VDADserver_ip','','Originate','$campaign_rec_filename','Channel: $channelrec','Context: $ext_context','Exten: $campaign_rec_exten','Priority: 1','Callerid: $campaign_rec_filename','','','','','');"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02134'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed) values('$recording_id','$campaign_rec_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0')"; $affected_rowsB = $dbhA->do($stmtB); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02135'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging; $stmtC = "UPDATE vicidial_live_agents SET external_recording='$recording_id' where user='$VDADuser';"; $affected_rowsC = $dbhA->do($stmtC); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02136'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- ROUTING INITIATED RECORDING STARTED : |$affected_rows|$recording_id|$campaign_rec_filename|$stmtA| |$affected_rowsB|$stmtB| |$affected_rowsC|$stmtC|"; &agi_output;} } diff --git a/agi/agi-VDAD_ALL_outboundBETA.agi b/agi/agi-VDAD_ALL_outboundBETA.agi index 12d6da88..839b2670 100644 --- a/agi/agi-VDAD_ALL_outboundBETA.agi +++ b/agi/agi-VDAD_ALL_outboundBETA.agi @@ -116,12 +116,13 @@ # 160101-1528 - Added routing_initiated_recordings # 161102-1037 - Fixed QM partition problem # 161115-1359 - Forked to BETA script, added vdad_debug_logging option +# 161201-1003 - Fixed LRERR logging issue # $script = 'agi-VDAD_ALL_outboundBETA.agi'; $AGILOG = '0'; $mel=1; # Mysql Error Log enabled = 1 -$mysql_log_count=119; +$mysql_log_count=151; $one_mysql_log=0; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second @@ -269,7 +270,7 @@ $stmtA = "SELECT vdad_debug_logging FROM system_settings;"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01151'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; @@ -391,7 +392,7 @@ if ( ($channel =~ /Local/i) && ($AST_ver !~ /^1\.0\.8|^1\.0\.9/) ) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='LocalEXIT-$priority',lead_id='$CIDlead_id',step='$LRct';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01120'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } @@ -426,7 +427,7 @@ if ( ($channel =~ /Local/i) && ($AST_ver !~ /^1\.0\.8|^1\.0\.9/) ) $xCLlist_id=0; $called_count=0; - $stmtA = "SELECT list_id,security_phrase,called_count from vicidial_list where lead_id='$CIDlead_id' limit 1;"; + $stmtA = "SELECT list_id,security_phrase,called_count,phone_number,phone_code from vicidial_list where lead_id='$CIDlead_id' limit 1;"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArowsLI=$sthA->rows; @@ -437,6 +438,8 @@ if ( ($channel =~ /Local/i) && ($AST_ver !~ /^1\.0\.8|^1\.0\.9/) ) $xCLlist_id = $aryA[0]; $security_phrase = $aryA[1]; $called_count = $aryA[2]; + $VDADphone = $aryA[3]; + $VDADphone_code = $aryA[4]; } $sthA->finish(); @@ -457,6 +460,20 @@ if ( ($channel =~ /Local/i) && ($AST_ver !~ /^1\.0\.8|^1\.0\.9/) ) $VDADqueue_priority = $aryA[6]; } $sthA->finish(); + if ($sthArows < 1) + { + $stmtA = "SELECT campaign_id FROM vicidial_lists where list_id='$xCLlist_id' limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01121'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $VDADcampaign = $aryA[0]; + } + $sthA->finish(); + } $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed,alt_dial,list_id,called_count) values('$uniqueid','$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','LRERR','$VDADphone_code','$VDADphone','VDAD','N','$VDADalt_dial','$xCLlist_id','$called_count')"; if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} @@ -1060,7 +1077,7 @@ if ($VDACaffected_rows > 0) $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='preroute',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01122'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); @@ -1141,7 +1158,7 @@ if ($VDACaffected_rows > 0) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='prerouteQM',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01123'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } } @@ -1456,7 +1473,7 @@ if ($call_handle_method =~ /SURVEY/) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-NI',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01124'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } $AGI->hangup(); @@ -1572,7 +1589,7 @@ if ($call_handle_method =~ /SURVEY/) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-3rd',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01125'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } @@ -1704,7 +1721,7 @@ if ($call_handle_method =~ /SURVEY/) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-4th',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01126'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } if (length($survey_fourth_exten) > 0) @@ -1982,7 +1999,7 @@ if ($call_handle_method =~ /SURVEY/) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-exten',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01127'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } @@ -2016,7 +2033,7 @@ if ($call_handle_method =~ /SURVEY/) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-Hangup',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01128'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } $AGI->hangup(); @@ -2100,7 +2117,7 @@ if ($call_handle_method =~ /SURVEY/) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-REC',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01129'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } @@ -2141,7 +2158,7 @@ if ($call_handle_method =~ /SURVEY/) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-DROP',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01130'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } $AGI->hangup(); @@ -2700,7 +2717,7 @@ while ($drop_timer <= $DROP_TIME) $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArowsVUrec=$sthA->rows; - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01131'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; if ($sthArowsVUrec > 0) { @aryA = $sthA->fetchrow_array; @@ -2719,7 +2736,7 @@ while ($drop_timer <= $DROP_TIME) $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01132'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; @@ -2760,12 +2777,12 @@ while ($drop_timer <= $DROP_TIME) ### insert a record into the recording_log table $stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channelrec','$VDADserver_ip','$campaign_rec_exten','$now_date','$now_date_epoch','$campaign_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02133'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;"; $sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02134'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; @@ -2779,20 +2796,20 @@ while ($drop_timer <= $DROP_TIME) $stmtA = "UPDATE recording_log SET filename='$campaign_rec_filename' where recording_id='$recording_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02135'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; } $stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VDADserver_ip','','Originate','$campaign_rec_filename','Channel: $channelrec','Context: $ext_context','Exten: $campaign_rec_exten','Priority: 1','Callerid: $campaign_rec_filename','','','','','');"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02136'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed) values('$recording_id','$campaign_rec_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0')"; $affected_rowsB = $dbhA->do($stmtB); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02137'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging; $stmtC = "UPDATE vicidial_live_agents SET external_recording='$recording_id' where user='$VDADuser';"; $affected_rowsC = $dbhA->do($stmtC); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02138'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- ROUTING INITIATED RECORDING STARTED : |$affected_rows|$recording_id|$campaign_rec_filename|$stmtA| |$affected_rowsB|$stmtB| |$affected_rowsC|$stmtC|"; &agi_output;} } @@ -2924,7 +2941,7 @@ while ($drop_timer <= $DROP_TIME) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-AGENT-1',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01139'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } @@ -3423,7 +3440,7 @@ while ($drop_timer <= $DROP_TIME) $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArowsVUrec=$sthA->rows; - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01140'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; if ($sthArowsVUrec > 0) { @aryA = $sthA->fetchrow_array; @@ -3442,7 +3459,7 @@ while ($drop_timer <= $DROP_TIME) $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01141'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; @@ -3483,12 +3500,12 @@ while ($drop_timer <= $DROP_TIME) ### insert a record into the recording_log table $stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channelrec','$VDADserver_ip','$campaign_rec_exten','$now_date','$now_date_epoch','$campaign_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02142'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;"; $sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02143'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; @@ -3502,20 +3519,20 @@ while ($drop_timer <= $DROP_TIME) $stmtA = "UPDATE recording_log SET filename='$campaign_rec_filename' where recording_id='$recording_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02144'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; } $stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VDADserver_ip','','Originate','$campaign_rec_filename','Channel: $channelrec','Context: $ext_context','Exten: $campaign_rec_exten','Priority: 1','Callerid: $campaign_rec_filename','','','','','');"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02145'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed) values('$recording_id','$campaign_rec_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0')"; $affected_rowsB = $dbhA->do($stmtB); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02146'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging; $stmtC = "UPDATE vicidial_live_agents SET external_recording='$recording_id' where user='$VDADuser';"; $affected_rowsC = $dbhA->do($stmtC); - $dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='02147'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- ROUTING INITIATED RECORDING STARTED : |$affected_rows|$recording_id|$campaign_rec_filename|$stmtA| |$affected_rowsB|$stmtB| |$affected_rowsC|$stmtC|"; &agi_output;} } @@ -3650,7 +3667,7 @@ while ($drop_timer <= $DROP_TIME) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-AGENT-2',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01148'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } @@ -3726,7 +3743,7 @@ while ($drop_timer <= $DROP_TIME) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='waiting-for-agent-$drop_timer',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01149'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } @@ -3944,7 +3961,7 @@ if ($drop_timer > $DROP_TIME) &duration_calc; $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='end-drop-$drop_timer',lead_id='$CIDlead_id';"; $affected_rows = $dbhA->do($stmtA); - $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $dbhP=$dbhA; $mysql_count='01150'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); } diff --git a/agi/agi-VDAD_ALL_outboundBETA2.agi b/agi/agi-VDAD_ALL_outboundBETA2.agi new file mode 100644 index 00000000..db5cb4d2 --- /dev/null +++ b/agi/agi-VDAD_ALL_outboundBETA2.agi @@ -0,0 +1,2691 @@ +#!/usr/bin/perl +# +# agi-VDAD_ALL_outboundBETA2.agi version 2.12 +# +# runs when an outbound call is answered. This script will +# send the calls out to the agents that are logged in. +# ## THIS SCRIPT CONSOLIDATES EIGHT SEPARATE VDAD outbound transfer SCRIPTS ## +# +# +# You need to put lines similar to those below in your extensions.conf file: +# ; Below are the parameters needed for the script to be run properly +# ; 1. the method of call handling for the script: +# ; - NORMAL - Standard outbound routing to agent +# ; - TEST - For performance testing only +# ; - BROADCAST - For no-agent broadcast dialing +# ; - SURVEY - For survery question then on to agent +# ; - SURVEYCAMP - For survery question using campaign settings +# ; - SURVEYCAMPCEP - Survery question, campaign settings, cepstral name +# ; - REMINDER - Reminder campaign +# ; - REMINDX - Reminder with transfer to agent +# ; 2. the method of searching for an available agent: +# ; - LB - Load Balance total system +# ; - LO - Load Balance Overflow only (priority to home server) +# ; - SO - Home server only +# ; 3. the sound file to play when doing a SURVEY, REMINDER, REMINDX campaign +# ; 4. the acceptible dtmf digits for a SURVEY +# ; 5. the out-opt digit for a SURVEY (must be in the digit map) +# ; 6. the sound file to play for a SURVEY when transfering to an agent +# ; 7. the sound file to play for a SURVEY when DNCing the call +# ; 8. OPTIN or OPTOUT: if OPTIN call is only sent to agent with button press +# ; if OPTOUT call is sent to agent if no button press at all +# ; 9. the status that is used for a SURVEY when someone opts out +# ; if the status is DNC it will also add them to the internal dnc table +# +# ;outbound VICIDIAL calls: +#exten => 8368,1,AGI(agi://127.0.0.1:4577/call_log) +#exten => 8368,2,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB) +#exten => 8368,3,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB) +#exten => 8368,4,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB) +#exten => 8368,5,Hangup +# +# ;outbound VICIDIAL SURVEY calls: +#exten => 8366,1,AGI(agi://127.0.0.1:4577/call_log) +#exten => 8366,2,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact-----OPTOUT-----DNC) +#exten => 8366,3,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact-----OPTOUT-----DNC) +#exten => 8366,4,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact-----OPTOUT-----DNC) +#exten => 8366,5,Hangup +# +# Copyright (C) 2016 Matt Florell LICENSE: AGPLv2 +# +# changes: +# 80218-2027 - First Build +# 80302-0232 - Added drop_action and transfer to in-group +# 80430-1144 - Added term_reason to vicidial_log, QUEUETIMEOUT +# 80520-0059 - Added SURVEY ability and digit maps +# 80527-2329 - Added SURVEYCAMP ability to pull settings from database +# 80831-0353 - Added logging of alt_dial field +# 80909-0603 - Added campaign-specific dnc option for outbound survey +# 81020-0235 - Fixed Drop hangup bug and other small bugs +# 81104-0255 - Changed code to alter callerIDnumber for remote agents to the number of the caller +# 81105-0424 - Added MySQL error logging +# 90202-0505 - Added CPD AMD detection and routing options +# 90214-0831 - Added CPD Fax detection option +# 90410-1645 - Added SURVEYCAMPCEP call handling method and cleaned up formatting +# 90628-1138 - Added more variable options for Cepstral TTS generation +# 90630-2250 - Added more Sangoma CDP statuses +# 90702-2240 - Added option to send to remote agent as phone*vendor_id +# 90721-1137 - Added rank and owner as vicidial_list fields +# 90808-0307 - Added longest_wait_time as agent routing option +# 90827-1535 - Added proper logging of list_id in vicidial_log table +# 90924-1605 - Added drop_inbound_group_override list_id option +# 91112-1101 - Changed ENTERQUEUE to CALLOUTBOUND in QM logging for outbound calls +# 91230-1159 - Change to callee callerID when sending the call to VMAIL +# 100205-1024 - Fixed CPD send to message +# 100319-0610 - Added extension group remote agent feature +# 100414-2156 - Added extension_appended_cidname option +# 100424-1341 - Added extended logging +# 100623-1310 - Added queue_priority to queue processing +# 100727-1653 - Fixes for queue priority feature +# 100903-0041 - Changed lead_id max length to 10 digits +# 101207-0713 - Added fix for rare VDAC-entry-missing issue +# 110213-0008 - Added scheduled callbacks custom statuses compatibility +# 110224-1733 - Added compatibility with QM phone environment logging +# 110303-2316 - Added condition that would not allow calls to be sent to agent with ringing inbound call +# 110324-2326 - Added recording of remote agent calls, per in-group and campaign recording settings +# 110325-1410 - Added user recording override settings checking for remote agent recording +# 110525-1530 - Added AUDIO and CALLMENU drop options +# 110528-2326 - Added CALLMENU survey method +# 110626-2342 - Added queuemetrics_pe_phone_append +# 110723-2330 - Set CID to customer phone number and caller code when transferring to CALLMENU +# 110812-1514 - Added static tts file parsing and replacement +# 110829-2324 - Added survey_recording option +# 110926-1929 - Small fixes +# 111201-1751 - Added grade-random next-agent-call option +# 111219-2256 - Added max stats updating +# 120430-2214 - Converted call to Monitor app to be asterisk 1.8 compatible +# 120430-2218 - For AGI commands not made through the AGI object added a read from STDIN before calling checkresult +# 120529-2112 - Added safe_harbor_audio_field campaign option +# 120621-0726 - Changed survey opt-in non-agent qm logging to log connection to VDAD agent +# 121009-1458 - Changed survey method HANGUP to not wait for digits, added LRERR Local channel logging +# 121120-0922 - Added QM socket-send functionality +# 121125-0035 - Added Other Campaign DNC option +# 130108-1806 - Changes for Asterisk 1.8 compatibility +# 130124-1853 - Issue #637 fix +# 130210-1013 - Added options for CALLMENU|INGROUP cpd_amd_actions +# 130425-0049 - Added survey_wait_sec option and pre-process time logging +# 130425-0657 - Added survey_no_response option to drop to campaign drop action +# 131209-1735 - Added called_count logging +# 140126-1128 - Added VMAIL_NO_INST options +# 140215-2121 - Added several variable options for QM socket URL +# 140312-2112 - Added CALLID as recording filename variable +# 140617-1946 - Added single-digit change to text for TTS +# 141211-1635 - Added cpd_unknown_action campaign option and list_id added to AST_send_URL calls +# 141219-1219 - Fixed issue related to QM logging +# 150928-1822 - Added dnc logging +# 160101-1528 - Added routing_initiated_recordings +# 161102-1037 - Fixed QM partition problem +# 161115-1359 - Forked to BETA script, added vdad_debug_logging option +# 161201-1003 - Fixed LRERR logging issue +# 161201-1030 - EXPERIMENTAL REMOVED MANY FEATURES TO TEST INTERPRETATION TIME!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# + +$script = 'agi-VDAD_ALL_outboundBETA2.agi'; +$AGILOG = '0'; +$mel=1; # Mysql Error Log enabled = 1 +$mysql_log_count=151; +$one_mysql_log=0; + +use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second +($START_s_hires, $START_usec) = gettimeofday(); +$ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + +$DROP_TIME = 9; ### default number of seconds to wait until you drop a waiting call +$at='@'; +$US='_'; +$wav='.wav'; + +# get date/time +($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); +$year = ($year + 1900); +$Tyear = ($year - 2000); +$mon++; +if ($mon < 10) {$mon = "0$mon";} +if ($mday < 10) {$mday = "0$mday";} +if ($hour < 10) {$hour = "0$hour";} +if ($min < 10) {$min = "0$min";} +if ($sec < 10) {$sec = "0$sec";} + +$now_date_epoch = time(); +$now_date = "$year-$mon-$mday $hour:$min:$sec"; +$CLInow_date = "$year-$mon-$mday\\ $hour:$min:$sec"; +$start_time_epoch = $now_date_epoch; +$start_time=$now_date; +$YMD = "$year-$mon-$mday"; +$CIDdate = "$mon$mday$hour$min$sec"; +$tsSQLdate = "$year$mon$mday$hour$min$sec"; +$filedate = "$US$year-$mon-$mday$US$hour$min$sec"; +$recdate = "$year$mon$mday-$hour$min$sec"; +$tinydate = "$Tyear$mon$mday$hour$min$sec"; +$SQLdate = "$year-$mon-$mday $hour:$min:$sec"; +$SQLdateBEGIN = $SQLdate; + +$BDtarget = ($now_date_epoch - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} +$BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + +$FDtarget = ($now_date_epoch + 120); +($Fsec,$Fmin,$Fhour,$Fmday,$Fmon,$Fyear,$Fwday,$Fyday,$Fisdst) = localtime($FDtarget); +$Fyear = ($Fyear + 1900); +$Fmon++; +if ($Fmon < 10) {$Fmon = "0$Fmon";} +if ($Fmday < 10) {$Fmday = "0$Fmday";} +if ($Fhour < 10) {$Fhour = "0$Fhour";} +if ($Fmin < 10) {$Fmin = "0$Fmin";} +if ($Fsec < 10) {$Fsec = "0$Fsec";} +$FDtsSQLdate = "$Fyear$Fmon$Fmday$Fhour$Fmin$Fsec"; + + +# default path to astguiclient configuration file: +$PATHconf = '/etc/astguiclient.conf'; + +open(conf, "$PATHconf") || die "can't open $PATHconf: $!\n"; +@conf = ; +close(conf); +$i=0; +foreach(@conf) + { + $line = $conf[$i]; + $line =~ s/ |>|\n|\r|\t|\#.*|;.*//gi; + if ( ($line =~ /^PATHhome/) && ($CLIhome < 1) ) + {$PATHhome = $line; $PATHhome =~ s/.*=//gi;} + if ( ($line =~ /^PATHlogs/) && ($CLIlogs < 1) ) + {$PATHlogs = $line; $PATHlogs =~ s/.*=//gi;} + if ( ($line =~ /^PATHagi/) && ($CLIagi < 1) ) + {$PATHagi = $line; $PATHagi =~ s/.*=//gi;} + if ( ($line =~ /^PATHweb/) && ($CLIweb < 1) ) + {$PATHweb = $line; $PATHweb =~ s/.*=//gi;} + if ( ($line =~ /^PATHsounds/) && ($CLIsounds < 1) ) + {$PATHsounds = $line; $PATHsounds =~ s/.*=//gi;} + if ( ($line =~ /^PATHmonitor/) && ($CLImonitor < 1) ) + {$PATHmonitor = $line; $PATHmonitor =~ s/.*=//gi;} + if ( ($line =~ /^VARserver_ip/) && ($CLIserver_ip < 1) ) + {$VARserver_ip = $line; $VARserver_ip =~ s/.*=//gi;} + if ( ($line =~ /^VARDB_server/) && ($CLIDB_server < 1) ) + {$VARDB_server = $line; $VARDB_server =~ s/.*=//gi;} + if ( ($line =~ /^VARDB_database/) && ($CLIDB_database < 1) ) + {$VARDB_database = $line; $VARDB_database =~ s/.*=//gi;} + if ( ($line =~ /^VARDB_user/) && ($CLIDB_user < 1) ) + {$VARDB_user = $line; $VARDB_user =~ s/.*=//gi;} + if ( ($line =~ /^VARDB_pass/) && ($CLIDB_pass < 1) ) + {$VARDB_pass = $line; $VARDB_pass =~ s/.*=//gi;} + if ( ($line =~ /^VARDB_port/) && ($CLIDB_port < 1) ) + {$VARDB_port = $line; $VARDB_port =~ s/.*=//gi;} + $i++; + } + +if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} +if (!$PRSLOGfile) {$PRSLOGfile = "$PATHlogs/prsout.$year-$mon-$mday";} +if (!$PRSTESTfile) {$PRSTESTfile = "$PATHlogs/prstest.$year-$mon-$mday";} +if (!$ERRLOGfile) {$ERRLOGfile = "$PATHlogs/MySQLerror.$year-$mon-$mday";} +if (!$CEPLOGfile) {$CEPLOGfile = "$PATHlogs/Cepstral.$year-$mon-$mday";} + +use DBI; +use Asterisk::AGI; +$AGI = new Asterisk::AGI; + +$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") + or die "Couldn't connect to database: " . DBI->errstr; + +### Grab Server values from the database +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks,agi_output,voicemail_dump_exten_no_inst FROM servers where server_ip = '$VARserver_ip';"; +$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; +$sthA->execute or die "executing: $stmtA ", $dbhA->errstr; +$sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01001'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $rec_count=0; +while ($sthArows > $rec_count) + { + @aryA = $sthA->fetchrow_array; + $DBvoicemail_dump_exten = $aryA[0]; + $DBext_context = $aryA[1]; + $DBanswer_transfer_agent = $aryA[2]; + $DBSERVER_GMT = $aryA[3]; + $asterisk_version = $aryA[4]; + $DBmax_vicidial_trunks = $aryA[5]; + $DBagi_output = $aryA[6]; + $voicemail_dump_exten_no_inst = $aryA[7]; + if ($DBvoicemail_dump_exten) {$voicemail_dump_exten = $DBvoicemail_dump_exten;} + if ($DBext_context) {$ext_context = $DBext_context;} + if ($DBanswer_transfer_agent) {$answer_transfer_agent = $DBanswer_transfer_agent;} + if ($DBSERVER_GMT) {$SERVER_GMT = $DBSERVER_GMT;} + if ($asterisk_version) {$AST_ver = $asterisk_version;} + if ($DBmax_vicidial_trunks) {$max_vicidial_trunks = $DBmax_vicidial_trunks;} + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); + +### Grab System Settings values from the database +$stmtA = "SELECT vdad_debug_logging FROM system_settings;"; +$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; +$sthA->execute or die "executing: $stmtA ", $dbhA->errstr; +$sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01151'; $MEL_aff_rows=$sthArows; &mysql_error_logging; +if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $vdad_debug_logging = $aryA[0]; + } +$sthA->finish(); + + +### begin parsing run-time options ### +if (length($ARGV[0])>1) + { + if ($AGILOG) + {$agi_string = "Perl Environment Dump:"; &agi_output;} + $i=0; + while ($#ARGV >= $i) + { + $args = "$args $ARGV[$i]"; + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} + $i++; + } + + ### list of command-line array arguments: + @ARGV_vars = split(/-----/, $ARGV[0]); + $call_handle_method = $ARGV_vars[0]; + $agent_search_method = $ARGV_vars[1]; + $survey_first_audio_file = $ARGV_vars[2]; + $survey_dtmf_digits = $ARGV_vars[3]; + $survey_ni_digit = $ARGV_vars[4]; + $survey_opt_in_audio_file = $ARGV_vars[5]; + $survey_ni_audio_file = $ARGV_vars[6]; + $survey_no_response_action =$ARGV_vars[7]; + $survey_ni_status = $ARGV_vars[8]; + } + +if ($call_handle_method !~ /NORMAL|TEST|BROADCAST|SURVEY|REMIND/) + {$call_handle_method='NORMAL';} +if ($agent_search_method !~ /LB|LO|SO/) + {$agent_search_method='LB';} + +if ($call_handle_method =~ /BROADCAST|SURVEY|REMIND/) + {$vdlog_status='PU';} +else + {$vdlog_status='QUEUE';} + +$|=1; +while() + { + chomp; + last unless length($_); + if ($AGILOG) + { + if (/^agi_(\w+)\:\s+(.*)$/) + { + $AGI{$1} = $2; + } + } + if (/^agi_uniqueid\:\s+(.*)$/) {$unique_id = $1; $uniqueid = $unique_id;} + if (/^agi_priority\:\s+(.*)$/) {$priority = $1;} + if (/^agi_channel\:\s+(.*)$/) {$channel = $1;} + if (/^agi_extension\:\s+(.*)$/) {$extension = $1;} + if (/^agi_type\:\s+(.*)$/) {$type = $1;} + if (/^agi_callerid\:\s+(.*)$/) {$callerid = $1;} + if (/^agi_calleridname\:\s+(.*)$/) {$calleridname = $1;} + } + +if ( (length($callerid)>20) && ($callerid =~ /\"\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S/) ) + { + $callerid =~ s/^\"//gi; + $callerid =~ s/\".*$//gi; + $callerid =~ s/ .*//gi; + ### set the callerid to the ACQS value(calleridname) + print "SET CALLERID $callerid\n"; + $result = ; + checkresult($result); + if ($AGILOG) {$agi_string = "callerID changed: $callerid"; &agi_output;} + } +if ( ( +(length($calleridname)>5) && ( (!$callerid) or ($callerid =~ /unknown|private|00000000/i) or ($callerid =~ /5551212/) ) +) or ( (length($calleridname)>17) && ($calleridname =~ /\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d/) ) ) + { + $calleridname =~ s/ .*//gi; + $callerid = $calleridname; + ### set the callerid to the ACQS value(calleridname) + print "SET CALLERID $callerid\n"; + $result = ; + checkresult($result); + if ($AGILOG) {$agi_string = "callerID changed: $callerid"; &agi_output;} + } + +if ($AGILOG) {$agi_string = "AGI Environment Dump:"; &agi_output;} + +foreach $i (sort keys %AGI) + { + if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;} + } + +if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|$calleridname|$priority|"; &agi_output;} + +$VDADcampaign=''; +$VDADphone=''; +$VDADphone_code=''; +$survey_drop=0; + +$callerid =~ s/\"//gi; +$callerid =~ s/ .*//gi; +$CIDlead_id = $callerid; +$CIDlead_id = substr($CIDlead_id, 10, 10); +$CIDlead_id = ($CIDlead_id + 0); + +if ($AGILOG) {$agi_string = "+++++ VDAD START : |$CIDlead_id|$now_date|$AST_ver|$priority|"; &agi_output;} + +if ( ($channel =~ /Local/i) && ($AST_ver !~ /^1\.0\.8|^1\.0\.9/) ) + { + $LRct = $AGI->get_variable('LRct'); + $LRct_p = sprintf("%03d", $LRct); + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='LocalEXIT-$priority',lead_id='$CIDlead_id',step='$LRct';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01120'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + + if ($AGILOG) {$agi_string = "+++++ VDAD START LOCAL CHANNEL: EXITING- $priority $LRct_p"; &agi_output;} + if ( ($priority > 2) && ($priority <= 7) ) + {usleep(1*10*1000);} # sleep for 1 hundredth of a second + if ($priority >= 8) + { + ### find list of callback statuses + $SCstatuses="'CBHOLD'"; + $stmtA = "select status from vicidial_statuses where scheduled_callback='Y' limit 10000000;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArowsSCS=$sthA->rows; + $rec_count=0; + while ($sthArowsSCS > $rec_count) + { + @aryA = $sthA->fetchrow_array; + $SCstatuses .= ",'$aryA[0]'"; + $rec_count++; + } + $sthA->finish(); + + if ($AGILOG) {$agi_string = "LLLLLLLLL LOCAL CHANNEL PRIORITY 4 LOGGING: (this is usually caused by carrier issues) LRERR $priority"; &agi_output;} + + # flag the lead as being Answered or Picked up + $stmtA = "UPDATE vicidial_list set status='LRERR' where lead_id='$CIDlead_id' and status NOT IN($SCstatuses);"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01100'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- LRERR vicidial_list LRERR update: |$affected_rows|$uniqueid|$CIDlead_id|"; &agi_output;} + + $xCLlist_id=0; + $called_count=0; + $stmtA = "SELECT list_id,security_phrase,called_count,phone_number,phone_code from vicidial_list where lead_id='$CIDlead_id' limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArowsLI=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01101'; $MEL_aff_rows=$sthArowsLI; &mysql_error_logging; + if ($sthArowsLI > 0) + { + @aryA = $sthA->fetchrow_array; + $xCLlist_id = $aryA[0]; + $security_phrase = $aryA[1]; + $called_count = $aryA[2]; + $VDADphone = $aryA[3]; + $VDADphone_code = $aryA[4]; + } + $sthA->finish(); + + $stmtA = "SELECT campaign_id,phone_number,phone_code,lead_id,call_time,alt_dial,queue_priority FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01102'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $VDADcampaign = $aryA[0]; + $VDADphone = $aryA[1]; + $VDADphone_code = $aryA[2]; + $VDADlead_id = $aryA[3]; + $VDADcall_time = $aryA[4]; + $VDADalt_dial = $aryA[5]; + $VDADqueue_priority = $aryA[6]; + } + $sthA->finish(); + if ($sthArows < 1) + { + $stmtA = "SELECT campaign_id FROM vicidial_lists where list_id='$xCLlist_id' limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01121'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $VDADcampaign = $aryA[0]; + } + $sthA->finish(); + } + + $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed,alt_dial,list_id,called_count) values('$uniqueid','$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','LRERR','$VDADphone_code','$VDADphone','VDAD','N','$VDADalt_dial','$xCLlist_id','$called_count')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01103'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + + if ($AGILOG) {$agi_string = "-- LRERR : |$VDADlead_id|$CIDlead_id|insert to vicidial_log: $uniqueid"; &agi_output;} + + $stmtA = "INSERT INTO vicidial_log_extended set uniqueid='$uniqueid',server_ip='$VARserver_ip',call_date='$SQLdate',lead_id = '$CIDlead_id',caller_code='$callerid',custom_call_id='';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01104'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- LRERR VLE insert: |$affected_rows|\n|$stmtA|"; &agi_output;} + } + exit; + } + +$stmtA = "SELECT count(*) FROM vicidial_live_agents where callerid='$callerid';"; +$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; +$sthA->execute or die "executing: $stmtA ", $dbhA->errstr; +$sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01002'; $MEL_aff_rows=$sthArows; &mysql_error_logging; +$rec_count=0; +while ($sthArows > $rec_count) + { + @aryA = $sthA->fetchrow_array; + $Pseudo_duplicate_count = $aryA[0]; + $rec_count++; + } +$sthA->finish(); +if ($AGILOG) {$agi_string = "$Pseudo_duplicate_count|$stmtA|"; &agi_output;} + +if ($Pseudo_duplicate_count > 0) + { + if ($AGILOG) {$agi_string = "+++++ VDAD START PSEUDO DUPLICATE: EXITING- $priority"; &agi_output;} + exit; + } + +$stmtA = "SELECT count(*) FROM vicidial_auto_calls where callerid='$callerid' and status IN('LIVE','XFER');"; +$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; +$sthA->execute or die "executing: $stmtA ", $dbhA->errstr; +$sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01003'; $MEL_aff_rows=$sthArows; &mysql_error_logging; +$rec_count=0; +while ($sthArows > $rec_count) + { + @aryA = $sthA->fetchrow_array; + $dialplan_duplicate_count = $aryA[0]; + $rec_count++; + } +$sthA->finish(); +if ($AGILOG) {$agi_string = "$dialplan_duplicate_count|$stmtA|"; &agi_output;} + +if ($dialplan_duplicate_count > 0) + { + if ($AGILOG) {$agi_string = "+++++ VDAD START DIALPLAN DUPLICATE: EXITING- $priority"; &agi_output;} + exit; + } + +### Grab call parameters from vicidial_auto_calls table +$stmtA = "UPDATE vicidial_auto_calls set uniqueid='$unique_id', channel='$channel',status='LIVE',stage='LIVE-0' where callerid='$callerid' order by call_time desc limit 1;"; +$VDACaffected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01004'; $MEL_aff_rows=$VDACaffected_rows; &mysql_error_logging; +if ($AGILOG) {$agi_string = "-- VDAD : |$VDACaffected_rows|update of vac table: $callerid\n|$stmtA|"; &agi_output;} +if ($VDACaffected_rows < 1) + { + if ($AGILOG) {$agi_string = "-- NO VDAC FOUND!!!!!: $callerid"; &agi_output;} + + $stmtA = "SELECT cmd_line_k,entry_date,cmd_line_j FROM vicidial_manager where callerid='$callerid' and action='Originate' order by entry_date,cmd_line_k desc limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01070'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + if ($AGILOG) {$agi_string = "VDAC-data|$aryA[0]|$aryA[1]|$aryA[2]|"; &agi_output;} + $VDADnotes = $aryA[0]; + $VDADnotes =~ s/VDACnote: //gi; + @VDAC_ARY = split(/\|/,$VDADnotes); + $VDADcampaign = $VDAC_ARY[0]; + $VDADlead_id = $VDAC_ARY[1]; + $VDADphone_code = $VDAC_ARY[2]; + $VDADphone = $VDAC_ARY[3]; + $VDADorigin = $VDAC_ARY[4]; + $VDADcall_time = $aryA[1]; + $VDADalt_dial = $VDAC_ARY[5]; + $VDADqueue_priority = $VDAC_ARY[6]; + $sthA->finish(); + $VDACaffected_rows=1; + + $stmtA = "INSERT INTO vicidial_auto_calls (server_ip,campaign_id,status,lead_id,uniqueid,callerid,channel,phone_code,phone_number,call_time,call_type,stage,queue_priority) values('$VARserver_ip','$VDADcampaign','LIVE','$VDADlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$VDADcall_time','$VDADorigin','LIVE-0','$VDADqueue_priority')"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01071'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "$affected_rows|VDAC-reinsert|$stmtA|"; &agi_output;} + } + else + { + if ($AGILOG) {$agi_string = "-- NO VDM FOUND!!!!!!!!!!: $callerid"; &agi_output;} + } + } +if ($VDACaffected_rows > 0) + { + ### find list of callback statuses + $SCstatuses="'CBHOLD'"; + $stmtA = "select status from vicidial_statuses where scheduled_callback='Y' limit 10000000;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArowsSCS=$sthA->rows; + $rec_count=0; + while ($sthArowsSCS > $rec_count) + { + @aryA = $sthA->fetchrow_array; + $SCstatuses .= ",'$aryA[0]'"; + $rec_count++; + } + $sthA->finish(); + $stmtA = "select status from vicidial_campaign_statuses where scheduled_callback='Y' limit 10000000;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArowsSCS=$sthA->rows; + $rec_count=0; + while ($sthArowsSCS > $rec_count) + { + @aryA = $sthA->fetchrow_array; + $SCstatuses .= ",'$aryA[0]'"; + $rec_count++; + } + $sthA->finish(); + + # flag the lead as being Answered or Picked up + $stmtA = "UPDATE vicidial_list set status='PU' where lead_id='$CIDlead_id' and status NOT IN($SCstatuses);"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01005'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAD vicidial_list PU update: |$affected_rows|$uniqueid|"; &agi_output;} + + $stmtA = "SELECT campaign_id,phone_number,phone_code,lead_id,call_time,alt_dial,queue_priority FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01006'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $VDADcampaign = $aryA[0]; + $VDADphone = $aryA[1]; + $VDADphone_code = $aryA[2]; + $VDADlead_id = $aryA[3]; + $VDADcall_time = $aryA[4]; + $VDADalt_dial = $aryA[5]; + $VDADqueue_priority = $aryA[6]; + } + $sthA->finish(); + + ##### BEGIN - Max call stats + $outcalls_count=0; + ### Get count of concurrent calls for this campaign + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where campaign_id='$VDADcampaign';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='02093'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $outcalls_count = $aryA[0]; + } + $sthA->finish(); + + $STATSmax_outbound=0; + $stmtA = "SELECT max_outbound from vicidial_daily_max_stats where campaign_id='$VDADcampaign' and stats_type='CAMPAIGN' and stats_flag='OPEN' order by update_time desc limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='02094'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $STATSmax_outbound = $aryA[0]; + $sthA->finish(); + + $update_SQL=''; + if ($STATSmax_outbound < $outcalls_count) + {$update_SQL .= ",max_outbound='$outcalls_count'";} + + if (length($update_SQL) > 5) + { + $stmtA = "UPDATE vicidial_daily_max_stats SET update_time=NOW()$update_SQL where campaign_id='$VDADcampaign' and stats_type='CAMPAIGN' and stats_flag='OPEN';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='02095'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "DAILY STATS UPDATE $VDADcampaign|$affected_rows|$stmtA|"; &agi_output;} + } + } + else + { + $stmtA = "INSERT INTO vicidial_daily_max_stats SET stats_date='$YMD',update_time=NOW(),max_outbound='$outcalls_count',campaign_id='$VDADcampaign',stats_type='CAMPAIGN',stats_flag='OPEN';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='02096'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "DAILY STATS INSERT $VDADcampaign|$affected_rows|$stmtA|\n"; &agi_output;} + } + ##### END - Max call stats + + ### Grab campaign values from the database + $stmtA = "SELECT drop_call_seconds,drop_action,safe_harbor_exten,concurrent_transfers,next_agent_call,voicemail_ext,drop_inbound_group,use_internal_dnc,use_campaign_dnc,cpd_amd_action,am_message_exten,three_way_call_cid,campaign_cid,survey_first_audio_file,survey_opt_in_audio_file,survey_ni_audio_file,survey_third_audio_file,survey_fourth_audio_file,extension_appended_cidname,queue_priority,closer_campaigns,queuemetrics_phone_environment,campaign_recording,campaign_rec_filename,safe_harbor_audio,safe_harbor_menu_id,survey_recording,safe_harbor_audio_field,use_other_campaign_dnc,cpd_unknown_action,routing_initiated_recordings,campaign_rec_exten FROM vicidial_campaigns where campaign_id = '$VDADcampaign';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01007'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $DBdrop_call_seconds = $aryA[0]; + $DBdrop_action = $aryA[1]; + $DBsafe_harbor_exten = $aryA[2]; + $DBconcurrent_transfers = $aryA[3]; + if ($DBdrop_call_seconds) {$DROP_TIME = $DBdrop_call_seconds;} + if ($DBdrop_action) {$drop_action = $DBdrop_action;} + if ($DBsafe_harbor_exten) {$safe_harbor_exten = $DBsafe_harbor_exten;} + $CAMP_callorder = $aryA[4]; + $VDADvoicemail_ext = $aryA[5]; + $drop_inbound_group = $aryA[6]; + $use_internal_dnc = $aryA[7]; + $use_campaign_dnc = $aryA[8]; + $cpd_amd_action = $aryA[9]; + $am_message_exten = $aryA[10]; + $three_way_call_cid = $aryA[11]; + $campaign_cid = $aryA[12]; + $survey_first_audio_file = $aryA[13]; + $survey_opt_in_audio_file = $aryA[14]; + $survey_ni_audio_file = $aryA[15]; + $survey_third_audio_file = $aryA[16]; + $survey_fourth_audio_file = $aryA[17]; + $extension_appended_cidname = $aryA[18]; + $VDADqueue_priority = $aryA[19]; + $closer_campaigns = $aryA[20]; + $queuemetrics_phone_environment = $aryA[21]; + $campaign_recording = $aryA[22]; + $campaign_rec_filename = $aryA[23]; + $safe_harbor_audio = $aryA[24]; + $safe_harbor_menu_id = $aryA[25]; + $survey_recording = $aryA[26]; + $safe_harbor_audio_field = $aryA[27]; + $use_other_campaign_dnc = $aryA[28]; + $cpd_unknown_action = $aryA[29]; + $routing_initiated_recordings = $aryA[30]; + $campaign_rec_exten = $aryA[31]; + if (length($closer_campaigns) > 2) + { + $closer_campaigns =~ s/^ | -$//gi; + $closer_campaigns =~ s/ /','/gi; + $closer_campaigns = "'$closer_campaigns'"; + } + else {$closer_campaigns="''";} + } + $sthA->finish(); + + ### start recording if survey recording is enabled + # removed + + ### pre-generate Cepstral first and last name as an audio file + # if ($call_handle_method =~ /SURVEYCAMPCEP/) removed + + $xCLlist_id=0; + $called_count=0; + $stmtA = "SELECT list_id,security_phrase,called_count from vicidial_list where lead_id='$CIDlead_id' limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArowsLI=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01105'; $MEL_aff_rows=$sthArowsLI; &mysql_error_logging; + if ($sthArowsLI > 0) + { + @aryA = $sthA->fetchrow_array; + $xCLlist_id = $aryA[0]; + $security_phrase = $aryA[1]; + $called_count = $aryA[2]; + } + $sthA->finish(); + + ($END_s_hires, $END_usec) = gettimeofday(); + $net_microseconds = $END_usec - $START_usec; + if ($net_microseconds < 0) + { + $net_microseconds = ($net_microseconds + 1000000); + $END_s_hires = ($END_s_hires - 1); + } + $net_microseconds = sprintf("%06d", $net_microseconds); + $net_seconds = $END_s_hires - $START_s_hires; + $net_duration = "$net_seconds.$net_microseconds"; + ($START_s_hires, $START_usec) = gettimeofday(); + $RUN_time = sprintf("%.3f", $net_duration); + if ($AGILOG) {$agi_string = "Preprocess time: |$RUN_time (".$END_s_hires.$END_usec." - ".$ORIG_time.")|"; &agi_output;} + + $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed,alt_dial,list_id,comments,called_count) values('$uniqueid','$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','$vdlog_status','$VDADphone_code','$VDADphone','VDAD','N','$VDADalt_dial','$xCLlist_id','$RUN_time','$called_count')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01008'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + + if ($AGILOG) {$agi_string = "-- VDAD : |$VDADlead_id|$CIDlead_id|insert to vicidial_log: $uniqueid"; &agi_output;} + + $stmtA = "INSERT INTO vicidial_log_extended set uniqueid='$uniqueid',server_ip='$VARserver_ip',call_date='$SQLdate',lead_id = '$CIDlead_id',caller_code='$callerid',custom_call_id='';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01067'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAD VLE insert: |$affected_rows|\n|$stmtA|"; &agi_output;} + + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='preroute',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01122'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + + +################################################################################ +##### PLAY REMINDER MESSAGE ##### removed + + +################################################################################ +##### START DO THE SURVEY ##### +if ($call_handle_method =~ /SURVEY/) + { + $AGI->stream_file('sip-silence'); + + ############# BEGIN CPD AMD SECTION ############################ + # if ($cpd_amd_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/) removed + + ############# BEGIN CPD Unknown SECTION ############################ + # if ($cpd_unknown_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/) removed + + $stmtA = "UPDATE vicidial_auto_calls set last_update_time='$FDtsSQLdate',stage='SURVEY-0' where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01014'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAC posttime record: |$affected_rows|$FDtsSQLdate|$callerid|SURVEY|"; &agi_output;} + + ### check to see if the SURVEY settings should be pulled from the campaign settings in the database + if ($call_handle_method =~ /SURVEYCAMP/) + { + $stmtA = "SELECT survey_dtmf_digits,survey_ni_digit,survey_method,survey_no_response_action,survey_ni_status,survey_response_digit_map,survey_xfer_exten,survey_camp_record_dir,survey_third_digit,survey_third_status,survey_third_exten,survey_fourth_digit,survey_fourth_status,survey_fourth_exten,survey_menu_id,survey_wait_sec FROM vicidial_campaigns where campaign_id='$VDADcampaign';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01015'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $survey_dtmf_digits = $aryA[0]; + $survey_ni_digit = $aryA[1]; + $survey_method = $aryA[2]; + $survey_no_response_action = $aryA[3]; + $survey_ni_status = $aryA[4]; + $survey_response_digit_map = $aryA[5]; + $survey_xfer_exten = $aryA[6]; + $survey_camp_record_dir = $aryA[7]; + $survey_third_digit = $aryA[8]; + $survey_third_status = $aryA[9]; + $survey_third_exten = $aryA[10]; + $survey_fourth_digit = $aryA[11]; + $survey_fourth_status = $aryA[12]; + $survey_fourth_exten = $aryA[13]; + $survey_menu_id = $aryA[14]; + $survey_wait_sec = $aryA[15]; + + @digit_map = split(/\|/,$survey_response_digit_map); + + $rec_count++; + } + $sthA->finish(); + } + + # play the message and let them press a number + $digits_to_collect = '1'; + $opt_code = enter_pin_number($survey_first_audio_file,$survey_dtmf_digits,$survey_method,$survey_wait_sec); + if (length($opt_code) < 1) {$opt_code = 'X';} + $opt_description = $opt_code; + + $w=0; + foreach (@digit_map) + { + if ($digit_map[$w] =~ /^$opt_code/) {$opt_description = $digit_map[$w]} + $w++; + } + + # record what they entered + $sec_phrase_SQL=''; + if (length($security_phrase)<1) + {$sec_phrase_SQL = "security_phrase='$opt_description',";} + $stmtA = "UPDATE vicidial_list set $sec_phrase_SQL status='PM' where lead_id = '$CIDlead_id';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01016'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_list OPT_CODE update: |$affected_rows|$CIDlead_id|$opt_code|"; + &agi_output; + } + + # they opted out + if ($opt_code =~ /$survey_ni_digit/) + { + if ( $survey_ni_audio_file ne "") + { + if ($survey_ni_audio_file =~ /\|/) + { + @survey_ni_audio_file_array = split(/\|/,$survey_ni_audio_file); + $w=0; + foreach(@survey_ni_audio_file_array) + { + if (length($survey_ni_audio_file_array[$w])>0) + { + $AGI->stream_file("$survey_ni_audio_file_array[$w]"); + } + $w++; + } + } + else + {$AGI->stream_file("$survey_ni_audio_file");} + } + + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01017'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|"; + &agi_output; + } + + $Euniqueid=$uniqueid; + $Euniqueid =~ s/\.\d+//gi; + $now_date_epoch = time(); + $drop_seconds = $now_date_epoch - $start_time_epoch; + $stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_ni_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01018'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_log update: $survey_ni_status|$affected_rows|$uniqueid|$drop_seconds|"; + &agi_output; + } + + $stmtA = "UPDATE vicidial_list set status='$survey_ni_status' where lead_id = '$CIDlead_id';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01019'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_list update: $survey_ni_status|$affected_rows|$CIDlead_id"; + &agi_output; + } + + if (($use_internal_dnc =~ /Y|AREACODE/) && ($survey_ni_status eq "DNC")) + { + $stmtA = "INSERT INTO vicidial_dnc set phone_number='$VDADphone';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01020'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_dnc insert: $affected_rows|$VDADphone"; + &agi_output; + } + $stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='-SYSINT-', action='add', action_date=NOW(), user='OUTAGI';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01112'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;} + } + if (($use_campaign_dnc =~ /Y|AREACODE/) && ($survey_ni_status eq "DNC")) + { + $stmtA = "SELECT use_other_campaign_dnc FROM vicidial_campaigns where campaign_id='$VDADcampaign';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01106'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $use_other_campaign_dnc = $aryA[0]; + } + $sthA->finish(); + $temp_campaign_id = $VDADcampaign; + if (length($use_other_campaign_dnc) > 0) {$temp_campaign_id = $use_other_campaign_dnc;} + + $stmtA = "INSERT INTO vicidial_campaign_dnc set phone_number='$VDADphone', campaign_id='$temp_campaign_id';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01021'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_campaign_dnc insert: $affected_rows|$VDADphone|$VDADcampaign|$temp_campaign_id"; + &agi_output; + } + $stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='$temp_campaign_id', action='add', action_date=NOW(), user='OUTAGI';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01113'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;} + } + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-NI',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01124'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + $AGI->hangup(); + + exit; + } + + ### third digit option + if ($opt_code =~ /$survey_third_digit/) + { + if ( $survey_third_audio_file ne "") + { + if ($survey_third_audio_file =~ /\|/) + { + @survey_third_audio_file_array = split(/\|/,$survey_third_audio_file); + $w=0; + foreach(@survey_third_audio_file_array) + { + if (length($survey_third_audio_file_array[$w])>0) + { + $AGI->stream_file("$survey_third_audio_file_array[$w]"); + } + $w++; + } + } + else + {$AGI->stream_file("$survey_third_audio_file");} + } + + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01017'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|"; + &agi_output; + } + + $Euniqueid=$uniqueid; + $Euniqueid =~ s/\.\d+//gi; + $now_date_epoch = time(); + $drop_seconds = $now_date_epoch - $start_time_epoch; + $stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_third_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01018'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_log update: $survey_third_status|$affected_rows|$uniqueid|$drop_seconds|"; + &agi_output; + } + + $stmtA = "UPDATE vicidial_list set status='$survey_third_status' where lead_id = '$CIDlead_id';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01019'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_list update: $survey_third_status|$affected_rows|$CIDlead_id"; + &agi_output; + } + + if (($use_internal_dnc =~ /Y|AREACODE/) && ($survey_third_status eq "DNC")) + { + $stmtA = "INSERT INTO vicidial_dnc set phone_number='$VDADphone';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01020'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_dnc insert: $affected_rows|$VDADphone"; + &agi_output; + } + $stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='-SYSINT-', action='add', action_date=NOW(), user='OUTAGI';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01114'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;} + } + if (($use_campaign_dnc =~ /Y|AREACODE/) && ($survey_third_status eq "DNC")) + { + $stmtA = "SELECT use_other_campaign_dnc FROM vicidial_campaigns where campaign_id='$VDADcampaign';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01107'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $use_other_campaign_dnc = $aryA[0]; + } + $sthA->finish(); + $temp_campaign_id = $VDADcampaign; + if (length($use_other_campaign_dnc) > 0) {$temp_campaign_id = $use_other_campaign_dnc;} + + $stmtA = "INSERT INTO vicidial_campaign_dnc set phone_number='$VDADphone', campaign_id='$temp_campaign_id';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01021'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_campaign_dnc insert: $affected_rows|$VDADphone|$VDADcampaign|$temp_campaign_id"; + &agi_output; + } + $stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='$temp_campaign_id', action='add', action_date=NOW(), user='OUTAGI';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01119'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;} + } + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-3rd',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01125'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + + if (length($survey_third_exten) > 0) + { + if ($AGILOG) {$agi_string = "exiting the VDAD SURVEY app, transferring call to $survey_third_exten"; &agi_output;} + print "SET CONTEXT $ext_context\n"; + $result = ; + checkresult($result); + print "SET EXTENSION $survey_third_exten\n"; + $result = ; + checkresult($result); + print "SET PRIORITY 1\n"; + $result = ; + checkresult($result); + } + else + {$AGI->hangup();} + + exit; + } + + + ### fourth digit option + if ($opt_code =~ /$survey_fourth_digit/) + { + if ( $survey_fourth_audio_file ne "") + { + if ($survey_fourth_audio_file =~ /\|/) + { + @survey_fourth_audio_file_array = split(/\|/,$survey_fourth_audio_file); + $w=0; + foreach(@survey_fourth_audio_file_array) + { + if (length($survey_fourth_audio_file_array[$w])>0) + { + $AGI->stream_file("$survey_fourth_audio_file_array[$w]"); + } + $w++; + } + } + else + {$AGI->stream_file("$survey_fourth_audio_file");} + } + + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01017'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|"; + &agi_output; + } + + $Euniqueid=$uniqueid; + $Euniqueid =~ s/\.\d+//gi; + $now_date_epoch = time(); + $drop_seconds = $now_date_epoch - $start_time_epoch; + $stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_fourth_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01018'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_log update: $survey_fourth_status|$affected_rows|$uniqueid|$drop_seconds|"; + &agi_output; + } + + $stmtA = "UPDATE vicidial_list set status='$survey_fourth_status' where lead_id = '$CIDlead_id';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01019'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_list update: $survey_fourth_status|$affected_rows|$CIDlead_id"; + &agi_output; + } + + if (($use_internal_dnc =~ /Y|AREACODE/) && ($survey_fourth_status eq "DNC")) + { + $stmtA = "INSERT INTO vicidial_dnc set phone_number='$VDADphone';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01020'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_dnc insert: $affected_rows|$VDADphone"; + &agi_output; + } + $stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='-SYSINT-', action='add', action_date=NOW(), user='OUTAGI';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01115'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;} + } + if (($use_campaign_dnc =~ /Y|AREACODE/) && ($survey_fourth_status eq "DNC")) + { + $stmtA = "SELECT use_other_campaign_dnc FROM vicidial_campaigns where campaign_id='$VDADcampaign';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01108'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $use_other_campaign_dnc = $aryA[0]; + } + $sthA->finish(); + $temp_campaign_id = $VDADcampaign; + if (length($use_other_campaign_dnc) > 0) {$temp_campaign_id = $use_other_campaign_dnc;} + + $stmtA = "INSERT INTO vicidial_campaign_dnc set phone_number='$VDADphone', campaign_id='$temp_campaign_id';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01021'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_campaign_dnc insert: $affected_rows|$VDADphone|$VDADcampaign|$temp_campaign_id"; + &agi_output; + } + $stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='$temp_campaign_id', action='add', action_date=NOW(), user='OUTAGI';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01116'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;} + } + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-4th',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01126'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + if (length($survey_fourth_exten) > 0) + { + if ($AGILOG) {$agi_string = "exiting the VDAD SURVEY app, transferring call to $survey_fourth_exten"; &agi_output;} + print "SET CONTEXT $ext_context\n"; + $result = ; + checkresult($result); + print "SET EXTENSION $survey_fourth_exten\n"; + $result = ; + checkresult($result); + print "SET PRIORITY 1\n"; + $result = ; + checkresult($result); + + } + else + {$AGI->hangup();} + + exit; + } + + # they opted in + if ( ($opt_code =~ /\d/) || ($survey_no_response_action =~ /OPTOUT/) ) + { + $now_date_epoch = time(); + $FDtarget = ($now_date_epoch + 60); + ($Fsec,$Fmin,$Fhour,$Fmday,$Fmon,$Fyear,$Fwday,$Fyday,$Fisdst) = localtime($FDtarget); + $Fyear = ($Fyear + 1900); + $Fmon++; + if ($Fmon < 10) {$Fmon = "0$Fmon";} + if ($Fmday < 10) {$Fmday = "0$Fmday";} + if ($Fhour < 10) {$Fhour = "0$Fhour";} + if ($Fmin < 10) {$Fmin = "0$Fmin";} + if ($Fsec < 10) {$Fsec = "0$Fsec";} + $FDtsSQLdate = "$Fyear$Fmon$Fmday$Fhour$Fmin$Fsec"; + + $stmtA = "UPDATE vicidial_auto_calls set last_update_time='$FDtsSQLdate' where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01022'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAC posttime record: |$affected_rows|$FDtsSQLdate|$callerid|"; &agi_output;} + + if ( $survey_opt_in_audio_file ne "") + { + if ($survey_opt_in_audio_file =~ /\|/) + { + @survey_opt_in_audio_file_array = split(/\|/,$survey_opt_in_audio_file); + $w=0; + foreach(@survey_opt_in_audio_file_array) + { + if (length($survey_opt_in_audio_file_array[$w])>0) + { + $AGI->stream_file("$survey_opt_in_audio_file_array[$w]"); + } + $w++; + } + } + else + {$AGI->stream_file("$survey_opt_in_audio_file");} + } + + if ($survey_method =~ /VOICEMAIL|EXTENSION|HANGUP|CALLMENU|VMAIL_NO_INST/) + { + $DROPexten=''; + if ($survey_method =~ /VOICEMAIL|VMAIL_NO_INST/) + { + $newcallerid = "\"$callerid <$VDADphone>\""; + $AGI->set_callerid($newcallerid); + print STDERR "Setting CID \"$newcallerid\"\n"; + checkresult($result); + if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;} + $survey_status='SVYVM'; + if ($survey_method =~ /VMAIL_NO_INST/) + {$voicemail_dump_exten = $voicemail_dump_exten_no_inst;} + if (length($VDADvoicemail_ext)>0) + {$DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext";} + } + if ($survey_method =~ /EXTENSION/) + { + $survey_status='SVYEXT'; + if (length($survey_xfer_exten)>0) + { + $DROPexten = "$survey_xfer_exten"; + + if ($three_way_call_cid !~ /CUSTOMER/) + { + $newcallerid = "\"$campaign_cid <$campaign_cid>\""; + $AGI->set_callerid($newcallerid); + + print STDERR "Setting CID \"$newcallerid\"\n"; + checkresult($result); + if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;} + } + } + } + if ($survey_method =~ /CALLMENU/) + { + $newcallerid = "\"$callerid <$VDADphone>\""; + $AGI->set_callerid($newcallerid); + print STDERR "Setting CID \"$newcallerid\"\n"; + checkresult($result); + if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;} + $survey_status='SVYCLM'; + if (length($survey_menu_id)>0) + { + $DROPexten = 's'; + $ext_context = $survey_menu_id; + } + } + if ($survey_method =~ /HANGUP/) + { + $survey_status='SVYHU'; + } + + $Euniqueid=$uniqueid; + $Euniqueid =~ s/\.\d+//gi; + $now_date_epoch = time(); + $drop_seconds = $now_date_epoch - $start_time_epoch; + $stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01023'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_log update: $survey_status|$affected_rows|$uniqueid|$drop_seconds|"; + &agi_output; + } + + $stmtA = "UPDATE vicidial_list set status='$survey_status' where lead_id = '$CIDlead_id';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01024'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_list update: $survey_status|$affected_rows|$CIDlead_id"; + &agi_output; + } + + if (length($DROPexten) > 0) + { + $stmtA = "UPDATE vicidial_auto_calls set status='XFER',stage='XFER-0' where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01025'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAC XFER status: |$affected_rows|$FDtsSQLdate|$callerid|"; &agi_output;} + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-exten',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01127'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + + if ($AGILOG) {$agi_string = "exiting the VDAD SURVEY app, transferring call to $DROPexten $ext_context"; &agi_output;} + print "SET CONTEXT $ext_context\n"; + $result = ; + checkresult($result); + print "SET EXTENSION $DROPexten\n"; + $result = ; + checkresult($result); + print "SET PRIORITY 1\n"; + $result = ; + checkresult($result); + + exit; + } + + if ($survey_method =~ /HANGUP/) + { + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01026'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|"; + &agi_output; + } + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-Hangup',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01128'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + $AGI->hangup(); + + exit; + } + } + + if ($survey_method =~ /CAMPREC/) + { + if ($survey_method =~ /60/) + {$timeout=60000;} + if ($survey_method =~ /WAV/) + {$format='WAV';} + if ($survey_method =~ /GSM/) + {$format='GSM';} + + $survey_status='SVYREC'; + + $Euniqueid=$uniqueid; + $Euniqueid =~ s/\.\d+//gi; + $now_date_epoch = time(); + $drop_seconds = $now_date_epoch - $start_time_epoch; + $stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01027'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_log update: $survey_status|$affected_rows|$uniqueid|$drop_seconds|"; + &agi_output; + } + + $stmtA = "UPDATE vicidial_list set status='$survey_status' where lead_id = '$CIDlead_id';"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01028'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_list update: $survey_status|$affected_rows|$CIDlead_id"; + &agi_output; + } + + if ( -e ('$survey_camp_record_dir/$VDADcampaign')) + {$do_nothing=1;} + else + {`mkdir -p --mode=0666 $survey_camp_record_dir/$VDADcampaign`;} + + $AGI->stream_file('beep'); + + $interrupt_digit = $AGI->record_file("$survey_camp_record_dir/$VDADcampaign/$VDADphone$filedate", "$format", '123456789*#', "$timeout", '0', 1, '10'); + if ($AGILOG) + { + $agi_string = "RECORDING FINISHED: $interrupt_digit|$survey_camp_record_dir/$VDADcampaign/$VDADphone$filedate|"; + &agi_output; + } + + $now_date_epoch = time(); + $drop_seconds = $now_date_epoch - $start_time_epoch; + $stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01029'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_log update: $survey_status|$affected_rows|$uniqueid|$drop_seconds|"; + &agi_output; + } + + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01030'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|"; + &agi_output; + } + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-REC',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01129'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + + $AGI->hangup(); + + exit; + } + } + else + { + $Euniqueid=$uniqueid; + $Euniqueid =~ s/\.\d+//gi; + $now_date_epoch = time(); + $drop_seconds = $now_date_epoch - $start_time_epoch; + $stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='PM', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";"; + if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01031'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vicidial_log update: PM|$affected_rows|$uniqueid|$drop_seconds|"; + &agi_output; + } + + if ($survey_no_response_action !~ /DROP/) + { + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01032'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) + { + $agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|"; + &agi_output; + } + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-SURVEY-DROP',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01130'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + $AGI->hangup(); + + exit; + } + else + { + $survey_drop++; + $drop_timer = (($drop_timer + $DROP_TIME) + 1); + $agi_string = "-- VDAD survey no-response go to campaign DROP |$drop_timer|$DROP_TIME|"; + &agi_output; + } + } + } +################################################################################ +##### END DO THE SURVEY ##### + + + + +if ($survey_drop < 1) + {$drop_timer=0;} +$drop_seconds=0; +$hold_message_counter=25; +$hold_tone_counter=0; + +while ($drop_timer <= $DROP_TIME) + { + $channel_status = $AGI->channel_status("$channel"); + if ($channel_status < 1) + { + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $channel_status_DC = $AGI->channel_status("$channel"); + + if ($channel_status_DC < 1) + { + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} + if ($drop_timer < $DROP_TIME) {$drop_seconds = $drop_timer;} + $drop_timer = ($drop_timer + $DROP_TIME); + } + } + + ############# BEGIN CPD AMD SECTION ############################ + # if ($cpd_amd_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/) removed + + ############# BEGIN CPD Unknown SECTION ############################ + # if ($cpd_unknown_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/) removed + + + + ############################################################################ + ### BEGIN attempt to send call to agent + ############################################################################ + $rec_countCUSTDATA=0; + $rec_countWAIT=0; + $cbc=0; + $aco_sub=0; + $agent_call_order='order by last_call_finish'; + if ($CAMP_callorder =~ /longest_wait_time/i) {$agent_call_order = 'order by last_state_change';} + if ($CAMP_callorder =~ /overall_user_level/i) {$agent_call_order = 'order by user_level desc,last_call_finish';} + if ($CAMP_callorder =~ /oldest_call_start/i) {$agent_call_order = 'order by last_call_time';} + if ($CAMP_callorder =~ /oldest_call_finish/i) {$agent_call_order = 'order by last_call_finish';} + if ($CAMP_callorder =~ /random/i) {$agent_call_order = 'order by random_id';} + if ($CAMP_callorder =~ /campaign_rank/i) {$agent_call_order = 'order by campaign_weight desc,last_call_finish';} + if ($CAMP_callorder =~ /fewest_calls/i) {$aco_sub=1; $agent_call_order = 'order by calls_today';} + if ($CAMP_callorder =~ /campaign_grade_random/i) {$aco_sub=1; $agent_call_order = 'order by random_id';} + + # removed agent_search_method + ################################################################################################### + ##### Attempt to send call to an agent on any server ##### + # removed concurrent_transfers, force set to 1000 to remove any delays + $concurrent_transfers = 1000; + + $cbc=0; + $rec_countWAITremOUT=0; + $rec_countWAITremIN=0; + $rec_countWAITremINallowed=0; + $agentdirect_count=0; + $READY_agent_closer_camps=''; + $READY_users=''; + $READY_users_count=0; + $AGENTDIRECT_user_ids=''; + ### find number of outbound calls waiting in line in front of this call + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and lead_id != '$CIDlead_id' and campaign_id = '$VDADcampaign' and call_time < \"$VDADcall_time\";"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01040'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $rec_countWAITremOUT = $aryA[0]; + } + $sthA->finish(); + if ($AGILOG) {$agi_string = "$rec_countWAITremOUT|$stmtA|"; &agi_output;} + + if (length($closer_campaigns) > 3) + { + ### find number of inbound calls waiting in line in front of this call + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where ( (status = 'LIVE') and ( (queue_priority > $VDADqueue_priority) and (call_type='IN') and (campaign_id IN($closer_campaigns)) ) );"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01074'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $rec_countWAITremIN = $aryA[0]; + $rec_countWAITremINallowed = $aryA[0]; + } + $sthA->finish(); + if ($AGILOG) {$agi_string = "$rec_countWAITremIN|$stmtA|"; &agi_output;} + } + + ### if there are inbound calls waiting, see if any READY agents are able to take them + if ($rec_countWAITremIN > 0) + { + ### get a list of the in-groups that the READY agents are able to take calls from + $stmtA = "SELECT closer_campaigns,user FROM vicidial_live_agents where status = 'READY' and lead_id<1 and ring_callerid='' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01075'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $READY_users_count=0; + while ($sthArows > $READY_users_count) + { + @aryA = $sthA->fetchrow_array; + $READY_users .= "'$aryA[1]',"; + @VLagent_camps = split(/ /,$aryA[0]); + $ki=0; + foreach(@VLagent_camps) + { + if ( ($VLagent_camps[$ki] !~ /AGENTDIRECT/) && (length($VLagent_camps[$ki]) > 1) && ($READY_agent_closer_camps !~ /'$VLagent_camps[$ki]'/) ) + {$READY_agent_closer_camps .= "'$VLagent_camps[$ki]',";} + $ki++; + } + $READY_users_count++; + } + $sthA->finish(); + $READY_agent_closer_camps =~ s/.$//gi; + $READY_users =~ s/.$//gi; + if (length($READY_agent_closer_camps) < 2) {$READY_agent_closer_camps="''";} + + if (length($READY_users)>2) + { + if ($closer_campaigns =~ /AGENTDIRECT/) + { + ### get a list of the users that have AGENTDIRECT calls waiting for them + $stmtA = "SELECT agent_only FROM vicidial_auto_calls where status = 'LIVE' and campaign_id LIKE \"%AGENTDIRECT%\" and last_update_time > '$BDtsSQLdate' and agent_only IN($READY_users) and agent_only != '';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01076'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $agentdirect_count=0; + while ($sthArows > $agentdirect_count) + { + @aryA = $sthA->fetchrow_array; + $AGENTDIRECT_user_ids .= "'$aryA[0]',"; + $agentdirect_count++; + } + $sthA->finish(); + $AGENTDIRECT_user_ids =~ s/.$//gi; + if (length($AGENTDIRECT_user_ids)>2) + {$AGENTDIRECT_user_ids = "or ( (campaign_id LIKE \"%AGENTDIRECT%\") and (agent_only IN($AGENTDIRECT_user_ids)) )";} + else + {$AGENTDIRECT_user_ids='';} + } + + ### find number of inbound calls from in-groups that READY agents are able to take calls from are waiting in line in front of this call + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where ( (status = 'LIVE') and ( ( (queue_priority > $VDADqueue_priority) and (call_type='IN') and (campaign_id IN($READY_agent_closer_camps)) ) ) $AGENTDIRECT_user_ids );"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01077'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $rec_countWAITremIN = $aryA[0]; + } + $sthA->finish(); + if ($AGILOG) {$agi_string = "$rec_countWAITremIN|$stmtA|"; &agi_output;} + } + } + +# if ($AGILOG) {$agi_string = "COUNT DEBUG: |$concurrent_transfers|$rec_countWAITremOUT|$rec_countWAITremIN|$rec_countWAITremINallowed|$agentdirect_count|$READY_users_count|$closer_campaigns|$READY_agent_closer_camps|$READY_users|$AGENTDIRECT_user_ids|"; &agi_output;} + + $rec_countWAITrem = ($rec_countWAITremOUT + $rec_countWAITremIN); + if ($rec_countWAITrem < $concurrent_transfers) + { + ### BEGIN grade random next-agent-call routing ### + if ($CAMP_callorder =~ /grade/) + { + $stmtA = "LOCK TABLES vicidial_live_agents WRITE;"; + my $LOCKaffected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01089'; $MEL_aff_rows=$LOCKaffected_rows; &mysql_error_logging; + + @GRADEuser=@MT; + @GRADEgrade=@MT; + @userGRADEarray=@MT; + $stmtA = "SELECT user,campaign_grade from vicidial_live_agents WHERE status='READY' and lead_id<1 and ring_callerid='' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate' limit 1000;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01090'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $gg=0; + $ga=0; + while ($gg < $sthArows) + { + @aryA = $sthA->fetchrow_array; + $GRADEuser[$gg] = $aryA[0]; + $GRADEgrade[$gg] = $aryA[1]; + if ($GRADEgrade[$gg] < 1) + {$GRADEgrade[$gg] = 1;} + $gi=0; + while ($gi < $GRADEgrade[$gg]) + { + $userGRADEarray[$ga] = $GRADEuser[$gg]; + # print STDERR " GRADE ENTRY: $userGRADEarray[$ga]|$ga|$gi|$GRADEgrade[$gg]\n"; + $gi++; + $ga++; + } + $gg++; + } + $sthA->finish(); + + $sthArows=0; + $affected_rows=0; + if ($ga > 0) + { + $GRADErandom = int( rand($ga)); + $userGRADEchosen = $userGRADEarray[$GRADErandom]; + + if ($AGILOG) {$agi_string = "GRADE RANDOM: $userGRADEchosen|$GRADErandom|$CAMP_callorder|$gg|$ga|$callerid"; &agi_output;} + + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', call_server_ip='$VARserver_ip', callerid='$callerid',comments='AUTO' where status='READY' and lead_id<1 and ring_callerid='' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate' and user='$userGRADEchosen' limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01091'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + } + if ($AGILOG) {$agi_string = "$VDADuser|$VDADgroup_weight|$stmtA|"; &agi_output;} + + $stmtA = "UNLOCK TABLES;"; + my $LOCKaffected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01092'; $MEL_aff_rows=$LOCKaffected_rows; &mysql_error_logging; + } + ### END grade random next-agent-call routing ### + else + { + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', call_server_ip='$VARserver_ip', callerid='$callerid',comments='AUTO' where status='READY' and lead_id<1 and ring_callerid='' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01042'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + } + + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|update of vla table: $VDADcampaign|$VARserver_ip\n|$stmtA|"; &agi_output;} + if ($affected_rows > 0) + { + $r=0; + $VDADuser=''; + while ( (length($VDADuser)<1) && ($r<3) ) + { + $stmtA = "SELECT conf_exten,user,extension,server_ip,ra_user FROM vicidial_live_agents where status IN('QUEUE','INCALL') and campaign_id='$VDADcampaign' and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01043'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $rec_count=0; + while ($sthArows > $rec_count) + { + @aryA = $sthA->fetchrow_array; + $VDADconf_exten = $aryA[0]; + $VDADuser = $aryA[1]; + $VDADextension = $aryA[2]; + $VDADserver_ip = $aryA[3]; + $ra_user = $aryA[4]; + $rec_count++; + } + $sthA->finish(); + $r++; + if ($r > 1) + { + if ($AGILOG) {$agi_string = "EEEEEEEEEE vla UPDATE DELAY!!! |$callerid|$r|"; &agi_output;} + + ### sleep for 23 hundredths of a second + usleep(1*230*1000); + $drop_timer = ($drop_timer + 0.25); + } + if ($r > 2) + { + $stmtA = "SELECT conf_exten,user,extension,server_ip,ra_user FROM vicidial_live_agents where callerid='$callerid' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01044'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + $rec_count=0; + while ($sthArows > $rec_count) + { + @aryA = $sthA->fetchrow_array; + $VDADconf_exten = $aryA[0]; + $VDADuser = $aryA[1]; + $VDADextension = $aryA[2]; + $VDADserver_ip = $aryA[3]; + $ra_user = $aryA[4]; + $rec_count++; + } + $sthA->finish(); + + if ($AGILOG) {$agi_string = "FFFFFFFFFF vla OR SELECT |$callerid|$VDADuser|"; &agi_output;} + } + } + + ### format the server dialstring to get the call to the agent meetme room on that server + $S='*'; + $VDADremDIALstr=''; + if( $VDADserver_ip =~ m/(\S+)\.(\S+)\.(\S+)\.(\S+)/ ) + { + $a = leading_zero($1); + $b = leading_zero($2); + $c = leading_zero($3); + $d = leading_zero($4); + $VDADremDIALstr = "$a$S$b$S$c$S$d$S"; + } + + ### BEGIN REMOTE AGENT SECTION + if ($VDADextension =~ /^R\//) + { + ### set the callerid to the ACQS value(calleridname) + ## use these two lines for Asterisk 1.2 tree + $newcallerid = "\"$calleridname <$VDADphone>\""; + $AGI->set_callerid($newcallerid); + ## use these two lines for Asterisk 1.0 tree + # print "SET CALLERID \"$calleridname\" <0000000000>\n"; + # print "SET CALLERIDNAME \"$calleridname\"\n"; + if ($VDADremDIALstr =~ /888888888888/) + { + $stmtA = "SELECT vendor_lead_code FROM vicidial_list where lead_id='$CIDlead_id';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01057'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $vendor_id = $aryA[0]; + } + $sthA->finish(); + $VDADremDIALstr = "$a$S$b$S$c$S$d$S$VDADphone$S$vendor_id"; + } + + if (length($ra_user) > 0) + { + $extension_group=''; + $stmtA = "SELECT extension_group,extension_group_order FROM vicidial_remote_agents where user_start='$ra_user';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01061'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $extension_group = $aryA[0]; + $extension_group_order = $aryA[1]; + } + $sthA->finish(); + if ( (length($extension_group) > 0) and ($extension_group !~ /^NONE/) ) + { + $extension_group_orderSQL = 'order by last_call_time'; + if ($extension_group_order =~ /RANK/) + {$extension_group_orderSQL = 'order by rank desc, last_call_time';} + if ($extension_group_order =~ /CALL_COUNT/) + {$extension_group_orderSQL = 'order by call_count_today, last_call_time';} + $stmtA = "UPDATE vicidial_extension_groups set last_callerid='$callerid',last_call_time=NOW(),call_count_today=(call_count_today + 1) where extension_group_id='$extension_group' and ( (campaign_groups='') or (campaign_groups LIKE \"%|$VDADcampaign|%\") ) $extension_group_orderSQL limit 1;"; + $VEGaffected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01062'; $MEL_aff_rows=$VEGaffected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- REMOTE EXTEN GROUP : |$VEGaffected_rows|update of veg table: $callerid\n|$stmtA|"; &agi_output;} + if ($VEGaffected_rows > 0) + { + $stmtA = "SELECT extension,extension_id,call_count_today FROM vicidial_extension_groups where last_callerid='$callerid' order by last_call_time desc limit 1;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01063'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $VDADconf_exten = $aryA[0]; + + if ($AGILOG) {$agi_string = "-- REMOTE EXTEN SET : |$VDADconf_exten|$aryA[1]|$aryA[2]|"; &agi_output;} + } + $sthA->finish(); + } + } + } + print STDERR "Setting CID \"$newcallerid\"\n"; + checkresult($result); + + $stmtA = "UPDATE vicidial_live_agents set ra_extension='$VDADremDIALstr$VDADconf_exten' where extension='$VDADextension' and ra_user='$ra_user';"; + $RALaffected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01067'; $MEL_aff_rows=$RALaffected_rows; &mysql_error_logging; + + $stmtA = "INSERT INTO vicidial_remote_agent_log set callerid='$callerid',uniqueid='$uniqueid',ra_user='$ra_user',user='$VDADuser',call_time=NOW(),extension='$VDADconf_exten',lead_id='$CIDlead_id',phone_number='$VDADphone',campaign_id='$VDADcampaign',processed='N';"; + $RALaffected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01065'; $MEL_aff_rows=$RALaffected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- REMOTE EXTEN LOG : |$RALaffected_rows|CID changed: \"$callerid\" \<$VDADphone\>\n|$stmtA|"; &agi_output;} + + + ### look for the recording settings for the start user of this remote agent + if (length($ra_user) > 0) + { + $stmtA = "SELECT vicidial_recording_override,vicidial_recording FROM vicidial_users where user='$ra_user';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArowsVUrec=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01072'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; + if ($sthArowsVUrec > 0) + { + @aryA = $sthA->fetchrow_array; + if ($aryA[0] !~ /DISABLED/) + {$campaign_recording = $aryA[0];} + if ($aryA[1] < 1) + {$campaign_recording = 'NONE';} + } + $sthA->finish(); + } + + ### if recording is enabled then start recording on this call before sending to a remote agent + if ($campaign_recording =~ /ALLCALLS|ALLFORCE/) + { + $stmtA = "SELECT vendor_lead_code FROM vicidial_list where lead_id='$CIDlead_id';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01075'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $vendor_lead_code = $aryA[0]; + } + $sthA->finish(); + + # get date/time + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + $year = ($year + 1900); + $Tyear = ($year - 2000); + $mon++; + if ($mon < 10) {$mon = "0$mon";} + if ($mday < 10) {$mday = "0$mday";} + if ($hour < 10) {$hour = "0$hour";} + if ($min < 10) {$min = "0$min";} + if ($sec < 10) {$sec = "0$sec";} + + $now_date_epoch = time(); + $now_date = "$year-$mon-$mday $hour:$min:$sec"; + $recdate = "$year$mon$mday-$hour$min$sec"; + $tinydate = "$Tyear$mon$mday$hour$min$sec"; + + $campaign_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi; + $campaign_rec_filename =~ s/CUSTPHONE/$VDADphone/gi; + $campaign_rec_filename =~ s/FULLDATE/$recdate/gi; + $campaign_rec_filename =~ s/TINYDATE/$tinydate/gi; + $campaign_rec_filename =~ s/EPOCH/$now_date_epoch/gi; + $campaign_rec_filename =~ s/AGENT/$VDADuser/gi; + $campaign_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi; + $campaign_rec_filename =~ s/LEADID/$CIDlead_id/gi; + $campaign_rec_filename =~ s/CALLID/$callerid/gi; + $campaign_rec_filename =~ s/\"|\'//gi; + + %ast_ver_str = parse_asterisk_version($asterisk_version); + if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6)) + { + $AGI->exec("Monitor wav|/var/spool/asterisk/monitor/MIX/$campaign_rec_filename"); + } + else + { + $AGI->exec("Monitor","wav,/var/spool/asterisk/monitor/MIX/$campaign_rec_filename"); + } + + ### insert record into recording_log table ### + $stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,length_in_sec,filename,lead_id,user,location,vicidial_id) values('$channel','$VARserver_ip','$VDADphone','$now_date','$now_date_epoch','0','$campaign_rec_filename','$CIDlead_id','$VDADuser','$campaign_rec_filename','$uniqueid');"; + $RLRAaffected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01076'; $MEL_aff_rows=$RLRAaffected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- REMOTE RECORDING STARTED : |$RLRAaffected_rows|$campaign_rec_filename|$stmtA|"; &agi_output;} + } + } + ### END REMOTE AGENT SECTION + else + { + if ($routing_initiated_recordings =~ /Y/) + { + ### BEGIN routing-initiated agent call recording for ALLCALLS/ALLFORCE ### + + ### look for the recording settings for the user + if (length($VDADuser) > 0) + { + $stmtA = "SELECT vicidial_recording_override,vicidial_recording FROM vicidial_users where user='$VDADuser';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArowsVUrec=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01140'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging; + if ($sthArowsVUrec > 0) + { + @aryA = $sthA->fetchrow_array; + if ($aryA[0] !~ /DISABLED/) + {$campaign_recording = $aryA[0];} + if ($aryA[1] < 1) + {$campaign_recording = 'NONE';} + } + $sthA->finish(); + } + + ### if recording is enabled then start recording on this call before sending to a remote agent + if ($campaign_recording =~ /ALLCALLS|ALLFORCE/) + { + $stmtA = "SELECT vendor_lead_code FROM vicidial_list where lead_id='$CIDlead_id';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01141'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $vendor_lead_code = $aryA[0]; + } + $sthA->finish(); + + # get date/time + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + $year = ($year + 1900); + $Tyear = ($year - 2000); + $mon++; + if ($mon < 10) {$mon = "0$mon";} + if ($mday < 10) {$mday = "0$mday";} + if ($hour < 10) {$hour = "0$hour";} + if ($min < 10) {$min = "0$min";} + if ($sec < 10) {$sec = "0$sec";} + + $now_date_epoch = time(); + $now_date = "$year-$mon-$mday $hour:$min:$sec"; + $recdate = "$year$mon$mday-$hour$min$sec"; + $tinydate = "$Tyear$mon$mday$hour$min$sec"; + + $campaign_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi; + $campaign_rec_filename =~ s/CUSTPHONE/$VDADphone/gi; + $campaign_rec_filename =~ s/FULLDATE/$recdate/gi; + $campaign_rec_filename =~ s/TINYDATE/$tinydate/gi; + $campaign_rec_filename =~ s/EPOCH/$now_date_epoch/gi; + $campaign_rec_filename =~ s/AGENT/$VDADuser/gi; + $campaign_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi; + $campaign_rec_filename =~ s/LEADID/$CIDlead_id/gi; + $campaign_rec_filename =~ s/CALLID/$callerid/gi; + $campaign_rec_filename =~ s/\"|\'//gi; + + $conf_silent_prefix='5'; + $channelrec = "Local/" . $conf_silent_prefix . '' . $VDADconf_exten . "@" . $ext_context; + + ### insert a record into the recording_log table + $stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channelrec','$VDADserver_ip','$campaign_rec_exten','$now_date','$now_date_epoch','$campaign_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='02142'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;"; + $sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02143'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $recording_id = $aryA[0]; + } + $sthA->finish(); + + if ($campaign_rec_filename =~ /RECID/) + { + $campaign_rec_filename =~ s/RECID/$recording_id/gi; + + $stmtA = "UPDATE recording_log SET filename='$campaign_rec_filename' where recording_id='$recording_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='02144'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + } + + $stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VDADserver_ip','','Originate','$campaign_rec_filename','Channel: $channelrec','Context: $ext_context','Exten: $campaign_rec_exten','Priority: 1','Callerid: $campaign_rec_filename','','','','','');"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='02145'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + + $stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed) values('$recording_id','$campaign_rec_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0')"; + $affected_rowsB = $dbhA->do($stmtB); + $dbhP=$dbhA; $mysql_count='02146'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging; + + $stmtC = "UPDATE vicidial_live_agents SET external_recording='$recording_id' where user='$VDADuser';"; + $affected_rowsC = $dbhA->do($stmtC); + $dbhP=$dbhA; $mysql_count='02147'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging; + + if ($AGILOG) {$agi_string = "-- ROUTING INITIATED RECORDING STARTED : |$affected_rows|$recording_id|$campaign_rec_filename|$stmtA| |$affected_rowsB|$stmtB| |$affected_rowsC|$stmtC|"; &agi_output;} + } + ### END routing-initiated agent call recording for ALLCALLS/ALLFORCE ### + } + + # if ($extension_appended_cidname =~ /Y/) removed + + $newcallerid = "\"$callerid <$phone_number>\""; + $AGI->set_callerid($newcallerid); + } + + $VDADremDIALstr .= "$VDADconf_exten"; + + $stmtA = "UPDATE vicidial_auto_calls set status='XFER', stage='XFER-$drop_timer', extension='$VDADremDIALstr' where callerid='$callerid';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01045'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAD XFER REMOTE: |$affected_rows|update of vac table: $callerid\n|$stmtA|"; &agi_output;} + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='post-route-AGENT-2',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01148'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + + $dbhA->disconnect(); + + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $VDADremDIALstr"; &agi_output;} + print "SET CONTEXT $ext_context\n"; + $result = ; + checkresult($result); + print "SET EXTENSION $VDADremDIALstr\n"; + $result = ; + checkresult($result); + print "SET PRIORITY 1\n"; + $result = ; + checkresult($result); + + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + $year = ($year + 1900); + $mon++; + if ($mon < 10) {$mon = "0$mon";} + if ($mday < 10) {$mday = "0$mday";} + if ($hour < 10) {$hour = "0$hour";} + if ($min < 10) {$min = "0$min";} + if ($sec < 10) {$sec = "0$sec";} + + $now_date_epoch = time(); + $now_date = "$year-$mon-$mday $hour:$min:$sec"; + if ($AGILOG) {$agi_string = "XXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} + + exit; + } + else + { + if ($AGILOG) {$agi_string = "NNNNNNNNNN No agent record found!!! $drop_timer"; &agi_output;} + } + } + else + { + if ($AGILOG) {$agi_string = "WWWWWWWW VDAD XFER BALANCE WAIT: |$rec_countWAITrem|$VDADcampaign|$channel|$callerid|$uniqueid|"; &agi_output;} + } + ############################################################################ + ### END attempt to send call to agent + ############################################################################ + + + if ($drop_timer < 3) + { + ### sleep for 23 hundredths of a second + usleep(1*230*1000); + $drop_timer = ($drop_timer + 0.25); + } + else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } + + $stmtA = "UPDATE vicidial_auto_calls set stage='LIVE-$drop_timer' where callerid='$callerid';"; + $affected_rows = $dbhA->do($stmtA); + if ($affected_rows < 1) + { + $stmtA = "INSERT INTO vicidial_auto_calls (server_ip,campaign_id,status,lead_id,uniqueid,callerid,channel,phone_code,phone_number,call_time,call_type,stage,queue_priority) values('$VARserver_ip','$VDADcampaign','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','OUT','LIVE-$drop_timer','$VDADqueue_priority')"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01047'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "$affected_rows|VDAC-reinsert|$stmtA|"; &agi_output;} + } + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='waiting-for-agent-$drop_timer',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01149'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + + #if ($AGILOG) {$agi_string = "-- VDAD : |$affected_rows|update of vac table: $callerid\n|$stmtA|"; &agi_output;} + } + + + + + + +if ($drop_timer > $DROP_TIME) + { + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + $year = ($year + 1900); + $mon++; + if ($mon < 10) {$mon = "0$mon";} + if ($mday < 10) {$mday = "0$mday";} + if ($hour < 10) {$hour = "0$hour";} + if ($min < 10) {$min = "0$min";} + if ($sec < 10) {$sec = "0$sec";} + + $now_date_epoch = time(); + $now_date = "$year-$mon-$mday $hour:$min:$sec"; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $Euniqueid=$uniqueid; + $Euniqueid =~ s/\.\d+//gi; + + if ($drop_seconds < 1) + { + $drop_seconds = $DROP_TIME; + } + + $drop_status='DROP'; + if ($survey_drop > 0) + {$drop_status='PM';} + + if ($drop_action =~ /MESSAGE/) + { + $newcallerid = "\"$callerid <$VDADphone>\""; + $AGI->set_callerid($newcallerid); + print STDERR "Setting CID \"$newcallerid\"\n"; + checkresult($result); + if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;} + if (length($safe_harbor_exten)>0) + {$DROPexten = "$safe_harbor_exten";} + } + if ($drop_action =~ /VOICEMAIL|VMAIL_NO_INST/) + { + $newcallerid = "\"$callerid <$VDADphone>\""; + $AGI->set_callerid($newcallerid); + print STDERR "Setting CID \"$newcallerid\"\n"; + checkresult($result); + if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;} + if ($drop_action =~ /VMAIL_NO_INST/) + {$voicemail_dump_exten = $voicemail_dump_exten_no_inst;} + if (length($VDADvoicemail_ext)>0) + {$DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext";} + } + if ($drop_action =~ /IN_GROUP/) + { + $drop_inbound_group_override=''; + if (length($xCLlist_id) > 1) + { + ### gather list_id overrides + $stmtA = "SELECT drop_inbound_group_override FROM vicidial_lists where list_id='$xCLlist_id';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArowsL=$sthA->rows; + if ($sthArowsL > 0) + { + @aryA = $sthA->fetchrow_array; + $drop_inbound_group_override = $aryA[0]; + if (length($drop_inbound_group_override) > 0) + {$drop_inbound_group = $drop_inbound_group_override;} + } + $sthA->finish(); + } + # Example: 90009*CL_uk3survy_*8301*10000123*universal*7275551212*1234*" + $S='*'; + $DROPexten = "90009*$drop_inbound_group$S$S$CIDlead_id$S$S$VDADphone$S$fronter$S"; + } + if ($drop_action =~ /CALLMENU/) + { + $newcallerid = "\"$callerid <$VDADphone>\""; + $AGI->set_callerid($newcallerid); + print STDERR "Setting CID \"$newcallerid\"\n"; + checkresult($result); + if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;} + $DROPexten = 's'; + $ext_context = $safe_harbor_menu_id; + if (length($ext_context)<1) + {$DROPexten = '';} + + $stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$drop_status',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds',term_reason='CALLMENUXFER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01083'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAD vicidial_log update: |$affected_rows|$uniqueid"; &agi_output;} + + $stmtA = "UPDATE vicidial_list set status='$drop_status' where lead_id = '$CIDlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01084'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAD vicidial_list update: |$affected_rows|$CIDlead_id"; &agi_output;} + } + else + { + $stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$drop_status',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds',term_reason='QUEUETIMEOUT' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01050'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAD vicidial_log update: |$affected_rows|$uniqueid"; &agi_output;} + + $stmtA = "UPDATE vicidial_list set status='$drop_status' where lead_id = '$CIDlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01051'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAD vicidial_list update: |$affected_rows|$CIDlead_id"; &agi_output;} + + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01052'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|"; &agi_output;} + } + + if ($drop_action =~ /AUDIO/) + { + if ($safe_harbor_audio_field !~ /DISABLED/) + { + $stmtA = "SELECT $safe_harbor_audio_field FROM vicidial_list where lead_id='$CIDlead_id';"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $dbhP=$dbhA; $mysql_count='01097'; $MEL_aff_rows=$sthArows; &mysql_error_logging; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $safe_harbor_audio_value = $aryA[0]; + + if (length($safe_harbor_audio_value)>0) + { + if ($AGILOG) {$agi_string = "playing drop message FIELD: $safe_harbor_audio_value|$safe_harbor_audio_field|$safe_harbor_audio"; &agi_output;} + $safe_harbor_audio = $safe_harbor_audio_value; + } + } + $sthA->finish(); + + } + $DROPexten=''; + if ($AGILOG) {$agi_string = "playing drop message: $safe_harbor_audio"; &agi_output;} + + if (length($safe_harbor_audio) > 0) + { + $AGI->stream_file('sip-silence'); + $AGI->stream_file('sip-silence'); + if ($safe_harbor_audio =~ /\|/) + { + @safe_harbor_audio_array = split(/\|/,$safe_harbor_audio); + $w=0; + foreach(@safe_harbor_audio_array) + { + if (length($safe_harbor_audio_array[$w])>0) + { + $AGI->stream_file("$safe_harbor_audio_array[$w]"); + } + $w++; + } + } + else + {$AGI->stream_file("$safe_harbor_audio");} + } + } + + if ($vdad_debug_logging > 0) + { + &duration_calc; + $stmtA = "INSERT INTO vicidial_vdad_log set caller_code='$callerid',server_ip='$VARserver_ip',call_date='$SQLdate',epoch_micro='$ORIG_time',db_time=NOW(),run_time='$net_duration',vdad_script='$script',stage='end-drop-$drop_timer',lead_id='$CIDlead_id';"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01150'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + $ORIG_time = $START_s_hires.'.'.sprintf("%06d", $START_usec); + } + + if (length($DROPexten)>0) + { + ### if DROP extension is defined then send the dropped call there instead of hangup + + $AGI->stream_file('ding'); # stop music-on-hold process + + sleep(1); + + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten $ext_context"; &agi_output;} + print "SET CONTEXT $ext_context\n"; + $result = ; + checkresult($result); + print "SET EXTENSION $DROPexten\n"; + $result = ; + checkresult($result); + print "SET PRIORITY 1\n"; + $result = ; + checkresult($result); + + } + else + { + ### use STDOUT to send call to proper DROP location + $VHqueryCID = "VH$CIDdate$VDADconf_exten"; + + ### insert a NEW record to the vicidial_manager table to be processed + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01053'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$CIDlead_id|$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} + + $AGI->hangup(); + } + } + + + +$dbhA->disconnect(); + +exit; + +sub enter_pin_number + { + $sound = $_[0]; + $survey_dtmf_digits = $_[1]; + $survey_method_TEMP = $_[2]; + $survey_wait_sec = $_[3]; + if (length($survey_wait_sec) < 1) # 10 seconds if wait time not defined + {$survey_wait_sec=10;} + $survey_wait_msec = ($survey_wait_sec * 1000); + + $digits_to_collect =~ s/DIGITID//gi; + + # please enter the pin number followed by the pound key + # please enter your X digit pin number + + $digit=''; + undef $digit; + $interrupt_digit=''; + undef $interrupt_digit; + + $interrupt_digit = $AGI->stream_file("$sound","$survey_dtmf_digits"); + + if ($AGILOG) {$agi_string = "interrupt_digit |$interrupt_digit| timeout |$survey_wait_sec|$survey_wait_msec|"; &agi_output;} + + $digits_being_entered=1; + $totalDTMF=''; + if ($interrupt_digit > 1) + { + $interrupt_digit = $interrupt_digit - 48; + + $totalDTMF=$interrupt_digit; + } + + $digit_loop_counter = length($totalDTMF); + + if ($survey_method_TEMP !~ /HANGUP/) + { + while ( ($digit_loop_counter < $digits_to_collect) ) + { + $digit = chr($AGI->wait_for_digit($survey_wait_msec)); # wait X seconds for input or until the pound key is pressed + if ( ($digit =~ /\d/) && ($survey_dtmf_digits =~ /$digit/) ) + { + $totalDTMF = "$totalDTMF$digit"; + if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;} + # $AGI->say_digits("$digit"); + undef $digit; + } + else + { + $digit_loop_counter=$digits_to_collect; + } + + $digit_loop_counter++; + } + } + + $totalDTMF =~ s/\D//gi; + $pin = $totalDTMF; + if ($totalDTMF) {if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}} + + return $pin; + } + + + + +sub checkresult + { + my ($res) = @_; + my $retval; + $tests++; + chomp $res; + if ($res =~ /^200/) + { + $res =~ /result=(-?\d+)/; + if (!length($1)) + { + # print STDERR "FAIL ($res)\n"; + $fail++; + } + else + { + # print STDERR "PASS ($1)\n"; + $pass++; + } + } + else + { + # print STDERR "FAIL (unexpected result '$res')\n"; + $fail++; + } + } + + +sub leading_zero($) + { + $_ = $_[0]; + s/^(\d)$/0$1/; + s/^(\d\d)$/0$1/; + return $_; + } # End of the leading_zero() routine. + + + +### you're call is very important to us, please stay on the line and you will be transferred to the next available agent + + +sub agi_output + { + if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### + if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} + $agi_string=''; + } + + +sub mysql_error_logging + { + $errno=''; + $error=''; + if ( ($mel > 0) || ($one_mysql_log > 0) ) + { + $errno = $dbhP->err(); + if ( ($errno > 0) || ($mel > 1) || ($one_mysql_log > 0) ) + { + $error = $dbhP->errstr(); + ### open the log file for writing ### + open(Eout, ">>$ERRLOGfile") + || die "Can't open $ERRLOGfile: $!\n"; + print Eout "$now_date|$script|$mysql_count|$MEL_aff_rows|$errno|$error|$stmtA|$callerid|$CIDlead_id|\n"; + close(Eout); + } + } + $one_mysql_log=0; + } + + + +##### CPD call progress AMD end call process ##### +# sub cpd_end_call removed + +# subroutine to parse the asterisk version +# and return a hash with the various part +sub parse_asterisk_version + { + # grab the arguments + my $ast_ver_str = $_[0]; + + # get everything after the - and put it in $ast_ver_postfix + my @hyphen_parts = split( /-/ , $ast_ver_str ); + + my $ast_ver_postfix = $hyphen_parts[1]; + + # now split everything before the - up by the . + my @dot_parts = split( /\./ , $hyphen_parts[0] ); + + my %ast_ver_hash; + + if ( $dot_parts[0] <= 1 ) + { + %ast_ver_hash = ( + "major" => $dot_parts[0], + "minor" => $dot_parts[1], + "build" => $dot_parts[2], + "revision" => $dot_parts[3], + "postfix" => $ast_ver_postfix + ); + } + + # digium dropped the 1 from asterisk 10 but we still need it + if ( $dot_parts[0] > 1 ) + { + %ast_ver_hash = ( + "major" => 1, + "minor" => $dot_parts[0], + "build" => $dot_parts[1], + "revision" => $dot_parts[2], + "postfix" => $ast_ver_postfix + ); + } + + return ( %ast_ver_hash ); + } + + +##### TTS test variables for single digits, convert to text if true ##### +sub tts_num_var_test + { + $_ = $_[0]; + $var_test = $_; + if ( (length($var_test) > 0) && (length($var_test) < 2) ) + { + $var_test =~ s/0/zero /gi; + $var_test =~ s/1/one /gi; + $var_test =~ s/2/two /gi; + $var_test =~ s/3/three /gi; + $var_test =~ s/4/four /gi; + $var_test =~ s/5/five /gi; + $var_test =~ s/6/six /gi; + $var_test =~ s/7/seven /gi; + $var_test =~ s/8/eight /gi; + $var_test =~ s/9/nine /gi; + } + return $var_test; + } + + +sub duration_calc + { + # calculate duration time + ($END_s_hires, $END_usec) = gettimeofday(); + $net_microseconds = $END_usec - $START_usec; + if ($net_microseconds < 0) + { + $net_microseconds = ($net_microseconds + 1000000); + $END_s_hires = ($END_s_hires - 1); + } + $net_microseconds = sprintf("%06d", $net_microseconds); + $net_seconds = $END_s_hires - $START_s_hires; + $net_duration = "$net_seconds.$net_microseconds"; + ($START_s_hires, $START_usec) = gettimeofday(); + } diff --git a/docs/OUTBOUND_OPTIMIZATIONS.txt b/docs/OUTBOUND_OPTIMIZATIONS.txt index e8a10479..67e4bd45 100644 --- a/docs/OUTBOUND_OPTIMIZATIONS.txt +++ b/docs/OUTBOUND_OPTIMIZATIONS.txt @@ -1,4 +1,4 @@ -OUTBOUND DIALING OPTIMIZATIONS DOC Started: 2016-11-15 Updated: 2016-11-15 +OUTBOUND DIALING OPTIMIZATIONS DOC Started: 2016-11-15 Updated: 2016-12-01 This document is a work in progress and is meant for reference only, to go over approaches to optimizing and speeding up the outbound auto-dialing processes @@ -16,10 +16,23 @@ Places to look at for speeding up outbound auto-dialing call routing speed: SECTION 1. LOCAL/ CHANNEL RESOLUTION -First, and explanation of what exatly the "Local/ channel resolution" issue is. Auto-dial calls are placed from VICIdial to Asterisk using a Local/ channel, which goes to the dialplan and places the calls out through a carrier. When the call is placed, there is no audio stream yet, only signalling, and it stays that way until after the Answer signal is received from the carrier. At that point, the Local/ channel will resolve to it's proper channel pointer(usually SIP/... if using a sip carrier). Where the issues come in, is how long it takes for the audio to begin being received so that the channel pointer can resolve. This is extremely variable, and depends on the end customer carrier, as well as all of the carrier equipment in-between. We ahve seen Local/ channels resolve anywhere from 0.1 seconds up to 2 seconds, and in a small percentage of cases, the channel never resolves because no audio stream is received. +First, and explanation of what exatly the "Local/ channel resolution" issue is. Auto-dial calls are placed from VICIdial to Asterisk using a Local/ channel, which goes to the dialplan and places the calls out through a carrier. When the call is placed, there is no audio stream yet, only signalling, and it stays that way until after the Answer signal is received from the carrier. At that point, the Local/ channel will resolve to it's proper channel pointer(usually SIP/... if using a sip carrier) and the pseudo channels that were created go away. Where the issues come in, is how long it takes for the audio to begin being received so that the channel pointer can resolve. This is extremely variable, and depends on the end customer carrier, as well as all of the carrier equipment in-between. We have seen Local/ channels resolve anywhere from 0.01 seconds up to 2 seconds, and in a small percentage of cases, the channel never resolves because no audio stream is ever received, even after 30 seconds of waiting post-Answer-signal. Another thing to remember related to this, Asterisk isn't perfect, and sometimes those pseudo channels will register as Answered for a split second before disappearing, which is another reason why it is important for the AGI routing script to not run on Local/ channels. Currently, the outbound call agent routing process will immediately attempt to route the call if the Local/ channel has been resolved, and if it isn't, it will wait 1 second before trying again, then if it is still not resolved, giving up and logging the call as LRERR status. The optimization we are trying in the BETA script is to try multiple attempts at much faster intervals to check for Local/ channel resolution. The compilation of the AGI script can take anywhere from 0.1 to 0.3 seconds, depending on the server hardware and system load, then if the AGI script detects a Local/ channel, it quits and is tried again immediately. This also allows for a longer amount of time to wait for the channel to resolve because the number of loops is adjustable. +The AST_vdad_debug_log_report.php report was created to help evaluate the log entries from the BETA AGI scripts. + +In our first round of live testing, we have seen the following results: +- Calls that had no resolution delay routed in 0.1 seconds on average post-Answer-signal (85% of Answered calls) +- Calls that had a resolution delay routed in 1.5 seconds on average post-Answer-signal (5% of Answered calls) +- Calls that never resolved in over 30 seconds made up less than 10% of total Answered calls +- The Asterisk 11 server had a lower rate of LRERR calls, and faster overall routing compared to 1.4 and 1.8 servers + +Some conclusions based upon the first round of live testing: +- Allowing more than 1 second for channel resolution increased delayed resolution calls being routed by about 30%, although this is still only 2% of total Answered calls +- If a call does not resolve within 3 seconds post-Answer, there is very little chance it will ever resolve, although we did have a few calls resolve at 25+ seconds +- Asterisk 11 appears to be more successful at forcing resolutions, and routing calls faster, when compared to earlier branches of Asterisk + @@ -28,8 +41,11 @@ Currently, the outbound call agent routing process will immediately attempt to r SECTION 2. DATABASE LOAD AND QUERY SPEED -Basic my.cnf and proper hardware optimizations. Nothing further yet. +Basic my.cnf and proper hardware optimizations. +Faster DB = Faster call routing + +Use LSI Logic MegaRAID controllers in RAID-10 configuration with fast SSD drives with database data on separate partition from the OS and applications. @@ -125,6 +141,18 @@ exten => 8377,n,AGI(agi-VDAD_ALL_outboundBETA.agi,NORMAL-----LB) exten => 8377,n,Hangup() +; BETA VICIDIAL_auto_dialer transfer script Load Balanced: +exten => 8387,1,Playback(sip-silence) +exten => 8387,n,AGI(agi://127.0.0.1:4577/call_log) +exten => 8387,n,Set(LRct=1) +exten => 8387,n,While($[${LRct} < 100]) +exten => 8387,n,AGI(agi-VDAD_ALL_outboundBETA2.agi,NORMAL-----LB) +exten => 8387,n,Set(LRct=$[${LRct} + 1]) +exten => 8387,n,EndWhile() +exten => 8387,n,AGI(agi-VDAD_ALL_outboundBETA2.agi,NORMAL-----LB) +exten => 8387,n,Hangup() + + Added vicidial_vdad_log table to store debug and timestamp data(examples below). To enabled this level of logging in the BETA script, you must run the following SQL statement: diff --git a/www/vicidial/AST_vdad_debug_log_report.php b/www/vicidial/AST_vdad_debug_log_report.php index dab68b50..9caacf73 100644 --- a/www/vicidial/AST_vdad_debug_log_report.php +++ b/www/vicidial/AST_vdad_debug_log_report.php @@ -5,6 +5,7 @@ # # CHANGES # 161124-0737 - First build +# 161201-0815 - Added more statistics and options # $startMS = microtime(); @@ -37,11 +38,16 @@ if (isset($_GET["DBX"])) {$DBX=$_GET["DBX"];} elseif (isset($_POST["DBX"])) {$DBX=$_POST["DBX"];} if (isset($_GET["archive"])) {$archive=$_GET["archive"];} elseif (isset($_POST["archive"])) {$archive=$_POST["archive"];} +if (isset($_GET["lrerr_statuses"])) {$lrerr_statuses=$_GET["lrerr_statuses"];} + elseif (isset($_POST["lrerr_statuses"])) {$lrerr_statuses=$_POST["lrerr_statuses"];} +if (isset($_GET["uncounted_statuses"])) {$uncounted_statuses=$_GET["uncounted_statuses"];} + elseif (isset($_POST["uncounted_statuses"])) {$uncounted_statuses=$_POST["uncounted_statuses"];} if (isset($_GET["submit"])) {$submit=$_GET["submit"];} elseif (isset($_POST["submit"])) {$submit=$_POST["submit"];} if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} + ############################################# ##### START SYSTEM_SETTINGS LOOKUP ##### $stmt = "SELECT use_non_latin,outbound_autodial_active,slave_db_server,reports_use_slave_db,enable_languages,language_method FROM system_settings;"; @@ -194,8 +200,11 @@ if (strlen($query_date_D) < 6) {$query_date_D = "00:00:00";} if (strlen($query_date_T) < 6) {$query_date_T = "23:59:59";} if (!isset($query_date)) {$query_date = $NOW_DATE;} if (strlen($stage) < 2) {$stage = 'SUMMARY';} +if (strlen($lrerr_statuses) < 1) {$lrerr_statuses = 0;} +if (strlen($uncounted_statuses) < 1) {$uncounted_statuses = 0;} $vicidial_vdad_log = 'vicidial_vdad_log'; if ($archive > 0) {$vicidial_vdad_log = 'vicidial_vdad_log_archive';} +$vicidial_log = 'vicidial_log'; /* $server_ip_string='|'; @@ -384,12 +393,26 @@ if ($SUBMIT) { ##### BEGIN SUMMARY SECTION ##### if ($stage == 'SUMMARY') { + $uncounted=0; $server_ct=0; $server_array[0]=''; $server_calls[0]=0; $server_LRERR[0]=0; + $server_LRERR_total[0]=0; $server_preroute[0]=0; $server_preroute_time[0]=0; + $server_LRcount[0]=0; + $server_LRcount_total[0]=0; + $server_LRpreroute[0]=0; + $server_LRpreroute_time[0]=0; + $server_nLRpreroute[0]=0; + $server_nLRpreroute_time[0]=0; + $status_ct=0; + $status_array[0]=''; + $status_calls[0]=0; + $ucstatus_ct=0; + $ucstatus_array[0]=''; + $ucstatus_calls[0]=0; $MAIN.="
\n";
 
 		$stmt = "SELECT caller_code,server_ip,count(*) FROM $vicidial_vdad_log where db_time >= '$query_date $query_date_D' and db_time <= '$query_date $query_date_T' group by caller_code,server_ip order by caller_code limit 100000;";
@@ -443,9 +466,17 @@ if ($SUBMIT) {
 			}
 
 		$i=0;
+		$m=0;
 		$LRERR=0;
+		$LRERR_total=0;
 		$preroute=0;
 		$preroute_total=0;
+		$LRcount=0;
+		$LRcount_total=0;
+		$LRpreroute=0;
+		$LRpreroute_total=0;
+		$nLRpreroute=0;
+		$nLRpreroute_total=0;
 		while ($cc_ct > $i)
 			{
 			if ($DBX > 0)
@@ -456,6 +487,8 @@ if ($SUBMIT) {
 			$last_runtime=0;
 			$preroute_time=0;
 			$found_preroute=0;
+			$this_call_LR=0;
+			$call_counted=0;
 
 			$stmt = "SELECT stage,step,epoch_micro,run_time FROM $vicidial_vdad_log where caller_code='$Acaller_code[$i]' and db_time >= '$query_date $query_date_D' and db_time <= '$query_date $query_date_T' order by epoch_micro;";
 			$rslt=mysql_to_mysqli($stmt, $link);
@@ -469,24 +502,85 @@ if ($SUBMIT) {
 				$Astep[$j] =		$row[1];
 				$Aepoch_micro[$j] =	$row[2];
 				$Arun_time[$j] =	$row[3];
+				$j++;
+				}
+			$j=0;
+			while ($cd_ct > $j)
+				{
+				if ($j < 1) {$start_epoch=$Aepoch_micro[$j];}
+				$last_epoch=$Aepoch_micro[$j];
+				$last_runtime=$Arun_time[$j];
+				if ($Astage[$j] == 'LocalEXIT-5') 
+					{
+					$this_call_LR++;
+					}
 				if ($Astage[$j] == 'LocalEXIT-8') 
 					{
+					$call_counted++;
 					$LRERR++;
+					$LRERR_time = ( ($last_epoch - $start_epoch) + $last_runtime);
+					$LRERR_total = ($LRERR_total + $LRERR_time);
 					$k=0;
 					while ($k < $server_ct)
 						{
 						if ($Aserver_ip[$i] == $server_array[$k])
 							{
 							$server_LRERR[$k]++;
+							$server_LRERR_time[$k] = ($server_LRERR_time[$k] + $LRERR_time);
 							}
 						$k++;
 						}
+					
+					if ($lrerr_statuses > 0)
+						{
+						$start_epoch = $Aepoch_micro[$j];
+						$start_epochA = explode('.',$start_epoch);
+						$start_epoch = ($start_epochA[0] - 240);
+						$start_date = date("Y-m-d H:i:s",$start_epoch);
+						$CIDlead_id = $Acaller_code[$i];
+						$CIDlead_id = substr($CIDlead_id, 10, 10);
+						$CIDlead_id = ($CIDlead_id + 0);
+						$stmt = "SELECT status,uniqueid FROM $vicidial_log where lead_id='$CIDlead_id' and call_date > \"$start_date\" order by call_date limit 1;";
+						$rslt=mysql_to_mysqli($stmt, $link);
+						if ($DB) {$MAIN.="$stmt\n";}
+						$status_row_ct = mysqli_num_rows($rslt);
+						if ($status_row_ct > 0)
+							{
+							$row=mysqli_fetch_row($rslt);
+
+							if ($m==0) 
+								{
+								$status_ct++;
+								$status_array[0]=$row[0];
+								$status_calls[0]++;
+								}
+							else
+								{
+								$k=0;
+								$status_found=0;
+								while ($k < $status_ct)
+									{
+									if ($row[0] == $status_array[$k])
+										{
+										$status_calls[$k]++;
+										$status_found=1;
+										}
+									$k++;
+									}
+								if ($status_found < 1)
+									{
+									$status_array[$status_ct]=$row[0];
+									$status_calls[$status_ct]++;
+									$status_ct++;
+									}
+								}
+							}
+						}
+					$m++;
 					}
-				if ($j < 1) {$start_epoch=$row[2];}
-				$last_epoch=$row[2];
-				$last_runtime=$row[3];
 				if ($Astage[$j] == 'preroute')
 					{
+					$call_counted++;
 					$found_preroute=1;
 					$preroute++;
 					$preroute_time = ( ($last_epoch - $start_epoch) + $last_runtime);
@@ -501,11 +595,97 @@ if ($SUBMIT) {
 							}
 						$k++;
 						}
+					if ($this_call_LR > 0)
+						{
+						$LRcount++;
+						$LRcount_total = ($LRcount_total + $this_call_LR);
+
+						$LRpreroute++;
+						$LRpreroute_time = ( ($last_epoch - $start_epoch) + $last_runtime);
+						$LRpreroute_total = ($LRpreroute_total + $LRpreroute_time);
+
+						$k=0;
+						while ($k < $server_ct)
+							{
+							if ($Aserver_ip[$i] == $server_array[$k])
+								{
+								$server_LRpreroute[$k]++;
+								$server_LRpreroute_time[$k] = ($server_LRpreroute_time[$k] + $LRpreroute_time);
+								}
+							$k++;
+							}
+						}
+					else
+						{
+						$nLRpreroute++;
+						$nLRpreroute_time = ( ($last_epoch - $start_epoch) + $last_runtime);
+						$nLRpreroute_total = ($nLRpreroute_total + $nLRpreroute_time);
+
+						$k=0;
+						while ($k < $server_ct)
+							{
+							if ($Aserver_ip[$i] == $server_array[$k])
+								{
+								$server_nLRpreroute[$k]++;
+								$server_nLRpreroute_time[$k] = ($server_nLRpreroute_time[$k] + $nLRpreroute_time);
+								}
+							$k++;
+							}
+						}
 					}
 				if ($DBX > 0)
 					{$MAIN.= "          $j  $Aepoch_micro[$j]  $Arun_time[$j]  $Astep[$j]  $Astage[$j]\n";}
 				$j++;
 				}
+			if ($call_counted < 1)
+				{
+				$uncounted++;
+				if ($uncounted_statuses > 0)
+					{
+					$start_epoch = $Aepoch_micro[$j];
+					$start_epochA = explode('.',$start_epoch);
+					$start_epoch = ($start_epochA[0] - 240);
+					$start_date = date("Y-m-d H:i:s",$start_epoch);
+					$CIDlead_id = $Acaller_code[$i];
+					$CIDlead_id = substr($CIDlead_id, 10, 10);
+					$CIDlead_id = ($CIDlead_id + 0);
+					$stmt = "SELECT status,uniqueid FROM $vicidial_log where lead_id='$CIDlead_id' and call_date > \"$start_date\" order by call_date limit 1;";
+					$rslt=mysql_to_mysqli($stmt, $link);
+					if ($DB) {$MAIN.="$stmt\n";}
+					$ucstatus_row_ct = mysqli_num_rows($rslt);
+					if ($ucstatus_row_ct > 0)
+						{
+						$row=mysqli_fetch_row($rslt);
+
+						if ($m==0) 
+							{
+							$ucstatus_ct++;
+							$ucstatus_array[0]=$row[0];
+							$ucstatus_calls[0]++;
+							}
+						else
+							{
+							$k=0;
+							$ucstatus_found=0;
+							while ($k < $ucstatus_ct)
+								{
+								if ($row[0] == $ucstatus_array[$k])
+									{
+									$ucstatus_calls[$k]++;
+									$ucstatus_found=1;
+									}
+								$k++;
+								}
+							if ($ucstatus_found < 1)
+								{
+								$ucstatus_array[$ucstatus_ct]=$row[0];
+								$ucstatus_calls[$ucstatus_ct]++;
+								$ucstatus_ct++;
+								}
+							}
+						}
+					}
+				}
 			$processing_time = ($last_epoch - $start_epoch);
 			$routing_time = ($processing_time + $last_runtime);
 			if ($DBX > 0)
@@ -516,14 +696,48 @@ if ($SUBMIT) {
 
 		$LRERR_pct=( ($LRERR / $i) * 100);
 		$LRERR_pct = sprintf("%01.2f", $LRERR_pct);
+		$LRERR_avg = ($LRERR_total / $LRERR);
+		$LRERR_avg = sprintf("%01.6f", $LRERR_avg);
 
 		$preroute_avg = ($preroute_total / $preroute);
 		$preroute_avg = sprintf("%01.6f", $preroute_avg);
+		$LRpreroute_avg = ($LRpreroute_total / $LRpreroute);
+		$LRpreroute_avg = sprintf("%01.6f", $LRpreroute_avg);
+		$nLRpreroute_avg = ($nLRpreroute_total / $nLRpreroute);
+		$nLRpreroute_avg = sprintf("%01.6f", $nLRpreroute_avg);
 
 		$MAIN.= "\nFINISHED - \n";
 		$MAIN.= "TOTAL ANSWERED CALLS:  $i\n";
-		$MAIN.= "LRERR:                 $LRERR  ($LRERR_pct%)\n";
+		$MAIN.= "LRERR:                 $LRERR  ($LRERR_pct%)   average $LRERR_avg sec\n";
 		$MAIN.= "preroute:              $preroute  (average $preroute_avg sec)\n";
+		$MAIN.= "LRpreroute:            $LRpreroute  (average $LRpreroute_avg sec)\n";
+		$MAIN.= "nLRpreroute:           $nLRpreroute  (average $nLRpreroute_avg sec)\n";
+		$MAIN.= "uncounted:             $uncounted\n";
+
+		if ($uncounted_statuses > 0)
+			{
+			$MAIN.= "UNCOUNTED STATUS SUMMARY - \n";
+			$k=0;
+			while ($k < $ucstatus_ct)
+				{
+				$ucstatus_array[$k] = sprintf("%6s", $ucstatus_array[$k]);
+				$ucstatus_calls[$k] = sprintf("%6s", $ucstatus_calls[$k]);
+				$MAIN.= "     $ucstatus_array[$k]:    $ucstatus_calls[$k]\n";
+				$k++;
+				}
+			}
+		if ($lrerr_statuses > 0)
+			{
+			$MAIN.= "LRERR STATUS SUMMARY - \n";
+			$k=0;
+			while ($k < $status_ct)
+				{
+				$status_array[$k] = sprintf("%6s", $status_array[$k]);
+				$status_calls[$k] = sprintf("%6s", $status_calls[$k]);
+				$MAIN.= "     $status_array[$k]:    $status_calls[$k]\n";
+				$k++;
+				}
+			}
 		$MAIN.= "SERVER SUMMARY - \n";
 
 		$k=0;
@@ -544,14 +758,22 @@ if ($SUBMIT) {
 
 			$LRERR_pct=( ($server_LRERR[$k] / $server_calls[$k]) * 100);
 			$LRERR_pct = sprintf("%01.2f", $LRERR_pct);
+			$LRERR_avg = ($server_LRERR_time[$k] / $server_LRERR[$k]);
+			$LRERR_avg = sprintf("%01.6f", $LRERR_avg);
 
 			$preroute_avg = ($server_preroute_time[$k] / $server_preroute[$k]);
 			$preroute_avg = sprintf("%01.6f", $preroute_avg);
+			$LRpreroute_avg = ($server_LRpreroute_time[$k] / $server_LRpreroute[$k]);
+			$LRpreroute_avg = sprintf("%01.6f", $LRpreroute_avg);
+			$nLRpreroute_avg = ($server_nLRpreroute_time[$k] / $server_nLRpreroute[$k]);
+			$nLRpreroute_avg = sprintf("%01.6f", $nLRpreroute_avg);
 
 			$MAIN.= "     $server_array[$k] - $server_description - $asterisk_version\n";
-			$MAIN.= "          TOTAL:      $server_calls[$k]\n";
-			$MAIN.= "          LRERR:      $server_LRERR[$k]  ($LRERR_pct%)\n";
-			$MAIN.= "          preroute:   $server_preroute[$k]  (average $preroute_avg sec)\n";
+			$MAIN.= "          TOTAL:        $server_calls[$k]\n";
+			$MAIN.= "          LRERR:        $server_LRERR[$k]  ($LRERR_pct%)    average $LRERR_avg sec\n";
+			$MAIN.= "          preroute:     $server_preroute[$k]  (average $preroute_avg sec)\n";
+			$MAIN.= "          LRpreroute:   $server_LRpreroute[$k]  (average $LRpreroute_avg sec)\n";
+			$MAIN.= "          nLRpreroute:  $server_nLRpreroute[$k]  (average $nLRpreroute_avg sec)\n";
 			$k++;
 			}