#!/usr/bin/perl # # agi-VDAD_ALL_outboundBETA2.agi version 2.14 # # 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) 2017 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!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # 170921-2007 - Fix for CALLID in beginning of recording filename # $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; } $vmgr_callerid = substr($campaign_rec_filename, 0, 17) . '...'; $stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VDADserver_ip','','Originate','$vmgr_callerid','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(); }