Added cm_phonesearch.agi script for phone number searching and redirection from a Call Menu
git-svn-id: svn://192.168.202.10@2657 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
@@ -66,6 +66,11 @@ OTHER CHANGES:
|
||||
|
||||
4. Added the ability for internal chats to have more than one agent participant
|
||||
|
||||
5. Added cm_phonesearch.agi script that can search for a phone number within the
|
||||
system and redirect a call to an in-group that is defined as the Default
|
||||
Transfer Group in a campaign that the lead belongs to. This must be
|
||||
configured in a Call Menu
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,399 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# cm_phonesearch.agi version 2.14
|
||||
#
|
||||
# Designed to work with Call Menus to allow searching of the caller ID phone
|
||||
# number the customer called in with against the vicidial_list table, and
|
||||
# finding the list of the most recent match, the campaign tied to that list and
|
||||
# the default transfer in-group of that campaign, then transferring the call to
|
||||
# that in-group
|
||||
#
|
||||
# If phone number is not found, call will go to the 'D' option in the call menu
|
||||
# If default in-group is not found, call will go to the 'C' option in the call menu
|
||||
# If default in-group is found, call will go to the 'B' option in the call menu
|
||||
#
|
||||
# Flag Options:
|
||||
# 1- Country code to search the areacode within, default 1
|
||||
# 2- Match lead order, default: "entry_newest"
|
||||
# entry_newest, entry_oldest, modify_newest, modify_oldest, call_newest, call_oldest, rank_highest, rank_lowest
|
||||
# example of what to set in the Call Menu:
|
||||
# Set the prompt to "sip-silence"
|
||||
# Set the Timeout to 1 second
|
||||
# Option: "Timeout" Route: "AGI" AGI: "cm_phonesearch.agi,1---entry_newest"
|
||||
# OR JUST
|
||||
# Set the prompt to "sip-silence|cm_phonesearch.agi,1---entry_oldest"
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2017 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
|
||||
#
|
||||
# changes:
|
||||
# 170113-0817 - First build
|
||||
#
|
||||
|
||||
$script = 'cm_phonesearch.agi';
|
||||
|
||||
($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";
|
||||
$start_time=$now_date;
|
||||
$CIDdate = "$mon$mday$hour$min$sec";
|
||||
$tsSQLdate = "$year$mon$mday$hour$min$sec";
|
||||
$SQLdate = "$year-$mon-$mday $hour:$min:$sec";
|
||||
$SQLdateBEGIN = $SQLdate;
|
||||
$state='';
|
||||
$CIDlead_id='';
|
||||
while (length($CIDdate) > 9) {$CIDdate =~ s/^.//gi;} # 0902235959 changed to 902235959
|
||||
|
||||
# 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";}
|
||||
|
||||
use DBI;
|
||||
use Asterisk::AGI;
|
||||
$AGI = new Asterisk::AGI;
|
||||
|
||||
$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass")
|
||||
or die "Couldn't connect to database: " . DBI->errstr;
|
||||
|
||||
### Grab Server values from the database
|
||||
$stmtA = "SELECT agi_output 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;
|
||||
$rec_count=0;
|
||||
while ($sthArows > $rec_count)
|
||||
{
|
||||
$AGILOG = '0';
|
||||
@aryA = $sthA->fetchrow_array;
|
||||
$DBagi_output = $aryA[0];
|
||||
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]);
|
||||
|
||||
$country_code = $ARGV_vars[0];
|
||||
$age = $ARGV_vars[1];
|
||||
}
|
||||
|
||||
if (length($country_code) < 1)
|
||||
{$country_code = '1';}
|
||||
if (length($age) < 1)
|
||||
{$age = 'entry_newest';}
|
||||
|
||||
|
||||
$|=1;
|
||||
while(<STDIN>)
|
||||
{
|
||||
chomp;
|
||||
last unless length($_);
|
||||
if ($AGILOG)
|
||||
{
|
||||
if (/^agi_(\w+)\:\s+(.*)$/)
|
||||
{
|
||||
$AGI{$1} = $2;
|
||||
}
|
||||
}
|
||||
|
||||
if (/^agi_context\:\s+(.*)$/) {$context = $1;}
|
||||
if (/^agi_uniqueid\:\s+(.*)$/) {$unique_id = $1; $uniqueid = $unique_id;}
|
||||
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;}
|
||||
}
|
||||
foreach $i (sort keys %AGI)
|
||||
{
|
||||
if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;}
|
||||
}
|
||||
|
||||
$callerid =~ s/\'|\\\\|\\\|\\|\\;|\\\;|\;|;//gi;
|
||||
$calleridname =~ s/\'|\\\\|\\\|\\|\\;|\\\;|\;|;//gi;
|
||||
$extension =~ s/\'|\"|\\\\|\\\|\\|\\;|\\\;|\;|;//gi;
|
||||
|
||||
if ($calleridname =~ /^V\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d|^Y\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d|^M\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d/)
|
||||
{
|
||||
$callerid = $calleridname;
|
||||
$callerid =~ s/\"//gi;
|
||||
$callerid =~ s/ .*//gi;
|
||||
$CIDlead_id = $callerid;
|
||||
$CIDlead_id = substr($CIDlead_id, 10, 10);
|
||||
$CIDlead_id = ($CIDlead_id + 0);
|
||||
|
||||
### gather state and phone_number from lead record ###
|
||||
$stmtA= "SELECT state,phone_number 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;
|
||||
if ($AGILOG) {$agi_string = "$sthArows|$stmtA|"; &agi_output;}
|
||||
if ($sthArows > 0)
|
||||
{
|
||||
@aryA = $sthA->fetchrow_array;
|
||||
$state = $aryA[0];
|
||||
$phone_number = $aryA[1];
|
||||
}
|
||||
$sthA->finish();
|
||||
}
|
||||
|
||||
if ( ($callerid =~ /\".*\"/) && ( (!$calleridname) or ($calleridname =~ /unknown/) ) )
|
||||
{
|
||||
$calleridname = $callerid;
|
||||
$calleridname =~ s/\<\d\d\d\d\d\d\d\d\d\d\>//gi;
|
||||
$calleridname =~ s/\"|\" //gi;
|
||||
}
|
||||
|
||||
if ($callerid !~ /^V\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d|^Y\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d|^M\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d/)
|
||||
{
|
||||
$callerid =~ s/\D|\'//gi;
|
||||
$calleridname =~ s/unknown|\'//gi;
|
||||
if ( (!$callerid) or ($callerid =~ /unknown/) )
|
||||
{$callerid = $calleridname;}
|
||||
if (length($callerid)>0) {$phone_number = $callerid;}
|
||||
else {$phone_number = '';}
|
||||
if (length($calleridname)>0) {$VLcomments = $calleridname;}
|
||||
else {$VLcomments = '';}
|
||||
if (length($callerid)<10) {$callerid = $parked_by;}
|
||||
if (length($pin)>0) {$callerid = $pin;}
|
||||
}
|
||||
|
||||
if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid| |$country_code|$phone_number|$age|"; &agi_output;}
|
||||
|
||||
$AGI->stream_file('sip-silence');
|
||||
$AGI->stream_file('sip-silence');
|
||||
$AGI->stream_file('sip-silence');
|
||||
|
||||
|
||||
$g=0;
|
||||
$list_id='';
|
||||
$lead_id='';
|
||||
### only perform search if minimum digits entered is valid and state is not already set ###
|
||||
if (length($phone_number) >= 6)
|
||||
{
|
||||
$ageSQL = 'order by entry_date desc';
|
||||
if ($age =~ /entry_oldest/) {$ageSQL = 'order by entry_date asc';}
|
||||
if ($age =~ /modify_newest/) {$ageSQL = 'order by modify_date desc';}
|
||||
if ($age =~ /modify_oldest/) {$ageSQL = 'order by modify_date asc';}
|
||||
if ($age =~ /call_newest/) {$ageSQL = 'order by last_local_call_time desc';}
|
||||
if ($age =~ /call_oldest/) {$ageSQL = 'order by last_local_call_time asc';}
|
||||
if ($age =~ /rank_highest/) {$ageSQL = 'order by rank desc';}
|
||||
if ($age =~ /rank_lowest/) {$ageSQL = 'order by rank asc';}
|
||||
|
||||
### search for state using areacode of caller id number ###
|
||||
$stmtA= "SELECT list_id,lead_id from vicidial_list where phone_code='$country_code' and phone_number='$phone_number' $ageSQL;";
|
||||
$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;
|
||||
$list_id = $aryA[0];
|
||||
$lead_id = $aryA[1];
|
||||
$g++;
|
||||
}
|
||||
$sthA->finish();
|
||||
if ($AGILOG) {$agi_string = "$sthArows($lead_id|$list_id)|$stmtA|"; &agi_output;}
|
||||
}
|
||||
|
||||
# Lead not found, send call to 'D' option in call menu
|
||||
if ($g < 1)
|
||||
{
|
||||
if ($AGILOG) {$agi_string = "entry not found($phone_number), exiting the cm_phonesearch.agi app, transferring call to D @ $context"; &agi_output;}
|
||||
print "SET CONTEXT $context\n";
|
||||
$result = <STDIN>;
|
||||
checkresult($result);
|
||||
print "SET EXTENSION D\n";
|
||||
$result = <STDIN>;
|
||||
checkresult($result);
|
||||
print "SET PRIORITY 1\n";
|
||||
$result = <STDIN>;
|
||||
checkresult($result);
|
||||
|
||||
exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
$campaign_id='';
|
||||
$default_xfer_group='';
|
||||
### search for campaign using list_id of found lead ###
|
||||
$stmtA= "SELECT campaign_id from vicidial_lists where list_id='$list_id';";
|
||||
$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;
|
||||
$campaign_id = $aryA[0];
|
||||
}
|
||||
$sthA->finish();
|
||||
if ($AGILOG) {$agi_string = "$sthArows($campaign_id)|$stmtA|"; &agi_output;}
|
||||
|
||||
if (length($campaign_id) > 0)
|
||||
{
|
||||
### search for default_xfer_group using campaign_id of found lead ###
|
||||
$stmtA= "SELECT default_xfer_group from vicidial_campaigns where campaign_id='$campaign_id';";
|
||||
$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;
|
||||
$default_xfer_group = $aryA[0];
|
||||
}
|
||||
$sthA->finish();
|
||||
if ($AGILOG) {$agi_string = "$sthArows($default_xfer_group)|$stmtA|"; &agi_output;}
|
||||
}
|
||||
}
|
||||
|
||||
$PADlead_id = sprintf("%010s", $lead_id); while (length($PADlead_id) > 10) {chop($PADlead_id);}
|
||||
$YqueryCID = "Y$CIDdate$PADlead_id";
|
||||
$newcallerid = "\"$YqueryCID <$phone_number>\"";
|
||||
$AGI->set_callerid($newcallerid);
|
||||
print STDERR "cm_phonesearch.agi Setting CID \"$newcallerid\"\n";
|
||||
checkresult($result);
|
||||
if ($AGILOG) {$agi_string = "callerID changed: $newcallerid"; &agi_output;}
|
||||
|
||||
# transfer in-group not found, send call to 'C' option in call menu
|
||||
if ( (length($default_xfer_group) < 1) || ($default_xfer_group =~ /---NONE---/) )
|
||||
{
|
||||
if ($AGILOG) {$agi_string = "in-group not found($phone_number), exiting the cm_phonesearch.agi app, transferring call to C @ $context"; &agi_output;}
|
||||
print "SET CONTEXT $context\n";
|
||||
$result = <STDIN>;
|
||||
checkresult($result);
|
||||
print "SET EXTENSION C\n";
|
||||
$result = <STDIN>;
|
||||
checkresult($result);
|
||||
print "SET PRIORITY 1\n";
|
||||
$result = <STDIN>;
|
||||
checkresult($result);
|
||||
|
||||
exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
$AGI->exec("EXEC Set(_ingroupvar=$default_xfer_group)");
|
||||
|
||||
if ($AGILOG) {$agi_string = "in-group found($phone_number|$default_xfer_group), exiting the cm_phonesearch.agi app, transferring call to B @ $context"; &agi_output;}
|
||||
print "SET CONTEXT $context\n";
|
||||
$result = <STDIN>;
|
||||
checkresult($result);
|
||||
print "SET EXTENSION B\n";
|
||||
$result = <STDIN>;
|
||||
checkresult($result);
|
||||
print "SET PRIORITY 1\n";
|
||||
$result = <STDIN>;
|
||||
checkresult($result);
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
##### SUBROUTINES #####
|
||||
|
||||
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 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++;
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
# - Auto reset lists at defined times
|
||||
# - Auto restarts Asterisk process if enabled in servers settings
|
||||
#
|
||||
# Copyright (C) 2016 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
|
||||
# Copyright (C) 2017 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
|
||||
#
|
||||
# CHANGES
|
||||
# 61011-1348 - First build
|
||||
@@ -113,9 +113,10 @@
|
||||
# 161014-0839 - Added vicidial_user_list_new_lead daily reset
|
||||
# 161116-0658 - Added purge of vicidial_ajax_log records older than 7 days to end of day process
|
||||
# 161226-2218 - Added conf_qualify option
|
||||
# 170113-1645 - Added call menu in-group option DYNAMIC_INGROUP_VAR for use with cm_phonesearch.agi
|
||||
#
|
||||
|
||||
$build = '161226-2218';
|
||||
$build = '170113-1645';
|
||||
|
||||
$DB=0; # Debug flag
|
||||
$teodDB=0; # flag to log Timeclock End of Day processes to log file
|
||||
@@ -2863,7 +2864,14 @@ if ( ($active_asterisk_server =~ /Y/) && ($generate_vicidial_conf =~ /Y/) && ($r
|
||||
|
||||
if ($dtmf_log[$i] > 0)
|
||||
{$call_menu_line .= "exten => $option_value[$j],$PRI,AGI(cm.agi,$tracking_group[$i]-----$option_value[$j]-----$dtmf_field[$i]-----$alt_dtmf_log[$i]-----$question[$i])\n"; $PRI++;}
|
||||
$call_menu_line .= "exten => $option_value[$j],$PRI,AGI(agi-VDAD_ALL_inbound.agi,$IGhandle_method-----$IGsearch_method-----$option_route_value[$j]-----$menu_id[$i]--------------------$IGlist_id-----$IGphone_code-----$IGcampaign_id---------------$IGvid_enter_filename-----$IGvid_id_number_filename-----$IGvid_confirm_filename-----$IGvid_validate_digits)\n"; $PRI++;
|
||||
if ($option_route_value[$j] =~ /DYNAMIC_INGROUP_VAR/)
|
||||
{
|
||||
$call_menu_line .= "exten => $option_value[$j],$PRI,AGI(agi-VDAD_ALL_inbound.agi,$IGhandle_method-----$IGsearch_method-----\$\{ingroupvar\}-----$menu_id[$i]--------------------$IGlist_id-----$IGphone_code-----$IGcampaign_id---------------$IGvid_enter_filename-----$IGvid_id_number_filename-----$IGvid_confirm_filename-----$IGvid_validate_digits)\n"; $PRI++;
|
||||
}
|
||||
else
|
||||
{
|
||||
$call_menu_line .= "exten => $option_value[$j],$PRI,AGI(agi-VDAD_ALL_inbound.agi,$IGhandle_method-----$IGsearch_method-----$option_route_value[$j]-----$menu_id[$i]--------------------$IGlist_id-----$IGphone_code-----$IGcampaign_id---------------$IGvid_enter_filename-----$IGvid_id_number_filename-----$IGvid_confirm_filename-----$IGvid_validate_digits)\n"; $PRI++;
|
||||
}
|
||||
$call_menu_line .= "exten => $option_value[$j],$PRI,Hangup()\n";
|
||||
}
|
||||
if ($option_route[$j] =~ /EXTENSION/)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
CROSS-CLUSTER COMMUNICATION 2011-05-27
|
||||
CROSS-CLUSTER COMMUNICATION Started: 2011-05-27 Updated: 2017-01-01
|
||||
|
||||
|
||||
!!!!! THIS FEATURE DOES NOT EXIST, THIS IS FOR PLANNING PURPOSES ONLY !!!!!
|
||||
@@ -100,3 +100,16 @@ cluster_server_status:
|
||||
|
||||
- IAX/SIP crossover trunks would be added between every server on every active cluster(depending on direction settings)
|
||||
- dialplan context would be added for each foreign cluster to route calls with proper cluster_id flag allowing for lookups of lead information
|
||||
|
||||
|
||||
|
||||
--------------------------------
|
||||
SIMPLER ALTERNATIVE OPTION:
|
||||
--------------------------------
|
||||
Below is a description of a more simple option, which is to send lead data from one cluster to another as the lead is sent over.
|
||||
- A call to be sent from one cluster to another should leave its callerIDname as the Caller Code, the 20-character code that includes the lead_id
|
||||
- This call will go into an internal DID on the other cluster through an IAX trunk between the two
|
||||
- At the DID, the call will get sent to a Call Menu where the call will go through an AGI script
|
||||
- That AGI script will look up the lead_id on the originating system using the Non-Agent API and credentials set in a Settings Container
|
||||
- If there is a match, then the AGI script will gather the default lead information, insert the information into the new system and change the callerIDname with the new system's lead_id included
|
||||
- The call will then go to an In-Group with that lead_id set so it can then go on to an agent
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
LIME SURVEY and ViciDial
|
||||
LIME SURVEY and ViciDial Started: 2009-09-08
|
||||
|
||||
We've been asked about Lime Survey(http://www.limesurvey.org) integration with ViciDial several times so here is a little summary of how you install it as well as how you can get it to work with Vicidial.
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@ PERFORMANCE TESTING OF A VICIDIAL SERVER 2008-03-31
|
||||
|
||||
OVERVIEW:
|
||||
|
||||
This document goes over the setup of a VICIDIAL/Asterisk server that you are testing, and the control Asterisk server that will be taking the calls from the serer being tested.
|
||||
This document goes over the setup of a VICIDIAL/Asterisk server that you are testing, and the control Asterisk server that will be taking the calls from the server being tested.
|
||||
|
||||
It is very difficult to realistically performance test a VICIDIAL server not in production because of the random-ness of call center operations.
|
||||
It is very difficult to realistically performance test a VICIDIAL server not in production because of the randomness of call center operations.
|
||||
|
||||
How this process works is that multiple remote agents are activated and calls are placed from the server being tested to a control server that will take those calls and send various signals and play various audio files so that the randomness of outbound dialing is simulated.
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
# admin.php - VICIDIAL administration page
|
||||
#
|
||||
# Copyright (C) 2016 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
|
||||
# Copyright (C) 2017 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
|
||||
#
|
||||
|
||||
$startMS = microtime();
|
||||
@@ -3908,12 +3908,13 @@ else
|
||||
# 161207-1953 - Added Agent DID Report
|
||||
# 161222-0841 - Added agent_chat_screen_colors
|
||||
# 161226-2224 - Added conf_qualify servers option
|
||||
# 170113-1637 - Added call menu in-group option DYNAMIC_INGROUP_VAR for use with cm_phonesearch.agi, and updated for 2017
|
||||
#
|
||||
|
||||
# make sure you have added a user to the vicidial_users MySQL table with at least user_level 9 to access this page the first time
|
||||
|
||||
$admin_version = '2.14-583a';
|
||||
$build = '161226-2224';
|
||||
$admin_version = '2.14-584a';
|
||||
$build = '170113-1637';
|
||||
|
||||
$STARTtime = date("U");
|
||||
$SQLdate = date("Y-m-d H:i:s");
|
||||
@@ -4380,7 +4381,7 @@ echo "<html>\n";
|
||||
echo "<head>\n";
|
||||
echo "<!-- VERSION: $admin_version BUILD: $build ADD: $ADD PHP_SELF: $PHP_SELF-->\n";
|
||||
echo "<META NAME=\"ROBOTS\" CONTENT=\"NONE\">\n";
|
||||
echo "<META NAME=\"COPYRIGHT\" CONTENT=\"© 2016 ViciDial Group\">\n";
|
||||
echo "<META NAME=\"COPYRIGHT\" CONTENT=\"© 2017 ViciDial Group\">\n";
|
||||
echo "<META NAME=\"AUTHOR\" CONTENT=\"ViciDial Group\">\n";
|
||||
echo "<script language=\"JavaScript\" src=\"calendar_db.js\"></script>\n";
|
||||
echo "<link rel=\"stylesheet\" href=\"calendar.css\">\n";
|
||||
@@ -28661,7 +28662,7 @@ if ($ADD==3511)
|
||||
echo "</span>";
|
||||
echo " <input type=hidden name=option_route_value_context_$j id=option_route_value_context_$j value=\"$option_route_value_context\">";
|
||||
echo " <select size=1 name=option_route_value_$j id=option_route_value_$j onChange=\"call_menu_link('$j','INGROUP');\">";
|
||||
echo "$ingroup_list<option SELECTED>$option_route_value</option></select>";
|
||||
echo "$ingroup_list<option SELECTED>$option_route_value</option><option>DYNAMIC_INGROUP_VAR</option></select>";
|
||||
echo " "._QXZ("Handle Method").": <select size=1 name=IGhandle_method_$j id=IGhandle_method_$j>";
|
||||
echo "$IGhandle_method_list<option SELECTED>$IGhandle_method</option></select> $NWB#call_menu-ingroup_settings$NWE\n";
|
||||
echo "<BR>"._QXZ("Search Method").": <select size=1 name=IGsearch_method_$j id=IGsearch_method_$j>";
|
||||
@@ -37385,7 +37386,7 @@ if ($ADD==999995)
|
||||
echo "<br><B> "._QXZ("Welcome to ViciDial: copyright, trademark and license page")."</B><BR><BR>\n";
|
||||
echo "<center><TABLE width=$section_width cellspacing=5 cellpadding=2>\n";
|
||||
|
||||
echo "<tr bgcolor=#$SSstd_row4_background><td align=right valign=top><B><font size=3>"._QXZ("Copyright").": </B></td><td align=left> "._QXZ("The ViciDial Contact Center Suite is maintained by the")." <a href=\"http://www.vicidial.com/\" target=\"_blank\">ViciDial Group</a>, © 2016</td></tr>\n";
|
||||
echo "<tr bgcolor=#$SSstd_row4_background><td align=right valign=top><B><font size=3>"._QXZ("Copyright").": </B></td><td align=left> "._QXZ("The ViciDial Contact Center Suite is maintained by the")." <a href=\"http://www.vicidial.com/\" target=\"_blank\">ViciDial Group</a>, © 2017</td></tr>\n";
|
||||
|
||||
echo "<tr bgcolor=#$SSstd_row4_background><td align=right valign=top><B><font size=3>"._QXZ("Trademark").": </B></td><td align=left> \"VICIDIAL\" "._QXZ("is a registered trademark of the")." <a href=\"http://www.vicidial.com/\" target=\"_blank\">ViciDial Group</a>. Here is our <a href=\"http://www.vicidial.com/?page_id=262\" target=\"_blank\">"._QXZ("trademark use policy")."</a></td></tr>\n";
|
||||
|
||||
@@ -38192,7 +38193,7 @@ echo "<FONT STYLE=\"font-family:HELVETICA;font-size:9;color:white;\"><br><br><!-
|
||||
echo _QXZ("VERSION").": $admin_version<BR>";
|
||||
echo _QXZ("BUILD").": $build\n";
|
||||
if (!preg_match("/_BUILD_/",$SShosted_settings))
|
||||
{echo "<BR><a href=\"$PHP_SELF?ADD=999995\"><font color=white>© 2016 ViciDial Group</font></a><BR><img src=\"images/pixel.gif\">";}
|
||||
{echo "<BR><a href=\"$PHP_SELF?ADD=999995\"><font color=white>© 2017 ViciDial Group</font></a><BR><img src=\"images/pixel.gif\">";}
|
||||
echo "</FONT>\n";
|
||||
?>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
# admin_header.php - VICIDIAL administration header
|
||||
#
|
||||
# Copyright (C) 2016 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
|
||||
# Copyright (C) 2017 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
|
||||
#
|
||||
|
||||
# CHANGES
|
||||
@@ -68,9 +68,9 @@
|
||||
# 160617-1426 - Added link from screen colors to system settings screen color settings
|
||||
# 161101-2129 - Added user_new_lead_limit Users subhead
|
||||
# 161103-2136 - Added agent_soundboards option
|
||||
# 170113-1633 - Added dynamic call menu in-group option DYNAMIC_INGROUP_VAR for use with cm_phonesearch.agi
|
||||
#
|
||||
|
||||
|
||||
$stmt="SELECT admin_home_url,enable_tts_integration,callcard_enabled,custom_fields_enabled,allow_emails,level_8_disable_add,allow_chats,enable_languages,admin_row_click,admin_screen_colors,user_new_lead_limit,user_territories_active,qc_features_active,agent_soundboards from system_settings;";
|
||||
$rslt=mysql_to_mysqli($stmt, $link);
|
||||
$row=mysqli_fetch_row($rslt);
|
||||
@@ -980,7 +980,7 @@ if ( ($ADD==3511) or ($ADD==2511) or ($ADD==2611) or ($ADD==4511) or ($ADD==5511
|
||||
new_content = new_content + '<span name=option_route_link_' + option + 'id=option_route_link_' + option + '>';
|
||||
new_content = new_content + "<a href=\"admin.php?ADD=3111&group_id=" + value + "\"><?php echo _QXZ("In-Group"); ?>:</a> </span>";
|
||||
new_content = new_content + '<select size=1 name=option_route_value_' + option + ' id=option_route_value_' + option + ' onChange="call_menu_link("' + option + '","INGROUP");">';
|
||||
new_content = new_content + '' + ingroup_list + "\n" + selected_value + '</select>';
|
||||
new_content = new_content + '' + ingroup_list + "\n" + selected_value + '<option>DYNAMIC_INGROUP_VAR</option></select>';
|
||||
new_content = new_content + " <?php echo _QXZ("Handle Method"); ?>: <select size=1 name=IGhandle_method_" + option + ' id=IGhandle_method_' + option + '>';
|
||||
new_content = new_content + '' + IGhandle_method_list + "\n" + '<option SELECTED>' + IGhandle_method + '</select>';
|
||||
new_content = new_content + ' <a href="javascript:openNewWindow(\'admin.php?ADD=99999#vicidial_call_menu-ingroup_settings\')"><IMG SRC="help.gif" WIDTH=20 HEIGHT=20 BORDER=0 ALT="HELP" ALIGN=TOP></a>';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
# help.php - VICIDIAL administration page
|
||||
#
|
||||
# Copyright (C) 2016 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
|
||||
# Copyright (C) 2017 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
|
||||
#
|
||||
|
||||
# CHANGELOG:
|
||||
@@ -105,6 +105,7 @@
|
||||
# 161207-1958 - Added Agent DID Stats report entry
|
||||
# 161222-0843 - Added agent_chat_screen_colors entry
|
||||
# 161226-2214 - Added conf_qualify entry
|
||||
# 170113-1647 - Added call menu in-group option DYNAMIC_INGROUP_VAR for use with cm_phonesearch.agi
|
||||
#
|
||||
|
||||
|
||||
@@ -3184,7 +3185,7 @@ if ($SSqc_features_active > 0)
|
||||
<BR>
|
||||
<A NAME="call_menu-ingroup_settings">
|
||||
<BR>
|
||||
<B><?php echo _QXZ("Call Menu In-Group Settings"); ?> -</B><?php echo _QXZ("If the route is set to INGROUP then there are many options that you can set to define how the call is sent to into the queue. In-Group is the inbound group that you want the call to go to. Handle Method is the way you want the call to be handled,"); ?> <a href="#inbound_dids-call_handle_method"><?php echo _QXZ("Click here to see a list of the available handle methods"); ?></a>. <?php echo _QXZ("Search Method defines how the queue will find the next agent, recommend leave this on LB. List ID is the list that the new lead is inserted into, also if the Method is not a LOOKUP method and the lead is not found. Campaign ID is the campaign to search lists through if one of the RC methods is used. Phone Code is the phone_code field entry for the lead that is inserted with. VID Enter Filename is used if the Method is set to one of the VIDPROMPT methods, it is the audio prompt played to ask the customer to enter their ID. VID ID Number Filename is used if the Method is set to one of the VIDPROMPT methods, it is the audio prompt played after customer enters their ID, something like YOU HAVE ENTERED. VID Confirm Filename is used if the Method is set to one of the VIDPROMPT methods, it is the audio prompt played to confirm their ID, something like PRESS 1 TO CONFIRM AND 2 TO REENTER. VID Digits is used if the Method is set to one of the VIDPROMPT methods, if it is set to a number it is the number of digits that must be entered by the customer when prompted for their ID, if set to empty or X then the customer will have to press pound or hash to finish their entry of their ID."); ?>
|
||||
<B><?php echo _QXZ("Call Menu In-Group Settings"); ?> -</B><?php echo _QXZ("If the route is set to INGROUP then there are many options that you can set to define how the call is sent to into the queue. In-Group is the inbound group that you want the call to go to. Handle Method is the way you want the call to be handled,"); ?> <a href="#inbound_dids-call_handle_method"><?php echo _QXZ("Click here to see a list of the available handle methods"); ?></a>. <?php echo _QXZ("Search Method defines how the queue will find the next agent, recommend leave this on LB. List ID is the list that the new lead is inserted into, also if the Method is not a LOOKUP method and the lead is not found. Campaign ID is the campaign to search lists through if one of the RC methods is used. Phone Code is the phone_code field entry for the lead that is inserted with. VID Enter Filename is used if the Method is set to one of the VIDPROMPT methods, it is the audio prompt played to ask the customer to enter their ID. VID ID Number Filename is used if the Method is set to one of the VIDPROMPT methods, it is the audio prompt played after customer enters their ID, something like YOU HAVE ENTERED. VID Confirm Filename is used if the Method is set to one of the VIDPROMPT methods, it is the audio prompt played to confirm their ID, something like PRESS 1 TO CONFIRM AND 2 TO REENTER. VID Digits is used if the Method is set to one of the VIDPROMPT methods, if it is set to a number it is the number of digits that must be entered by the customer when prompted for their ID, if set to empty or X then the customer will have to press pound or hash to finish their entry of their ID.") . ' ' . _QXZ("If you are using the cm_phonesearch.agi in this Call Menu, you can set the B option to use the special DYNAMIC_INGROUP_VAR in-group for that script to work properly."); ?>
|
||||
|
||||
<BR>
|
||||
<A NAME="call_menu-custom_dialplan_entry">
|
||||
|
||||
Reference in New Issue
Block a user