#!/usr/bin/perl # # agi-VDAD_ALL_outbound.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: (agent_search_method) # ; - LB - Load Balance total system # ; - LO - Load Balance Overflow only (priority to home server) # ; - SO - Home server only # ; 3. The Connected Line Name to solve CID Name change issues. # ; 4. the sound file to play when doing a SURVEY, REMINDER, REMINDX campaign # ; 5. the acceptible dtmf digits for a SURVEY # ; 6. the out-opt digit for a SURVEY (must be in the digit map) # ; 7. the sound file to play for a SURVEY when transfering to an agent # ; 8. the sound file to play for a SURVEY when DNCing the call # ; 9. 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 # ; 10. the status that is use for a SURVEY when someone opts out # ; if the status is DNC it will also add them to the internal dnc table # #; VICIDIAL_auto_dialer transfer script Load Balanced: #exten => 8368,1,AGI(agi://127.0.0.1:4577/call_log) #exten => 8368,n,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB-----${CONNECTEDLINE(name)}) #exten => 8368,n,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) 2025 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 # 161201-1003 - Fixed LRERR logging issue # 170921-2007 - Fix for CALLID in beginning of recording filename # 170930-0913 - Added extension append options # 180926-2350 - Added _wait_time options for next_agent_call # 190531-0901 - Changed dialplan inputs to accept connected-line name for CIDname validation, added SIP event processing # 190713-1045 - Added Call Quota logging # 190925-1348 - Added campaign SIP Actions processing # 191104-2026 - Added code for Khomp version compatibility # 191120-2235 - Added DYN multi-prompt survey prompts functionality # 200825-2342 - Added option for auto-only sip actions # 200915-2218 - Fixes for surveys with hash-star # 210907-1254 - Added KHOMP code (install JSON::PP Perl module and remove '#UC#' in the code to enable) # 220524-1746 - Changed SHARED_ campaign in-group transfers to use 'SRDROP' log status instead of 'DROP' # 230309-0952 - Added abandon_check_queue feature # 240804-1218 - Remove ding and sleep for dropped calls going to an extension(message) # 240906-1021 - Added testing for stereo_recording campaign option *NOT PRODUCTION READY* # 241001-2222 - Fixes for Khomp call processing # 241020-1928 - Added khomp campaign settings options # 250827-1556 - Added stereo_recording code # $script = 'agi-VDAD_ALL_outbound.agi'; $AGILOG = '0'; $mel=1; # Mysql Error Log enabled = 1 $mysql_log_count=147; $one_mysql_log=0; use Time::Local; use Time::HiRes ('tv_interval','gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second ($START_s_hires, $START_usec) = gettimeofday(); # Needed for Khomp Integration #UC# use JSON::PP qw(encode_json decode_json); ### find curl binary for KHOMP $curlbin = ''; $khomp_enabled = 1; if ( -e ('/bin/curl')) {$curlbin = '/bin/curl';} else { if ( -e ('/usr/bin/curl')) {$curlbin = '/usr/bin/curl';} else { if ( -e ('/usr/local/bin/curl')) {$curlbin = '/usr/local/bin/curl';} else { if ($AGILOG) {$agi_string = "ERROR: curl binary not found, KHOMP disabled"; &agi_output;} $khomp_enabled = 0; } } } $DROP_TIME = 9; ### default number of seconds to wait until you drop a waiting call $at='@'; $US='_'; $wav='.wav'; # get date/time $now_date_epoch = 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";} $epochTWENTYFOURhoursAGO = ($now_date_epoch - 86400); ($Ssec,$Smin,$Shour,$Smday,$Smon,$Syear,$Swday,$Syday,$Sisdst) = localtime($epochTWENTYFOURhoursAGO); $Smon++; $Syear = ($Syear + 1900); if ($Smon < 10) {$Smon = "0$Smon";} if ($Smday < 10) {$Smday = "0$Smday";} if ($Shour < 10) {$Shour = "0$Shour";} if ($Smin < 10) {$Smin = "0$Smin";} if ($Ssec < 10) {$Ssec = "0$Ssec";} $timeTWENTYFOURhoursAGO = "$Syear-$Smon-$Smday $Shour:$Smin:$Ssec"; $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";} # generate paths to asterisk stereo recordings directories: $PATHmonitorS = $PATHmonitor."S"; $PATHmonitorP = $PATHmonitor."P"; $PATHmonitorTRASH = $PATHmonitor."TRASH"; 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; ############################################# ##### Gather system_settings ##### $stmtA = "SELECT sip_event_logging,call_quota_lead_ranking,agent_search_method,abandon_check_queue,stereo_recording,stereo_parallel_recording FROM system_settings;"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; $SSsip_event_logging = $aryA[0]; $SScall_quota_lead_ranking = $aryA[1]; $SSagent_search_method = $aryA[2]; $SSabandon_check_queue = $aryA[3]; $SSstereo_recording = $aryA[4]; $SSstereo_parallel_recording = $aryA[5]; } $sthA->finish(); ########################################### ### 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,external_server_ip,conf_engine 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]; $external_server_ip = $aryA[8]; $conf_engine = $aryA[9]; 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(); ### 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]; $connected_line_name = $ARGV_vars[2]; $survey_first_audio_file = $ARGV_vars[3]; $survey_dtmf_digits = $ARGV_vars[4]; $survey_ni_digit = $ARGV_vars[5]; $survey_opt_in_audio_file = $ARGV_vars[6]; $survey_ni_audio_file = $ARGV_vars[7]; $survey_no_response_action = $ARGV_vars[8]; $survey_ni_status = $ARGV_vars[9]; } 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; # check if callerid is valid if ( !validate_cid_name( $callerid ) ) { if ($AGILOG) {$agi_string = "CALLERID '$callerid' INVALID!!!!!!! Trying to use Connected Line Name '$connected_line_name'"; &agi_output;} if ( validate_cid_name( $connected_line_name ) ) { $callerid = $connected_line_name; } else { if ($AGILOG) {$agi_string = "Connected Line Name $connected_line_name is also invalid! This is bad."; &agi_output;} } } $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;} ##### BEGIN SIP event logging, if enabled in the system ##### if ($SSsip_event_logging > 0) { $SIP_event_recent_inserted=0; $SIP_event_action_checked=0; # flag the vicidial_sip_event_recent record as undergoing processing $stmtA = "UPDATE vicidial_sip_event_recent set processed='U' where caller_code='$callerid' LIMIT 1;"; if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); $dbhP=$dbhA; $mysql_count='01137'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- SIP-event recent check: |$affected_rows|$callerid|"; &agi_output;} if ($affected_rows > 0) { $dial_time = 0; $stmtA = "SELECT invite_date,UNIX_TIMESTAMP(first_180_date),UNIX_TIMESTAMP(first_183_date),UNIX_TIMESTAMP(200_date),TIMESTAMPDIFF(MICROSECOND,invite_date,200_date) as dial,TIMESTAMPDIFF(MICROSECOND,invite_date,first_180_date) as prog,TIMESTAMPDIFF(MICROSECOND,invite_date,first_183_date) as pdd from vicidial_sip_event_recent where caller_code='$callerid' LIMIT 1;"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArowsVSER=$sthA->rows; $dbhP=$dbhA; $mysql_count='01138'; $MEL_aff_rows=$sthArowsLI; &mysql_error_logging; if ($sthArowsVSER > 0) { @aryA = $sthA->fetchrow_array; $invite_date = $aryA[0]; $first_180_date = $aryA[1]; $first_183_date = $aryA[2]; $sip200_date = $aryA[3]; $dial_time = $aryA[4]; $time_to_progress = $aryA[5]; $time_to_ring = $aryA[6]; if ( ($first_180_date > 0) && ($first_180_date != 'NULL') && ($first_183_date > 0) && ($first_183_date != 'NULL')) {if ($first_180_date > $first_183_date) {$time_to_progress=$time_to_ring;}} } $sthA->finish(); if ($sthArowsVSER > 0) { if ( ($time_to_progress > 0) && ($time_to_progress != 'NULL') ) { if ( ($dial_time <= 0) || ($dial_time == 'NULL') ) {$dial_time = $time_to_progress;} $invite_to_ring = $time_to_progress; $ring_to_final = ($dial_time - $invite_to_ring); } else { if ( ($time_to_ring > 0) && ($time_to_ring != 'NULL') ) { if ( ($dial_time <= 0) || ($dial_time == 'NULL') ) {$dial_time = $time_to_ring;} $invite_to_ring = $time_to_ring; $ring_to_final = ($dial_time - $invite_to_ring); } else { $invite_to_ring = 0; $ring_to_final = 0; } } if ($invite_to_ring != '0') {$invite_to_ring = ($invite_to_ring / 1000000);} if ($ring_to_final != '0') {$ring_to_final = ($ring_to_final / 1000000);} if ($dial_time != '0') {$dial_time = ($dial_time / 1000000);} $invite_to_final = $dial_time; # insert a record into the vicidial_log_extended_sip table for this call $stmtA = "INSERT INTO vicidial_log_extended_sip SET call_date='$invite_date', caller_code='$callerid', invite_to_ring='$invite_to_ring', ring_to_final='$ring_to_final', invite_to_final='$dial_time', last_event_code='200';"; if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); $dbhP=$dbhA; $mysql_count='01139'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- SIP-event recent processed: |$affected_rows|$callerid|"; &agi_output;} # flag the vicidial_sip_event_recent record as processed $stmtA = "UPDATE vicidial_sip_event_recent set processed='Y' where caller_code='$callerid' LIMIT 1;"; if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); $dbhP=$dbhA; $mysql_count='01140'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- SIP-event recent processed: |$affected_rows|$callerid|"; &agi_output;} $SIP_event_recent_inserted++; } } } ##### END SIP event logging, if enabled in the system ##### if ( ($channel =~ /Local/i) && ($AST_ver !~ /^1\.0\.8|^1\.0\.9/) ) { if ($AGILOG) {$agi_string = "+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} if ($priority > 2) {sleep(1);} if ($priority > 3) { ### 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='01120'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; $VDADcampaign = $aryA[0]; } $sthA->finish(); } $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed,alt_dial,list_id,called_count) values('$uniqueid','$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','LRERR','$VDADphone_code','$VDADphone','VDAD','N','$VDADalt_dial','$xCLlist_id','$called_count')"; if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $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;} if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) ) { $temp_status = 'LRERR'; &call_quota_logging; } } 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,call_quota_lead_ranking,sip_event_logging,amd_type,agent_search_method,dial_method,stereo_recording,khomp_settings_container,stereo_recording_agent,stereo_rec_filename,stereo_parallel_recording,parallel_rec_co_filename,parallel_rec_cm_filename,parallel_rec_fr_filename 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]; $VD_call_quota_lead_ranking = $aryA[32]; $CAMPsip_event_logging = $aryA[33]; $amd_type = $aryA[34]; $agent_search_method_OVERRIDE = $aryA[35]; $campaign_dial_method = $aryA[36]; $stereo_recording = $aryA[37]; $khomp_settings_container = $aryA[38]; $stereo_recording_agent = $aryA[39]; $stereo_rec_filename = $aryA[40]; $stereo_parallel_recording = $aryA[41]; $parallel_rec_co_filename = $aryA[42]; $parallel_rec_cm_filename = $aryA[43]; $parallel_rec_fr_filename = $aryA[44]; if (length($closer_campaigns) > 2) { $closer_campaigns =~ s/^ | -$//gi; $closer_campaigns =~ s/ /','/gi; $closer_campaigns = "'$closer_campaigns'"; } else {$closer_campaigns="''";} } $sthA->finish(); ### if using KHOMP Analytics get relavant system settings if ( $amd_type eq "KHOMP" ) { $khomp_api_url = ''; $khomp_api_proxied = 'false'; $khomp_api_login_url = ''; $khomp_api_user = ''; $khomp_api_pass = ''; $khomp_api_check_ssl = ''; $khomp_header = ''; $khomp_id_format = ''; $khomp_api_token = ''; $khomp_api_token_expire = 0; $agi_string = "-- KHOMP: Using settings container $khomp_settings_container"; &agi_output; $stmtA = "SELECT container_entry FROM vicidial_settings_containers WHERE container_id = '$khomp_settings_container';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; $container_entry = $aryA[0]; my @lines = split ( /\n/, $container_entry ); foreach my $line (@lines) { # remove comments and blank lines $line =~ /^\s*$/ and next; # skip blank lines $line =~ /^\s*#/ and next; # skip line that begin with # if ( $line =~ /#/ ) # check for comments midway through the line { # remove them @split_line = split( /#/ , $line ); $line = $split_line[0]; } if ( $line =~ /=>/ ) { @setting = split( /=>/ , $line ); $key = $setting[0]; $key =~ s/^\s+|\s+$//g; $value = $setting[1]; $value =~ s/^\s+|\s+$//g; if ( $key eq 'khomp_api_url' ) { $khomp_api_url = $value; } if ( $key eq 'khomp_api_proxied' ) { $khomp_api_proxied = $value; } if ( $key eq 'khomp_api_user' ) { $khomp_api_user = $value; } if ( $key eq 'khomp_api_pass' ) { $khomp_api_pass = $value; } if ( $key eq 'khomp_api_check_ssl' ) { $khomp_api_check_ssl = $value; } if ( $key eq 'khomp_header' ) { $khomp_header = $value; } if ( $key eq 'khomp_id_format' ) { $khomp_id_format = $value; } if ( $key eq 'khomp_api_login_url' ) { $khomp_api_login_url = $value; } if ( $key eq 'khomp_api_token' ) { $khomp_api_token = $value; } if ( $key eq 'khomp_api_token_expire' ) { $khomp_api_token_expire = $value; } } } $agi_string = "KHOMP Settings: url-$khomp_api_url|proxied-$khomp_api_proxied|login_url-$khomp_api_login_url|user-$khomp_api_user|pass-$khomp_api_pass|ssl-check-$khomp_api_check_ssl|header-$khomp_header|format-$khomp_id_format|api-token-$khomp_api_token|token-expire-$khomp_api_token_expire|"; &agi_output; } ### load the Khomp status map %conclusion_map = {}; $stmtA = "SELECT container_entry FROM vicidial_settings_containers WHERE container_id = 'KHOMPSTATUSMAP';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; $container_entry = $aryA[0]; my @lines = split ( /\n/, $container_entry ); foreach my $line (@lines) { # remove comments and blank lines $line =~ /^\s*$/ and next; # skip blank lines $line =~ /^\s*#/ and next; # skip line that begin with # if ( $line =~ /#/ ) # check for comments midway through the line { # remove them @split_line = split( /#/ , $line ); $line = $split_line[0]; } if ( $line =~ /=>/ ) { @setting = split( /=>/ , $line ); $conclusion_pattern = $setting[0]; $conclusion_pattern =~ s/^\s+|\s+$//g; $action_status = $setting[1]; $action_status =~ s/^\s+|\s+$//g; # check if the conclusion_pattern looks like "blah"."blahblah" or just "blah" if ( $conclusion_pattern =~ /\./ ) { # if "blah"."blahblah" break it up @rsr = split( /\./ , $conclusion_pattern ); $conclusion = $rsr[0]; $conclusion =~ s/^\s+|\s+$//g; $conclusion =~ s/^"|"$//g; $pattern = $rsr[1]; $pattern =~ s/^\s+|\s+$//g; $pattern =~ s/^"|"$//g; } else { # otherwise conclusion is the string and pattern is blank $conclusion = $conclusion_pattern; $conclusion =~ s/^\s+|\s+$//g; $conclusion =~ s/^"|"$//g; $pattern = ""; } @as = split( /\./ , $action_status ); $action = @as[0]; $action =~ s/^\s+|\s+$//g; $action =~ s/^"|"$//g; $status = @as[1]; $status =~ s/^\s+|\s+$//g; $status =~ s/^"|"$//g; $dial_status = @as[2]; $dial_status =~ s/^\s+|\s+$//g; $dial_status =~ s/^"|"$//g; # load the result map hash with the values $conclusion_map{"$conclusion"}{"$pattern"}{'action'} = $action; $conclusion_map{"$conclusion"}{"$pattern"}{'status'} = $status; $conclusion_map{"$conclusion"}{"$pattern"}{'dial_status'} = $dial_status; } } } } ##### BEGIN SIP Action check ##### if ( ($SIP_event_recent_inserted > 0) && ($SIP_event_action_checked < 1) && (length($CAMPsip_event_logging) > 0) and ($CAMPsip_event_logging !~ /^DISABLED$/i) ) { # Gather settings container for SIP Event Actions $CQcontainer_entry=''; $stmtA = "SELECT container_entry FROM vicidial_settings_containers where container_id='$CAMPsip_event_logging';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; if ( ($AGILOG > 0) && ($sthArows > 0) ) {$agi_string = "-- SIP ACTION check: |$sthArows|$invite_to_final|$CAMPsip_event_logging|"; &agi_output;} $dbhP=$dbhA; $mysql_count='01141'; $MEL_aff_rows=$sthArows; &mysql_error_logging; if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; $SAcontainer_entry = $aryA[0]; $SAcontainer_entry =~ s/\r|\t|\'|\"//gi; @sip_action_settings = split(/\n/,$SAcontainer_entry); $sea=0; foreach (@sip_action_settings) { if ( ($sip_action_settings[$sea] =~ /^invite_to_final => /) && ($sip_action_settings[$sea] !~ /manual-only/i) ) { # invite_to_final => 0.0,1.0,hangup-dispo-message,FAS,Auto Hangup and Dispo of False Answer Call,auto-only $sip_action_settings[$sea] =~ s/invite_to_final => //gi; @invite_to_finalARY = split(/,/,$sip_action_settings[$sea]); $T_dial_time = ($invite_to_final + 0); $itf_begin = ($invite_to_finalARY[0] + 0); $itf_end = ($invite_to_finalARY[1] + 0); $itf_actions = $invite_to_finalARY[2]; $itf_dispo = $invite_to_finalARY[3]; $itf_message = $invite_to_finalARY[4]; if ( ($T_dial_time >= $itf_begin) && ($T_dial_time <= $itf_end) && (length($itf_actions) > 4) ) { if ($itf_actions =~ /logtable/i) { ##### insert record into vicidial_sip_action_log $stmtA="INSERT INTO vicidial_sip_action_log set call_date='$invite_date',caller_code='$callerid',lead_id='$CIDlead_id',phone_number='$VDADphone',user='VDAD',result='$itf_dispo';"; $SAaffected_rows = $dbhA->do($stmtA); $dbhP=$dbhA; $mysql_count='01142'; $MEL_aff_rows=$SAaffected_rows; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- SIP ACTION logtable inserted : |$SAaffected_rows|($T_dial_time <> $itf_begin -> $itf_end)|$itf_actions|$stmtA|"; &agi_output;} } if ($itf_actions =~ /hangup/i) { if (length($itf_dispo) < 1) {$itf_dispo='SIPACT';} $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='01143'; $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(); $START_time = $START_s_hires . '.' . sprintf("%06s", $START_usec); $END_time = $END_s_hires . '.' . sprintf("%06s", $END_usec); $RUN_time = ($END_time - $START_time); $RUN_time = sprintf("%.3f", $RUN_time); if ($AGILOG) {$agi_string = "Preprocess time: |$RUN_time ($END_time - $START_time)|"; &agi_output;} $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,end_epoch,length_in_sec,status,phone_code,phone_number,user,processed,alt_dial,list_id,comments,called_count,term_reason) values('$uniqueid','$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','$now_date_epoch','0','$itf_dispo','$VDADphone_code','$VDADphone','VDAD','N','$VDADalt_dial','$xCLlist_id','$RUN_time','$called_count','SYSTEM')"; if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); $dbhP=$dbhA; $mysql_count='01144'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- SIP ACTION VDAD : |$VDADlead_id|$CIDlead_id|($T_dial_time <> $itf_begin -> $itf_end)|$itf_actions|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='01145'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- SIP ACTION VDAD VLE insert: |$affected_rows|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='$itf_dispo' where lead_id='$CIDlead_id';"; if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; } $affected_rows = $dbhA->do($stmtA); $dbhP=$dbhA; $mysql_count='01146'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- SIP ACTION VDAD vicidial_list update: $itf_dispo|$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='01147'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|"; &agi_output;} if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) ) { $temp_status = $itf_dispo; &call_quota_logging; } $AGI->hangup(); exit; } } } $sea++; } } $sthA->finish(); $SIP_event_action_checked++; } ##### END SIP Action check ##### ### start recording if survey recording is enabled if ( ($call_handle_method =~ /SURVEY/) && ($survey_recording =~ /Y/) ) { $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='01077'; $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/INGROUP/$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/VDAD/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; $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|$PATHmonitor/MIX/$campaign_rec_filename"); } else { $AGI->exec("Monitor","wav,$PATHmonitor/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','VDAD','$campaign_rec_filename','$uniqueid');"; $SRaffected_rows = $dbhA->do($stmtA); $dbhP=$dbhA; $mysql_count='01078'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging; $stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;"; $sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; $dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging; 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='02214'; $MEL_aff_rows=$affected_rows; &mysql_error_logging; } $stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status) values('$recording_id','MONO_LEGACY_SURVEY','$VARserver_ip','$now_date','$channel','$campaign_rec_filename','$CIDlead_id','VDAD','2020-12-31 23:59:59','STARTED');"; $rLIVEaffected_rows = $dbhA->do($stmtD); $dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging; if ($AGILOG) {$agi_string = "-- SURVEY RECORDING STARTED : |$SRaffected_rows|$campaign_rec_filename|$rLIVEaffected_rows|$stmtA|"; &agi_output;} } ##### BEGIN TTS or DYN audio prompt processing, pre-generate Cepstral first and last name as an audio file ##### if ($call_handle_method =~ /SURVEYCAMPCEP/) { $t=0; if ($survey_first_audio_file =~ /^TTS|^DYN/) { $TTS_prompt[$t] = 'survey_first_audio_file'; $TTS_filename[$t] = $survey_first_audio_file; $TTS_DYN[$t]=0; if ($survey_first_audio_file =~ /^DYN/) {$TTS_DYN[$t]++;} $TTS_filename[$t]=~s/^TTS|^DYN//gi; $t++; } if ($survey_opt_in_audio_file =~ /^TTS|^DYN/) { $TTS_prompt[$t] = 'survey_opt_in_audio_file'; $TTS_filename[$t] = $survey_opt_in_audio_file; $TTS_DYN[$t]=0; if ($survey_opt_in_audio_file =~ /^DYN/) {$TTS_DYN[$t]++;} $TTS_filename[$t]=~s/^TTS|^DYN//gi; $t++; } if ($survey_ni_audio_file =~ /^TTS|^DYN/) { $TTS_prompt[$t] = 'survey_ni_audio_file'; $TTS_filename[$t] = $survey_ni_audio_file; $TTS_DYN[$t]=0; if ($survey_ni_audio_file =~ /^DYN/) {$TTS_DYN[$t]++;} $TTS_filename[$t]=~s/^TTS|^DYN//gi; $t++; } if ($survey_third_audio_file =~ /^TTS|^DYN/) { $TTS_prompt[$t] = 'survey_third_audio_file'; $TTS_filename[$t] = $survey_third_audio_file; $TTS_DYN[$t]=0; if ($survey_third_audio_file =~ /^DYN/) {$TTS_DYN[$t]++;} $TTS_filename[$t]=~s/^TTS|^DYN//gi; $t++; } if ($survey_fourth_audio_file =~ /^TTS|^DYN/) { $TTS_prompt[$t] = 'survey_fourth_audio_file'; $TTS_filename[$t] = $survey_fourth_audio_file; $TTS_DYN[$t]=0; if ($survey_fourth_audio_file =~ /^DYN/) {$TTS_DYN[$t]++;} $TTS_filename[$t]=~s/^TTS|^DYN//gi; $t++; } if ($AGILOG) {$agi_string = "-- TTS : |$t|$TTS_filename[0]|$TTS_filename[1]|$TTS_filename[2]|$TTS_filename[3]|$TTS_filename[4]|"; &agi_output;} ### if there are TTS audio files run this if ($t > 0) { $stmtA = "SELECT lead_id,entry_date,modify_date,status,user,vendor_lead_code,source_id,list_id,phone_number,title,first_name,middle_initial,last_name,address1,address2,address3,city,state,province,postal_code,country_code,gender,date_of_birth,alt_phone,email,security_phrase,comments,called_count,last_local_call_time,rank,owner 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; $TTS_lead_id = tts_num_var_test($aryA[0]); $TTS_entry_date = tts_num_var_test($aryA[1]); $TTS_modify_date = tts_num_var_test($aryA[2]); $TTS_status = tts_num_var_test($aryA[3]); $TTS_user = tts_num_var_test($aryA[4]); $TTS_vendor_lead_code = tts_num_var_test($aryA[5]); $TTS_source_id = tts_num_var_test($aryA[6]); $TTS_list_id = tts_num_var_test($aryA[7]); $TTS_phone_number = tts_num_var_test($aryA[8]); $TTS_title = tts_num_var_test($aryA[9]); $TTS_first_name = tts_num_var_test($aryA[10]); $TTS_middle_initial = tts_num_var_test($aryA[11]); $TTS_last_name = tts_num_var_test($aryA[12]); $TTS_address1 = tts_num_var_test($aryA[13]); $TTS_address2 = tts_num_var_test($aryA[14]); $TTS_address3 = tts_num_var_test($aryA[15]); $TTS_city = tts_num_var_test($aryA[16]); $TTS_state = tts_num_var_test($aryA[17]); $TTS_province = tts_num_var_test($aryA[18]); $TTS_postal_code = tts_num_var_test($aryA[19]); $TTS_country_code = tts_num_var_test($aryA[20]); $TTS_gender = tts_num_var_test($aryA[21]); $TTS_date_of_birth = tts_num_var_test($aryA[22]); $TTS_alt_phone = tts_num_var_test($aryA[23]); $TTS_email = tts_num_var_test($aryA[24]); $TTS_security_phrase = tts_num_var_test($aryA[25]); $TTS_comments = tts_num_var_test($aryA[26]); $TTS_called_count = tts_num_var_test($aryA[27]); $TTS_last_local_call_time = tts_num_var_test($aryA[28]); $TTS_rank = tts_num_var_test($aryA[29]); $TTS_owner = tts_num_var_test($aryA[30]); } $sthA->finish(); $s=0; while ($s < $t) { if ($TTS_DYN[$s] < 1) { $stmtA = "SELECT tts_text,tts_voice FROM vicidial_tts_prompts where tts_id='$TTS_filename[$s]';"; $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 ($s < 1) {$hideCLI = '';} else {$hideCLI = '&';} if ($sthArows > 0) { @aryA = $sthA->fetchrow_array; $TTS_voice = $aryA[1]; $TTS_text[$s] = $aryA[0]; } $sthA->finish(); } else {$TTS_text[$s] = $TTS_filename[$s];} ### BEGIN replace variables with record values ### $TTS_text[$s] =~ s/--A--lead_id--B--/$TTS_lead_id/gi; $TTS_text[$s] =~ s/--A--entry_date--B--/$TTS_entry_date/gi; $TTS_text[$s] =~ s/--A--modify_date--B--/$TTS_modify_date/gi; $TTS_text[$s] =~ s/--A--status--B--/$TTS_status/gi; $TTS_text[$s] =~ s/--A--user--B--/$TTS_user/gi; $TTS_text[$s] =~ s/--A--vendor_lead_code--B--/$TTS_vendor_lead_code/gi; $TTS_text[$s] =~ s/--A--source_id--B--/$TTS_source_id/gi; $TTS_text[$s] =~ s/--A--list_id--B--/$TTS_list_id/gi; $TTS_text[$s] =~ s/--A--phone_number--B--/$TTS_phone_number/gi; $TTS_text[$s] =~ s/--A--title--B--/$TTS_title/gi; $TTS_text[$s] =~ s/--A--first_name--B--/$TTS_first_name/gi; $TTS_text[$s] =~ s/--A--middle_initial--B--/$TTS_middle_initial/gi; $TTS_text[$s] =~ s/--A--last_name--B--/$TTS_last_name/gi; $TTS_text[$s] =~ s/--A--address1--B--/$TTS_address1/gi; $TTS_text[$s] =~ s/--A--address2--B--/$TTS_address2/gi; $TTS_text[$s] =~ s/--A--address3--B--/$TTS_address3/gi; $TTS_text[$s] =~ s/--A--city--B--/$TTS_city/gi; $TTS_text[$s] =~ s/--A--state--B--/$TTS_state/gi; $TTS_text[$s] =~ s/--A--province--B--/$TTS_province/gi; $TTS_text[$s] =~ s/--A--postal_code--B--/$TTS_postal_code/gi; $TTS_text[$s] =~ s/--A--country_code--B--/$TTS_country_code/gi; $TTS_text[$s] =~ s/--A--gender--B--/$TTS_gender/gi; $TTS_text[$s] =~ s/--A--date_of_birth--B--/$TTS_date_of_birth/gi; $TTS_text[$s] =~ s/--A--alt_phone--B--/$TTS_alt_phone/gi; $TTS_text[$s] =~ s/--A--email--B--/$TTS_email/gi; $TTS_text[$s] =~ s/--A--security_phrase--B--/$TTS_security_phrase/gi; $TTS_text[$s] =~ s/--A--comments--B--/$TTS_comments/gi; $TTS_text[$s] =~ s/--A--called_count--B--/$TTS_called_count/gi; $TTS_text[$s] =~ s/--A--last_local_call_time--B--/$TTS_last_local_call_time/gi; $TTS_text[$s] =~ s/--A--rank--B--/$TTS_rank/gi; $TTS_text[$s] =~ s/--A--owner--B--/$TTS_owner/gi; ### END replace variables with record values ### ### BEGIN check for --C-- and --D-- tags for static file replacement if ( ($TTS_text[$s] =~ /--C--/) || ($TTS_text[$s] =~ /--D--/) ) { $Cdash='--C--'; $Ddash='--D--'; @static_check = split(/--C--/,$TTS_text[$s]); $sc=0; $sr=0; foreach(@static_check) { if ($sc > 0) { $static_check[$sc] =~ s/--D-.*//gi; $static_check_lc = lc($static_check[$sc]); print STDERR " Checking For Static Replacement: $static_check[$sc]|$static_check_lc$wav\n"; $static_found=0; if (-e "/var/lib/asterisk/sounds/tts_static/$static_check_lc$wav") { $CDstatic = "