From f4e3cd1f058ac2defa07b36161b83e6bc70d7cc9 Mon Sep 17 00:00:00 2001 From: mattf Date: Tue, 15 Nov 2016 19:46:42 +0000 Subject: [PATCH] Added listloader file upload error output Added beta outbound call routing code and docs git-svn-id: svn://192.168.202.10@2620 3d104415-ff17-0410-8863-d5cf3c621b8a --- agi/agi-VDAD_ALL_outboundBETA.agi | 4395 +++++++++++++++++ docs/OUTBOUND_OPTIMIZATIONS.txt | 149 + docs/conf_examples/extensions.conf.sample-1.8 | 10 + extras/MySQL_AST_CREATE_tables.sql | 20 +- extras/upgrade_2.12.sql | 19 + www/vicidial/admin_listloader_fourth_gen.php | 42 +- 6 files changed, 4630 insertions(+), 5 deletions(-) create mode 100644 agi/agi-VDAD_ALL_outboundBETA.agi create mode 100644 docs/OUTBOUND_OPTIMIZATIONS.txt diff --git a/agi/agi-VDAD_ALL_outboundBETA.agi b/agi/agi-VDAD_ALL_outboundBETA.agi new file mode 100644 index 00000000..12d6da88 --- /dev/null +++ b/agi/agi-VDAD_ALL_outboundBETA.agi @@ -0,0 +1,4395 @@ +#!/usr/bin/perl +# +# agi-VDAD_ALL_outboundBETA.agi version 2.12 +# +# runs when an outbound call is answered. This script will +# send the calls out to the agents that are logged in. +# ## THIS SCRIPT CONSOLIDATES EIGHT SEPARATE VDAD outbound transfer SCRIPTS ## +# +# +# You need to put lines similar to those below in your extensions.conf file: +# ; Below are the parameters needed for the script to be run properly +# ; 1. the method of call handling for the script: +# ; - NORMAL - Standard outbound routing to agent +# ; - TEST - For performance testing only +# ; - BROADCAST - For no-agent broadcast dialing +# ; - SURVEY - For survery question then on to agent +# ; - SURVEYCAMP - For survery question using campaign settings +# ; - SURVEYCAMPCEP - Survery question, campaign settings, cepstral name +# ; - REMINDER - Reminder campaign +# ; - REMINDX - Reminder with transfer to agent +# ; 2. the method of searching for an available agent: +# ; - LB - Load Balance total system +# ; - LO - Load Balance Overflow only (priority to home server) +# ; - SO - Home server only +# ; 3. the sound file to play when doing a SURVEY, REMINDER, REMINDX campaign +# ; 4. the acceptible dtmf digits for a SURVEY +# ; 5. the out-opt digit for a SURVEY (must be in the digit map) +# ; 6. the sound file to play for a SURVEY when transfering to an agent +# ; 7. the sound file to play for a SURVEY when DNCing the call +# ; 8. OPTIN or OPTOUT: if OPTIN call is only sent to agent with button press +# ; if OPTOUT call is sent to agent if no button press at all +# ; 9. the status that is used for a SURVEY when someone opts out +# ; if the status is DNC it will also add them to the internal dnc table +# +# ;outbound VICIDIAL calls: +#exten => 8368,1,AGI(agi://127.0.0.1:4577/call_log) +#exten => 8368,2,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB) +#exten => 8368,3,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB) +#exten => 8368,4,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB) +#exten => 8368,5,Hangup +# +# ;outbound VICIDIAL SURVEY calls: +#exten => 8366,1,AGI(agi://127.0.0.1:4577/call_log) +#exten => 8366,2,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact-----OPTOUT-----DNC) +#exten => 8366,3,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact-----OPTOUT-----DNC) +#exten => 8366,4,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact-----OPTOUT-----DNC) +#exten => 8366,5,Hangup +# +# Copyright (C) 2016 Matt Florell LICENSE: AGPLv2 +# +# changes: +# 80218-2027 - First Build +# 80302-0232 - Added drop_action and transfer to in-group +# 80430-1144 - Added term_reason to vicidial_log, QUEUETIMEOUT +# 80520-0059 - Added SURVEY ability and digit maps +# 80527-2329 - Added SURVEYCAMP ability to pull settings from database +# 80831-0353 - Added logging of alt_dial field +# 80909-0603 - Added campaign-specific dnc option for outbound survey +# 81020-0235 - Fixed Drop hangup bug and other small bugs +# 81104-0255 - Changed code to alter callerIDnumber for remote agents to the number of the caller +# 81105-0424 - Added MySQL error logging +# 90202-0505 - Added CPD AMD detection and routing options +# 90214-0831 - Added CPD Fax detection option +# 90410-1645 - Added SURVEYCAMPCEP call handling method and cleaned up formatting +# 90628-1138 - Added more variable options for Cepstral TTS generation +# 90630-2250 - Added more Sangoma CDP statuses +# 90702-2240 - Added option to send to remote agent as phone*vendor_id +# 90721-1137 - Added rank and owner as vicidial_list fields +# 90808-0307 - Added longest_wait_time as agent routing option +# 90827-1535 - Added proper logging of list_id in vicidial_log table +# 90924-1605 - Added drop_inbound_group_override list_id option +# 91112-1101 - Changed ENTERQUEUE to CALLOUTBOUND in QM logging for outbound calls +# 91230-1159 - Change to callee callerID when sending the call to VMAIL +# 100205-1024 - Fixed CPD send to message +# 100319-0610 - Added extension group remote agent feature +# 100414-2156 - Added extension_appended_cidname option +# 100424-1341 - Added extended logging +# 100623-1310 - Added queue_priority to queue processing +# 100727-1653 - Fixes for queue priority feature +# 100903-0041 - Changed lead_id max length to 10 digits +# 101207-0713 - Added fix for rare VDAC-entry-missing issue +# 110213-0008 - Added scheduled callbacks custom statuses compatibility +# 110224-1733 - Added compatibility with QM phone environment logging +# 110303-2316 - Added condition that would not allow calls to be sent to agent with ringing inbound call +# 110324-2326 - Added recording of remote agent calls, per in-group and campaign recording settings +# 110325-1410 - Added user recording override settings checking for remote agent recording +# 110525-1530 - Added AUDIO and CALLMENU drop options +# 110528-2326 - Added CALLMENU survey method +# 110626-2342 - Added queuemetrics_pe_phone_append +# 110723-2330 - Set CID to customer phone number and caller code when transferring to CALLMENU +# 110812-1514 - Added static tts file parsing and replacement +# 110829-2324 - Added survey_recording option +# 110926-1929 - Small fixes +# 111201-1751 - Added grade-random next-agent-call option +# 111219-2256 - Added max stats updating +# 120430-2214 - Converted call to Monitor app to be asterisk 1.8 compatible +# 120430-2218 - For AGI commands not made through the AGI object added a read from STDIN before calling checkresult +# 120529-2112 - Added safe_harbor_audio_field campaign option +# 120621-0726 - Changed survey opt-in non-agent qm logging to log connection to VDAD agent +# 121009-1458 - Changed survey method HANGUP to not wait for digits, added LRERR Local channel logging +# 121120-0922 - Added QM socket-send functionality +# 121125-0035 - Added Other Campaign DNC option +# 130108-1806 - Changes for Asterisk 1.8 compatibility +# 130124-1853 - Issue #637 fix +# 130210-1013 - Added options for CALLMENU|INGROUP cpd_amd_actions +# 130425-0049 - Added survey_wait_sec option and pre-process time logging +# 130425-0657 - Added survey_no_response option to drop to campaign drop action +# 131209-1735 - Added called_count logging +# 140126-1128 - Added VMAIL_NO_INST options +# 140215-2121 - Added several variable options for QM socket URL +# 140312-2112 - Added CALLID as recording filename variable +# 140617-1946 - Added single-digit change to text for TTS +# 141211-1635 - Added cpd_unknown_action campaign option and list_id added to AST_send_URL calls +# 141219-1219 - Fixed issue related to QM logging +# 150928-1822 - Added dnc logging +# 160101-1528 - Added routing_initiated_recordings +# 161102-1037 - Fixed QM partition problem +# 161115-1359 - Forked to BETA script, added vdad_debug_logging option +# + +$script = 'agi-VDAD_ALL_outboundBETA.agi'; +$AGILOG = '0'; +$mel=1; # Mysql Error Log enabled = 1 +$mysql_log_count=119; +$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='01XXX'; $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='01XXX'; $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 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]; + } + $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(); + + $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 + 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|/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','VDAD','$campaign_rec_filename','$uniqueid');"; + $SRaffected_rows = $dbhA->do($stmtA); + $dbhP=$dbhA; $mysql_count='01078'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging; + if ($AGILOG) {$agi_string = "-- SURVEY RECORDING STARTED : |$SRaffected_rows|$campaign_rec_filename|$stmtA|"; &agi_output;} + } + + + ### pre-generate Cepstral first and last name as an audio file + if ($call_handle_method =~ /SURVEYCAMPCEP/) + { + $t=0; + if ($survey_first_audio_file =~ /^TTS/) + { + $TTS_prompt[$t] = 'survey_first_audio_file'; + $TTS_filename[$t] = $survey_first_audio_file; + $TTS_filename[$t]=~s/^TTS//gi; + $t++; + } + if ($survey_opt_in_audio_file =~ /^TTS/) + { + $TTS_prompt[$t] = 'survey_opt_in_audio_file'; + $TTS_filename[$t] = $survey_opt_in_audio_file; + $TTS_filename[$t]=~s/^TTS//gi; + $t++; + } + if ($survey_ni_audio_file =~ /^TTS/) + { + $TTS_prompt[$t] = 'survey_ni_audio_file'; + $TTS_filename[$t] = $survey_ni_audio_file; + $TTS_filename[$t]=~s/^TTS//gi; + $t++; + } + if ($survey_third_audio_file =~ /^TTS/) + { + $TTS_prompt[$t] = 'survey_third_audio_file'; + $TTS_filename[$t] = $survey_third_audio_file; + $TTS_filename[$t]=~s/^TTS//gi; + $t++; + } + if ($survey_fourth_audio_file =~ /^TTS/) + { + $TTS_prompt[$t] = 'survey_fourth_audio_file'; + $TTS_filename[$t] = $survey_fourth_audio_file; + $TTS_filename[$t]=~s/^TTS//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) + { + $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]; + ### 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 = "