Files
agc_2-X/agi/agi-VDAD_ALL_outbound.agi
T
mattf d5a90e49f3 Fixes for systems with overloaded Khomp servers on outbound auto-dialing
git-svn-id: svn://192.168.202.10@4019 3d104415-ff17-0410-8863-d5cf3c621b8a
2026-09-02 20:09:25 +00:00

7237 lines
334 KiB
Perl

#!/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 - <default> 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 - <default> 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) 2026 Matt Florell <vicidial@gmail.com> 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 <karlb>
# 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
# 250924-2150 - Added code for deprecation of "Monitor" application after Asterisk 20
# 251001-1837 - Fix for rare Stereo recording filename issue
# 251020-0835 - Added code for recording_dtmf_muting, fix for stereo call recording
# 260902-1607 - Fix for systems with overloaded Khomp servers
#
$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 = <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,recording_dtmf_detection,recording_dtmf_muting 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];
$SSrecording_dtmf_detection = $aryA[6];
$SSrecording_dtmf_muting = $aryA[7];
}
$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(<STDIN>)
{
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 = <STDIN>;
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 = <STDIN>;
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,recording_dtmf_muting 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];
$recording_dtmf_muting = $aryA[45];
if ( ($SSrecording_dtmf_detection < 1) || ($SSrecording_dtmf_muting < 1) )
{$recording_dtmf_muting=0;}
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
&get_date_time;
$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
{
if ( ($ast_ver_str{major} > 20) || ($SSrecording_dtmf_muting > 0) )
{
# Deprecation of "Monitor" application after Asterisk 20
$AGI->exec("MixMonitor",",r($PATHmonitor/MIX/$campaign_rec_filename-in.wav)t($PATHmonitor/MIX/$campaign_rec_filename-out.wav)");
}
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;
}
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','MONO_LEGACY_SURVEY','$VARserver_ip','$now_date','$channel','$campaign_rec_filename','$CIDlead_id','VDAD','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$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 = "<audio src='/var/lib/asterisk/sounds/tts_static/$static_check_lc$wav' /> ";
$static_found++;
}
else
{
if (-e "/var/lib/asterisk/sounds/$static_check_lc$wav")
{
$CDstatic = "<audio src='/var/lib/asterisk/sounds/$static_check_lc$wav' /> ";
$static_found++;
}
else
{
$firsttwo = substr($static_check_lc, 0, 2);
if (-e "/var/lib/asterisk/sounds/tts_static/$firsttwo/$static_check_lc$wav")
{
$CDstatic = "<audio src='/var/lib/asterisk/sounds/tts_static/$firsttwo/$static_check_lc$wav' /> ";
$static_found++;
}
}
}
if ($static_found > 0)
{
$CDmatch = "$Cdash$static_check[$sc]$Ddash";
$TTS_text[$s] =~ s/$CDmatch/$CDstatic/gi;
print STDERR " Static Replacement Found: $CDmatch|$CDstatic\n";
$sr++;
}
}
$sc++;
}
$TTS_text[$s] =~ s/--C--|--D--//gi;
print STDERR "\nStatic Replacements Found: $sc|$sr\n";
}
### END check for --C-- and --D-- tags for static file replacement
if ($TTS_DYN[$s] < 1)
{
### filter input for CLI-safe characters
$TTS_text[$s] =~ s/[^,\.\<\>\'\/\=\_\-\: 0-9a-zA-Z]//gi;
$TTS_textRAW[$s] = $TTS_text[$s];
$TTS_text[$s] =~ s/ /\\ /gi;
$TTS_text[$s] =~ s/\./\\./gi;
$TTS_text[$s] =~ s/\=/\\=/gi;
$TTS_text[$s] =~ s/\</\\</gi;
$TTS_text[$s] =~ s/\>/\\>/gi;
$TTS_text[$s] =~ s/\//\\\//gi;
$TTS_text[$s] =~ s/\'/\\'/gi;
# $voice = 'Allison-8kHz'; # override the voice to Allison-8k
print STDERR "\nGenerating: $TTS_text[$s] - $TTS_voice\n";
open(CEPout, ">>$CEPLOGfile")
|| die "Can't open $CEPLOGfile: $!\n";
print CEPout "$PATHagi/cepstral_generate.pl --debug --voice=$TTS_voice --dialog=$TTS_text[$s]\n";
close(CEPout);
### send command to generate cepstral TTS audio file
`$PATHagi/cepstral_generate.pl --debug --voice=$TTS_voice --dialog=$TTS_text[$s] >> $CEPLOGfile $hideCLI`;
use Digest::MD5 qw(md5_hex);
$enc = md5_hex("$TTS_textRAW[$s]-$TTS_voice"); # the hash
$enc_ftl = substr($enc, 0, 2); # first letter of hash
$TTS_filename_path[$s] = $PATHsounds . "/tts/" . $enc_ftl . "/tts-" . $enc;
print STDERR "\nfilename: $TTS_filename_path[$s]\n";
}
else
{$TTS_filename_path[$s] = $TTS_text[$s];}
if ($AGILOG) {$agi_string = "-- TTS-post : |$t|$CIDlead_id|$TTS_filename_path[$s]|"; &agi_output;}
$s++;
}
$s=0;
while ($s < $t)
{
if ($TTS_prompt[$s] =~ /survey_first_audio_file/)
{$survey_first_audio_file = $TTS_filename_path[$s];}
if ($TTS_prompt[$s] =~ /survey_opt_in_audio_file/)
{$survey_opt_in_audio_file = $TTS_filename_path[$s];}
if ($TTS_prompt[$s] =~ /survey_ni_audio_file/)
{$survey_ni_audio_file = $TTS_filename_path[$s];}
if ($TTS_prompt[$s] =~ /survey_third_audio_file/)
{$survey_third_audio_file = $TTS_filename_path[$s];}
if ($TTS_prompt[$s] =~ /survey_fourth_audio_file/)
{$survey_fourth_audio_file = $TTS_filename_path[$s];}
$s++;
}
}
}
##### END TTS or DYN audio prompt processing, pre-generate Cepstral first and last name as an audio file #####
$xCLlist_id=0;
$called_count=0;
$stmtA = "SELECT list_id,security_phrase,called_count from vicidial_list where lead_id='$CIDlead_id' limit 1;";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsLI=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01105'; $MEL_aff_rows=$sthArowsLI; &mysql_error_logging;
if ($sthArowsLI > 0)
{
@aryA = $sthA->fetchrow_array;
$xCLlist_id = $aryA[0];
$security_phrase = $aryA[1];
$called_count = $aryA[2];
}
$sthA->finish();
($END_s_hires, $END_usec) = gettimeofday();
$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,status,phone_code,phone_number,user,processed,alt_dial,list_id,comments,called_count) values('$uniqueid','$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','$vdlog_status','$VDADphone_code','$VDADphone','VDAD','N','$VDADalt_dial','$xCLlist_id','$RUN_time','$called_count')";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01008'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD : |$VDADlead_id|$CIDlead_id|insert to vicidial_log: $uniqueid"; &agi_output;}
$stmtA = "INSERT INTO vicidial_log_extended set uniqueid='$uniqueid',server_ip='$VARserver_ip',call_date='$SQLdate',lead_id = '$CIDlead_id',caller_code='$callerid',custom_call_id='';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01067'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD VLE insert: |$affected_rows|\n|$stmtA|"; &agi_output;}
if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) )
{
$temp_status = $vdlog_status;
&call_quota_logging;
}
#############################################
##### START QUEUEMETRICS LOGGING LOOKUP #####
$stmtA = "SELECT enable_queuemetrics_logging,queuemetrics_server_ip,queuemetrics_dbname,queuemetrics_login,queuemetrics_pass,queuemetrics_log_id,queuemetrics_eq_prepend,queuemetrics_pe_phone_append,queuemetrics_socket,queuemetrics_socket_url 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='01009'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$enable_queuemetrics_logging = $aryA[0];
$queuemetrics_server_ip = $aryA[1];
$queuemetrics_dbname = $aryA[2];
$queuemetrics_login= $aryA[3];
$queuemetrics_pass = $aryA[4];
$queuemetrics_log_id = $aryA[5];
$queuemetrics_eq_prepend = $aryA[6];
$queuemetrics_pe_phone_append = $aryA[7];
$queuemetrics_socket = $aryA[8];
$queuemetrics_socket_url = $aryA[9];
$rec_count++;
}
$sthA->finish();
##### END QUEUEMETRICS LOGGING LOOKUP #####
###########################################
if ($enable_queuemetrics_logging > 0)
{
$stmtA = "SELECT phone_number FROM vicidial_auto_calls 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='01010'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$phone_number = $aryA[0];
$data2 = $phone_number;
$rec_count++;
}
$sthA->finish();
if ( (length($queuemetrics_eq_prepend) > 0) && ($queuemetrics_eq_prepend !~ /NONE/) )
{
$stmtA = "SELECT $queuemetrics_eq_prepend 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='01011'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$rec_count=0;
while ($sthArows > $rec_count)
{
$DASH='-';
@aryA = $sthA->fetchrow_array;
$QMprepend = $aryA[0];
$rec_count++;
$data2 = "$QMprepend$DASH$phone_number";
}
$sthA->finish();
}
$dbhB = DBI->connect("DBI:mysql:$queuemetrics_dbname:$queuemetrics_server_ip:3306", "$queuemetrics_login", "$queuemetrics_pass")
or die "Couldn't connect to database: " . DBI->errstr;
if ($DBX) {print "CONNECTED TO DATABASE: $queuemetrics_server_ip|$queuemetrics_dbname\n";}
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='CALLOUTBOUND',data2='$data2',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01012'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$dbhB->disconnect();
}
}
################################################################################
##### PLAY REMINDER MESSAGE #####
if ($call_handle_method =~ /REMIND/)
{
$AGI->stream_file('sip-silence');
### Using Sangoma CPD
if ( $amd_type eq 'CPD' )
{
############# BEGIN CPD AMD SECTION ############################
if ($cpd_amd_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/)
{
$stmtA = "SELECT count(*) FROM vicidial_cpd_log where callerid='$callerid' and result NOT IN('Voice','Unknown','???','') and status='NEW';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01054'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$cpd_amd = $aryA[0];
}
$sthA->finish();
if ($cpd_amd > 0)
{
&cpd_end_call;
}
}
############# END CPD AMD SECTION ############################
############# BEGIN CPD Unknown SECTION ############################
if ($cpd_unknown_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/)
{
$stmtA = "SELECT count(*) FROM vicidial_cpd_log where callerid='$callerid' and result IN('Unknown','???') and status='NEW';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01109'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$cpd_unknown = $aryA[0];
}
$sthA->finish();
if ($cpd_unknown > 0)
{
&cpd_end_call;
}
}
############# END CPD Unknown SECTION ############################
}
### Using KHOMP call analytics
if (( $amd_type eq 'KHOMP' ) && ( $khomp_enabled ) )
{
process_khomp_analytics(
$khomp_api_url,
$khomp_api_proxied,
$khomp_api_login_url,
$khomp_api_user,
$khomp_api_pass,
$khomp_api_check_ssl,
$khomp_header,
$khomp_id_format,
$khomp_settings_container,
$external_server_ip,
$VDADcampaign,
$callerid,
$cpd_amd_action,
$cpd_unknown_action,
$CIDlead_id
);
}
$stmtA = "UPDATE vicidial_auto_calls set last_update_time='$FDtsSQLdate',stage='REMIND-0' where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01013'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAC posttime record: |$affected_rows|$FDtsSQLdate|$callerid|REMIND|"; &agi_output;}
if ( $survey_first_audio_file ne "")
{
if ($survey_first_audio_file =~ /\|/)
{
@survey_first_audio_file_array = split(/\|/,$survey_first_audio_file);
$w=0;
foreach(@survey_first_audio_file_array)
{
if (length($survey_first_audio_file_array[$w])>0)
{
$AGI->stream_file("$survey_first_audio_file_array[$w]");
}
$w++;
}
}
else
{$AGI->stream_file("$survey_first_audio_file");}
}
}
################################################################################
##### START DO THE SURVEY #####
if ($call_handle_method =~ /SURVEY/)
{
$AGI->stream_file('sip-silence');
### Using Sangoma CPD
if ( $amd_type eq 'CPD' )
{
############# BEGIN CPD AMD SECTION ############################
if ($cpd_amd_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/)
{
$stmtA = "SELECT count(*) FROM vicidial_cpd_log where callerid='$callerid' and result NOT IN('Voice','Unknown','???','') and status='NEW';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01110'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$cpd_amd = $aryA[0];
}
$sthA->finish();
if ($cpd_amd > 0)
{
&cpd_end_call;
}
}
############# END CPD AMD SECTION ############################
############# BEGIN CPD Unknown SECTION ############################
if ($cpd_unknown_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/)
{
$stmtA = "SELECT count(*) FROM vicidial_cpd_log where callerid='$callerid' and result IN('Unknown','???') and status='NEW';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01111'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$cpd_unknown = $aryA[0];
}
$sthA->finish();
if ($cpd_unknown > 0)
{
&cpd_end_call;
}
}
############# END CPD Unknown SECTION ############################
}
### Using KHOMP call analytics
if (( $amd_type eq 'KHOMP' ) && ( $khomp_enabled ) )
{
process_khomp_analytics(
$khomp_api_url,
$khomp_api_proxied,
$khomp_api_login_url,
$khomp_api_user,
$khomp_api_pass,
$khomp_api_check_ssl,
$khomp_header,
$khomp_id_format,
$khomp_settings_container,
$external_server_ip,
$VDADcampaign,
$callerid,
$cpd_amd_action,
$cpd_unknown_action,
$CIDlead_id
);
}
$stmtA = "UPDATE vicidial_auto_calls set last_update_time='$FDtsSQLdate',stage='SURVEY-0' where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01014'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAC posttime record: |$affected_rows|$FDtsSQLdate|$callerid|SURVEY|"; &agi_output;}
### check to see if the SURVEY settings should be pulled from the campaign settings in the database
if ($call_handle_method =~ /SURVEYCAMP/)
{
$stmtA = "SELECT survey_dtmf_digits,survey_ni_digit,survey_method,survey_no_response_action,survey_ni_status,survey_response_digit_map,survey_xfer_exten,survey_camp_record_dir,survey_third_digit,survey_third_status,survey_third_exten,survey_fourth_digit,survey_fourth_status,survey_fourth_exten,survey_menu_id,survey_wait_sec FROM vicidial_campaigns where campaign_id='$VDADcampaign';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01015'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$survey_dtmf_digits = $aryA[0];
$survey_ni_digit = $aryA[1];
$survey_method = $aryA[2];
$survey_no_response_action = $aryA[3];
$survey_ni_status = $aryA[4];
$survey_response_digit_map = $aryA[5];
$survey_xfer_exten = $aryA[6];
$survey_camp_record_dir = $aryA[7];
$survey_third_digit = $aryA[8];
$survey_third_status = $aryA[9];
$survey_third_exten = $aryA[10];
$survey_fourth_digit = $aryA[11];
$survey_fourth_status = $aryA[12];
$survey_fourth_exten = $aryA[13];
$survey_menu_id = $aryA[14];
$survey_wait_sec = $aryA[15];
@digit_map = split(/\|/,$survey_response_digit_map);
$rec_count++;
}
$sthA->finish();
}
# play the message and let them press a number
$digits_to_collect = '1';
$opt_code = enter_pin_number($survey_first_audio_file,$survey_dtmf_digits,$survey_method,$survey_wait_sec);
if (length($opt_code) < 1) {$opt_code = 'X';}
$opt_description = $opt_code;
$w=0;
foreach (@digit_map)
{
if ($digit_map[$w] =~ /^$opt_code/) {$opt_description = $digit_map[$w]}
$w++;
}
# record what they entered
$sec_phrase_SQL='';
if (length($security_phrase)<1)
{$sec_phrase_SQL = "security_phrase='$opt_description',";}
$stmtA = "UPDATE vicidial_list set $sec_phrase_SQL status='PM' where lead_id = '$CIDlead_id';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01016'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_list OPT_CODE update: |$affected_rows|$CIDlead_id|$opt_code|";
&agi_output;
}
# they opted out
if ($opt_code eq $survey_ni_digit)
{
if ( $survey_ni_audio_file ne "")
{
if ($survey_ni_audio_file =~ /\|/)
{
@survey_ni_audio_file_array = split(/\|/,$survey_ni_audio_file);
$w=0;
foreach(@survey_ni_audio_file_array)
{
if (length($survey_ni_audio_file_array[$w])>0)
{
$AGI->stream_file("$survey_ni_audio_file_array[$w]");
}
$w++;
}
}
else
{$AGI->stream_file("$survey_ni_audio_file");}
}
$stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01017'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|";
&agi_output;
}
$Euniqueid=$uniqueid;
$Euniqueid =~ s/\.\d+//gi;
$now_date_epoch = time();
$drop_seconds = $now_date_epoch - $start_time_epoch;
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_ni_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01018'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_log update: $survey_ni_status|$affected_rows|$uniqueid|$drop_seconds|";
&agi_output;
}
$stmtA = "UPDATE vicidial_list set status='$survey_ni_status' where lead_id = '$CIDlead_id';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01019'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_list update: $survey_ni_status|$affected_rows|$CIDlead_id";
&agi_output;
}
if (($use_internal_dnc =~ /Y|AREACODE/) && ($survey_ni_status eq "DNC"))
{
$stmtA = "INSERT INTO vicidial_dnc set phone_number='$VDADphone';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01020'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_dnc insert: $affected_rows|$VDADphone";
&agi_output;
}
$stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='-SYSINT-', action='add', action_date=NOW(), user='OUTAGI';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01112'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;}
}
if (($use_campaign_dnc =~ /Y|AREACODE/) && ($survey_ni_status eq "DNC"))
{
$stmtA = "SELECT use_other_campaign_dnc FROM vicidial_campaigns where campaign_id='$VDADcampaign';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01106'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$use_other_campaign_dnc = $aryA[0];
}
$sthA->finish();
$temp_campaign_id = $VDADcampaign;
if (length($use_other_campaign_dnc) > 0) {$temp_campaign_id = $use_other_campaign_dnc;}
$stmtA = "INSERT INTO vicidial_campaign_dnc set phone_number='$VDADphone', campaign_id='$temp_campaign_id';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01021'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_campaign_dnc insert: $affected_rows|$VDADphone|$VDADcampaign|$temp_campaign_id";
&agi_output;
}
$stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='$temp_campaign_id', action='add', action_date=NOW(), user='OUTAGI';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01113'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;}
}
if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) )
{
$temp_status = $survey_ni_status;
&call_quota_logging;
}
$AGI->hangup();
exit;
}
### third digit option
if ($opt_code eq $survey_third_digit)
{
if ( $survey_third_audio_file ne "")
{
if ($survey_third_audio_file =~ /\|/)
{
@survey_third_audio_file_array = split(/\|/,$survey_third_audio_file);
$w=0;
foreach(@survey_third_audio_file_array)
{
if (length($survey_third_audio_file_array[$w])>0)
{
$AGI->stream_file("$survey_third_audio_file_array[$w]");
}
$w++;
}
}
else
{$AGI->stream_file("$survey_third_audio_file");}
}
$stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01017'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|";
&agi_output;
}
$Euniqueid=$uniqueid;
$Euniqueid =~ s/\.\d+//gi;
$now_date_epoch = time();
$drop_seconds = $now_date_epoch - $start_time_epoch;
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_third_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01018'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_log update: $survey_third_status|$affected_rows|$uniqueid|$drop_seconds|";
&agi_output;
}
$stmtA = "UPDATE vicidial_list set status='$survey_third_status' where lead_id = '$CIDlead_id';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01019'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_list update: $survey_third_status|$affected_rows|$CIDlead_id";
&agi_output;
}
if (($use_internal_dnc =~ /Y|AREACODE/) && ($survey_third_status eq "DNC"))
{
$stmtA = "INSERT INTO vicidial_dnc set phone_number='$VDADphone';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01020'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_dnc insert: $affected_rows|$VDADphone";
&agi_output;
}
$stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='-SYSINT-', action='add', action_date=NOW(), user='OUTAGI';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01114'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;}
}
if (($use_campaign_dnc =~ /Y|AREACODE/) && ($survey_third_status eq "DNC"))
{
$stmtA = "SELECT use_other_campaign_dnc FROM vicidial_campaigns where campaign_id='$VDADcampaign';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01107'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$use_other_campaign_dnc = $aryA[0];
}
$sthA->finish();
$temp_campaign_id = $VDADcampaign;
if (length($use_other_campaign_dnc) > 0) {$temp_campaign_id = $use_other_campaign_dnc;}
$stmtA = "INSERT INTO vicidial_campaign_dnc set phone_number='$VDADphone', campaign_id='$temp_campaign_id';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01021'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_campaign_dnc insert: $affected_rows|$VDADphone|$VDADcampaign|$temp_campaign_id";
&agi_output;
}
$stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='$temp_campaign_id', action='add', action_date=NOW(), user='OUTAGI';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01119'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;}
}
if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) )
{
$temp_status = $survey_third_status;
&call_quota_logging;
}
if (length($survey_third_exten) > 0)
{
if ($AGILOG) {$agi_string = "exiting the VDAD SURVEY app, transferring call to $survey_third_exten"; &agi_output;}
print "SET CONTEXT $ext_context\n";
$result = <STDIN>;
checkresult($result);
print "SET EXTENSION $survey_third_exten\n";
$result = <STDIN>;
checkresult($result);
print "SET PRIORITY 1\n";
$result = <STDIN>;
checkresult($result);
}
else
{$AGI->hangup();}
exit;
}
### fourth digit option
if ($opt_code eq $survey_fourth_digit)
{
if ( $survey_fourth_audio_file ne "")
{
if ($survey_fourth_audio_file =~ /\|/)
{
@survey_fourth_audio_file_array = split(/\|/,$survey_fourth_audio_file);
$w=0;
foreach(@survey_fourth_audio_file_array)
{
if (length($survey_fourth_audio_file_array[$w])>0)
{
$AGI->stream_file("$survey_fourth_audio_file_array[$w]");
}
$w++;
}
}
else
{$AGI->stream_file("$survey_fourth_audio_file");}
}
$stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01017'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|";
&agi_output;
}
$Euniqueid=$uniqueid;
$Euniqueid =~ s/\.\d+//gi;
$now_date_epoch = time();
$drop_seconds = $now_date_epoch - $start_time_epoch;
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_fourth_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01018'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_log update: $survey_fourth_status|$affected_rows|$uniqueid|$drop_seconds|";
&agi_output;
}
$stmtA = "UPDATE vicidial_list set status='$survey_fourth_status' where lead_id = '$CIDlead_id';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01019'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_list update: $survey_fourth_status|$affected_rows|$CIDlead_id";
&agi_output;
}
if (($use_internal_dnc =~ /Y|AREACODE/) && ($survey_fourth_status eq "DNC"))
{
$stmtA = "INSERT INTO vicidial_dnc set phone_number='$VDADphone';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01020'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_dnc insert: $affected_rows|$VDADphone";
&agi_output;
}
$stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='-SYSINT-', action='add', action_date=NOW(), user='OUTAGI';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01115'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;}
}
if (($use_campaign_dnc =~ /Y|AREACODE/) && ($survey_fourth_status eq "DNC"))
{
$stmtA = "SELECT use_other_campaign_dnc FROM vicidial_campaigns where campaign_id='$VDADcampaign';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01108'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$use_other_campaign_dnc = $aryA[0];
}
$sthA->finish();
$temp_campaign_id = $VDADcampaign;
if (length($use_other_campaign_dnc) > 0) {$temp_campaign_id = $use_other_campaign_dnc;}
$stmtA = "INSERT INTO vicidial_campaign_dnc set phone_number='$VDADphone', campaign_id='$temp_campaign_id';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01021'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_campaign_dnc insert: $affected_rows|$VDADphone|$VDADcampaign|$temp_campaign_id";
&agi_output;
}
$stmtA="INSERT INTO vicidial_dnc_log SET phone_number='$VDADphone', campaign_id='$temp_campaign_id', action='add', action_date=NOW(), user='OUTAGI';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01116'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "$affected_rows|$stmtA|"; &agi_output;}
}
if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) )
{
$temp_status = $survey_fourth_status;
&call_quota_logging;
}
if (length($survey_fourth_exten) > 0)
{
if ($AGILOG) {$agi_string = "exiting the VDAD SURVEY app, transferring call to $survey_fourth_exten"; &agi_output;}
print "SET CONTEXT $ext_context\n";
$result = <STDIN>;
checkresult($result);
print "SET EXTENSION $survey_fourth_exten\n";
$result = <STDIN>;
checkresult($result);
print "SET PRIORITY 1\n";
$result = <STDIN>;
checkresult($result);
}
else
{$AGI->hangup();}
exit;
}
# they opted in
if ( ($opt_code =~ /\d|\*|\#/) || ($survey_no_response_action =~ /OPTOUT/) )
{
$now_date_epoch = time();
$FDtarget = ($now_date_epoch + 60);
($Fsec,$Fmin,$Fhour,$Fmday,$Fmon,$Fyear,$Fwday,$Fyday,$Fisdst) = localtime($FDtarget);
$Fyear = ($Fyear + 1900);
$Fmon++;
if ($Fmon < 10) {$Fmon = "0$Fmon";}
if ($Fmday < 10) {$Fmday = "0$Fmday";}
if ($Fhour < 10) {$Fhour = "0$Fhour";}
if ($Fmin < 10) {$Fmin = "0$Fmin";}
if ($Fsec < 10) {$Fsec = "0$Fsec";}
$FDtsSQLdate = "$Fyear$Fmon$Fmday$Fhour$Fmin$Fsec";
$stmtA = "UPDATE vicidial_auto_calls set last_update_time='$FDtsSQLdate' where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01022'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAC posttime record: |$affected_rows|$FDtsSQLdate|$callerid|"; &agi_output;}
if ( $survey_opt_in_audio_file ne "")
{
if ($survey_opt_in_audio_file =~ /\|/)
{
@survey_opt_in_audio_file_array = split(/\|/,$survey_opt_in_audio_file);
$w=0;
foreach(@survey_opt_in_audio_file_array)
{
if (length($survey_opt_in_audio_file_array[$w])>0)
{
$AGI->stream_file("$survey_opt_in_audio_file_array[$w]");
}
$w++;
}
}
else
{$AGI->stream_file("$survey_opt_in_audio_file");}
}
if ($survey_method =~ /VOICEMAIL|EXTENSION|HANGUP|CALLMENU|VMAIL_NO_INST/)
{
$DROPexten='';
if ($survey_method =~ /VOICEMAIL|VMAIL_NO_INST/)
{
$newcallerid = "\"$callerid <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
print STDERR "Setting CID \"$newcallerid\"\n";
checkresult($result);
if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;}
$survey_status='SVYVM';
if ($survey_method =~ /VMAIL_NO_INST/)
{$voicemail_dump_exten = $voicemail_dump_exten_no_inst;}
if (length($VDADvoicemail_ext)>0)
{$DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext";}
}
if ($survey_method =~ /EXTENSION/)
{
$survey_status='SVYEXT';
if (length($survey_xfer_exten)>0)
{
$DROPexten = "$survey_xfer_exten";
if ($three_way_call_cid !~ /CUSTOMER/)
{
$newcallerid = "\"$campaign_cid <$campaign_cid>\"";
$AGI->set_callerid($newcallerid);
print STDERR "Setting CID \"$newcallerid\"\n";
checkresult($result);
if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;}
}
}
}
if ($survey_method =~ /CALLMENU/)
{
$newcallerid = "\"$callerid <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
print STDERR "Setting CID \"$newcallerid\"\n";
checkresult($result);
if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;}
$survey_status='SVYCLM';
if (length($survey_menu_id)>0)
{
$DROPexten = 's';
$ext_context = $survey_menu_id;
}
}
if ($survey_method =~ /HANGUP/)
{
$survey_status='SVYHU';
}
$Euniqueid=$uniqueid;
$Euniqueid =~ s/\.\d+//gi;
$now_date_epoch = time();
$drop_seconds = $now_date_epoch - $start_time_epoch;
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01023'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_log update: $survey_status|$affected_rows|$uniqueid|$drop_seconds|";
&agi_output;
}
$stmtA = "UPDATE vicidial_list set status='$survey_status' where lead_id = '$CIDlead_id';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01024'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_list update: $survey_status|$affected_rows|$CIDlead_id";
&agi_output;
}
if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) )
{
$temp_status = $survey_status;
&call_quota_logging;
}
if ($enable_queuemetrics_logging > 0)
{
$qm_call_time = ($now_date_epoch - $start_time_epoch);
$qm_complete_time = ($now_date_epoch + 1);
$qm_complete_sec = ($qm_call_time + 1);
$dbhB = DBI->connect("DBI:mysql:$queuemetrics_dbname:$queuemetrics_server_ip:3306", "$queuemetrics_login", "$queuemetrics_pass")
or die "Couldn't connect to database: " . DBI->errstr;
if ($DBX) {print "CONNECTED TO DATABASE: $queuemetrics_server_ip|$queuemetrics_dbname\n";}
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='Agent/VDAD',verb='CONNECT',data1='0',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01098'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$qm_complete_time',call_id='$callerid',queue='$VDADcampaign',agent='Agent/VDAD',verb='COMPLETEAGENT',data1='0',data2='$qm_complete_sec',data3='1',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01099'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
# $stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='EXITWITHTIMEOUT',data1='1',serverid='$queuemetrics_log_id';";
# $Baffected_rows = $dbhB->do($stmtB);
# $dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01079'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$qm_complete_time',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='CALLSTATUS',data1='$survey_status',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01080'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$dbhB->disconnect();
if ( ($queuemetrics_socket =~ /CONNECT_COMPLETE/) and (length($queuemetrics_socket_url) > 10) )
{
if ($queuemetrics_socket_url =~ /--A--/)
{
########## FIND vicidial_list lead data ##########
$stmtA = "SELECT vendor_lead_code,list_id,phone_code,phone_number,title,first_name,middle_initial,last_name,postal_code FROM vicidial_list where lead_id='$CIDlead_id' LIMIT 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01109'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$vendor_lead_code = $aryA[0];
$list_id = $aryA[1];
$phone_code = $aryA[2];
$phone_number = $aryA[3];
$title = $aryA[4];
$first_name = $aryA[5];
$middle_initial = $aryA[6];
$last_name = $aryA[7];
$postal_code = $aryA[8];
}
$sthA->finish();
$queuemetrics_socket_url =~ s/^VAR//gi;
$queuemetrics_socket_url =~ s/--A--lead_id--B--/$CIDlead_id/gi;
$queuemetrics_socket_url =~ s/--A--vendor_id--B--/$vendor_lead_code/gi;
$queuemetrics_socket_url =~ s/--A--vendor_lead_code--B--/$vendor_lead_code/gi;
$queuemetrics_socket_url =~ s/--A--list_id--B--/$list_id/gi;
$queuemetrics_socket_url =~ s/--A--phone_number--B--/$phone_number/gi;
$queuemetrics_socket_url =~ s/--A--title--B--/$title/gi;
$queuemetrics_socket_url =~ s/--A--first_name--B--/$first_name/gi;
$queuemetrics_socket_url =~ s/--A--middle_initial--B--/$middle_initial/gi;
$queuemetrics_socket_url =~ s/--A--last_name--B--/$last_name/gi;
$queuemetrics_socket_url =~ s/--A--postal_code--B--/$postal_code/gi;
$queuemetrics_socket_url =~ s/ /+/gi;
$queuemetrics_socket_url =~ s/&/\\&/gi;
}
#### run for CONNECT
$socket_send_data_begin='?';
$socket_send_data = "time_id=$now_date_epoch&call_id=$callerid&queue=$VDADcampaign&agent=Agent/VDAD&verb=CONNECT&data1=0&data2=&data3=&data4=";
if ($queuemetrics_socket_url =~ /\?/)
{$socket_send_data_begin='&';}
### send queue_log data to the queuemetrics_socket_url ###
$compat_url = "$queuemetrics_socket_url$socket_send_data_begin$socket_send_data";
$compat_url =~ s/ /+/gi;
$compat_url =~ s/&/\\&/gi;
$launch = $PATHhome . "/AST_send_URL.pl";
$launch .= " --SYSLOG" if ($SYSLOG);
$launch .= " --lead_id=" . $CIDlead_id;
$launch .= " --phone_number=" . $VDADphone;
$launch .= " --user=VDAD";
$launch .= " --call_type=OUT";
$launch .= " --campaign=" . $VDADcampaign;
$launch .= " --uniqueid=" . $uniqueid;
$launch .= " --call_id=" . $callerid;
$launch .= " --list_id=" . $list_id;
$launch .= " --alt_dial=MAIN";
$launch .= " --function=QM_SOCKET_SEND";
$launch .= " --compat_url=" . $compat_url;
system($launch . ' &');
if ($AGILOG) {$agi_string = "$launch|"; &agi_output;}
### run for COMPLETEAGENT
$socket_send_data_begin='?';
$socket_send_data = "time_id=$qm_complete_time&call_id=$callerid&queue=$VDADcampaign&agent=Agent/VDAD&verb=COMPLETEAGENT&data1=0&data2=$qm_complete_sec&data3=1&data4=";
if ($queuemetrics_socket_url =~ /\?/)
{$socket_send_data_begin='&';}
### send queue_log data to the queuemetrics_socket_url ###
$compat_url = "$queuemetrics_socket_url$socket_send_data_begin$socket_send_data";
$compat_url =~ s/ /+/gi;
$compat_url =~ s/&/\\&/gi;
$launch = $PATHhome . "/AST_send_URL.pl";
$launch .= " --SYSLOG" if ($SYSLOG);
$launch .= " --lead_id=" . $CIDlead_id;
$launch .= " --phone_number=" . $VDADphone;
$launch .= " --user=VDAD";
$launch .= " --call_type=OUT";
$launch .= " --campaign=" . $VDADcampaign;
$launch .= " --uniqueid=" . $uniqueid;
$launch .= " --call_id=" . $callerid;
$launch .= " --list_id=" . $list_id;
$launch .= " --alt_dial=MAIN";
$launch .= " --function=QM_SOCKET_SEND";
$launch .= " --compat_url=" . $compat_url;
system($launch . ' &');
if ($AGILOG) {$agi_string = "$launch|"; &agi_output;}
}
}
if (length($DROPexten) > 0)
{
$stmtA = "UPDATE vicidial_auto_calls set status='XFER',stage='XFER-0' where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01025'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAC XFER status: |$affected_rows|$FDtsSQLdate|$callerid|"; &agi_output;}
if ($AGILOG) {$agi_string = "exiting the VDAD SURVEY app, transferring call to $DROPexten $ext_context"; &agi_output;}
print "SET CONTEXT $ext_context\n";
$result = <STDIN>;
checkresult($result);
print "SET EXTENSION $DROPexten\n";
$result = <STDIN>;
checkresult($result);
print "SET PRIORITY 1\n";
$result = <STDIN>;
checkresult($result);
exit;
}
if ($survey_method =~ /HANGUP/)
{
$stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01026'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|";
&agi_output;
}
$AGI->hangup();
exit;
}
}
if ($survey_method =~ /CAMPREC/)
{
if ($survey_method =~ /60/)
{$timeout=60000;}
if ($survey_method =~ /WAV/)
{$format='WAV';}
if ($survey_method =~ /GSM/)
{$format='GSM';}
$survey_status='SVYREC';
$Euniqueid=$uniqueid;
$Euniqueid =~ s/\.\d+//gi;
$now_date_epoch = time();
$drop_seconds = $now_date_epoch - $start_time_epoch;
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01027'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_log update: $survey_status|$affected_rows|$uniqueid|$drop_seconds|";
&agi_output;
}
$stmtA = "UPDATE vicidial_list set status='$survey_status' where lead_id = '$CIDlead_id';";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01028'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_list update: $survey_status|$affected_rows|$CIDlead_id";
&agi_output;
}
if ( -e ('$survey_camp_record_dir/$VDADcampaign'))
{$do_nothing=1;}
else
{`mkdir -p --mode=0666 $survey_camp_record_dir/$VDADcampaign`;}
$AGI->stream_file('beep');
$interrupt_digit = $AGI->record_file("$survey_camp_record_dir/$VDADcampaign/$VDADphone$filedate", "$format", '123456789*#', "$timeout", '0', 1, '10');
if ($AGILOG)
{
$agi_string = "RECORDING FINISHED: $interrupt_digit|$survey_camp_record_dir/$VDADcampaign/$VDADphone$filedate|";
&agi_output;
}
$now_date_epoch = time();
$drop_seconds = $now_date_epoch - $start_time_epoch;
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$survey_status', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01029'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_log update: $survey_status|$affected_rows|$uniqueid|$drop_seconds|";
&agi_output;
}
$stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01030'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|";
&agi_output;
}
if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) )
{
$temp_status = $survey_status;
&call_quota_logging;
}
$AGI->hangup();
exit;
}
}
else
{
$Euniqueid=$uniqueid;
$Euniqueid =~ s/\.\d+//gi;
$now_date_epoch = time();
$drop_seconds = $now_date_epoch - $start_time_epoch;
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='PM', end_epoch='$now_date_epoch', length_in_sec='$drop_seconds', term_reason='CALLER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) { $agi_string = "|$stmtA|"; &agi_output; }
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01031'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vicidial_log update: PM|$affected_rows|$uniqueid|$drop_seconds|";
&agi_output;
}
if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) )
{
$temp_status = 'PM';
&call_quota_logging;
}
if ($survey_no_response_action !~ /DROP/)
{
$stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01032'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG)
{
$agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|";
&agi_output;
}
$AGI->hangup();
exit;
}
else
{
$survey_drop++;
$drop_timer = (($drop_timer + $DROP_TIME) + 1);
$agi_string = "-- VDAD survey no-response go to campaign DROP |$drop_timer|$DROP_TIME|";
&agi_output;
}
}
}
################################################################################
##### END DO THE SURVEY #####
if ($survey_drop < 1)
{$drop_timer=0;}
$drop_seconds=0;
$hold_message_counter=25;
$hold_tone_counter=0;
#### Using KHOMP analytics
if (( $amd_type eq 'KHOMP' ) && ( $khomp_enabled ) )
{
process_khomp_analytics(
$khomp_api_url,
$khomp_api_proxied,
$khomp_api_login_url,
$khomp_api_user,
$khomp_api_pass,
$khomp_api_check_ssl,
$khomp_header,
$khomp_id_format,
$khomp_settings_container,
$external_server_ip,
$VDADcampaign,
$callerid,
$cpd_amd_action,
$cpd_unknown_action,
$CIDlead_id
);
}
while ($drop_timer <= $DROP_TIME)
{
$channel_status = $AGI->channel_status("$channel");
if ($channel_status < 1)
{
if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;}
### sleep for 99 hundredths of a second
usleep(1*990*1000);
$channel_status_DC = $AGI->channel_status("$channel");
if ($channel_status_DC < 1)
{
if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;}
if ($drop_timer < $DROP_TIME) {$drop_seconds = $drop_timer;}
$drop_timer = ($drop_timer + $DROP_TIME);
}
}
### Using Sangoma CPD
if ( $amd_type eq 'CPD' )
{
############# BEGIN CPD AMD SECTION ############################
if ($cpd_amd_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/)
{
$stmtA = "SELECT count(*) FROM vicidial_cpd_log where callerid='$callerid' and result NOT IN('Voice','Unknown','???','') and status='NEW';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01117'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$cpd_amd = $aryA[0];
}
$sthA->finish();
if ($cpd_amd > 0)
{
&cpd_end_call;
}
}
############# END CPD AMD SECTION ############################
############# BEGIN CPD Unknown SECTION ############################
if ($cpd_unknown_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/)
{
$stmtA = "SELECT count(*) FROM vicidial_cpd_log where callerid='$callerid' and result IN('Unknown','???') and status='NEW';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01118'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$cpd_unknown = $aryA[0];
}
$sthA->finish();
if ($cpd_unknown > 0)
{
&cpd_end_call;
}
}
}
############# END CPD Unknown SECTION ############################
############################################################################
### BEGIN attempt to send call to agent
############################################################################
$rec_countCUSTDATA=0;
$rec_countWAIT=0;
$cbc=0;
$aco_sub=0;
$agent_call_order='order by last_call_finish';
if ($CAMP_callorder =~ /longest_wait_time/i) {$agent_call_order = 'order by last_state_change';}
if ($CAMP_callorder =~ /overall_user_level/i) {$agent_call_order = 'order by user_level desc,last_call_finish';}
if ($CAMP_callorder =~ /oldest_call_start/i) {$agent_call_order = 'order by last_call_time';}
if ($CAMP_callorder =~ /oldest_call_finish/i) {$agent_call_order = 'order by last_call_finish';}
if ($CAMP_callorder =~ /random/i) {$agent_call_order = 'order by random_id';}
if ($CAMP_callorder =~ /campaign_rank/i) {$agent_call_order = 'order by campaign_weight desc,last_call_finish';}
if ($CAMP_callorder =~ /fewest_calls/i) {$aco_sub=1; $agent_call_order = 'order by calls_today,last_call_finish';}
if ($CAMP_callorder =~ /campaign_grade_random/i) {$aco_sub=1; $agent_call_order = 'order by random_id';}
if ($CAMP_callorder =~ /overall_user_level_wait_time/i) {$agent_call_order = 'order by user_level desc,last_state_change';}
if ($CAMP_callorder =~ /campaign_rank_wait_time/i) {$agent_call_order = 'order by campaign_weight desc,last_state_change';}
if ($CAMP_callorder =~ /fewest_calls_wait_time/i) {$aco_sub=1; $agent_call_order = 'order by calls_today,last_state_change';}
##### Attempt to send call to an agent on this server only #####
if ( ($agent_search_method =~ /^SO|^LO/) || ( ( ($SSagent_search_method == 1) || ($SSagent_search_method == 3) ) && ($agent_search_method_OVERRIDE =~ /^SO|^LO/) ) )
{
if ($agent_search_method =~ /^SO/)
{$agent_search_method = 'LO';}
if ( ( ($SSagent_search_method == 1) || ($SSagent_search_method == 3) ) && ($agent_search_method_OVERRIDE =~ /^SO/) )
{
if ($AGILOG) {$agi_string = "|Agent Search Method Campaign Override: $agent_search_method_OVERRIDE ($SSagent_search_method)$agent_search_method|"; &agi_output;}
$agent_search_method = 'SO';
}
if ($DBconcurrent_transfers =~ /AUTO/)
{
$active_agents=1;
$stmtA = "SELECT count(*) FROM vicidial_live_agents where campaign_id = '$VDADcampaign' and server_ip='$VARserver_ip' and last_update_time > '$BDtsSQLdate';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01041'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$active_agents = $aryA[0];
$rec_count++;
}
$concurrent_transfers = ($active_agents / 10);
$concurrent_transfers = sprintf("%.0f", $concurrent_transfers);
$concurrent_transfers++;
if ($AGILOG) {$agi_string = "|CONCURRENT TRANSFERS AUTO SETTING: $concurrent_transfers ($active_agents)|"; &agi_output;}
}
else {$concurrent_transfers = $DBconcurrent_transfers;}
$sthA->finish();
$cbc=0;
$rec_countWAITOUT=0;
$rec_countWAITIN=0;
$rec_countWAITINallowed=0;
$agentdirect_count=0;
$READY_agent_closer_camps='';
$READY_users='';
$READY_users_count=0;
$AGENTDIRECT_user_ids='';
### find number of outbound calls waiting in line in front of this call
$stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and lead_id != '$CIDlead_id' and campaign_id = '$VDADcampaign' and call_time < \"$VDADcall_time\";";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01040'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$rec_countWAITOUT = $aryA[0];
}
$sthA->finish();
if (length($closer_campaigns) > 3)
{
### find number of inbound calls waiting in line in front of this call
$stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and ( (queue_priority > '$VDADqueue_priority') and (call_type='IN') and (campaign_id IN($closer_campaigns)) );";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01070'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$rec_countWAITIN = $aryA[0];
$rec_countWAITINallowed = $aryA[0];
}
$sthA->finish();
}
### if there are inbound calls waiting, see if any READY agents are able to take them
if ($rec_countWAITIN > 0)
{
### get a list of the in-groups that the READY agents are able to take calls from
$stmtA = "SELECT closer_campaigns,user FROM vicidial_live_agents where status = 'READY' and ring_callerid='' and server_ip='$VARserver_ip' and lead_id<1 and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01071'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$READY_users_count=0;
while ($sthArows > $READY_users_count)
{
@aryA = $sthA->fetchrow_array;
$READY_users .= "'$aryA[1]',";
@VLagent_camps = split(/ /,$aryA[0]);
$ki=0;
foreach(@VLagent_camps)
{
if ( ($VLagent_camps[$ki] !~ /AGENTDIRECT/) && (length($VLagent_camps[$ki]) > 1) && ($READY_agent_closer_camps !~ /'$VLagent_camps[$ki]'/) )
{$READY_agent_closer_camps .= "'$VLagent_camps[$ki]',";}
$ki++;
}
$READY_users_count++;
}
$sthA->finish();
$READY_agent_closer_camps =~ s/.$//gi;
$READY_users =~ s/.$//gi;
if (length($READY_agent_closer_camps) < 2) {$READY_agent_closer_camps="''";}
if (length($READY_users)>2)
{
if ($closer_campaigns =~ /AGENTDIRECT/)
{
### get a list of the users that have AGENTDIRECT calls waiting for them
$stmtA = "SELECT agent_only FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%AGENTDIRECT%\" and last_update_time > '$BDtsSQLdate' and agent_only IN($READY_users) and agent_only != '';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01072'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$agentdirect_count=0;
while ($sthArows > $agentdirect_count)
{
@aryA = $sthA->fetchrow_array;
$AGENTDIRECT_user_ids .= "'$aryA[0]',";
$agentdirect_count++;
}
$sthA->finish();
$AGENTDIRECT_user_ids =~ s/.$//gi;
if (length($AGENTDIRECT_user_ids)>2)
{$AGENTDIRECT_user_ids = "or ( (campaign_id LIKE \"%AGENTDIRECT%\") and (agent_only IN($AGENTDIRECT_user_ids)) )";}
else
{$AGENTDIRECT_user_ids='';}
}
### find number of inbound calls from in-groups that READY agents are able to take calls from are waiting in line in front of this call
$stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and ( ( (queue_priority > '$VDADqueue_priority') and (call_type='IN') and (campaign_id IN($READY_agent_closer_camps)) ) $AGENTDIRECT_user_ids );";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01073'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$rec_countWAITIN = $aryA[0];
}
$sthA->finish();
}
}
# if ($AGILOG) {$agi_string = "COUNT DEBUG: |$concurrent_transfers|$rec_countWAITOUT|$rec_countWAITIN|$rec_countWAITINallowed|$agentdirect_count|$READY_users_count|$closer_campaigns|$READY_agent_closer_camps|$READY_users|$AGENTDIRECT_user_ids|"; &agi_output;}
$rec_countWAIT = ($rec_countWAITOUT + $rec_countWAITIN);
if ($rec_countWAIT < $concurrent_transfers)
{
### BEGIN grade random next-agent-call routing ###
if ($CAMP_callorder =~ /grade/)
{
$stmtA = "LOCK TABLES vicidial_live_agents WRITE;";
my $LOCKaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01085'; $MEL_aff_rows=$LOCKaffected_rows; &mysql_error_logging;
@GRADEuser=@MT;
@GRADEgrade=@MT;
@userGRADEarray=@MT;
$stmtA = "SELECT user,campaign_grade from vicidial_live_agents WHERE status='READY' and lead_id<1 and ring_callerid='' and server_ip='$VARserver_ip' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate' limit 1000;";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01086'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$gg=0;
$ga=0;
while ($gg < $sthArows)
{
@aryA = $sthA->fetchrow_array;
$GRADEuser[$gg] = $aryA[0];
$GRADEgrade[$gg] = $aryA[1];
if ($GRADEgrade[$gg] < 1)
{$GRADEgrade[$gg] = 1;}
$gi=0;
while ($gi < $GRADEgrade[$gg])
{
$userGRADEarray[$ga] = $GRADEuser[$gg];
# print STDERR " GRADE ENTRY: $userGRADEarray[$ga]|$ga|$gi|$GRADEgrade[$gg]\n";
$gi++;
$ga++;
}
$gg++;
}
$sthA->finish();
$sthArows=0;
$affected_rows=0;
if ($ga > 0)
{
$GRADErandom = int( rand($ga));
$userGRADEchosen = $userGRADEarray[$GRADErandom];
if ($AGILOG) {$agi_string = "GRADE RANDOM: $userGRADEchosen|$GRADErandom|$CAMP_callorder|$gg|$ga|$callerid"; &agi_output;}
$stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', call_server_ip='$VARserver_ip', callerid='$callerid',comments='AUTO' where status='READY' and lead_id<1 and ring_callerid='' and server_ip='$VARserver_ip' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate' and user='$userGRADEchosen' limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01087'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
if ($AGILOG) {$agi_string = "$VDADuser|$VDADgroup_weight|$stmtA|"; &agi_output;}
$stmtA = "UNLOCK TABLES;";
my $LOCKaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01088'; $MEL_aff_rows=$LOCKaffected_rows; &mysql_error_logging;
}
### END grade random next-agent-call routing ###
else
{
$stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', call_server_ip='$VARserver_ip', callerid='$callerid',comments='AUTO' where status = 'READY' and lead_id<1 and server_ip='$VARserver_ip' and ring_callerid='' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01035'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|update of vla table: $VDADcampaign|$VARserver_ip\n|$stmtA|"; &agi_output;}
if ($affected_rows > 0)
{
$r=0;
$VDADuser='';
while ( (length($VDADuser)<1) && ($r<3) )
{
$stmtA = "SELECT conf_exten,user,extension,ra_user FROM vicidial_live_agents where status IN('QUEUE','INCALL') and server_ip='$VARserver_ip' and campaign_id='$VDADcampaign' and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01036'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$VDADconf_exten = $aryA[0];
$VDADuser = $aryA[1];
$VDADextension = $aryA[2];
$ra_user = $aryA[3];
$VDADserver_ip = $VARserver_ip;
$rec_count++;
}
$sthA->finish();
$r++;
if ($r > 1)
{
if ($AGILOG) {$agi_string = "EEEEEEEEEE vla UPDATE DELAY!!! |$callerid|$r|"; &agi_output;}
### sleep for 23 hundredths of a second
usleep(1*230*1000);
$drop_timer = ($drop_timer + 0.25);
}
if ($r > 2)
{
$stmtA = "SELECT conf_exten,user,extension,ra_user FROM vicidial_live_agents where callerid='$callerid' order by last_call_time limit 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01037'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$VDADconf_exten = $aryA[0];
$VDADuser = $aryA[1];
$VDADextension = $aryA[2];
$ra_user = $aryA[3];
$VDADserver_ip = $VARserver_ip;
$rec_count++;
}
$sthA->finish();
if ($AGILOG) {$agi_string = "FFFFFFFFFF vla OR SELECT |$callerid|$VDADuser|"; &agi_output;}
}
}
### BEGIN REMOTE AGENT SECTION
if ($VDADextension =~ /^R\//)
{
### set the callerid to the ACQS value(calleridname)
## use these two lines for Asterisk 1.2 tree
$newcallerid = "\"$calleridname <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
## use these two lines for Asterisk 1.0 tree
# print "SET CALLERID \"$calleridname\" <0000000000>\n";
# print "SET CALLERIDNAME \"$calleridname\"\n";
### custom change to allow exten to be sent as phone*vendor_id
if ($VDADconf_exten =~ /888888888888/)
{
$stmtA = "SELECT vendor_lead_code FROM vicidial_list where lead_id='$CIDlead_id';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01057'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$vendor_id = $aryA[0];
}
$sthA->finish();
$VDADconf_exten = "$VDADphone$S$vendor_id";
}
if (length($ra_user) > 0)
{
$extension_group='';
$stmtA = "SELECT extension_group,extension_group_order FROM vicidial_remote_agents where user_start='$ra_user';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01058'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$extension_group = $aryA[0];
$extension_group_order = $aryA[1];
}
$sthA->finish();
if ( (length($extension_group) > 0) and ($extension_group !~ /^NONE/) )
{
$extension_group_orderSQL = 'order by last_call_time';
if ($extension_group_order =~ /RANK/)
{$extension_group_orderSQL = 'order by rank desc, last_call_time';}
if ($extension_group_order =~ /CALL_COUNT/)
{$extension_group_orderSQL = 'order by call_count_today, last_call_time';}
$stmtA = "UPDATE vicidial_extension_groups set last_callerid='$callerid',last_call_time=NOW(),call_count_today=(call_count_today + 1) where extension_group_id='$extension_group' and ( (campaign_groups='') or (campaign_groups LIKE \"%|$VDADcampaign|%\") ) $extension_group_orderSQL limit 1;";
$VEGaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01059'; $MEL_aff_rows=$VEGaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE EXTEN GROUP : |$VEGaffected_rows|update of veg table: $callerid\n|$stmtA|"; &agi_output;}
if ($VEGaffected_rows > 0)
{
$stmtA = "SELECT extension,extension_id,call_count_today FROM vicidial_extension_groups where last_callerid='$callerid' order by last_call_time desc limit 1;";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01060'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$VDADconf_exten = $aryA[0];
if ($AGILOG) {$agi_string = "-- REMOTE EXTEN SET : |$VDADconf_exten|$aryA[1]|$aryA[2]|"; &agi_output;}
}
$sthA->finish();
}
}
}
print STDERR "Setting CID \"$newcallerid\"\n";
checkresult($result);
$stmtA = "UPDATE vicidial_live_agents set ra_extension='$VDADconf_exten' where extension='$VDADextension' and ra_user='$ra_user';";
$RALaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01066'; $MEL_aff_rows=$RALaffected_rows; &mysql_error_logging;
$stmtA = "INSERT INTO vicidial_remote_agent_log set callerid='$callerid',uniqueid='$uniqueid',ra_user='$ra_user',user='$VDADuser',call_time=NOW(),extension='$VDADconf_exten',lead_id='$CIDlead_id',phone_number='$VDADphone',campaign_id='$VDADcampaign',processed='N';";
$RALaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01064'; $MEL_aff_rows=$RALaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE EXTEN LOG : |$RALaffected_rows|CID changed: \"$callerid\" \<$VDADphone\>\n|$stmtA|"; &agi_output;}
### look for the recording settings for the start user of this remote agent
if (length($ra_user) > 0)
{
$stmtA = "SELECT vicidial_recording_override,vicidial_recording FROM vicidial_users where user='$ra_user';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsVUrec=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01072'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging;
if ($sthArowsVUrec > 0)
{
@aryA = $sthA->fetchrow_array;
if ($aryA[0] !~ /DISABLED/)
{$campaign_recording = $aryA[0];}
if ($aryA[1] < 1)
{$campaign_recording = 'NONE';}
}
$sthA->finish();
}
### if recording is enabled then start recording on this call before sending to a remote agent
if ($campaign_recording =~ /ALLCALLS|ALLFORCE/)
{
$stmtA = "SELECT vendor_lead_code FROM vicidial_list where lead_id='$CIDlead_id';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01073'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$vendor_lead_code = $aryA[0];
}
$sthA->finish();
# get date/time
&get_date_time;
$campaign_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$campaign_rec_filename =~ s/CUSTPHONE/$VDADphone/gi;
$campaign_rec_filename =~ s/FULLDATE/$recdate/gi;
$campaign_rec_filename =~ s/TINYDATE/$tinydate/gi;
$campaign_rec_filename =~ s/EPOCH/$now_date_epoch/gi;
$campaign_rec_filename =~ s/AGENT/$VDADuser/gi;
$campaign_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$campaign_rec_filename =~ s/LEADID/$CIDlead_id/gi;
$campaign_rec_filename =~ s/CALLID/$callerid/gi;
$campaign_rec_filename =~ s/\"|\'//gi;
if ( ($stereo_recording =~ /CUSTOMER|BOTH/i) && ($conf_engine eq "CONFBRIDGE") && ($SSstereo_recording > 0) )
{
# do nothing can't record more than 1 stream on the same channel, stereo call recording processing is right below this section
# $retval = $AGI->exec("MixMonitor",",r($PATHmonitorS/$campaign_rec_filename-in.wav)t($PATHmonitorS/$campaign_rec_filename-out.wav)");
}
else
{
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
$retval = $AGI->exec("Monitor wav|$PATHmonitor/MIX/$campaign_rec_filename");
}
else
{
if ( ($ast_ver_str{major} > 20) || ($SSrecording_dtmf_muting > 0) )
{
# Deprecation of "Monitor" application after Asterisk 20
$retval = $AGI->exec("MixMonitor",",r($PATHmonitor/MIX/$campaign_rec_filename-in.wav)t($PATHmonitor/MIX/$campaign_rec_filename-out.wav)");
}
else
{
$retval = $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','$VDADuser','$campaign_rec_filename','$uniqueid');";
$RLRAaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01074'; $MEL_aff_rows=$RLRAaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE RECORDING STARTED : |$retval|$RLRAaffected_rows|$campaign_rec_filename|$stmtA|"; &agi_output;}
$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;
}
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','MONO_LEGACY_REMOTE','$VARserver_ip','$now_date','$channel','$campaign_rec_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE RECORDING STARTED : |$RLRAaffected_rows|$campaign_rec_filename|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
### stereo recording stuff goes here for remote agents
### BEGIN stereo call recording for ALLCALLS/ALLFORCE and for all parallel stereo recording campaigns for remote agents ###
if ( ($stereo_recording =~ /CUSTOMER|BOTH/i) && ($conf_engine eq "CONFBRIDGE") && ($SSstereo_recording > 0) )
{
&get_date_time;
$stereo_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$stereo_rec_filename =~ s/INGROUP/$VDADcampaign/gi;
$stereo_rec_filename =~ s/CUSTPHONE/$VDADphone/gi;
$stereo_rec_filename =~ s/FULLDATE/$recdate/gi;
$stereo_rec_filename =~ s/TINYDATE/$tinydate/gi;
$stereo_rec_filename =~ s/EPOCH/$now_date_epoch/gi;
$stereo_rec_filename =~ s/AGENT/$VDADuser/gi;
$stereo_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$stereo_rec_filename =~ s/LEADID/$CIDlead_id/gi;
$stereo_rec_filename =~ s/CALLID/$callerid/gi;
$stereo_rec_filename =~ s/\"|\'//gi;
$PATHmonitorT = $PATHmonitorS;
if ( ($SSstereo_parallel_recording > 0) && ($stereo_parallel_recording =~ /CUSTOMER|FULL/) )
{
$PATHmonitorT = $PATHmonitorP;
### insert record into recording_log_parallel table ###
$stmtA = "INSERT INTO recording_log_parallel (channel,server_ip,extension,start_time,length_in_sec,filename,lead_id,user,vicidial_id,recording_status) values('$channel','$VARserver_ip','','$now_date','0','PL$stereo_rec_filename','$CIDlead_id','$VDADuser','$uniqueid','START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $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;
$parallel_recording_id = $aryA[0];
}
$sthA->finish();
### start the parallel recording
$retval_stop = $AGI->exec("StopMixMonitor","");
$retval = $AGI->exec("MixMonitor",",r($PATHmonitorT/PL$stereo_rec_filename-out.wav)t($PATHmonitorT/PL$stereo_rec_filename-in.wav)");
if ($AGILOG) {$agi_string = "-- REMOTE PARALLEL STEREO STARTED: |$retval|$retval_stop|$SRaffected_rows|$parallel_recording_id|$stmtA|"; &agi_output;}
if ($stereo_parallel_recording =~ /CUSTOMER-ONLY/)
{
$temp_parallel_rec_co_filename = "CO".$stereo_rec_filename;
if (length($parallel_rec_co_filename) > 0)
{
$temp_parallel_rec_co_filename = $parallel_rec_co_filename;
$temp_parallel_rec_co_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_co_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_co_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_co_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_co_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_co_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_co_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_co_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_co_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_co_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_co_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPCOR','$now_date','$now_date_epoch','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_co_filename =~ /RECID/)
{
$temp_parallel_rec_co_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_co_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL CUSTOMER-ONLY REMOTE $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL CUSTOMER-ONLY REMOTE','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE PARALLEL CO STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
if ($stereo_parallel_recording =~ /CUSTOMER-MUTED/)
{
$temp_parallel_rec_cm_filename = "CM".$stereo_rec_filename;
if (length($parallel_rec_cm_filename) > 0)
{
$temp_parallel_rec_cm_filename = $parallel_rec_cm_filename;
$temp_parallel_rec_cm_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_cm_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_cm_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_cm_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_cm_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_cm_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_cm_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_cm_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_cm_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_cm_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_cm_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPCMR','$now_date','$now_date_epoch','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_cm_filename =~ /RECID/)
{
$temp_parallel_rec_cm_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_cm_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL CUSTOMER-MUTED REMOTE $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL CUSTOMER-MUTED REMOTE','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE PARALLEL CM STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
if ($stereo_parallel_recording =~ /FULL-RECORDING/)
{
$temp_parallel_rec_fr_filename = "FR".$stereo_rec_filename;
if (length($parallel_rec_fr_filename) > 0)
{
$temp_parallel_rec_fr_filename = $parallel_rec_fr_filename;
$temp_parallel_rec_fr_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_fr_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_fr_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_fr_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_fr_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_fr_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_fr_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_fr_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_fr_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_fr_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_fr_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPFRR','$now_date','$now_date_epoch','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_fr_filename =~ /RECID/)
{
$temp_parallel_rec_fr_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_fr_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL FULL-RECORDING REMOTE $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL FULL-RECORDING REMOTE','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE PARALLEL FR STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
# insert logs for agent-controlled stereo call recordings while parallel recordings are enabled
if ($stereo_recording_agent =~ /ALLCALLS|ALLFORCE/)
{
$temp_parallel_rec_ag_filename = $stereo_rec_filename;
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPACR','$now_date','$now_date_epoch','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_ag_filename =~ /RECID/)
{
$temp_parallel_rec_ag_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_ag_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL AGENT-CONTROLLED REMOTE $stereo_recording $stereo_recording_agent','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL AGENT-CONTROLLED REMOTE','$VARserver_ip','$now_date','$channel','$stereo_recording_agent','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE PARALLEL AG STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
}
else
{
## Start NON-parallel stereo call recording ##
if ($stereo_recording_agent =~ /ALLCALLS|ALLFORCE/)
{
$rl_exten='SACRBC';
if ($stereo_recording =~ /CUSTOMER_ONLY/i)
{$rl_exten='SACRCO';}
if ($stereo_recording =~ /CUSTOMER_MUTE/i)
{$rl_exten='SACRCM';}
# insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','$rl_exten','$now_date','$now_date_epoch','$stereo_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($stereo_rec_filename =~ /RECID/)
{
$stereo_rec_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$stereo_rec_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
$retval_stop = $AGI->exec("StopMixMonitor","");
$retval = $AGI->exec("MixMonitor",",r($PATHmonitorT/$stereo_rec_filename-out.wav)t($PATHmonitorT/$stereo_rec_filename-in.wav)");
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$stereo_rec_filename','$CIDlead_id','$VDADcampaign STEREO AGENT-CONTROLLED REMOTE $stereo_recording $stereo_recording_agent','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','STEREO START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO AGENT-CONTROLLED REMOTE $rl_exten','$VARserver_ip','$now_date','$channel','$stereo_rec_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
$mLIVEaffected_rows=0;
if ($stereo_recording =~ /CUSTOMER_ONLY/i)
{
$vmgr_callerid = substr($stereo_rec_filename, 0, 16) . 'M...';
$stmtE="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VARserver_ip','','MixMonitorMute','$vmgr_callerid','ActionID: $vmgr_callerid','Channel: $channel','Direction: write','State: 1','','','','','','');";
$mLIVEaffected_rows = $dbhA->do($stmtE);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$mLIVEaffected_rows; &mysql_error_logging;
}
if ($stereo_recording =~ /CUSTOMER_MUTE/i)
{
$vmgr_callerid = substr($stereo_rec_filename, 0, 16) . 'M...';
$stmtE="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VARserver_ip','','MixMonitorMute','$vmgr_callerid','ActionID: $vmgr_callerid','Channel: $channel','Direction: read','State: 1','','','','','','');";
$mLIVEaffected_rows = $dbhA->do($stmtE);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$mLIVEaffected_rows; &mysql_error_logging;
}
if ($AGILOG) {$agi_string = "-- REMOTE AGENT STEREO RECORDING STARTED : |$retval|$retval_stop|$SRaffected_rows|$recording_id|$rLIVEaffected_rows|$mLIVEaffected_rows|$stmtA|"; &agi_output;}
}
}
}
### END stereo call recording for ALLCALLS/ALLFORCE and for all parallel stereo recording campaigns for Remote Agents ###
}
### END REMOTE AGENT SECTION
else
{
if ($routing_initiated_recordings =~ /Y/)
{
### BEGIN routing-initiated agent call recording for ALLCALLS/ALLFORCE ###
### look for the recording settings for the user
if (length($VDADuser) > 0)
{
$stmtA = "SELECT vicidial_recording_override,vicidial_recording FROM vicidial_users where user='$VDADuser';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsVUrec=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01121'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging;
if ($sthArowsVUrec > 0)
{
@aryA = $sthA->fetchrow_array;
if ($aryA[0] !~ /DISABLED/)
{$campaign_recording = $aryA[0];}
if ($aryA[1] < 1)
{$campaign_recording = 'NONE';}
}
$sthA->finish();
}
### if recording is enabled then start recording on this call before sending to a remote agent
if ($campaign_recording =~ /ALLCALLS|ALLFORCE/)
{
$stmtA = "SELECT vendor_lead_code FROM vicidial_list where lead_id='$CIDlead_id';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01122'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$vendor_lead_code = $aryA[0];
}
$sthA->finish();
# get date/time
&get_date_time;
$campaign_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$campaign_rec_filename =~ s/CUSTPHONE/$VDADphone/gi;
$campaign_rec_filename =~ s/FULLDATE/$recdate/gi;
$campaign_rec_filename =~ s/TINYDATE/$tinydate/gi;
$campaign_rec_filename =~ s/EPOCH/$now_date_epoch/gi;
$campaign_rec_filename =~ s/AGENT/$VDADuser/gi;
$campaign_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$campaign_rec_filename =~ s/LEADID/$CIDlead_id/gi;
$campaign_rec_filename =~ s/CALLID/$callerid/gi;
$campaign_rec_filename =~ s/\"|\'//gi;
$conf_silent_prefix='5';
$channelrec = "Local/" . $conf_silent_prefix . '' . $VDADconf_exten . "@" . $ext_context;
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channelrec','$VDADserver_ip','$campaign_rec_exten','$now_date','$now_date_epoch','$campaign_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02123'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02124'; $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='02125'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
$vmgr_callerid = substr($campaign_rec_filename, 0, 17) . '...';
$stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VDADserver_ip','','Originate','$vmgr_callerid','Channel: $channelrec','Context: $ext_context','Exten: $campaign_rec_exten','Priority: 1','Callerid: $campaign_rec_filename','','','','','');";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02126'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed) values('$recording_id','$campaign_rec_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0')";
$affected_rowsB = $dbhA->do($stmtB);
$dbhP=$dbhA; $mysql_count='02127'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging;
$stmtC = "UPDATE vicidial_live_agents SET external_recording='$recording_id' where user='$VDADuser';";
$affected_rowsC = $dbhA->do($stmtC);
$dbhP=$dbhA; $mysql_count='02128'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','MONO_LEGACY_RIR','$VDADserver_ip','$now_date','$channelrec','$campaign_rec_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- ROUTING INITIATED RECORDING STARTED : |$affected_rows|$recording_id|$campaign_rec_filename|$rLIVEaffected_rows|$stmtA| |$affected_rowsB|$stmtB| |$affected_rowsC|$stmtC|"; &agi_output;}
}
### END routing-initiated agent call recording for ALLCALLS/ALLFORCE ###
}
### BEGIN stereo call recording for ALLCALLS/ALLFORCE and for all parallel stereo recording campaigns ###
if ( ($stereo_recording =~ /CUSTOMER|BOTH/i) && ($conf_engine eq "CONFBRIDGE") && ($SSstereo_recording > 0) )
{
&get_date_time;
$stereo_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$stereo_rec_filename =~ s/INGROUP/$VDADcampaign/gi;
$stereo_rec_filename =~ s/CUSTPHONE/$VDADphone/gi;
$stereo_rec_filename =~ s/FULLDATE/$recdate/gi;
$stereo_rec_filename =~ s/TINYDATE/$tinydate/gi;
$stereo_rec_filename =~ s/EPOCH/$now_date_epoch/gi;
$stereo_rec_filename =~ s/AGENT/$VDADuser/gi;
$stereo_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$stereo_rec_filename =~ s/LEADID/$CIDlead_id/gi;
$stereo_rec_filename =~ s/CALLID/$callerid/gi;
$stereo_rec_filename =~ s/\"|\'//gi;
$PATHmonitorT = $PATHmonitorS;
if ( ($SSstereo_parallel_recording > 0) && ($stereo_parallel_recording =~ /CUSTOMER|FULL/) )
{
$PATHmonitorT = $PATHmonitorP;
### insert record into recording_log_parallel table ###
$stmtA = "INSERT INTO recording_log_parallel (channel,server_ip,extension,start_time,length_in_sec,filename,lead_id,user,vicidial_id,recording_status) values('$channel','$VARserver_ip','','$now_date','0','PL$stereo_rec_filename','$CIDlead_id','$VDADuser','$uniqueid','START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $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;
$parallel_recording_id = $aryA[0];
}
$sthA->finish();
### start the parallel recording
$retval_stop = $AGI->exec("StopMixMonitor","");
$retval = $AGI->exec("MixMonitor",",r($PATHmonitorT/PL$stereo_rec_filename-out.wav)t($PATHmonitorT/PL$stereo_rec_filename-in.wav)");
if ($AGILOG) {$agi_string = "-- PARALLEL STEREO STARTED: |$retval|$retval_stop|$SRaffected_rows|$parallel_recording_id|$stmtA|"; &agi_output;}
if ($stereo_parallel_recording =~ /CUSTOMER-ONLY/)
{
$temp_parallel_rec_co_filename = "CO".$stereo_rec_filename;
if (length($parallel_rec_co_filename) > 0)
{
$temp_parallel_rec_co_filename = $parallel_rec_co_filename;
$temp_parallel_rec_co_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_co_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_co_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_co_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_co_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_co_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_co_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_co_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_co_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_co_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_co_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPCO','$now_date','$now_date_epoch','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_co_filename =~ /RECID/)
{
$temp_parallel_rec_co_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_co_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL CUSTOMER-ONLY $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL CUSTOMER-ONLY','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- PARALLEL CO STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
if ($stereo_parallel_recording =~ /CUSTOMER-MUTED/)
{
$temp_parallel_rec_cm_filename = "CM".$stereo_rec_filename;
if (length($parallel_rec_cm_filename) > 0)
{
$temp_parallel_rec_cm_filename = $parallel_rec_cm_filename;
$temp_parallel_rec_cm_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_cm_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_cm_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_cm_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_cm_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_cm_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_cm_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_cm_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_cm_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_cm_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_cm_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPCM','$now_date','$now_date_epoch','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_cm_filename =~ /RECID/)
{
$temp_parallel_rec_cm_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_cm_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL CUSTOMER-MUTED $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL CUSTOMER-MUTED','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- PARALLEL CM STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
if ($stereo_parallel_recording =~ /FULL-RECORDING/)
{
$temp_parallel_rec_fr_filename = "FR".$stereo_rec_filename;
if (length($parallel_rec_fr_filename) > 0)
{
$temp_parallel_rec_fr_filename = $parallel_rec_fr_filename;
$temp_parallel_rec_fr_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_fr_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_fr_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_fr_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_fr_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_fr_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_fr_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_fr_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_fr_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_fr_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_fr_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPFR','$now_date','$now_date_epoch','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_fr_filename =~ /RECID/)
{
$temp_parallel_rec_fr_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_fr_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL FULL-RECORDING $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL FULL-RECORDING','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- PARALLEL FR STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
# insert logs for agent-controlled stereo call recordings while parallel recordings are enabled
if ($stereo_recording_agent =~ /ALLCALLS|ALLFORCE/)
{
$temp_parallel_rec_ag_filename = $stereo_rec_filename;
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPACI','$now_date','$now_date_epoch','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_ag_filename =~ /RECID/)
{
$temp_parallel_rec_ag_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_ag_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL AGENT-CONTROLLED RIR $stereo_recording $stereo_recording_agent','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed,rir_type) values('$recording_id','$temp_parallel_rec_ag_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0','S')";
$affected_rowsB = $dbhA->do($stmtB);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL AGENT-CONTROLLED RIR','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- PARALLEL AG STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
}
else
{
## Start NON-parallel stereo call recording ##
if ($stereo_recording_agent =~ /ALLCALLS|ALLFORCE/)
{
$rl_exten='SACIBC';
if ($stereo_recording =~ /CUSTOMER_ONLY/i)
{$rl_exten='SACICO';}
if ($stereo_recording =~ /CUSTOMER_MUTE/i)
{$rl_exten='SACICM';}
# insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','$rl_exten','$now_date','$now_date_epoch','$stereo_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($stereo_rec_filename =~ /RECID/)
{
$stereo_rec_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$stereo_rec_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
$retval_stop = $AGI->exec("StopMixMonitor","");
$retval = $AGI->exec("MixMonitor",",r($PATHmonitorT/$stereo_rec_filename-out.wav)t($PATHmonitorT/$stereo_rec_filename-in.wav)");
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$stereo_rec_filename','$CIDlead_id','$VDADcampaign STEREO AGENT-CONTROLLED RIR $stereo_recording $stereo_recording_agent','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','STEREO START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed,rir_type) values('$recording_id','$stereo_rec_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0','S')";
$affected_rowsB = $dbhA->do($stmtB);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO AGENT-CONTROLLED RIR $rl_exten','$VARserver_ip','$now_date','$channel','$stereo_rec_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
$mLIVEaffected_rows=0;
if ($stereo_recording =~ /CUSTOMER_ONLY/i)
{
$vmgr_callerid = substr($stereo_rec_filename, 0, 16) . 'M...';
$stmtE="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VARserver_ip','','MixMonitorMute','$vmgr_callerid','ActionID: $vmgr_callerid','Channel: $channel','Direction: write','State: 1','','','','','','');";
$mLIVEaffected_rows = $dbhA->do($stmtE);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$mLIVEaffected_rows; &mysql_error_logging;
}
if ($stereo_recording =~ /CUSTOMER_MUTE/i)
{
$vmgr_callerid = substr($stereo_rec_filename, 0, 16) . 'M...';
$stmtE="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VARserver_ip','','MixMonitorMute','$vmgr_callerid','ActionID: $vmgr_callerid','Channel: $channel','Direction: read','State: 1','','','','','','');";
$mLIVEaffected_rows = $dbhA->do($stmtE);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$mLIVEaffected_rows; &mysql_error_logging;
}
if ($AGILOG) {$agi_string = "-- AGENT STEREO RECORDING STARTED : |$retval|$retval_stop|$SRaffected_rows|$recording_id|$rLIVEaffected_rows|$mLIVEaffected_rows|$stmtA|"; &agi_output;}
}
}
}
### END stereo call recording for ALLCALLS/ALLFORCE and for all parallel stereo recording campaigns ###
if ($extension_appended_cidname =~ /Y|USER/)
{
$eac_extension='';
$stmtA = "SELECT extension,campaign_id FROM vicidial_live_agents where user='$VDADuser' order by last_call_time limit 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01068'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
if ($extension_appended_cidname =~ /USER/)
{
$eac_extension = $VDADuser;
}
else
{
$eac_extension = $aryA[0];
$eac_extension =~ s/SIP\/|IAX2\/|Zap\/|DAHDI\/|Local\///gi;
}
if ($extension_appended_cidname =~ /WITH_CAMPAIGN/)
{$eac_extension .= " $aryA[1]";}
}
$sthA->finish();
$newcallerid = "\"$callerid $eac_extension <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
}
else
{
$newcallerid = "\"$callerid <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
}
}
$stmtA = "UPDATE vicidial_auto_calls set status='XFER', stage='XFER-$drop_timer', extension='$VDADconf_exten' where callerid='$callerid';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01038'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|"; &agi_output;}
if ($SSabandon_check_queue > 0)
{
### check for ACTIVE vicidial_abandon_check_queue records and set to CONNECTED if they exist
$stmtA = "UPDATE vicidial_abandon_check_queue SET check_status='CONNECTED' where lead_id = '$CIDlead_id' and check_status IN('NEW','QUEUE','PROCESSING') and abandon_time > \"$timeTWENTYFOURhoursAGO\" order by abandon_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02068'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VACQ connected 1: |$CIDlead_id|$affected_rows|$stmtA"; &agi_output;}
if ($affected_rows < 1)
{
### check for INACTIVE vicidial_abandon_check_queue records and set to CONNECTED if they exist
$stmtA = "UPDATE vicidial_abandon_check_queue SET check_status='CONNECTED' where lead_id = '$CIDlead_id' and check_status IN('COMPLETE','REJECT','CONNECTED') and abandon_time > \"$timeTWENTYFOURhoursAGO\" order by abandon_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02068'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VACQ connected 2: |$CIDlead_id|$affected_rows|$stmtA"; &agi_output;}
}
}
if ($enable_queuemetrics_logging > 0)
{
$dbhB = DBI->connect("DBI:mysql:$queuemetrics_dbname:$queuemetrics_server_ip:3306", "$queuemetrics_login", "$queuemetrics_pass")
or die "Couldn't connect to database: " . DBI->errstr;
if ($DBX) {print "CONNECTED TO DATABASE: $queuemetrics_server_ip|$queuemetrics_dbname\n";}
$pe_append='';
if ( ($queuemetrics_pe_phone_append > 0) && (length($queuemetrics_phone_environment)>0) )
{
@qm_extension = split(/\//,$VDADextension);
$pe_append = "-$qm_extension[1]";
}
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='Agent/$VDADuser',verb='CONNECT',data1='$drop_timer',serverid='$queuemetrics_log_id',data4='$queuemetrics_phone_environment$pe_append';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01039'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$dbhB->disconnect();
if ( ($queuemetrics_socket =~ /CONNECT_COMPLETE/) and (length($queuemetrics_socket_url) > 10) )
{
if ($queuemetrics_socket_url =~ /--A--/)
{
########## FIND vicidial_list lead data ##########
$stmtA = "SELECT vendor_lead_code,list_id,phone_code,phone_number,title,first_name,middle_initial,last_name,postal_code FROM vicidial_list where lead_id='$CIDlead_id' LIMIT 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01110'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$vendor_lead_code = $aryA[0];
$list_id = $aryA[1];
$phone_code = $aryA[2];
$phone_number = $aryA[3];
$title = $aryA[4];
$first_name = $aryA[5];
$middle_initial = $aryA[6];
$last_name = $aryA[7];
$postal_code = $aryA[8];
}
$sthA->finish();
$queuemetrics_socket_url =~ s/^VAR//gi;
$queuemetrics_socket_url =~ s/--A--lead_id--B--/$CIDlead_id/gi;
$queuemetrics_socket_url =~ s/--A--vendor_id--B--/$vendor_lead_code/gi;
$queuemetrics_socket_url =~ s/--A--vendor_lead_code--B--/$vendor_lead_code/gi;
$queuemetrics_socket_url =~ s/--A--list_id--B--/$list_id/gi;
$queuemetrics_socket_url =~ s/--A--phone_number--B--/$phone_number/gi;
$queuemetrics_socket_url =~ s/--A--title--B--/$title/gi;
$queuemetrics_socket_url =~ s/--A--first_name--B--/$first_name/gi;
$queuemetrics_socket_url =~ s/--A--middle_initial--B--/$middle_initial/gi;
$queuemetrics_socket_url =~ s/--A--last_name--B--/$last_name/gi;
$queuemetrics_socket_url =~ s/--A--postal_code--B--/$postal_code/gi;
$queuemetrics_socket_url =~ s/ /+/gi;
$queuemetrics_socket_url =~ s/&/\\&/gi;
}
$socket_send_data_begin='?';
$socket_send_data = "time_id=$now_date_epoch&call_id=$callerid&queue=$VDADcampaign&agent=Agent/$VDADuser&verb=CONNECT&data1=$drop_timer&data2=&data3=&data4=$queuemetrics_phone_environment$pe_append";
if ($queuemetrics_socket_url =~ /\?/)
{$socket_send_data_begin='&';}
### send queue_log data to the queuemetrics_socket_url ###
$compat_url = "$queuemetrics_socket_url$socket_send_data_begin$socket_send_data";
$compat_url =~ s/ /+/gi;
$compat_url =~ s/&/\\&/gi;
$launch = $PATHhome . "/AST_send_URL.pl";
$launch .= " --SYSLOG" if ($SYSLOG);
$launch .= " --lead_id=" . $CIDlead_id;
$launch .= " --phone_number=" . $VDADphone;
$launch .= " --user=" . $VDADuser;
$launch .= " --call_type=OUT";
$launch .= " --campaign=" . $VDADcampaign;
$launch .= " --uniqueid=" . $uniqueid;
$launch .= " --call_id=" . $callerid;
$launch .= " --list_id=" . $list_id;
$launch .= " --alt_dial=MAIN";
$launch .= " --function=QM_SOCKET_SEND";
$launch .= " --compat_url=" . $compat_url;
system($launch . ' &');
if ($AGILOG) {$agi_string = "$launch|"; &agi_output;}
}
}
$dbhA->disconnect();
if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $VDADconf_exten"; &agi_output;}
print "SET CONTEXT $ext_context\n";
$result = <STDIN>;
checkresult($result);
print "SET EXTENSION $VDADconf_exten\n";
$result = <STDIN>;
checkresult($result);
print "SET PRIORITY 1\n";
$result = <STDIN>;
checkresult($result);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = ($year + 1900);
$mon++;
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
if ($hour < 10) {$hour = "0$hour";}
if ($min < 10) {$min = "0$min";}
if ($sec < 10) {$sec = "0$sec";}
$now_date_epoch = time();
$now_date = "$year-$mon-$mday $hour:$min:$sec";
if ($AGILOG) {$agi_string = "XXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;}
exit;
}
else
{
if ($AGILOG) {$agi_string = "NNNNNNNNNN No agent record found!!!"; &agi_output;}
}
}
else
{
if ($AGILOG) {$agi_string = "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$VDADcampaign|$channel|$callerid|$uniqueid|"; &agi_output;}
}
}
if ($agent_search_method =~ /^LO|^LB/)
{
###################################################################################################
##### Attempt to send call to an agent on any server #####
if ($DBconcurrent_transfers =~ /AUTO/)
{
$active_agents=1;
$stmtA = "SELECT count(*) FROM vicidial_live_agents where campaign_id = '$VDADcampaign' and last_update_time > '$BDtsSQLdate';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01041'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$active_agents = $aryA[0];
$rec_count++;
}
$concurrent_transfers = ($active_agents / 10);
$concurrent_transfers = sprintf("%.0f", $concurrent_transfers);
$concurrent_transfers++;
if ($AGILOG) {$agi_string = "|CONCURRENT TRANSFERS AUTO SETTING: $concurrent_transfers ($active_agents)|"; &agi_output;}
}
else {$concurrent_transfers = $DBconcurrent_transfers;}
$sthA->finish();
$cbc=0;
$rec_countWAITremOUT=0;
$rec_countWAITremIN=0;
$rec_countWAITremINallowed=0;
$agentdirect_count=0;
$READY_agent_closer_camps='';
$READY_users='';
$READY_users_count=0;
$AGENTDIRECT_user_ids='';
### find number of outbound calls waiting in line in front of this call
$stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and lead_id != '$CIDlead_id' and campaign_id = '$VDADcampaign' and call_time < \"$VDADcall_time\";";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01040'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$rec_countWAITremOUT = $aryA[0];
}
$sthA->finish();
if ($AGILOG) {$agi_string = "$rec_countWAITremOUT|$stmtA|"; &agi_output;}
if (length($closer_campaigns) > 3)
{
### find number of inbound calls waiting in line in front of this call
$stmtA = "SELECT count(*) FROM vicidial_auto_calls where ( (status = 'LIVE') and ( (queue_priority > $VDADqueue_priority) and (call_type='IN') and (campaign_id IN($closer_campaigns)) ) );";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01074'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$rec_countWAITremIN = $aryA[0];
$rec_countWAITremINallowed = $aryA[0];
}
$sthA->finish();
if ($AGILOG) {$agi_string = "$rec_countWAITremIN|$stmtA|"; &agi_output;}
}
### if there are inbound calls waiting, see if any READY agents are able to take them
if ($rec_countWAITremIN > 0)
{
### get a list of the in-groups that the READY agents are able to take calls from
$stmtA = "SELECT closer_campaigns,user FROM vicidial_live_agents where status = 'READY' and lead_id<1 and ring_callerid='' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01075'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$READY_users_count=0;
while ($sthArows > $READY_users_count)
{
@aryA = $sthA->fetchrow_array;
$READY_users .= "'$aryA[1]',";
@VLagent_camps = split(/ /,$aryA[0]);
$ki=0;
foreach(@VLagent_camps)
{
if ( ($VLagent_camps[$ki] !~ /AGENTDIRECT/) && (length($VLagent_camps[$ki]) > 1) && ($READY_agent_closer_camps !~ /'$VLagent_camps[$ki]'/) )
{$READY_agent_closer_camps .= "'$VLagent_camps[$ki]',";}
$ki++;
}
$READY_users_count++;
}
$sthA->finish();
$READY_agent_closer_camps =~ s/.$//gi;
$READY_users =~ s/.$//gi;
if (length($READY_agent_closer_camps) < 2) {$READY_agent_closer_camps="''";}
if (length($READY_users)>2)
{
if ($closer_campaigns =~ /AGENTDIRECT/)
{
### get a list of the users that have AGENTDIRECT calls waiting for them
$stmtA = "SELECT agent_only FROM vicidial_auto_calls where status = 'LIVE' and campaign_id LIKE \"%AGENTDIRECT%\" and last_update_time > '$BDtsSQLdate' and agent_only IN($READY_users) and agent_only != '';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01076'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$agentdirect_count=0;
while ($sthArows > $agentdirect_count)
{
@aryA = $sthA->fetchrow_array;
$AGENTDIRECT_user_ids .= "'$aryA[0]',";
$agentdirect_count++;
}
$sthA->finish();
$AGENTDIRECT_user_ids =~ s/.$//gi;
if (length($AGENTDIRECT_user_ids)>2)
{$AGENTDIRECT_user_ids = "or ( (campaign_id LIKE \"%AGENTDIRECT%\") and (agent_only IN($AGENTDIRECT_user_ids)) )";}
else
{$AGENTDIRECT_user_ids='';}
}
### find number of inbound calls from in-groups that READY agents are able to take calls from are waiting in line in front of this call
$stmtA = "SELECT count(*) FROM vicidial_auto_calls where ( (status = 'LIVE') and ( ( (queue_priority > $VDADqueue_priority) and (call_type='IN') and (campaign_id IN($READY_agent_closer_camps)) ) ) $AGENTDIRECT_user_ids );";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01077'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$rec_countWAITremIN = $aryA[0];
}
$sthA->finish();
if ($AGILOG) {$agi_string = "$rec_countWAITremIN|$stmtA|"; &agi_output;}
}
}
# if ($AGILOG) {$agi_string = "COUNT DEBUG: |$concurrent_transfers|$rec_countWAITremOUT|$rec_countWAITremIN|$rec_countWAITremINallowed|$agentdirect_count|$READY_users_count|$closer_campaigns|$READY_agent_closer_camps|$READY_users|$AGENTDIRECT_user_ids|"; &agi_output;}
$rec_countWAITrem = ($rec_countWAITremOUT + $rec_countWAITremIN);
if ($rec_countWAITrem < $concurrent_transfers)
{
### BEGIN grade random next-agent-call routing ###
if ($CAMP_callorder =~ /grade/)
{
$stmtA = "LOCK TABLES vicidial_live_agents WRITE;";
my $LOCKaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01089'; $MEL_aff_rows=$LOCKaffected_rows; &mysql_error_logging;
@GRADEuser=@MT;
@GRADEgrade=@MT;
@userGRADEarray=@MT;
$stmtA = "SELECT user,campaign_grade from vicidial_live_agents WHERE status='READY' and lead_id<1 and ring_callerid='' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate' limit 1000;";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01090'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$gg=0;
$ga=0;
while ($gg < $sthArows)
{
@aryA = $sthA->fetchrow_array;
$GRADEuser[$gg] = $aryA[0];
$GRADEgrade[$gg] = $aryA[1];
if ($GRADEgrade[$gg] < 1)
{$GRADEgrade[$gg] = 1;}
$gi=0;
while ($gi < $GRADEgrade[$gg])
{
$userGRADEarray[$ga] = $GRADEuser[$gg];
# print STDERR " GRADE ENTRY: $userGRADEarray[$ga]|$ga|$gi|$GRADEgrade[$gg]\n";
$gi++;
$ga++;
}
$gg++;
}
$sthA->finish();
$sthArows=0;
$affected_rows=0;
if ($ga > 0)
{
$GRADErandom = int( rand($ga));
$userGRADEchosen = $userGRADEarray[$GRADErandom];
if ($AGILOG) {$agi_string = "GRADE RANDOM: $userGRADEchosen|$GRADErandom|$CAMP_callorder|$gg|$ga|$callerid"; &agi_output;}
$stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', call_server_ip='$VARserver_ip', callerid='$callerid',comments='AUTO' where status='READY' and lead_id<1 and ring_callerid='' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate' and user='$userGRADEchosen' limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01091'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
if ($AGILOG) {$agi_string = "$VDADuser|$VDADgroup_weight|$stmtA|"; &agi_output;}
$stmtA = "UNLOCK TABLES;";
my $LOCKaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01092'; $MEL_aff_rows=$LOCKaffected_rows; &mysql_error_logging;
}
### END grade random next-agent-call routing ###
else
{
$stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', call_server_ip='$VARserver_ip', callerid='$callerid',comments='AUTO' where status='READY' and lead_id<1 and ring_callerid='' and campaign_id='$VDADcampaign' and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01042'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|update of vla table: $VDADcampaign|$VARserver_ip\n|$stmtA|"; &agi_output;}
if ($affected_rows > 0)
{
$r=0;
$VDADuser='';
while ( (length($VDADuser)<1) && ($r<3) )
{
$stmtA = "SELECT conf_exten,user,extension,server_ip,ra_user FROM vicidial_live_agents where status IN('QUEUE','INCALL') and campaign_id='$VDADcampaign' and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01043'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$VDADconf_exten = $aryA[0];
$VDADuser = $aryA[1];
$VDADextension = $aryA[2];
$VDADserver_ip = $aryA[3];
$ra_user = $aryA[4];
$rec_count++;
}
$sthA->finish();
$r++;
if ($r > 1)
{
if ($AGILOG) {$agi_string = "EEEEEEEEEE vla UPDATE DELAY!!! |$callerid|$r|"; &agi_output;}
### sleep for 23 hundredths of a second
usleep(1*230*1000);
$drop_timer = ($drop_timer + 0.25);
}
if ($r > 2)
{
$stmtA = "SELECT conf_exten,user,extension,server_ip,ra_user FROM vicidial_live_agents where callerid='$callerid' order by last_call_time limit 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01044'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$VDADconf_exten = $aryA[0];
$VDADuser = $aryA[1];
$VDADextension = $aryA[2];
$VDADserver_ip = $aryA[3];
$ra_user = $aryA[4];
$rec_count++;
}
$sthA->finish();
if ($AGILOG) {$agi_string = "FFFFFFFFFF vla OR SELECT |$callerid|$VDADuser|"; &agi_output;}
}
}
### format the server dialstring to get the call to the agent meetme room on that server
$S='*';
$VDADremDIALstr='';
if( $VDADserver_ip =~ m/(\S+)\.(\S+)\.(\S+)\.(\S+)/ )
{
$a = leading_zero($1);
$b = leading_zero($2);
$c = leading_zero($3);
$d = leading_zero($4);
$VDADremDIALstr = "$a$S$b$S$c$S$d$S";
}
### BEGIN REMOTE AGENT SECTION
if ($VDADextension =~ /^R\//)
{
### set the callerid to the ACQS value(calleridname)
## use these two lines for Asterisk 1.2 tree
$newcallerid = "\"$calleridname <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
## use these two lines for Asterisk 1.0 tree
# print "SET CALLERID \"$calleridname\" <0000000000>\n";
# print "SET CALLERIDNAME \"$calleridname\"\n";
if ($VDADremDIALstr =~ /888888888888/)
{
$stmtA = "SELECT vendor_lead_code FROM vicidial_list where lead_id='$CIDlead_id';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01057'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$vendor_id = $aryA[0];
}
$sthA->finish();
$VDADremDIALstr = "$a$S$b$S$c$S$d$S$VDADphone$S$vendor_id";
}
if (length($ra_user) > 0)
{
$extension_group='';
$stmtA = "SELECT extension_group,extension_group_order FROM vicidial_remote_agents where user_start='$ra_user';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01061'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$extension_group = $aryA[0];
$extension_group_order = $aryA[1];
}
$sthA->finish();
if ( (length($extension_group) > 0) and ($extension_group !~ /^NONE/) )
{
$extension_group_orderSQL = 'order by last_call_time';
if ($extension_group_order =~ /RANK/)
{$extension_group_orderSQL = 'order by rank desc, last_call_time';}
if ($extension_group_order =~ /CALL_COUNT/)
{$extension_group_orderSQL = 'order by call_count_today, last_call_time';}
$stmtA = "UPDATE vicidial_extension_groups set last_callerid='$callerid',last_call_time=NOW(),call_count_today=(call_count_today + 1) where extension_group_id='$extension_group' and ( (campaign_groups='') or (campaign_groups LIKE \"%|$VDADcampaign|%\") ) $extension_group_orderSQL limit 1;";
$VEGaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01062'; $MEL_aff_rows=$VEGaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE EXTEN GROUP : |$VEGaffected_rows|update of veg table: $callerid\n|$stmtA|"; &agi_output;}
if ($VEGaffected_rows > 0)
{
$stmtA = "SELECT extension,extension_id,call_count_today FROM vicidial_extension_groups where last_callerid='$callerid' order by last_call_time desc limit 1;";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01063'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$VDADconf_exten = $aryA[0];
if ($AGILOG) {$agi_string = "-- REMOTE EXTEN SET : |$VDADconf_exten|$aryA[1]|$aryA[2]|"; &agi_output;}
}
$sthA->finish();
}
}
}
print STDERR "Setting CID \"$newcallerid\"\n";
checkresult($result);
$stmtA = "UPDATE vicidial_live_agents set ra_extension='$VDADremDIALstr$VDADconf_exten' where extension='$VDADextension' and ra_user='$ra_user';";
$RALaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01067'; $MEL_aff_rows=$RALaffected_rows; &mysql_error_logging;
$stmtA = "INSERT INTO vicidial_remote_agent_log set callerid='$callerid',uniqueid='$uniqueid',ra_user='$ra_user',user='$VDADuser',call_time=NOW(),extension='$VDADconf_exten',lead_id='$CIDlead_id',phone_number='$VDADphone',campaign_id='$VDADcampaign',processed='N';";
$RALaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01065'; $MEL_aff_rows=$RALaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE EXTEN LOG : |$RALaffected_rows|CID changed: \"$callerid\" \<$VDADphone\>\n|$stmtA|"; &agi_output;}
### look for the recording settings for the start user of this remote agent
if (length($ra_user) > 0)
{
$stmtA = "SELECT vicidial_recording_override,vicidial_recording FROM vicidial_users where user='$ra_user';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsVUrec=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01072'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging;
if ($sthArowsVUrec > 0)
{
@aryA = $sthA->fetchrow_array;
if ($aryA[0] !~ /DISABLED/)
{$campaign_recording = $aryA[0];}
if ($aryA[1] < 1)
{$campaign_recording = 'NONE';}
}
$sthA->finish();
}
### if recording is enabled then start recording on this call before sending to a remote agent
if ($campaign_recording =~ /ALLCALLS|ALLFORCE/)
{
$stmtA = "SELECT vendor_lead_code FROM vicidial_list where lead_id='$CIDlead_id';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01075'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$vendor_lead_code = $aryA[0];
}
$sthA->finish();
# get date/time
&get_date_time;
$campaign_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$campaign_rec_filename =~ s/CUSTPHONE/$VDADphone/gi;
$campaign_rec_filename =~ s/FULLDATE/$recdate/gi;
$campaign_rec_filename =~ s/TINYDATE/$tinydate/gi;
$campaign_rec_filename =~ s/EPOCH/$now_date_epoch/gi;
$campaign_rec_filename =~ s/AGENT/$VDADuser/gi;
$campaign_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$campaign_rec_filename =~ s/LEADID/$CIDlead_id/gi;
$campaign_rec_filename =~ s/CALLID/$callerid/gi;
$campaign_rec_filename =~ s/\"|\'//gi;
if ( ($stereo_recording =~ /CUSTOMER|BOTH/i) && ($conf_engine eq "CONFBRIDGE") && ($SSstereo_recording > 0) )
{
# do nothing can't record more than 1 stream on the same channel, stereo call recording processing is right below this section
# $retval = $AGI->exec("MixMonitor",",r($PATHmonitorS/$campaign_rec_filename-in.wav)t($PATHmonitorS/$campaign_rec_filename-out.wav)");
}
else
{
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
$retval = $AGI->exec("Monitor wav|$PATHmonitor/MIX/$campaign_rec_filename");
}
else
{
if ( ($ast_ver_str{major} > 20) || ($SSrecording_dtmf_muting > 0) )
{
# Deprecation of "Monitor" application after Asterisk 20
$retval = $AGI->exec("MixMonitor",",r($PATHmonitor/MIX/$campaign_rec_filename-in.wav)t($PATHmonitor/MIX/$campaign_rec_filename-out.wav)");
}
else
{
$retval = $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','$VDADuser','$campaign_rec_filename','$uniqueid');";
$RLRAaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01076'; $MEL_aff_rows=$RLRAaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE RECORDING STARTED : |$retval|$RLRAaffected_rows|$campaign_rec_filename|$stmtA|"; &agi_output;}
$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;
}
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','MONO_LEGACY_REMOTE','$VARserver_ip','$now_date','$channel','$campaign_rec_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE2 RECORDING STARTED : |$RLRAaffected_rows|$campaign_rec_filename|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
### BEGIN stereo call recording for ALLCALLS/ALLFORCE and for all parallel stereo recording campaigns for remote agents ###
if ( ($stereo_recording =~ /CUSTOMER|BOTH/i) && ($conf_engine eq "CONFBRIDGE") && ($SSstereo_recording > 0) )
{
&get_date_time;
$stereo_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$stereo_rec_filename =~ s/INGROUP/$VDADcampaign/gi;
$stereo_rec_filename =~ s/CUSTPHONE/$VDADphone/gi;
$stereo_rec_filename =~ s/FULLDATE/$recdate/gi;
$stereo_rec_filename =~ s/TINYDATE/$tinydate/gi;
$stereo_rec_filename =~ s/EPOCH/$now_date_epoch/gi;
$stereo_rec_filename =~ s/AGENT/$VDADuser/gi;
$stereo_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$stereo_rec_filename =~ s/LEADID/$CIDlead_id/gi;
$stereo_rec_filename =~ s/CALLID/$callerid/gi;
$stereo_rec_filename =~ s/\"|\'//gi;
$PATHmonitorT = $PATHmonitorS;
if ( ($SSstereo_parallel_recording > 0) && ($stereo_parallel_recording =~ /CUSTOMER|FULL/) )
{
$PATHmonitorT = $PATHmonitorP;
### insert record into recording_log_parallel table ###
$stmtA = "INSERT INTO recording_log_parallel (channel,server_ip,extension,start_time,length_in_sec,filename,lead_id,user,vicidial_id,recording_status) values('$channel','$VARserver_ip','','$now_date','0','PL$stereo_rec_filename','$CIDlead_id','$VDADuser','$uniqueid','START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $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;
$parallel_recording_id = $aryA[0];
}
$sthA->finish();
### start the parallel recording
$retval_stop = $AGI->exec("StopMixMonitor","");
$retval = $AGI->exec("MixMonitor",",r($PATHmonitorT/PL$stereo_rec_filename-out.wav)t($PATHmonitorT/PL$stereo_rec_filename-in.wav)");
if ($AGILOG) {$agi_string = "-- REMOTE2 PARALLEL STEREO STARTED: |$retval|$retval_stop|$SRaffected_rows|$parallel_recording_id|$stmtA|"; &agi_output;}
if ($stereo_parallel_recording =~ /CUSTOMER-ONLY/)
{
$temp_parallel_rec_co_filename = "CO".$stereo_rec_filename;
if (length($parallel_rec_co_filename) > 0)
{
$temp_parallel_rec_co_filename = $parallel_rec_co_filename;
$temp_parallel_rec_co_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_co_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_co_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_co_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_co_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_co_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_co_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_co_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_co_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_co_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_co_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPCOR','$now_date','$now_date_epoch','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_co_filename =~ /RECID/)
{
$temp_parallel_rec_co_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_co_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL CUSTOMER-ONLY REMOTE $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL CUSTOMER-ONLY REMOTE','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE2 PARALLEL CO STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
if ($stereo_parallel_recording =~ /CUSTOMER-MUTED/)
{
$temp_parallel_rec_cm_filename = "CM".$stereo_rec_filename;
if (length($parallel_rec_cm_filename) > 0)
{
$temp_parallel_rec_cm_filename = $parallel_rec_cm_filename;
$temp_parallel_rec_cm_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_cm_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_cm_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_cm_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_cm_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_cm_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_cm_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_cm_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_cm_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_cm_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_cm_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPCMR','$now_date','$now_date_epoch','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_cm_filename =~ /RECID/)
{
$temp_parallel_rec_cm_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_cm_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL CUSTOMER-MUTED REMOTE $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL CUSTOMER-MUTED REMOTE','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE2 PARALLEL CM STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
if ($stereo_parallel_recording =~ /FULL-RECORDING/)
{
$temp_parallel_rec_fr_filename = "FR".$stereo_rec_filename;
if (length($parallel_rec_fr_filename) > 0)
{
$temp_parallel_rec_fr_filename = $parallel_rec_fr_filename;
$temp_parallel_rec_fr_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_fr_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_fr_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_fr_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_fr_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_fr_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_fr_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_fr_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_fr_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_fr_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_fr_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPRFR','$now_date','$now_date_epoch','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_fr_filename =~ /RECID/)
{
$temp_parallel_rec_fr_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_fr_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL FULL-RECORDING REMOTE $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL FULL-RECORDING REMOTE','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE2 PARALLEL FR STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
# insert logs for agent-controlled stereo call recordings while parallel recordings are enabled
if ($stereo_recording_agent =~ /ALLCALLS|ALLFORCE/)
{
$temp_parallel_rec_ag_filename = $stereo_rec_filename;
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPACR','$now_date','$now_date_epoch','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_ag_filename =~ /RECID/)
{
$temp_parallel_rec_ag_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_ag_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL AGENT-CONTROLLED REMOTE $stereo_recording $stereo_recording_agent','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL AGENT-CONTROLLED REMOTE','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- REMOTE2 PARALLEL AG STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
}
else
{
## Start NON-parallel stereo call recording ##
if ($stereo_recording_agent =~ /ALLCALLS|ALLFORCE/)
{
$rl_exten='SACRBC';
if ($stereo_recording =~ /CUSTOMER_ONLY/i)
{$rl_exten='SACRCO';}
if ($stereo_recording =~ /CUSTOMER_MUTE/i)
{$rl_exten='SACRCM';}
# insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','$rl_exten','$now_date','$now_date_epoch','$stereo_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($stereo_rec_filename =~ /RECID/)
{
$stereo_rec_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$stereo_rec_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
$retval_stop = $AGI->exec("StopMixMonitor","");
$retval = $AGI->exec("MixMonitor",",r($PATHmonitorT/$stereo_rec_filename-out.wav)t($PATHmonitorT/$stereo_rec_filename-in.wav)");
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$stereo_rec_filename','$CIDlead_id','$VDADcampaign STEREO AGENT-CONTROLLED REMOTE $stereo_recording $stereo_recording_agent','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','STEREO START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO AGENT-CONTROLLED REMOTE $rl_exten','$VARserver_ip','$now_date','$channel','$stereo_rec_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
$mLIVEaffected_rows=0;
if ($stereo_recording =~ /CUSTOMER_ONLY/i)
{
$vmgr_callerid = substr($stereo_rec_filename, 0, 16) . 'M...';
$stmtE="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VARserver_ip','','MixMonitorMute','$vmgr_callerid','ActionID: $vmgr_callerid','Channel: $channel','Direction: write','State: 1','','','','','','');";
$mLIVEaffected_rows = $dbhA->do($stmtE);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$mLIVEaffected_rows; &mysql_error_logging;
}
if ($stereo_recording =~ /CUSTOMER_MUTE/i)
{
$vmgr_callerid = substr($stereo_rec_filename, 0, 16) . 'M...';
$stmtE="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VARserver_ip','','MixMonitorMute','$vmgr_callerid','ActionID: $vmgr_callerid','Channel: $channel','Direction: read','State: 1','','','','','','');";
$mLIVEaffected_rows = $dbhA->do($stmtE);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$mLIVEaffected_rows; &mysql_error_logging;
}
if ($AGILOG) {$agi_string = "-- REMOTE2 AGENT STEREO RECORDING STARTED : |$retval|$retval_stop|$SRaffected_rows|$recording_id|$rLIVEaffected_rows|$mLIVEaffected_rows|$stmtA|"; &agi_output;}
}
}
}
### END stereo call recording for ALLCALLS/ALLFORCE and for all parallel stereo recording campaigns for Remote Agents ###
}
### END REMOTE AGENT SECTION
else
{
if ($routing_initiated_recordings =~ /Y/)
{
### BEGIN routing-initiated agent call recording for ALLCALLS/ALLFORCE ###
### look for the recording settings for the user
if (length($VDADuser) > 0)
{
$stmtA = "SELECT vicidial_recording_override,vicidial_recording FROM vicidial_users where user='$VDADuser';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsVUrec=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01129'; $MEL_aff_rows=$sthArowsVUrec; &mysql_error_logging;
if ($sthArowsVUrec > 0)
{
@aryA = $sthA->fetchrow_array;
if ($aryA[0] !~ /DISABLED/)
{$campaign_recording = $aryA[0];}
if ($aryA[1] < 1)
{$campaign_recording = 'NONE';}
}
$sthA->finish();
}
### if recording is enabled then start recording on this call before sending to a remote agent
if ($campaign_recording =~ /ALLCALLS|ALLFORCE/)
{
$stmtA = "SELECT vendor_lead_code FROM vicidial_list where lead_id='$CIDlead_id';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01130'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$vendor_lead_code = $aryA[0];
}
$sthA->finish();
# get date/time
&get_date_time;
$campaign_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$campaign_rec_filename =~ s/CUSTPHONE/$VDADphone/gi;
$campaign_rec_filename =~ s/FULLDATE/$recdate/gi;
$campaign_rec_filename =~ s/TINYDATE/$tinydate/gi;
$campaign_rec_filename =~ s/EPOCH/$now_date_epoch/gi;
$campaign_rec_filename =~ s/AGENT/$VDADuser/gi;
$campaign_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$campaign_rec_filename =~ s/LEADID/$CIDlead_id/gi;
$campaign_rec_filename =~ s/CALLID/$callerid/gi;
$campaign_rec_filename =~ s/\"|\'//gi;
$conf_silent_prefix='5';
$channelrec = "Local/" . $conf_silent_prefix . '' . $VDADconf_exten . "@" . $ext_context;
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channelrec','$VDADserver_ip','$campaign_rec_exten','$now_date','$now_date_epoch','$campaign_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02131'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02132'; $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='02133'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
$vmgr_callerid = substr($campaign_rec_filename, 0, 17) . '...';
$stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VDADserver_ip','','Originate','$vmgr_callerid','Channel: $channelrec','Context: $ext_context','Exten: $campaign_rec_exten','Priority: 1','Callerid: $campaign_rec_filename','','','','','');";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02134'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed) values('$recording_id','$campaign_rec_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0')";
$affected_rowsB = $dbhA->do($stmtB);
$dbhP=$dbhA; $mysql_count='02135'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging;
$stmtC = "UPDATE vicidial_live_agents SET external_recording='$recording_id' where user='$VDADuser';";
$affected_rowsC = $dbhA->do($stmtC);
$dbhP=$dbhA; $mysql_count='02136'; $MEL_aff_rows=$affected_rowsC; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','MONO_LEGACY_RIR','$VDADserver_ip','$now_date','$channelrec','$campaign_rec_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- ROUTING INITIATED RECORDING STARTED : |$affected_rows|$recording_id|$campaign_rec_filename|$rLIVEaffected_rows|$stmtA| |$affected_rowsB|$stmtB| |$affected_rowsC|$stmtC|"; &agi_output;}
}
### END routing-initiated agent call recording for ALLCALLS/ALLFORCE ###
}
### BEGIN stereo call recording for ALLCALLS/ALLFORCE and for all parallel stereo recording campaigns ###
if ( ($stereo_recording =~ /CUSTOMER|BOTH/i) && ($conf_engine eq "CONFBRIDGE") && ($SSstereo_recording > 0) )
{
&get_date_time;
$stereo_rec_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$stereo_rec_filename =~ s/INGROUP/$VDADcampaign/gi;
$stereo_rec_filename =~ s/CUSTPHONE/$VDADphone/gi;
$stereo_rec_filename =~ s/FULLDATE/$recdate/gi;
$stereo_rec_filename =~ s/TINYDATE/$tinydate/gi;
$stereo_rec_filename =~ s/EPOCH/$now_date_epoch/gi;
$stereo_rec_filename =~ s/AGENT/$VDADuser/gi;
$stereo_rec_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$stereo_rec_filename =~ s/LEADID/$CIDlead_id/gi;
$stereo_rec_filename =~ s/CALLID/$callerid/gi;
$stereo_rec_filename =~ s/\"|\'//gi;
$PATHmonitorT = $PATHmonitorS;
if ( ($SSstereo_parallel_recording > 0) && ($stereo_parallel_recording =~ /CUSTOMER|FULL/) )
{
$PATHmonitorT = $PATHmonitorP;
### insert record into recording_log_parallel table ###
$stmtA = "INSERT INTO recording_log_parallel (channel,server_ip,extension,start_time,length_in_sec,filename,lead_id,user,vicidial_id,recording_status) values('$channel','$VARserver_ip','','$now_date','0','PL$stereo_rec_filename','$CIDlead_id','$VDADuser','$uniqueid','START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $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;
$parallel_recording_id = $aryA[0];
}
$sthA->finish();
### start the parallel recording
$retval_stop = $AGI->exec("StopMixMonitor","");
$retval = $AGI->exec("MixMonitor",",r($PATHmonitorT/PL$stereo_rec_filename-out.wav)t($PATHmonitorT/PL$stereo_rec_filename-in.wav)");
if ($AGILOG) {$agi_string = "-- PARALLEL STEREO STARTED: |$retval|$retval_stop|$SRaffected_rows|$parallel_recording_id|$stmtA|"; &agi_output;}
if ($stereo_parallel_recording =~ /CUSTOMER-ONLY/)
{
$temp_parallel_rec_co_filename = "CO".$stereo_rec_filename;
if (length($parallel_rec_co_filename) > 0)
{
$temp_parallel_rec_co_filename = $parallel_rec_co_filename;
$temp_parallel_rec_co_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_co_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_co_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_co_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_co_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_co_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_co_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_co_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_co_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_co_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_co_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPCO','$now_date','$now_date_epoch','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_co_filename =~ /RECID/)
{
$temp_parallel_rec_co_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_co_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL CUSTOMER-ONLY $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL CUSTOMER-ONLY','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_co_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- PARALLEL CO STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
if ($stereo_parallel_recording =~ /CUSTOMER-MUTED/)
{
$temp_parallel_rec_cm_filename = "CM".$stereo_rec_filename;
if (length($parallel_rec_cm_filename) > 0)
{
$temp_parallel_rec_cm_filename = $parallel_rec_cm_filename;
$temp_parallel_rec_cm_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_cm_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_cm_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_cm_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_cm_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_cm_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_cm_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_cm_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_cm_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_cm_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_cm_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPCM','$now_date','$now_date_epoch','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_cm_filename =~ /RECID/)
{
$temp_parallel_rec_cm_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_cm_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL CUSTOMER-MUTED $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL CUSTOMER-MUTED','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_cm_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- PARALLEL CM STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
if ($stereo_parallel_recording =~ /FULL-RECORDING/)
{
$temp_parallel_rec_fr_filename = "FR".$stereo_rec_filename;
if (length($parallel_rec_fr_filename) > 0)
{
$temp_parallel_rec_fr_filename = $parallel_rec_fr_filename;
$temp_parallel_rec_fr_filename =~ s/CAMPAIGN/$VDADcampaign/gi;
$temp_parallel_rec_fr_filename =~ s/INGROUP/$VDADcampaign/gi;
$temp_parallel_rec_fr_filename =~ s/CUSTPHONE/$VDADphone/gi;
$temp_parallel_rec_fr_filename =~ s/FULLDATE/$recdate/gi;
$temp_parallel_rec_fr_filename =~ s/TINYDATE/$tinydate/gi;
$temp_parallel_rec_fr_filename =~ s/EPOCH/$now_date_epoch/gi;
$temp_parallel_rec_fr_filename =~ s/AGENT/$VDADuser/gi;
$temp_parallel_rec_fr_filename =~ s/VENDORLEADCODE/$vendor_lead_code/gi;
$temp_parallel_rec_fr_filename =~ s/LEADID/$CIDlead_id/gi;
$temp_parallel_rec_fr_filename =~ s/CALLID/$callerid/gi;
$temp_parallel_rec_fr_filename =~ s/\"|\'//gi;
}
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPFR','$now_date','$now_date_epoch','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_fr_filename =~ /RECID/)
{
$temp_parallel_rec_fr_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_fr_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL FULL-RECORDING $stereo_recording','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL FULL-RECORDING','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_fr_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- PARALLEL FR STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
# insert logs for agent-controlled stereo call recordings while parallel recordings are enabled
if ($stereo_recording_agent =~ /ALLCALLS|ALLFORCE/)
{
$temp_parallel_rec_ag_filename = $stereo_rec_filename;
### insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','SPACI','$now_date','$now_date_epoch','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($temp_parallel_rec_ag_filename =~ /RECID/)
{
$temp_parallel_rec_ag_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$temp_parallel_rec_ag_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,parallel_recording_id,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADcampaign STEREO_PARALLEL AGENT-CONTROLLED RIR $stereo_recording $stereo_recording_agent','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','$parallel_recording_id','PARALLEL START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed,rir_type) values('$recording_id','$temp_parallel_rec_ag_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0','S')";
$affected_rowsB = $dbhA->do($stmtB);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO_PARALLEL AGENT-CONTROLLED RIR','$VARserver_ip','$now_date','$channel','$temp_parallel_rec_ag_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- PARALLEL AG STEREO RECORDING LOG INSERT : |$SRaffected_rows|$recording_id|$parallel_recording_id|$rLIVEaffected_rows|$stmtA|"; &agi_output;}
}
}
else
{
## Start NON-parallel stereo call recording ##
if ($stereo_recording_agent =~ /ALLCALLS|ALLFORCE/)
{
$rl_exten='SACIBC';
if ($stereo_recording =~ /CUSTOMER_ONLY/i)
{$rl_exten='SACICO';}
if ($stereo_recording =~ /CUSTOMER_MUTE/i)
{$rl_exten='SACICM';}
# insert a record into the recording_log table
$stmtA = "INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,filename,lead_id,user,vicidial_id) values('$channel','$VARserver_ip','$rl_exten','$now_date','$now_date_epoch','$stereo_rec_filename','$CIDlead_id','$VDADuser','$uniqueid')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
$stmtB = "SELECT LAST_INSERT_ID() LIMIT 1;";
$sthA = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $stmtA=$stmtB; $mysql_count='02XXX'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$recording_id = $aryA[0];
}
$sthA->finish();
if ($stereo_rec_filename =~ /RECID/)
{
$stereo_rec_filename =~ s/RECID/$recording_id/gi;
$stmtA = "UPDATE recording_log SET filename='$stereo_rec_filename' where recording_id='$recording_id';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
}
$retval_stop = $AGI->exec("StopMixMonitor","");
$retval = $AGI->exec("MixMonitor",",r($PATHmonitorT/$stereo_rec_filename-out.wav)t($PATHmonitorT/$stereo_rec_filename-in.wav)");
### insert record into recording_log_stereo table ###
$stmtA = "INSERT INTO recording_log_stereo (recording_id,server_ip,start_time,length_in_sec,filename,lead_id,options,processing_log,recording_status) values('$recording_id','$VARserver_ip','$now_date','0','$stereo_rec_filename','$CIDlead_id','$VDADcampaign STEREO AGENT-CONTROLLED RIR $stereo_recording $stereo_recording_agent','start: $now_date|vicidial_id: $uniqueid|user: $VDADuser|channel: $channel|','STEREO START');";
$SRaffected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$SRaffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO routing_initiated_recordings (recording_id,filename,launch_time,lead_id,vicidial_id,user,processed,rir_type) values('$recording_id','$stereo_rec_filename','$now_date','$CIDlead_id','$uniqueid','$VDADuser','0','S')";
$affected_rowsB = $dbhA->do($stmtB);
$dbhP=$dbhA; $mysql_count='02XXX'; $MEL_aff_rows=$affected_rowsB; &mysql_error_logging;
if ( ($SSrecording_dtmf_detection > 0) && ($SSrecording_dtmf_muting > 0) )
{if ($SSrecording_dtmf_muting > 1) {$recording_dtmf_muting = $SSrecording_dtmf_muting;} }
$stmtD = "INSERT INTO recording_live (recording_id,recording_type,server_ip,start_time,channel,filename,lead_id,user,dtmf_muting_end_time,recording_status,dtmf_muting_seconds) values('$recording_id','STEREO AGENT-CONTROLLED RIR $rl_exten','$VARserver_ip','$now_date','$channel','$stereo_rec_filename','$CIDlead_id','$VDADuser','2020-12-31 23:59:59','STARTED','$recording_dtmf_muting');";
$rLIVEaffected_rows = $dbhA->do($stmtD);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$rLIVEaffected_rows; &mysql_error_logging;
$mLIVEaffected_rows=0;
if ($stereo_recording =~ /CUSTOMER_ONLY/i)
{
$vmgr_callerid = substr($stereo_rec_filename, 0, 16) . 'M...';
$stmtE="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VARserver_ip','','MixMonitorMute','$vmgr_callerid','ActionID: $vmgr_callerid','Channel: $channel','Direction: write','State: 1','','','','','','');";
$mLIVEaffected_rows = $dbhA->do($stmtE);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$mLIVEaffected_rows; &mysql_error_logging;
}
if ($stereo_recording =~ /CUSTOMER_MUTE/i)
{
$vmgr_callerid = substr($stereo_rec_filename, 0, 16) . 'M...';
$stmtE="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VARserver_ip','','MixMonitorMute','$vmgr_callerid','ActionID: $vmgr_callerid','Channel: $channel','Direction: read','State: 1','','','','','','');";
$mLIVEaffected_rows = $dbhA->do($stmtE);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$mLIVEaffected_rows; &mysql_error_logging;
}
if ($AGILOG) {$agi_string = "-- AGENT STEREO RECORDING STARTED : |$retval|$retval_stop|$SRaffected_rows|$recording_id|$rLIVEaffected_rows|$mLIVEaffected_rows|$stmtA|"; &agi_output;}
}
}
}
### END stereo call recording for ALLCALLS/ALLFORCE and for all parallel stereo recording campaigns ###
if ($extension_appended_cidname =~ /Y|USER/)
{
$eac_extension='';
$stmtA = "SELECT extension,campaign_id FROM vicidial_live_agents where user='$VDADuser' order by last_call_time limit 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01069'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
if ($extension_appended_cidname =~ /USER/)
{
$eac_extension = $VDADuser;
}
else
{
$eac_extension = $aryA[0];
$eac_extension =~ s/SIP\/|IAX2\/|Zap\/|DAHDI\/|Local\///gi;
}
if ($extension_appended_cidname =~ /WITH_CAMPAIGN/)
{$eac_extension .= " $aryA[1]";}
}
$sthA->finish();
$newcallerid = "\"$callerid $eac_extension <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
}
else
{
$newcallerid = "\"$callerid <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
}
}
$VDADremDIALstr .= "$VDADconf_exten";
$stmtA = "UPDATE vicidial_auto_calls set status='XFER', stage='XFER-$drop_timer', extension='$VDADremDIALstr' where callerid='$callerid';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01045'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD XFER REMOTE: |$affected_rows|update of vac table: $callerid\n|$stmtA|"; &agi_output;}
if ($enable_queuemetrics_logging > 0)
{
$dbhB = DBI->connect("DBI:mysql:$queuemetrics_dbname:$queuemetrics_server_ip:3306", "$queuemetrics_login", "$queuemetrics_pass")
or die "Couldn't connect to database: " . DBI->errstr;
if ($DBX) {print "CONNECTED TO DATABASE: $queuemetrics_server_ip|$queuemetrics_dbname\n";}
$pe_append='';
if ( ($queuemetrics_pe_phone_append > 0) && (length($queuemetrics_phone_environment)>0) )
{
@qm_extension = split(/\//,$VDADextension);
$pe_append = "-$qm_extension[1]";
}
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='Agent/$VDADuser',verb='CONNECT',data1='$drop_timer',serverid='$queuemetrics_log_id',data4='$queuemetrics_phone_environment$pe_append';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01046'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$dbhB->disconnect();
if ( ($queuemetrics_socket =~ /CONNECT_COMPLETE/) and (length($queuemetrics_socket_url) > 10) )
{
if ($queuemetrics_socket_url =~ /--A--/)
{
########## FIND vicidial_list lead data ##########
$stmtA = "SELECT vendor_lead_code,list_id,phone_code,phone_number,title,first_name,middle_initial,last_name,postal_code FROM vicidial_list where lead_id='$CIDlead_id' LIMIT 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01111'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$vendor_lead_code = $aryA[0];
$list_id = $aryA[1];
$phone_code = $aryA[2];
$phone_number = $aryA[3];
$title = $aryA[4];
$first_name = $aryA[5];
$middle_initial = $aryA[6];
$last_name = $aryA[7];
$postal_code = $aryA[8];
}
$sthA->finish();
$queuemetrics_socket_url =~ s/^VAR//gi;
$queuemetrics_socket_url =~ s/--A--lead_id--B--/$CIDlead_id/gi;
$queuemetrics_socket_url =~ s/--A--vendor_id--B--/$vendor_lead_code/gi;
$queuemetrics_socket_url =~ s/--A--vendor_lead_code--B--/$vendor_lead_code/gi;
$queuemetrics_socket_url =~ s/--A--list_id--B--/$list_id/gi;
$queuemetrics_socket_url =~ s/--A--phone_number--B--/$phone_number/gi;
$queuemetrics_socket_url =~ s/--A--title--B--/$title/gi;
$queuemetrics_socket_url =~ s/--A--first_name--B--/$first_name/gi;
$queuemetrics_socket_url =~ s/--A--middle_initial--B--/$middle_initial/gi;
$queuemetrics_socket_url =~ s/--A--last_name--B--/$last_name/gi;
$queuemetrics_socket_url =~ s/--A--postal_code--B--/$postal_code/gi;
$queuemetrics_socket_url =~ s/ /+/gi;
$queuemetrics_socket_url =~ s/&/\\&/gi;
}
$socket_send_data_begin='?';
$socket_send_data = "time_id=$now_date_epoch&call_id=$callerid&queue=$VDADcampaign&agent=Agent/$VDADuser&verb=CONNECT&data1=$drop_timer&data2=&data3=&data4=$queuemetrics_phone_environment$pe_append";
if ($queuemetrics_socket_url =~ /\?/)
{$socket_send_data_begin='&';}
### send queue_log data to the queuemetrics_socket_url ###
$compat_url = "$queuemetrics_socket_url$socket_send_data_begin$socket_send_data";
$compat_url =~ s/ /+/gi;
$compat_url =~ s/&/\\&/gi;
$launch = $PATHhome . "/AST_send_URL.pl";
$launch .= " --SYSLOG" if ($SYSLOG);
$launch .= " --lead_id=" . $CIDlead_id;
$launch .= " --phone_number=" . $VDADphone;
$launch .= " --user=" . $VDADuser;
$launch .= " --call_type=OUT";
$launch .= " --campaign=" . $VDADcampaign;
$launch .= " --uniqueid=" . $uniqueid;
$launch .= " --call_id=" . $callerid;
$launch .= " --list_id=" . $list_id;
$launch .= " --alt_dial=MAIN";
$launch .= " --function=QM_SOCKET_SEND";
$launch .= " --compat_url=" . $compat_url;
system($launch . ' &');
if ($AGILOG) {$agi_string = "$launch|"; &agi_output;}
}
}
$dbhA->disconnect();
if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $VDADremDIALstr"; &agi_output;}
print "SET CONTEXT $ext_context\n";
$result = <STDIN>;
checkresult($result);
print "SET EXTENSION $VDADremDIALstr\n";
$result = <STDIN>;
checkresult($result);
print "SET PRIORITY 1\n";
$result = <STDIN>;
checkresult($result);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = ($year + 1900);
$mon++;
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
if ($hour < 10) {$hour = "0$hour";}
if ($min < 10) {$min = "0$min";}
if ($sec < 10) {$sec = "0$sec";}
$now_date_epoch = time();
$now_date = "$year-$mon-$mday $hour:$min:$sec";
if ($AGILOG) {$agi_string = "XXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;}
exit;
}
else
{
if ($AGILOG) {$agi_string = "NNNNNNNNNN No agent record found!!! $drop_timer"; &agi_output;}
}
}
else
{
if ($AGILOG) {$agi_string = "WWWWWWWW VDAD XFER BALANCE WAIT: |$rec_countWAITrem|$VDADcampaign|$channel|$callerid|$uniqueid|"; &agi_output;}
}
}
############################################################################
### END attempt to send call to agent
############################################################################
if ($drop_timer < 3)
{
### sleep for 23 hundredths of a second
usleep(1*230*1000);
$drop_timer = ($drop_timer + 0.25);
}
else
{
### sleep for 99 hundredths of a second
usleep(1*990*1000);
$drop_timer++;
}
$stmtA = "UPDATE vicidial_auto_calls set stage='LIVE-$drop_timer' where callerid='$callerid';";
$affected_rows = $dbhA->do($stmtA);
if ($affected_rows < 1)
{
$stmtA = "INSERT INTO vicidial_auto_calls (server_ip,campaign_id,status,lead_id,uniqueid,callerid,channel,phone_code,phone_number,call_time,call_type,stage,queue_priority) values('$VARserver_ip','$VDADcampaign','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','OUT','LIVE-$drop_timer','$VDADqueue_priority')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01047'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "$affected_rows|VDAC-reinsert|$stmtA|"; &agi_output;}
}
#if ($AGILOG) {$agi_string = "-- VDAD : |$affected_rows|update of vac table: $callerid\n|$stmtA|"; &agi_output;}
}
if ($drop_timer > $DROP_TIME)
{
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = ($year + 1900);
$mon++;
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
if ($hour < 10) {$hour = "0$hour";}
if ($min < 10) {$min = "0$min";}
if ($sec < 10) {$sec = "0$sec";}
$now_date_epoch = time();
$now_date = "$year-$mon-$mday $hour:$min:$sec";
$CIDdate = "$mon$mday$hour$min$sec";
$tsSQLdate = "$year$mon$mday$hour$min$sec";
$SQLdate = "$year-$mon-$mday $hour:$min:$sec";
$Euniqueid=$uniqueid;
$Euniqueid =~ s/\.\d+//gi;
if ($drop_seconds < 1)
{
$drop_seconds = $DROP_TIME;
}
$drop_status='DROP';
$drop_log_status='';
if ($survey_drop > 0)
{$drop_status='PM';}
if ($drop_action =~ /MESSAGE/)
{
$newcallerid = "\"$callerid <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
print STDERR "Setting CID \"$newcallerid\"\n";
checkresult($result);
if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;}
if (length($safe_harbor_exten)>0)
{$DROPexten = "$safe_harbor_exten";}
}
if ($drop_action =~ /VOICEMAIL|VMAIL_NO_INST/)
{
$newcallerid = "\"$callerid <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
print STDERR "Setting CID \"$newcallerid\"\n";
checkresult($result);
if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;}
if ($drop_action =~ /VMAIL_NO_INST/)
{$voicemail_dump_exten = $voicemail_dump_exten_no_inst;}
if (length($VDADvoicemail_ext)>0)
{$DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext";}
}
if ($drop_action =~ /IN_GROUP/)
{
$drop_inbound_group_override='';
if (length($xCLlist_id) > 1)
{
### gather list_id overrides
$stmtA = "SELECT drop_inbound_group_override FROM vicidial_lists where list_id='$xCLlist_id';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsL=$sthA->rows;
if ($sthArowsL > 0)
{
@aryA = $sthA->fetchrow_array;
$drop_inbound_group_override = $aryA[0];
if (length($drop_inbound_group_override) > 0)
{$drop_inbound_group = $drop_inbound_group_override;}
}
$sthA->finish();
}
# Example: 90009*CL_uk3survy_*8301*10000123*universal*7275551212*1234*"
$S='*';
$DROPexten = "90009*$drop_inbound_group$S$S$CIDlead_id$S$S$VDADphone$S$fronter$S";
if ( ($DBdrop_call_seconds < 0) && ($campaign_dial_method =~ /SHARED/i) )
{$drop_log_status = 'SRDROP';}
}
if ($drop_action =~ /CALLMENU/)
{
$newcallerid = "\"$callerid <$VDADphone>\"";
$AGI->set_callerid($newcallerid);
print STDERR "Setting CID \"$newcallerid\"\n";
checkresult($result);
if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;}
$DROPexten = 's';
$ext_context = $safe_harbor_menu_id;
if (length($ext_context)<1)
{$DROPexten = '';}
if (length($drop_log_status) < 1) {$drop_log_status = $drop_status;}
if ($enable_queuemetrics_logging > 0)
{
$dbhB = DBI->connect("DBI:mysql:$queuemetrics_dbname:$queuemetrics_server_ip:3306", "$queuemetrics_login", "$queuemetrics_pass")
or die "Couldn't connect to database: " . DBI->errstr;
if ($DBX) {print "CONNECTED TO DATABASE: $queuemetrics_server_ip|$queuemetrics_dbname\n";}
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='EXITWITHTIMEOUT',data1='1',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01081'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='CALLSTATUS',data1='$drop_log_status',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01082'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$dbhB->disconnect();
}
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$drop_log_status',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds',term_reason='CALLMENUXFER' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01083'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD vicidial_log update: |$affected_rows|$uniqueid"; &agi_output;}
$stmtA = "UPDATE vicidial_list set status='$drop_status' where lead_id = '$CIDlead_id';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01084'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD vicidial_list update: |$affected_rows|$CIDlead_id"; &agi_output;}
}
else
{
if (length($drop_log_status) < 1) {$drop_log_status = $drop_status;}
if ($enable_queuemetrics_logging > 0)
{
$dbhB = DBI->connect("DBI:mysql:$queuemetrics_dbname:$queuemetrics_server_ip:3306", "$queuemetrics_login", "$queuemetrics_pass")
or die "Couldn't connect to database: " . DBI->errstr;
if ($DBX) {print "CONNECTED TO DATABASE: $queuemetrics_server_ip|$queuemetrics_dbname\n";}
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='EXITWITHTIMEOUT',data1='1',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01048'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='CALLSTATUS',data1='$drop_log_status',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01049'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$dbhB->disconnect();
}
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$drop_log_status',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds',term_reason='QUEUETIMEOUT' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01050'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD vicidial_log update: |$affected_rows|$uniqueid|$drop_log_status|$drop_status"; &agi_output;}
$stmtA = "UPDATE vicidial_list set status='$drop_status' where lead_id = '$CIDlead_id';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01051'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD vicidial_list update: |$affected_rows|$CIDlead_id"; &agi_output;}
if ( ($DBdrop_call_seconds < 0) && ($drop_action =~ /IN_GROUP/) )
{
$stmtA = "INSERT IGNORE INTO vicidial_shared_drops (callerid,server_ip,campaign_id,status,lead_id,uniqueid,channel,phone_code,phone_number,call_time,call_type,stage,last_update_time,alt_dial,drop_time) SELECT callerid,server_ip,campaign_id,status,lead_id,uniqueid,channel,phone_code,phone_number,call_time,call_type,stage,last_update_time,alt_dial,now() from vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01XXX'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- SHARED drop record inserted: |$affected_rows|$VDADcampaign|"; &agi_output;}
}
$stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01052'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD vac record deleted: |$affected_rows|$VDADcampaign|"; &agi_output;}
}
if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) )
{
$temp_status = $drop_status;
&call_quota_logging;
}
if ($drop_action =~ /AUDIO/)
{
if ($safe_harbor_audio_field !~ /DISABLED/)
{
$stmtA = "SELECT $safe_harbor_audio_field FROM vicidial_list where lead_id='$CIDlead_id';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01097'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$safe_harbor_audio_value = $aryA[0];
if (length($safe_harbor_audio_value)>0)
{
if ($AGILOG) {$agi_string = "playing drop message FIELD: $safe_harbor_audio_value|$safe_harbor_audio_field|$safe_harbor_audio"; &agi_output;}
$safe_harbor_audio = $safe_harbor_audio_value;
}
}
$sthA->finish();
}
$DROPexten='';
if ($AGILOG) {$agi_string = "playing drop message: $safe_harbor_audio"; &agi_output;}
if (length($safe_harbor_audio) > 0)
{
$AGI->stream_file('sip-silence');
$AGI->stream_file('sip-silence');
if ($safe_harbor_audio =~ /\|/)
{
@safe_harbor_audio_array = split(/\|/,$safe_harbor_audio);
$w=0;
foreach(@safe_harbor_audio_array)
{
if (length($safe_harbor_audio_array[$w])>0)
{
$AGI->stream_file("$safe_harbor_audio_array[$w]");
}
$w++;
}
}
else
{$AGI->stream_file("$safe_harbor_audio");}
}
}
if (length($DROPexten)>0)
{
### if DROP extension is defined then send the dropped call there instead of hangup
$AGI->stream_file('sip-silence');
# $AGI->stream_file('ding'); # stop music-on-hold process
# sleep(1);
if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten $ext_context"; &agi_output;}
print "SET CONTEXT $ext_context\n";
$result = <STDIN>;
checkresult($result);
print "SET EXTENSION $DROPexten\n";
$result = <STDIN>;
checkresult($result);
print "SET PRIORITY 1\n";
$result = <STDIN>;
checkresult($result);
}
else
{
### use STDOUT to send call to proper DROP location
$VHqueryCID = "VH$CIDdate$VDADconf_exten";
### insert a NEW record to the vicidial_manager table to be processed
$stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01053'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$CIDlead_id|$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;}
$AGI->hangup();
}
}
$dbhA->disconnect();
exit;
sub enter_pin_number
{
$sound = $_[0];
$survey_dtmf_digits = $_[1];
$survey_method_TEMP = $_[2];
$survey_wait_sec = $_[3];
if (length($survey_wait_sec) < 1) # 10 seconds if wait time not defined
{$survey_wait_sec=10;}
$survey_wait_msec = ($survey_wait_sec * 1000);
$digits_to_collect =~ s/DIGITID//gi;
# please enter the pin number followed by the pound key
# please enter your X digit pin number
$digit='';
undef $digit;
$interrupt_digit='';
undef $interrupt_digit;
if ( $sound ne "")
{
if ($sound =~ /\|/)
{
@sound_array = split(/\|/,$sound);
$w=0;
foreach(@sound_array)
{
if (length($sound_array[$w])>0)
{
if ($interrupt_digit < 2)
{
$interrupt_digit = $AGI->stream_file("$sound_array[$w]","$survey_dtmf_digits");
}
}
$w++;
}
}
else
{$interrupt_digit = $AGI->stream_file("$sound","$survey_dtmf_digits");}
}
if ($AGILOG) {$agi_string = "interrupt_digit |$interrupt_digit| timeout |$survey_wait_sec|$survey_wait_msec|"; &agi_output;}
$digits_being_entered=1;
$totalDTMF='';
if ($interrupt_digit > 1)
{
if ($interrupt_digit == 35) {$interrupt_digit='#';}
if ($interrupt_digit == 42) {$interrupt_digit='*';}
if ($interrupt_digit >= 48)
{$interrupt_digit = $interrupt_digit - 48;}
$totalDTMF=$interrupt_digit;
}
$digit_loop_counter = length($totalDTMF);
if ($survey_method_TEMP !~ /HANGUP/)
{
while ( ($digit_loop_counter < $digits_to_collect) )
{
$digit = chr($AGI->wait_for_digit($survey_wait_msec)); # wait X seconds for input or until the pound key is pressed
if ( ($digit =~ /\d/) && ($survey_dtmf_digits =~ /$digit/) )
{
$totalDTMF = "$totalDTMF$digit";
if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}
# $AGI->say_digits("$digit");
undef $digit;
}
else
{
$digit_loop_counter=$digits_to_collect;
}
$digit_loop_counter++;
}
}
#$totalDTMF =~ s/\D//gi;
$pin = $totalDTMF;
if ($totalDTMF) {if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}}
return $pin;
}
sub checkresult
{
my ($res) = @_;
my $retval;
$tests++;
chomp $res;
if ($res =~ /^200/)
{
$res =~ /result=(-?\d+)/;
if (!length($1))
{
# print STDERR "FAIL ($res)\n";
$fail++;
}
else
{
# print STDERR "PASS ($1)\n";
$pass++;
}
}
else
{
# print STDERR "FAIL (unexpected result '$res')\n";
$fail++;
}
}
sub leading_zero($)
{
$_ = $_[0];
s/^(\d)$/0$1/;
s/^(\d\d)$/0$1/;
return $_;
} # End of the leading_zero() routine.
### you're call is very important to us, please stay on the line and you will be transferred to the next available agent
sub agi_output
{
if ($AGILOG >=2)
{
### open the log file for writing ###
open(Lout, ">>$AGILOGfile")
|| die "Can't open $AGILOGfile: $!\n";
print Lout "$now_date|$script|$agi_string\n";
close(Lout);
}
### send to STDERR writing ###
if ( ($AGILOG == '1') || ($AGILOG == '3') )
{print STDERR "$now_date|$script|$agi_string\n";}
$agi_string='';
}
sub mysql_error_logging
{
$errno='';
$error='';
if ( ($mel > 0) || ($one_mysql_log > 0) )
{
$errno = $dbhP->err();
if ( ($errno > 0) || ($mel > 1) || ($one_mysql_log > 0) )
{
$error = $dbhP->errstr();
### open the log file for writing ###
open(Eout, ">>$ERRLOGfile")
|| die "Can't open $ERRLOGfile: $!\n";
print Eout "$now_date|$script|$mysql_count|$MEL_aff_rows|$errno|$error|$stmtA|$callerid|$CIDlead_id|\n";
close(Eout);
}
}
$one_mysql_log=0;
}
##### BEGIN Call Quota Lead Ranking logging #####
sub call_quota_logging
{
# Gather settings container for Call Quota Lead Ranking
$CQcontainer_entry='';
$stmtA = "SELECT container_entry FROM vicidial_settings_containers where container_id='$VD_call_quota_lead_ranking';";
$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;
$CQcontainer_entry = $aryA[0];
$CQcontainer_entry =~ s/\\//gi;
}
$sthA->finish();
# Define variables for Call Quota settings
$session_one='';
$session_two='';
$session_three='';
$session_four='';
$session_five='';
$session_six='';
$settings_session_score=0;
$zero_rank_after_call=0;
if (length($CQcontainer_entry) > 5)
{
@container_lines = split(/\n/,$CQcontainer_entry);
$c=0;
foreach(@container_lines)
{
$container_lines[$c] =~ s/;.*|\r|\t| //gi;
if (length($container_lines[$c]) > 5)
{
# define core settings
if ($container_lines[$c] =~ /^zero_rank_after_call/i)
{
$container_lines[$c] =~ s/zero_rank_after_call=>//gi;
if ( ($container_lines[$c] >= 0) && ($container_lines[$c] <= 1) )
{
$zero_rank_after_call = $container_lines[$c];
}
}
# define sessions
if ($container_lines[$c] =~ /^session_one/i)
{
$session_one_valid=0; $session_one_start=''; $session_one_end='';
$session_one = $container_lines[$c];
$session_one =~ s/session_one=>//gi;
if ( (length($session_one) > 0) && (length($session_one) <= 9) && ($session_one =~ /,/) )
{
@session_oneARY = split(/,/,$session_one);
$session_one_start = $session_oneARY[0];
$session_one_end = $session_oneARY[1];
if ( (length($session_one_start) >= 4) && (length($session_one_end) >= 4) && ($session_one_start < $session_one_end) && ($session_one_end <= 2400) )
{
$settings_session_score++;
$session_one_valid++;
}
}
}
if ($container_lines[$c] =~ /^session_two/i)
{
$session_two_valid=0; $session_two_start=''; $session_two_end='';
$session_two = $container_lines[$c];
$session_two =~ s/session_two=>//gi;
if ( (length($session_two) > 0) && (length($session_two) <= 9) && ($session_two =~ /,/) )
{
@session_twoARY = split(/,/,$session_two);
$session_two_start = $session_twoARY[0];
$session_two_end = $session_twoARY[1];
if ( (length($session_two_start) >= 4) && (length($session_two_end) >= 4) && ($session_one_valid > 0) && ($session_one_end <= $session_two_start) && ($session_two_start < $session_two_end) && ($session_two_end <= 2400) )
{
$settings_session_score++;
$session_two_valid++;
}
}
}
if ($container_lines[$c] =~ /^session_three/i)
{
$session_three_valid=0; $session_three_start=''; $session_three_end='';
$session_three = $container_lines[$c];
$session_three =~ s/session_three=>//gi;
if ( (length($session_three) > 0) && (length($session_three) <= 9) && ($session_three =~ /,/) )
{
@session_threeARY = split(/,/,$session_three);
$session_three_start = $session_threeARY[0];
$session_three_end = $session_threeARY[1];
if ( (length($session_three_start) >= 4) && (length($session_three_end) >= 4) && ($session_two_valid > 0) && ($session_two_end <= $session_three_start) && ($session_three_start < $session_three_end) && ($session_three_end <= 2400) )
{
$settings_session_score++;
$session_three_valid++;
}
}
}
if ($container_lines[$c] =~ /^session_four/i)
{
$session_four_valid=0; $session_four_start=''; $session_four_end='';
$session_four = $container_lines[$c];
$session_four =~ s/session_four=>//gi;
if ( (length($session_four) > 0) && (length($session_four) <= 9) && ($session_four =~ /,/) )
{
@session_fourARY = split(/,/,$session_four);
$session_four_start = $session_fourARY[0];
$session_four_end = $session_fourARY[1];
if ( (length($session_four_start) >= 4) && (length($session_four_end) >= 4) && ($session_three_valid > 0) && ($session_three_end <= $session_four_start) && ($session_four_start < $session_four_end) && ($session_four_end <= 2400) )
{
$settings_session_score++;
$session_four_valid++;
}
}
}
if ($container_lines[$c] =~ /^session_five/i)
{
$session_five_valid=0; $session_five_start=''; $session_five_end='';
$session_five = $container_lines[$c];
$session_five =~ s/session_five=>//gi;
if ( (length($session_five) > 0) && (length($session_five) <= 9) && ($session_five =~ /,/) )
{
@session_fiveARY = split(/,/,$session_five);
$session_five_start = $session_fiveARY[0];
$session_five_end = $session_fiveARY[1];
if ( (length($session_five_start) >= 4) && (length($session_five_end) >= 4) && ($session_four_valid > 0) && ($session_four_end <= $session_five_start) && ($session_five_start < $session_five_end) && ($session_five_end <= 2400) )
{
$settings_session_score++;
$session_five_valid++;
}
}
}
if ($container_lines[$c] =~ /^session_six/i)
{
$session_six_valid=0; $session_six_start=''; $session_six_end='';
$session_six = $container_lines[$c];
$session_six =~ s/session_six=>//gi;
if ( (length($session_six) > 0) && (length($session_six) <= 9) && ($session_six =~ /,/) )
{
@session_sixARY = split(/,/,$session_six);
$session_six_start = $session_sixARY[0];
$session_six_end = $session_sixARY[1];
if ( (length($session_six_start) >= 4) && (length($session_six_end) >= 4) && ($session_five_valid > 0) && ($session_five_end <= $session_six_start) && ($session_six_start < $session_six_end) && ($session_six_end <= 2400) )
{
$settings_session_score++;
$session_six_valid++;
}
}
}
}
else
{if ($DBX > 0) {print " blank line: $c|$container_lines[$c]|\n";}}
$c++;
}
if ($settings_session_score >= 1)
{
$stmtA = "SELECT list_id,called_count,rank FROM vicidial_list where lead_id='$CIDlead_id';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$VLlist_id = $aryA[0];
$VLcalled_count = $aryA[1];
$VLrank = $aryA[2];
$tempVLrank = $VLrank;
if ( ($zero_rank_after_call > 0) && ($VLrank > 0) ) {$tempVLrank=0;}
}
$sthA->finish();
$secX = time();
$CQtarget = ($secX - 14400); # look back 4 hours
($CQsec,$CQmin,$CQhour,$CQmday,$CQmon,$CQyear,$CQwday,$CQyday,$CQisdst) = localtime($CQtarget);
$CQyear = ($CQyear + 1900);
$CQmon++;
if ($CQmon < 10) {$CQmon = "0$CQmon";}
if ($CQmday < 10) {$CQmday = "0$CQmday";}
if ($CQhour < 10) {$CQhour = "0$CQhour";}
if ($CQmin < 10) {$CQmin = "0$CQmin";}
if ($CQsec < 10) {$CQsec = "0$CQsec";}
$CQSQLdate = "$CQyear-$CQmon-$CQmday $CQhour:$CQmin:$CQsec";
$VDL_call_datetime='';
$stmtA = "SELECT call_date from vicidial_dial_log where lead_id='$CIDlead_id' and call_date > \"$CQSQLdate\" and caller_code LIKE \"%$CIDlead_id\" order by call_date desc limit 1;";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$VDLcall_datetime = $aryA[0];
@VDLcall_datetimeARY = split(/ /,$VDLcall_datetime);
@VDLcall_timeARY = split(/:/,$VDLcall_datetimeARY[1]);
$VDLcall_hourmin = "$VDLcall_timeARY[0]$VDLcall_timeARY[1]";
if ( ($session_one_start <= $VDLcall_hourmin) and ($session_one_end > $VDLcall_hourmin) )
{
$call_in_session=1;
$session_newSQL=",session_one_calls='1',session_one_today_calls='1'";
$session_updateSQL=",session_one_calls=(session_one_calls + 1),session_one_today_calls=(session_one_today_calls + 1)";
}
if ( ($session_two_start <= $VDLcall_hourmin) and ($session_two_end > $VDLcall_hourmin) )
{
$call_in_session=2;
$session_newSQL=",session_two_calls='1',session_two_today_calls='1'";
$session_updateSQL=",session_two_calls=(session_two_calls + 1),session_two_today_calls=(session_two_today_calls + 1)";
}
if ( ($session_three_start <= $VDLcall_hourmin) and ($session_three_end > $VDLcall_hourmin) )
{
$call_in_session=3;
$session_newSQL=",session_three_calls='1',session_three_today_calls='1'";
$session_updateSQL=",session_three_calls=(session_three_calls + 1),session_three_today_calls=(session_three_today_calls + 1)";
}
if ( ($session_four_start <= $VDLcall_hourmin) and ($session_four_end > $VDLcall_hourmin) )
{
$call_in_session=4;
$session_newSQL=",session_four_calls='1',session_four_today_calls='1'";
$session_updateSQL=",session_four_calls=(session_four_calls + 1),session_four_today_calls=(session_four_today_calls + 1)";
}
if ( ($session_five_start <= $VDLcall_hourmin) and ($session_five_end > $VDLcall_hourmin) )
{
$call_in_session=5;
$session_newSQL=",session_five_calls='1',session_five_today_calls='1'";
$session_updateSQL=",session_five_calls=(session_five_calls + 1),session_five_today_calls=(session_five_today_calls + 1)";
}
if ( ($session_six_start <= $VDLcall_hourmin) and ($session_six_end > $VDLcall_hourmin) )
{
$call_in_session=6;
$session_newSQL=",session_six_calls='1',session_six_today_calls='1'";
$session_updateSQL=",session_six_calls=(session_six_calls + 1),session_six_today_calls=(session_six_today_calls + 1)";
}
if ($AGILOG) {$agi_string = "CQ-Debug 2: $VDLcall_datetime|$VDLcall_hourmin|$timeclock_end_of_day|$session_one_start|$session_one_end|$call_in_session|"; &agi_output;}
if ($call_in_session > 0)
{
if (length($timeclock_end_of_day) < 1) {$timeclock_end_of_day='0000';}
$timeclock_end_of_day_hour = (substr($timeclock_end_of_day, 0, 2) + 0);
$timeclock_end_of_day_min = (substr($timeclock_end_of_day, 2, 2) + 0);
$today_start_epoch = timelocal('0',$timeclock_end_of_day_min,$timeclock_end_of_day_hour,$mday,($mon-1),$year);
if ($timeclock_end_of_day > $VDLcall_hourmin)
{$today_start_epoch = ($today_start_epoch - 86400);}
$day_two_start_epoch = ($today_start_epoch - (86400 * 1));
$day_three_start_epoch = ($today_start_epoch - (86400 * 2));
$day_four_start_epoch = ($today_start_epoch - (86400 * 3));
$day_five_start_epoch = ($today_start_epoch - (86400 * 4));
$day_six_start_epoch = ($today_start_epoch - (86400 * 5));
$day_seven_start_epoch = ($today_start_epoch - (86400 * 6));
# Gather the details on existing vicidial_lead_call_quota_counts for this lead, if there is one
$stmtA = "SELECT first_call_date,UNIX_TIMESTAMP(first_call_date),last_call_date from vicidial_lead_call_quota_counts where lead_id='$CIDlead_id' and list_id='$VLlist_id';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$VLCQCinfo_ct=$sthA->rows;
if ($VLCQCinfo_ct > 0)
{
@aryA = $sthA->fetchrow_array;
$VLCQCfirst_call_datetime = $aryA[0];
$VLCQCfirst_call_epoch = $aryA[1];
$VLCQClast_call_date = $aryA[2];
if ($VDLcall_datetime ne $VLCQClast_call_date)
{
if ($VLCQCfirst_call_epoch >= $today_start_epoch)
{$day_updateSQL=',day_one_calls=(day_one_calls+1)';}
if ( ($VLCQCfirst_call_epoch >= $day_two_start_epoch) and ($VLCQCfirst_call_epoch < $today_start_epoch) )
{$day_updateSQL=',day_two_calls=(day_two_calls+1)';}
if ( ($VLCQCfirst_call_epoch >= $day_three_start_epoch) and ($VLCQCfirst_call_epoch < $day_two_start_epoch) )
{$day_updateSQL=',day_three_calls=(day_three_calls+1)';}
if ( ($VLCQCfirst_call_epoch >= $day_four_start_epoch) and ($VLCQCfirst_call_epoch < $day_three_start_epoch) )
{$day_updateSQL=',day_four_calls=(day_four_calls+1)';}
if ( ($VLCQCfirst_call_epoch >= $day_five_start_epoch) and ($VLCQCfirst_call_epoch < $day_four_start_epoch) )
{$day_updateSQL=',day_five_calls=(day_five_calls+1)';}
if ( ($VLCQCfirst_call_epoch >= $day_six_start_epoch) and ($VLCQCfirst_call_epoch < $day_five_start_epoch) )
{$day_updateSQL=',day_six_calls=(day_six_calls+1)';}
if ( ($VLCQCfirst_call_epoch >= $day_seven_start_epoch) and ($VLCQCfirst_call_epoch < $day_six_start_epoch) )
{$day_updateSQL=',day_seven_calls=(day_seven_calls+1)';}
# Update in the vicidial_lead_call_quota_counts table for this lead
$stmtA="UPDATE vicidial_lead_call_quota_counts SET last_call_date='$VDLcall_datetime',status='$temp_status',called_count='$VLcalled_count',rank='$tempVLrank',modify_date=NOW() $session_updateSQL $day_updateSQL where lead_id='$CIDlead_id' and list_id='$VLlist_id' and modify_date < NOW();";
}
else
{
# Update in the vicidial_lead_call_quota_counts table for this lead
$stmtA="UPDATE vicidial_lead_call_quota_counts SET status='$temp_status',called_count='$VLcalled_count',rank='$tempVLrank',modify_date=NOW() where lead_id='$CIDlead_id' and list_id='$VLlist_id';";
}
$VLCQCaffected_rows_update = $dbhA->do($stmtA);
if ($AGILOG) {$agi_string = "-- VLCQC record updated: |$VLCQCaffected_rows_update| |$stmtA|"; &agi_output;}
}
else
{
# Insert new record into vicidial_lead_call_quota_counts table for this lead
$stmtA="INSERT INTO vicidial_lead_call_quota_counts SET lead_id='$CIDlead_id',list_id='$VLlist_id',first_call_date='$VDLcall_datetime',last_call_date='$VDLcall_datetime',status='$temp_status',called_count='$VLcalled_count',day_one_calls='1',rank='$tempVLrank',modify_date=NOW() $session_newSQL;";
$VLCQCaffected_rows_update = $dbhA->do($stmtA);
if ($AGILOG) {$agi_string = "-- VLCQC record inserted: |$VLCQCaffected_rows_update| |$stmtA|"; &agi_output;}
}
if ( ($zero_rank_after_call > 0) && ($VLrank > 0) )
{
# Update this lead to rank=0
$stmtA="UPDATE vicidial_list SET rank='0' where lead_id='$CIDlead_id';";
$VLCQCaffected_rows_zero_rank = $dbhA->do($stmtA);
if ($AGILOG) {$agi_string = "-- VLCQC lead rank zero: |$VLCQCaffected_rows_zero_rank| |$stmtA|"; &agi_output;}
}
}
}
$sthA->finish();
}
}
}
##### END Call Quota Lead Ranking logging #####
##### CPD call progress AMD end call process #####
sub cpd_end_call
{
$stmtA = "SELECT result FROM vicidial_cpd_log where callerid='$callerid';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
$dbhP=$dbhA; $mysql_count='01056'; $MEL_aff_rows=$sthArows; &mysql_error_logging;
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$cpd_result = $aryA[0];
}
$sthA->finish();
$CPDfound=0;
$CPDunknown=0;
if ($cpd_result =~ /Busy/i) {$vdad_result='CPDB'; $CPDfound++;}
if ($cpd_result =~ /All-Trunks-Busy/i) {$vdad_result='CPDATB'; $CPDfound++;}
if ($cpd_result =~ /No-Answer/i) {$vdad_result='CPDNA'; $CPDfound++;}
if ($cpd_result =~ /Reject/i) {$vdad_result='CPDREJ'; $CPDfound++;}
if ($cpd_result =~ /Invalid-Number/i) {$vdad_result='CPDINV'; $CPDfound++;}
if ($cpd_result =~ /Service-Unavailable/i) {$vdad_result='CPDSUA'; $CPDfound++;}
if ($cpd_result =~ /Sit-Intercept/i) {$vdad_result='CPDSI'; $CPDfound++;}
if ($cpd_result =~ /Sit-No-Circuit/i) {$vdad_result='CPDSNC'; $CPDfound++;}
if ($cpd_result =~ /Sit-Reorder/i) {$vdad_result='CPDSR'; $CPDfound++;}
if ($cpd_result =~ /Sit-Unknown/i) {$vdad_result='CPDSUK'; $CPDfound++;}
if ($cpd_result =~ /Sit-Vacant/i) {$vdad_result='CPDSV'; $CPDfound++;}
if ($cpd_result =~ /Fax|Modem/i) {$vdad_result='AFAX'; $CPDfound++;}
if ($cpd_result =~ /^Unknown|\?\?\?/i) {$vdad_result='CPDUK'; $CPDfound++; $CPDunknown++;}
if ($CPDfound < 1) {$vdad_result='AA';}
if ($CPDunknown < 1)
{if ($AGILOG) {$agi_string = "CALL CPD AMD Detected $channel $callerid|$drop_timer|$cpd_result"; &agi_output;}}
else
{if ($AGILOG) {$agi_string = "CALL CPD UNKNOWN Detected $channel $callerid|$drop_timer|$cpd_result"; &agi_output;}}
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = ($year + 1900);
$mon++;
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
if ($hour < 10) {$hour = "0$hour";}
if ($min < 10) {$min = "0$min";}
if ($sec < 10) {$sec = "0$sec";}
$now_date_epoch = time();
$now_date = "$year-$mon-$mday $hour:$min:$sec";
$CIDdate = "$mon$mday$hour$min$sec";
$tsSQLdate = "$year$mon$mday$hour$min$sec";
$SQLdate = "$year-$mon-$mday $hour:$min:$sec";
if ($enable_queuemetrics_logging > 0)
{
$dbhB = DBI->connect("DBI:mysql:$queuemetrics_dbname:$queuemetrics_server_ip:3306", "$queuemetrics_login", "$queuemetrics_pass")
or die "Couldn't connect to database: " . DBI->errstr;
if ($DBX) {print "CONNECTED TO DATABASE: $queuemetrics_server_ip|$queuemetrics_dbname\n";}
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='EXITWITHTIMEOUT',data1='1',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01048'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='CALLSTATUS',data1='$vdad_result',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01049'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$dbhB->disconnect();
}
if ($drop_seconds < 1)
{
$drop_seconds = $DROP_TIME;
}
if ( ($cpd_amd_action =~ /MESSAGE|CALLMENU|INGROUP/) && ($cpd_result !~ /Fax|^Unknown|\?\?\?/i) )
{
$DROPexten = "8320";
$AMDSTATUS_set = $AGI->set_variable('AMDSTATUS', "CPDMACHINE");
$AMDCAUSE_set = $AGI->set_variable('AMDCAUSE', $cpd_result);
}
else
{
if ( ($cpd_unknown_action =~ /MESSAGE|CALLMENU|INGROUP/) && ($cpd_result =~ /^Unknown|\?\?\?/i) )
{
$DROPexten = "8320";
$AMDSTATUS_set = $AGI->set_variable('AMDSTATUS', "CPDMACHINE");
$AMDCAUSE_set = $AGI->set_variable('AMDCAUSE', $cpd_result);
}
else
{
$stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01052'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD CPD vac record deleted: |$affected_rows|$VDADcampaign|"; &agi_output;}
}
}
$Euniqueid=$uniqueid;
$Euniqueid =~ s/\.\d+//gi;
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$vdad_result',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds',term_reason='AGENT' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01050'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD CPD vicidial_log update: |$affected_rows|$uniqueid"; &agi_output;}
$stmtA = "UPDATE vicidial_list set status='$vdad_result' where lead_id = '$CIDlead_id';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01051'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD CPD vicidial_list update: |$affected_rows|$CIDlead_id"; &agi_output;}
$stmtA = "UPDATE vicidial_cpd_log SET status='PROCESSED',cpd_seconds='$drop_timer' where callerid='$callerid' and result IN('Answering-Machine','Fax','Unknown','???') and status='NEW';";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01055'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ( ($SScall_quota_lead_ranking > 0) && ($VD_call_quota_lead_ranking !~ /^DISABLED$/i) )
{
$temp_status = $vdad_result;
&call_quota_logging;
}
### use STDOUT to send call to proper DROP location
$VHqueryCID = "VH$CIDdate$VDADconf_exten";
if (length($DROPexten)>0)
{ ### if DROP extension is defined then send the dropped call there instead of hangup
$AGI->stream_file('sip-silence');
$AGI->stream_file('sip-silence');
$AGI->stream_file('sip-silence');
# $AGI->stream_file('ding'); # stop music-on-hold process
# sleep(1);
if ($AGILOG) {$agi_string = "exiting the VDAD app, CPD transferring call to $DROPexten"; &agi_output;}
print "SET CONTEXT $ext_context\n";
$result = <STDIN>;
checkresult($result);
print "SET EXTENSION $DROPexten\n";
$result = <STDIN>;
checkresult($result);
print "SET PRIORITY 1\n";
$result = <STDIN>;
checkresult($result);
exit;
}
else
{
### insert a NEW record to the vicidial_manager table to be processed
$stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01053'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDCL call_hungup CPD timout: |$CIDlead_id|$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;}
$AGI->hangup();
exit;
}
}
# subroutine to parse the asterisk version
# and return a hash with the various part
sub parse_asterisk_version
{
# grab the arguments
my $ast_ver_str = $_[0];
# get everything after the - and put it in $ast_ver_postfix
my @hyphen_parts = split( /-/ , $ast_ver_str );
my $ast_ver_postfix = $hyphen_parts[1];
# now split everything before the - up by the .
my @dot_parts = split( /\./ , $hyphen_parts[0] );
my %ast_ver_hash;
if ( $dot_parts[0] <= 1 )
{
%ast_ver_hash = (
"major" => $dot_parts[0],
"minor" => $dot_parts[1],
"build" => $dot_parts[2],
"revision" => $dot_parts[3],
"postfix" => $ast_ver_postfix
);
}
# digium dropped the 1 from asterisk 10 but we still need it
if ( $dot_parts[0] > 1 )
{
%ast_ver_hash = (
"major" => 1,
"minor" => $dot_parts[0],
"build" => $dot_parts[1],
"revision" => $dot_parts[2],
"postfix" => $ast_ver_postfix
);
}
return ( %ast_ver_hash );
}
##### TTS test variables for single digits, convert to text if true #####
sub tts_num_var_test
{
$_ = $_[0];
$var_test = $_;
if ( (length($var_test) > 0) && (length($var_test) < 2) )
{
$var_test =~ s/0/zero /gi;
$var_test =~ s/1/one /gi;
$var_test =~ s/2/two /gi;
$var_test =~ s/3/three /gi;
$var_test =~ s/4/four /gi;
$var_test =~ s/5/five /gi;
$var_test =~ s/6/six /gi;
$var_test =~ s/7/seven /gi;
$var_test =~ s/8/eight /gi;
$var_test =~ s/9/nine /gi;
}
return $var_test;
}
sub get_date_time
{
# get date/time, for recording filenames
($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";
}
sub trigger_transfer_process
{
# $DS='--';
# $BEGIN='BEGIN';
#
# $CLI = "/usr/bin/date >> $PRSTESTfile &";
# $CLI = "/root/phone.pl $CIDlead_id$DS$uniqueid$DS$CLInow_date$DS$VDADuser$DS$phone_number$DS$DS$BEGIN$DS >> $PRSTESTfile &";
#
# `$CLI`;
#
# if ($AGILOG >=2)
# {
# ### open the log file for writing ###
# open(Pout, ">>$PRSLOGfile")
# || die "Can't open $AGILOGfile: $!\n";
# print Pout "$now_date|$VDADconf_exten|$VDADuser|$VDADextension|$CIDlead_id|$phone_number|$uniqueid|$channel_group|$drop_timer|$CLI|\n";
# close(Pout);
# }
}
# function to validate whether a CID Name is a Vicidial Call ID that we care about
sub validate_cid_name
{
my ($cid_name) = @_;
# check if it is a valid CID Name
if (
( $cid_name =~ /DC\d\d\d\d\d\dW\d\d\d\d\d\d\d\d\d\dW/ ) || # 3way transfers
( $cid_name =~ /M\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d/) || # Manual Dials
( $cid_name =~ /V\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d/) || # Auto Dials
( $cid_name =~ /Y\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d/) # Inbound Calls
)
{
return 1; # if so return 1 for true
}
else
{
return 0; # if not return 0 for false
}
}
### code for processing KHOMP analytics
sub process_khomp_analytics
{
(
$khomp_api_url,
$khomp_api_proxied,
$khomp_api_login_url,
$khomp_api_user,
$khomp_api_pass,
$khomp_api_check_ssl,
$khomp_header,
$khomp_id_format,
$khomp_settings_container,
$external_server_ip,
$campaign_id,
$callerid,
$cpd_amd_action,
$cpd_unknown_action,
$CIDlead_id
) = @_;
### Extra SIP Headers begin with an X
$khomp_header = "X-" . $khomp_header;
# determin khomp id format to use
if ($khomp_id_format eq 'CALLERCODE')
{ $khomp_id = $callerid; }
elsif ($khomp_id_format eq 'CALLERCODE_EXTERNIP')
{ $khomp_id = $callerid . '_' . $external_server_ip; }
elsif ($khomp_id_format eq 'CALLERCODE_CAMP_EXTERNIP')
{ $khomp_id = $callerid . '_' . $campaign_id . '_' . $external_server_ip; }
my $api_auth_time = 0;
if ( ($khomp_api_token_expire < time() ) or ( $khomp_api_token eq 'TOKENTOKENTOKEN' ))
{
if ($AGILOG) {$agi_string = "-- KHOMP API Token $khomp_api_token has expired at $khomp_api_token_expire"; &agi_output;}
# get a new API token
my $new_khomp_api_token = '';
if ( $khomp_api_proxied eq 'false' )
{
($new_khomp_api_token, $api_auth_time) = khomp_api_login( $khomp_api_login_url, $khomp_api_user, $khomp_api_pass, $khomp_api_check_ssl );
}
if ( $new_khomp_api_token ne '0' )
{
# update the settings container
my $old_token_string = "khomp_api_token => $khomp_api_token";
my $new_token_string = "khomp_api_token => $new_khomp_api_token";
my $new_token_expire_time = time() + 3600;
my $old_token_expire_string = "khomp_api_token_expire => $khomp_api_token_expire";
my $new_token_expire_string = "khomp_api_token_expire => $new_token_expire_time";
# LOCK vicidial_settings_containers
$stmtA = "LOCK TABLES vicidial_settings_containers WRITE";
$dbhA->do($stmtA);
# UPDATE the Token
$stmtToken = "UPDATE vicidial_settings_containers SET container_entry = REGEXP_REPLACE(container_entry, '$old_token_string', '$new_token_string') WHERE container_id = '$khomp_settings_container';";
$affected_rows = $dbhA->do($stmtToken);
# UPDATE the Expire time
$stmtExpire = "UPDATE vicidial_settings_containers SET container_entry = REGEXP_REPLACE(container_entry, '$old_token_expire_string', '$new_token_expire_string') WHERE container_id = '$khomp_settings_container';";
$affected_rows = $dbhA->do($stmtExpire);
# Unlock vicidial_settings_containers
$stmtA = "UNLOCK TABLES";
$dbhA->do($stmtA);
if ($AGILOG) {$agi_string = "-- KHOMP SC TOKEN UPDATE|$affected_rows|$stmtToken|"; &agi_output;}
if ($AGILOG) {$agi_string = "-- KHOMP SC TOKEN EXPIRE UPDATE|$affected_rows|$stmtExpire|"; &agi_output;}
# over write the old with the new
$khomp_api_token = $new_khomp_api_token;
}
}
else
{
if ($AGILOG) {$agi_string = "-- KHOMP API Token $khomp_api_token still valid till $khomp_api_token_expire"; &agi_output;}
}
if ( $khomp_api_token ne 'TOKENTOKENTOKEN' )
{
# build JSON object
my $khomp_request = {
'id' => 0,
'method' => 'CallList',
'params' => {
'token' => "$khomp_api_token",
'query' => {
'type' => "eq",
'field' => "sip_header:$khomp_header",
'values' => ["$khomp_id"],
},
'selected_fields' => ["sip_header:call-id", "start_stamp", "audio_stamp", "answer_stamp", "end_stamp", "analyzer_stamp", "analyzer_conclusion", "analyzer_pattern", "analyzer_action", "hangup_origin", "hangup_cause", "hangup_cause_sent"]
},
'jsonrpc' => '2.0',
};
# encode it as JSON
#UC# $khomp_json = encode_json( $khomp_request );
# call the API
($result, $api_query_time) = khomp_json_api( $khomp_json, $khomp_api_url, $khomp_api_check_ssl );
# check the result
if ( $result =~ /^ERROR/ )
{
# we got an error so log it
if ($AGILOG) { $agi_string = "--KHOMP: $result"; &agi_output; }
}
else
{
# we got a result
if ( defined $result->{'result'}->{'calls'}[0]->{'fields'} )
{
my $khomp_call_data = $result->{'result'}->{'calls'}[0]->{'fields'};
%parsed_data = khomp_parse_call_data( $khomp_header, $khomp_id, $callerid, $CIDlead_id, $khomp_id_format, $khomp_call_data );
$parsed_data{'api_auth_time'} = $api_auth_time;
$parsed_data{'api_query_time'} = $api_query_time;
$conclusion = $parsed_data{'conclusion'};
$pattern = $parsed_data{'pattern'};
#$agi_string = Dumper( \%conclusion_map );
#&agi_output;
my $action = '';
my $status = '';
if ( defined ( $conclusion_map{"$conclusion"}{"$pattern"}{'action'} ) )
{
$action = $conclusion_map{"$conclusion"}{"$pattern"}{'action'};
$status = $conclusion_map{"$conclusion"}{"$pattern"}{'status'};
}
elsif ( defined( $conclusion_map{"$conclusion"}{''}{'action'} ) )
{
$action = $conclusion_map{"$conclusion"}{''}{'action'};
$status = $conclusion_map{"$conclusion"}{''}{'status'};
}
else
{
$action = 'route';
$status = 'KPEROR';
}
if ($AGILOG) { $agi_string = "--KHOMP: conclusion = $conclusion|pattern = $pattern|action = $action|status = $status"; &agi_output; }
if ( $action ne '' ) { $parsed_data{'vici_action'} = "$action"; }
if ( $status ne '' ) { $parsed_data{'vici_status'} = "$status"; }
# log the khomp data in the vicidial_khomp_log
log_khomp_call_data( %parsed_data );
# handle the AMD action
if (
(( $action eq 'amdaction' ) && ($cpd_amd_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/)) ||
(( $action eq 'cpdunknown' ) && ($cpd_unknown_action =~ /DISPO|MESSAGE|CALLMENU|INGROUP/)) ||
( $action eq 'status' )
)
{
khomp_end_call( %parsed_data );
}
if ( $action eq 'route' )
{
if ($AGILOG) { $agi_string = "--KHOMP: Routing Call"; &agi_output; }
}
if ( $action eq '' )
{
if ($AGILOG) { $agi_string = "--KHOMP: No Action Defined. Routing Call"; &agi_output; }
}
}
else
{
if ($AGILOG) { $agi_string = "--KHOMP: No Call Record Found"; &agi_output; }
}
}
}
else
{
if ($AGILOG) { $agi_string = "--KHOMP: Login Failed"; &agi_output; }
}
}
# code to log the khomp data in vicidial_khomp_log
sub log_khomp_call_data
{
%khomp_call_data = @_;
$stmtA = "UPDATE vicidial_khomp_log SET caller_code = '$khomp_call_data{'caller_code'}', lead_id = '$khomp_call_data{'lead_id'}', server_ip = '$VARserver_ip', khomp_header = '$khomp_call_data{'khomp_header'}', khomp_id = '$khomp_call_data{'khomp_id'}', khomp_id_format = '$khomp_call_data{'khomp_id_format'}', route_auth_time = '$khomp_call_data{'api_auth_time'}', route_query_time = '$khomp_call_data{'api_query_time'}'";
if ( defined( $khomp_call_data{'sip_call_id'} ) ) { $stmtA .= ", sip_call_id = '$khomp_call_data{'sip_call_id'}'"; }
if ( defined( $khomp_call_data{'start_epoch'} ) ) { $stmtA .= ", start_date = FROM_UNIXTIME($khomp_call_data{'start_epoch'})"; }
if ( defined( $khomp_call_data{'audio_epoch'} ) ) { $stmtA .= ", audio_date = FROM_UNIXTIME($khomp_call_data{'audio_epoch'})"; }
if ( defined( $khomp_call_data{'answer_epoch'} ) ) { $stmtA .= ", answer_date = FROM_UNIXTIME($khomp_call_data{'answer_epoch'})"; }
if ( defined( $khomp_call_data{'end_epoch'} ) ) { $stmtA .= ", end_date = FROM_UNIXTIME($khomp_call_data{'end_epoch'})"; }
if ( defined( $khomp_call_data{'analyzer_epoch'} ) ) { $stmtA .= ", analyzer_date = FROM_UNIXTIME($khomp_call_data{'analyzer_epoch'})"; }
if ( defined( $khomp_call_data{'conclusion'} ) ) { $stmtA .= ", conclusion = '$khomp_call_data{'conclusion'}'"; }
if ( defined( $khomp_call_data{'pattern'} ) ) { $stmtA .= ", pattern = '$khomp_call_data{'pattern'}'"; }
if ( defined( $khomp_call_data{'action'} ) ) { $stmtA .= ", action = '$khomp_call_data{'action'}'"; }
if ( defined( $khomp_call_data{'hangup_origin'} ) ) { $stmtA .= ", hangup_origin = '$khomp_call_data{'hangup_origin'}'"; }
if ( defined( $khomp_call_data{'hangup_cause_recv'} ) ) { $stmtA .= ", hangup_cause_recv = '$khomp_call_data{'hangup_cause_recv'}'"; }
if ( defined( $khomp_call_data{'hangup_cause_sent'} ) ) { $stmtA .= ", hangup_cause_sent = '$khomp_call_data{'hangup_cause_sent'}'"; }
if ( defined( $khomp_call_data{'vici_action'} ) ) { $stmtA .= ", vici_action = '$khomp_call_data{'vici_action'}'"; }
if ( defined( $khomp_call_data{'vici_status'} ) ) { $stmtA .= ", vici_status = '$khomp_call_data{'vici_status'}'"; }
$stmtA .= " WHERE khomp_id = '$khomp_call_data{'khomp_id'}'";
$affected_rows = $dbhA->do($stmtA);
if ($AGILOG) {$agi_string = "-- KHOMP Log Update: |$stmtA|$affected_rows|"; &agi_output;}
}
sub khomp_end_call
{
%khomp_call_data = @_;
$vdad_action = $khomp_call_data{'vici_action'};
$vdad_result = $khomp_call_data{'vici_status'};
if ($AGILOG) {$agi_string = "-- VDAD KHOMP End Call |a:$vdad_action|s:$vdad_result|"; &agi_output;}
my $conclusion = $khomp_call_data{'conclusion'};
my $pattern = $khomp_call_data{'pattern'};
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = ($year + 1900);
$mon++;
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
if ($hour < 10) {$hour = "0$hour";}
if ($min < 10) {$min = "0$min";}
if ($sec < 10) {$sec = "0$sec";}
$now_date_epoch = time();
$now_date = "$year-$mon-$mday $hour:$min:$sec";
$CIDdate = "$mon$mday$hour$min$sec";
$tsSQLdate = "$year$mon$mday$hour$min$sec";
$SQLdate = "$year-$mon-$mday $hour:$min:$sec";
if ($enable_queuemetrics_logging > 0)
{
$dbhB = DBI->connect("DBI:mysql:$queuemetrics_dbname:$queuemetrics_server_ip:3306", "$queuemetrics_login", "$queuemetrics_pass")
or die "Couldn't connect to database: " . DBI->errstr;
if ($DBX) {print "CONNECTED TO DATABASE: $queuemetrics_server_ip|$queuemetrics_dbname\n";}
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='EXITWITHTIMEOUT',data1='1',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01048'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$stmtB = "INSERT INTO queue_log SET `partition`='P01',time_id='$now_date_epoch',call_id='$callerid',queue='$VDADcampaign',agent='NONE',verb='CALLSTATUS',data1='$vdad_result',serverid='$queuemetrics_log_id';";
$Baffected_rows = $dbhB->do($stmtB);
$dbhP=$dbhB; $stmtA=$stmtB; $mysql_count='01049'; $MEL_aff_rows=$Baffected_rows; &mysql_error_logging;
$dbhB->disconnect();
}
if ($drop_seconds < 1)
{
$drop_seconds = $DROP_TIME;
}
if (
( ($cpd_amd_action =~ /MESSAGE|CALLMENU|INGROUP/) && ($vdad_action eq 'amdaction') ) ||
( ($cpd_unknown_action =~ /MESSAGE|CALLMENU|INGROUP/) && ($vdad_action eq 'cpdunknown' ) )
)
{
$DROPexten = "8320";
$AMDSTATUS_set = $AGI->set_variable('AMDSTATUS', "CPDMACHINE");
$AMDCAUSE_set = $AGI->set_variable('AMDCAUSE', "$conclusion-$pattern");
}
else
{
$stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' order by call_time desc limit 1;";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01052'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD KHOMP vac record deleted: |$affected_rows|$VDADcampaign|$callerid|"; &agi_output;}
}
$Euniqueid=$uniqueid;
$Euniqueid =~ s/\.\d+//gi;
$stmtA = "UPDATE vicidial_log FORCE INDEX(lead_id) set status='$vdad_result',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds',term_reason='AGENT' where lead_id = '$CIDlead_id' and uniqueid LIKE \"$Euniqueid%\";";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01050'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD KHOMP vicidial_log update: |$affected_rows|$uniqueid"; &agi_output;}
$stmtA = "UPDATE vicidial_list set status='$vdad_result' where lead_id = '$CIDlead_id';";
if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;}
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01051'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD KHOMP vicidial_list update: |$affected_rows|$CIDlead_id"; &agi_output;}
### use STDOUT to send call to proper DROP location
$VHqueryCID = "VH$CIDdate$VDADconf_exten";
if (length($DROPexten)>0)
{ ### if DROP extension is defined then send the dropped call there instead of hangup
$AGI->stream_file('sip-silence');
$AGI->stream_file('sip-silence');
$AGI->stream_file('sip-silence');
if ($AGILOG) {$agi_string = "exiting the VDAD app, KHOMP transferring call to $DROPexten"; &agi_output;}
print "SET CONTEXT $ext_context\n";
$result = <STDIN>;
checkresult($result);
print "SET EXTENSION $DROPexten\n";
$result = <STDIN>;
checkresult($result);
print "SET PRIORITY 1\n";
$result = <STDIN>;
checkresult($result);
exit;
}
else
{
### insert a NEW record to the vicidial_manager table to be processed
$stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')";
$affected_rows = $dbhA->do($stmtA);
$dbhP=$dbhA; $mysql_count='01053'; $MEL_aff_rows=$affected_rows; &mysql_error_logging;
if ($AGILOG) {$agi_string = "-- VDAD call_hungup KHOMP timout: |$CIDlead_id|$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;}
$AGI->hangup();
exit;
}
}
### code for parsing the call data into a useful data structure
sub khomp_parse_call_data
{
( $khomp_header, $khomp_id, $callerid, $lead_id, $khomp_id_format, $khomp_call_data ) = @_;
my %new_khomp_call_data;
#KHOMP Field Names - Meaning:
# sip_header:call-id - leg A - SIP Call-ID
# start_stamp - unix timestamp of the call start (first INVITE)
# audio_stamp - unix timestamp of the audio start (183)
# answer_stamp - unix timestamp of the call answer (200 OK)
# end_stamp - unix timestamp of call end
# analyzer_stamp - unix timestamp of Analytics conclusion
# analyzer_conclusion - the Analytics conclusion
# analyzer_pattern - The specific pattern that was detected (if any)
# analyzer_action - the action taken for the analytics conclusion
# hangup_origin - which leg hangup the call: leg a or leg b
# hangup_cause - hangup cause received
# hangup_cause_sent - the cause code that was sent
#
$new_khomp_call_data{'caller_code'} = $callerid;
$new_khomp_call_data{'lead_id'} = $lead_id;
$new_khomp_call_data{'khomp_header'} = $khomp_header;
$new_khomp_call_data{'khomp_id'} = $khomp_id;
$new_khomp_call_data{'khomp_id_format'} = $khomp_id_format;
$new_khomp_call_data{'sip_call_id'} = $khomp_call_data->{'sip_header:call-id'};
$new_khomp_call_data{'start_epoch'} = $khomp_call_data->{'start_stamp'};
$new_khomp_call_data{'audio_epoch'} = $khomp_call_data->{'audio_stamp'};
$new_khomp_call_data{'answer_epoch'} = $khomp_call_data->{'answer_stamp'};
$new_khomp_call_data{'end_epoch'} = $khomp_call_data->{'end_stamp'};
$new_khomp_call_data{'analyzer_epoch'} = $khomp_call_data->{'analyzer_stamp'};
$new_khomp_call_data{'conclusion'} = $khomp_call_data->{'analyzer_conclusion'};
$new_khomp_call_data{'pattern'} = $khomp_call_data->{'analyzer_pattern'};
$new_khomp_call_data{'action'} = $khomp_call_data->{'analyzer_action'};
$new_khomp_call_data{'hangup_origin'} = $khomp_call_data->{'hangup_origin'};
$new_khomp_call_data{'hangup_cause_recv'} = $khomp_call_data->{'hangup_cause'};
$new_khomp_call_data{'hangup_cause_sent'} = $khomp_call_data->{'hangup_cause_sent'};
# handle blank times
if ($new_khomp_call_data{'start_epoch'} eq '') { $new_khomp_call_data{'start_epoch'} = 0; }
if ($new_khomp_call_data{'audio_epoch'} eq '') { $new_khomp_call_data{'audio_epoch'} = 0; }
if ($new_khomp_call_data{'answer_epoch'} eq '') { $new_khomp_call_data{'answer_epoch'} = 0; }
if ($new_khomp_call_data{'end_epoch'} eq '') { $new_khomp_call_data{'end_epoch'} = 0; }
if ($new_khomp_call_data{'analyzer_epoch'} eq '') { $new_khomp_call_data{'analyzer_epoch'} = 0; }
# time is returned in milliseconds since 1970 we need seconds
if ($new_khomp_call_data{'start_epoch'} > 0) { $new_khomp_call_data{'start_epoch'} = $new_khomp_call_data{'start_epoch'} / 1000; }
if ($new_khomp_call_data{'audio_epoch'} > 0) { $new_khomp_call_data{'audio_epoch'} = $new_khomp_call_data{'audio_epoch'} / 1000; }
if ($new_khomp_call_data{'answer_epoch'} > 0) { $new_khomp_call_data{'answer_epoch'} = $new_khomp_call_data{'answer_epoch'} / 1000; }
if ($new_khomp_call_data{'end_epoch'} > 0) { $new_khomp_call_data{'end_epoch'} = $new_khomp_call_data{'end_epoch'} / 1000; }
if ($new_khomp_call_data{'analyzer_epoch'} > 0) { $new_khomp_call_data{'analyzer_epoch'} = $new_khomp_call_data{'analyzer_epoch'} / 1000; }
return %new_khomp_call_data;
}
### code for logging into KHOMP api
sub khomp_api_login
{
(
$khomp_api_login_url,
$khomp_api_user,
$khomp_api_pass,
$khomp_api_check_ssl
) = @_;
my $token = 'login';
my $auth_start_sec;
my $auth_start_usec;
my $auth_end_sec;
my $auth_end_usec;
my $auth_sec;
my $auth_usec;
my $api_auth_time;
($auth_start_sec, $auth_start_usec) = gettimeofday();
# build JSON object
my $login_json = {
'id' => 0,
'method' => 'SessionLogin',
'params' => {
'username' => "$khomp_api_user",
'password' => "$khomp_api_pass",
},
'jsonrpc' => '2.0',
};
# encode it as JSON
#UC# $login_json = encode_json( $login_json );
my $curl_cmd = "";
if ($khomp_api_check_ssl == 0)
{
$agi_string = "-- KHOMP SSL VERIFICATION DISABLE!"; &agi_output;
$curl_cmd = "$curlbin --insecure -sS --data \'$login_json\' $khomp_api_login_url";
}
else
{
$curl_cmd = "$curlbin -sS --data \'$login_json\' $khomp_api_login_url";
}
$agi_string = "-- KHOMP CURL COMMAND: $curl_cmd"; &agi_output;
$message = `$curl_cmd`;
chomp($message);
if ($AGILOG)
{
$agi_string = "-- KHOMP LOGIN URL: |$khomp_api_login_url|"; &agi_output;
$agi_string = "-- KHOMP LOGIN JSON : |$login_json|"; &agi_output;
$agi_string = "-- KHOMP LOGIN RESPONSE JSON: |$message|"; &agi_output;
}
#UC# $json = JSON::PP->new->ascii->pretty->allow_nonref;
#UC# $result = $json->decode($message);
$token = $result->{'result'}->{'token'};
if ( $token eq '' ) { $token = '0'; }
($auth_end_sec, $auth_end_usec) = gettimeofday();
$api_auth_time = tv_interval ( [$auth_start_sec, $auth_start_usec], [$auth_end_sec, $auth_end_usec]);
return ($token, $api_auth_time);
}
### code for connecting to KHOMP api and passing JSON
sub khomp_json_api
{
( $khomp_json, $khomp_api_url, $khomp_api_check_ssl ) = @_;
my $query_start_sec;
my $query_start_usec;
my $query_end_sec;
my $query_end_usec;
my $query_sec;
my $query_usec;
my $api_query_time;
($query_start_sec, $query_start_usec) = gettimeofday();
my $curl_cmd = "";
if ($khomp_api_check_ssl == 0)
{
$agi_string = "-- KHOMP SSL VERIFICATION DISABLE!"; &agi_output;
$curl_cmd = "$curlbin --insecure -sS --data \'$khomp_json\' $khomp_api_url";
}
else
{
$curl_cmd = "$curlbin -sS --data \'$khomp_json\' $khomp_api_url";
}
$agi_string = "-- KHOMP CURL COMMAND: $curl_cmd"; &agi_output;
$message = `$curl_cmd`;
chomp($message);
if ($AGILOG)
{
$agi_string = "-- KHOMP URL: |$khomp_api_url|"; &agi_output;
$agi_string = "-- KHOMP JSON : |$khomp_json|"; &agi_output;
$agi_string = "-- KHOMP RESPONSE JSON: |$message|"; &agi_output;
}
$test503 = $message;
$test503 =~ s/\n|\r|\t//gi;
if ($test503 =~ /503 Service Not Available/)
{
$agi_string = "-- KHOMP API REJECTED OUR REQUEST!!! forcing fake timeout response"; &agi_output;
$message = '{"id":0,"jsonrpc":"2.0","result":{"calls":[{"disconnected":false,"fields":{"analyzer_action":"Connect","analyzer_conclusion":"Khomp Reject","analyzer_pattern":"","analyzer_stamp":"9999999999","answer_stamp":"9999999999","audio_stamp":"9999999999","end_stamp":"","hangup_cause":"","hangup_cause_sent":"","hangup_origin":"","sip_header:call-id":"","start_stamp":"1788358771462"}}]}}';
}
#UC# $json = JSON::PP->new->ascii->pretty->allow_nonref;
#UC# $result = $json->decode($message);
($query_end_sec, $query_end_usec) = gettimeofday();
$api_query_time = tv_interval ( [$query_start_sec, $query_start_usec], [$query_end_sec, $query_end_usec]);
return ($result, $api_query_time);
}