Files
2019-07-22 14:52:55 +00:00

2281 lines
101 KiB
Perl

#!/usr/bin/perl
#
# AST_VDcall_quotas.pl version 2.14
#
# DESCRIPTION:
# Updates the vicidial_list table for the call quota lead ranking system
#
# SUMMARY:
# For VICIDIAL outbound dialing, this program must be in the crontab on only one
# server, running once an hour during operating hours.
#
# Copyright (C) 2019 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
#
# CHANGELOG
# 190705-1353 - First build
# 190722-1005 - Added more log-audit code and log-fixing
#
# constants
$build = '190705-1353';
$DB=0; # Debug flag, set to 0 for no debug messages. Can be overriden with CLI --debug flag
$US='__';
$MT[0]='';
# options
$VLforce_index = 'FORCE INDEX(list_id)'; # to disable, set to ''
$force_process_all_leads=0;
$populate_call_quota_logs=0;
$no_insert_call_quota_logs=0;
### gather date and time
$secT = time();
$secX = time();
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = ($year + 1900);
$mon++;
$wtoday = $wday;
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";}
$file_date = "$year-$mon-$mday";
$now_date = "$year-$mon-$mday $hour:$min:$sec";
$VDL_date = "$year-$mon-$mday 00:00:01";
$YMD = "$year-$mon-$mday";
### get date-time of one hour ago ###
$VDL_hour_epoch = ($secX - (60 * 60));
($Vsec,$Vmin,$Vhour,$Vmday,$Vmon,$Vyear,$Vwday,$Vyday,$Visdst) = localtime($VDL_hour_epoch);
$Vyear = ($Vyear + 1900);
$Vmon++;
if ($Vmon < 10) {$Vmon = "0$Vmon";}
if ($Vmday < 10) {$Vmday = "0$Vmday";}
if ($Vhour < 10) {$Vhour = "0$Vhour";}
if ($Vmin < 10) {$Vmin = "0$Vmin";}
if ($Vsec < 10) {$Vsec = "0$Vsec";}
$VDL_hour = "$Vyear-$Vmon-$Vmday $Vhour:$Vmin:$Vsec";
### begin parsing CLI run-time options ###
if (length($ARGV[0])>1)
{
$i=0;
$allow_inactive_list_leads=0;
while ($#ARGV >= $i)
{
$args = "$args $ARGV[$i]";
$i++;
}
if ($args =~ /--help/i)
{
print "allowed run time options(must stay in this order):\n";
print " [--help] = this screen\n";
print " [--version] = print version of this script, then exit\n";
print " [--debug] = debug\n";
print " [--debugX] = super debug\n";
print " [--campaign=XXX] = run for campaign XXX only(or more campaigns if separated by triple dash ---)\n";
print " [--force-process-all-leads] = run call quota ranking on all leads, not just leads modified since last run\n";
print " [--populate-call-quota-logs] = run through the last 7 days of call logs for a campaign and add/update missing call quota log entries, MUST SET CAMPAIGN!\n";
print " [--no-insert-call-quota-logs] = if running the populate process, do not insert new log records\n";
print "\n";
exit;
}
else
{
if ($args =~ /--version/i)
{
print "version: $build\n";
exit;
}
if ($args =~ /--populate-call-quota-logs/i)
{
$populate_call_quota_logs=1;
print "\n----- POPULATE CALL QUOTA LOGS: $populate_call_quota_logs -----\n\n";
}
if ($args =~ /--no-insert-call-quota-logs/i)
{
$no_insert_call_quota_logs=1;
print "\n----- POPULATE NO INSERT CALL QUOTA LOGS: $no_insert_call_quota_logs -----\n\n";
}
if ($args =~ /--campaign=/i)
{
# print "\n|$ARGS|\n\n";
@data_in = split(/--campaign=/,$args);
$CLIcampaign = $data_in[1];
$CLIcampaign =~ s/ .*$//gi;
if ($CLIcampaign =~ /---/)
{
$CLIcampaign =~ s/---/','/gi;
}
}
else
{
$CLIcampaign = '';
if ($populate_call_quota_logs > 0)
{
$populate_call_quota_logs=0;
print "\n----- POPULATE CALL QUOTA LOGS ERROR: No Campaign specified ($populate_call_quota_logs) -----\n\n";
exit;
}
}
if ($args =~ /--level=/i)
{
@data_in = split(/--level=/,$args);
$CLIlevel = $data_in[1];
$CLIlevel =~ s/ .*$//gi;
$CLIlevel =~ s/\D//gi;
print "\n-----HOPPER LEVEL OVERRIDE: $CLIlevel -----\n\n";
}
else
{$CLIlevel = '';}
if ($args =~ /--debug/i)
{
$DB=1;
print "\n----- DEBUG -----\n\n";
}
if ($args =~ /--debugX/i)
{
$DBX=1;
print "\n----- SUPER DEBUG -----\n\n";
}
if ($args =~ /--force-process-all-leads/i)
{
$force_process_all_leads=1;
print "\n----- FORCE PROCESS ALL LEADS: $force_process_all_leads -----\n\n";
}
}
}
else
{
print "no command line options set\n";
}
# 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 (!$VDHLOGfile) {$VDHLOGfile = "$PATHlogs/call_quotas.$year-$mon-$mday";}
if (!$VARDB_port) {$VARDB_port='3306';}
use Time::Local;
use DBI;
$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass")
or die "Couldn't connect to database: " . DBI->errstr;
#############################################
##### SYSTEM SETTINGS LOOKUP #####
$SScall_quota_lead_ranking=0;
$stmtA = "SELECT call_quota_lead_ranking,timeclock_end_of_day 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;
$SScall_quota_lead_ranking = $aryA[0];
$SStimeclock_end_of_day = $aryA[1];
}
$sthA->finish();
##### END SYSTEM SETTINGS LOOKUP #####
###########################################
if ($SScall_quota_lead_ranking < 1)
{
print "Call Quota Lead Ranking is disabled on this system, exiting...\n";
exit;
}
### Grab Server values from the database
$stmtA = "SELECT vd_server_logs,local_gmt 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;
if ($sthArows==0) {die "Server IP $VARserver_ip does not have an entry in the servers table\n\n";}
if ($sthArows > 0)
{
@aryA = $sthA->fetchrow_array;
$DBvd_server_logs = $aryA[0];
$DBSERVER_GMT = $aryA[1];
if ($DBvd_server_logs =~ /Y/) {$SYSLOG = '1';}
else {$SYSLOG = '0';}
if (length($DBSERVER_GMT)>0) {$SERVER_GMT = $DBSERVER_GMT;}
}
$sthA->finish();
$secX = time();
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($secX);
$mon++;
$year = ($year + 1900);
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_hourmin = "$hour$min";
$LOCAL_GMT_OFF = $SERVER_GMT;
$LOCAL_GMT_OFF_STD = $SERVER_GMT;
if ($isdst) {$LOCAL_GMT_OFF++;}
$GMT_now = ($secX - ($LOCAL_GMT_OFF * 3600));
($GMTsec,$GMTmin,$GMThour,$GMTmday,$GMTmon,$GMTyear,$GMTwday,$GMTyday,$GMTisdst) = localtime($GMT_now);
$GMTmon++;
$GMTyear = ($GMTyear + 1900);
if ($GMTmon < 10) {$GMTmon = "0$GMTmon";}
if ($GMTmday < 10) {$GMTmday = "0$GMTmday";}
if ($GMThour < 10) {$GMThour = "0$GMThour";}
if ($GMTmin < 10) {$GMTmin = "0$GMTmin";}
if ($GMTsec < 10) {$GMTsec = "0$GMTsec";}
if ($DB) {print "TIME DEBUG: $LOCAL_GMT_OFF_STD|$LOCAL_GMT_OFF|$isdst| GMT: $GMThour:$GMTmin \n";}
if (length($SStimeclock_end_of_day) < 1) {$SStimeclock_end_of_day='0000';}
$timeclock_end_of_day_hour = (substr($SStimeclock_end_of_day, 0, 2) + 0);
$timeclock_end_of_day_min = (substr($SStimeclock_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 ($SStimeclock_end_of_day > $now_hourmin)
{$today_start_epoch = ($today_start_epoch - 86400);}
# calculate back to day 7 starting with day 1 = $today_start_epoch
$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));
$SVtarget = ($today_start_epoch - (86400 * 6)); # look back to the start of day 7
($SVsec,$SVmin,$SVhour,$SVmday,$SVmon,$SVyear,$SVwday,$SVyday,$SVisdst) = localtime($SVtarget);
$SVyear = ($SVyear + 1900);
$SVmon++;
if ($SVmon < 10) {$SVmon = "0$SVmon";}
if ($SVmday < 10) {$SVmday = "0$SVmday";}
if ($SVhour < 10) {$SVhour = "0$SVhour";}
if ($SVmin < 10) {$SVmin = "0$SVmin";}
if ($SVsec < 10) {$SVsec = "0$SVsec";}
$SVSQLdate = "$SVyear-$SVmon-$SVmday $SVhour:$SVmin:$SVsec";
if ($DBX > 0) {print "TIME DEBUG: |$SStimeclock_end_of_day|$now_hourmin|$timeclock_end_of_day_hour|$timeclock_end_of_day_min|$today_start_epoch|$SVtarget|$SVSQLdate|\n";}
##################################################
##### BEGIN populate call quota logs process #####
##################################################
if ($populate_call_quota_logs > 0)
{
$log_updated=0;
$log_not_updated=0;
$log_inserted=0;
$total_call_count=0;
$update_status_ct=0;
$update_session_ct=0;
$update_day_ct=0;
$skip_dial_log_no_uid=0;
$updated_dial_log_no_uid=0;
# Gather a list of all lists within a campaign
$stmtA = "SELECT list_id from vicidial_lists where campaign_id IN('$CLIcampaign');";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
if ($DBX > 0) {print "$sthArows|$stmtA\n";}
$list_ct=0;
while ($sthArows > $list_ct)
{
@aryA = $sthA->fetchrow_array;
if ($list_ct > 0) {$list_idsSQL .= ",";}
$list_idsSQL .= "'$aryA[0]'";
$list_ct++;
}
$sthA->finish();
if (length($list_idsSQL) < 4)
{
if ($DB > 0) {print "NO LISTS ARE ASSIGNED TO CAMPAIGN: $CLIcampaign|$sthArows \n";}
}
else
{
# Gather a list of all leads called within the last 7 days within the lists of the specified campaign ( and lead_id='819938')
$stmtA = "SELECT lead_id,list_id from vicidial_list where list_id IN($list_idsSQL) and last_local_call_time >= \"$SVSQLdate\";";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsLEADS=$sthA->rows;
if ($DBX > 0) {print "$sthArowsLEADS|$stmtA\n";}
$lead_ct=0;
while ($sthArowsLEADS > $lead_ct)
{
@aryA = $sthA->fetchrow_array;
$LEADlead_id[$lead_ct] = $aryA[0];
$LEADlist_id[$lead_ct] = $aryA[1];
$lead_ct++;
}
$sthA->finish();
if ($lead_ct < 1)
{
if ($DB > 0) {print "NO LEADS CALLED IN THE LAST 7 DAYS ON THIS CAMPAIGN: $CLIcampaign|$lead_ct \n";}
}
else
{
if ($DBX > 0) {print "CALLS FOUND FOR THIS CAMPAIGN: $CLIcampaign|$lead_ct \n";}
$stmtA = "SELECT call_quota_lead_ranking from vicidial_campaigns where campaign_id IN('$CLIcampaign');";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
if ($DBX > 0) {print "$sthArows|$stmtA\n";}
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$call_quota_lead_ranking = $aryA[0];
$rec_count++;
}
$sthA->finish();
$TEMPcontainer_entry='';
$TEMPcall_quota_lead_ranking = $call_quota_lead_ranking;
&gather_call_quota_settings;
if ( ($settings_core_score >= 10) && ($settings_session_score >= 1) )
{
### BEGIN Gather calls for each lead, analyze and update call_quota log record ###
$lead_ct=0;
while ($sthArowsLEADS > $lead_ct)
{
$stmtA = "SELECT call_date,UNIX_TIMESTAMP(call_date),uniqueid,caller_code from vicidial_dial_log where lead_id='$LEADlead_id[$lead_ct]' and call_date >= \"$SVSQLdate\" order by call_date limit 1000;";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsCALLS=$sthA->rows;
if ($DBX > 0) {print "$sthArowsCALLS|$stmtA\n";}
$call_ct=0;
while ($sthArowsCALLS > $call_ct)
{
@aryA = $sthA->fetchrow_array;
$LEADcall_date[$call_ct] = $aryA[0];
$LEADcall_epoch[$call_ct] = $aryA[1];
$LEADuniqueid[$call_ct] = $aryA[2];
$LEADcaller_code[$call_ct] = $aryA[3];
$call_ct++;
}
$sthA->finish();
$call_ct=0;
while ($sthArowsCALLS > $call_ct)
{
if (length($LEADuniqueid[$call_ct]) < 9)
{
# Look for extended log from dial log entry with no uniqueid
$stmtA = "SELECT uniqueid from vicidial_log_extended where caller_code='$LEADcaller_code[$call_ct]' and lead_id='$LEADlead_id[$lead_ct]';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsVLEUID=$sthA->rows;
if ($DBX > 0) {print "$sthArowsVLEUID|$stmtA\n";}
if ($sthArowsVLEUID > 0)
{
@aryA = $sthA->fetchrow_array;
$LEADuniqueid[$call_ct] = $aryA[0];
}
$sthA->finish();
if ( ($sthArowsVLEUID > 0) && (length($LEADuniqueid[$call_ct]) >= 9) )
{
# Update list record with cache counts
$stmtA = "UPDATE vicidial_dial_log SET uniqueid='$LEADuniqueid[$call_ct]' where caller_code='$LEADcaller_code[$call_ct]' and lead_id='$LEADlead_id[$lead_ct]' limit 1;";
$affected_rows = $dbhA->do($stmtA);
if ($DBX) {print "vicidial_dial_log UPDATED: $affected_rows|$stmtA|\n";}
$event_string = "-- vicidial_dial_log record updated: $affected_rows|$stmtA|$update_debug|"; &event_logger;
$updated_dial_log_no_uid = ($updated_dial_log_no_uid + $affected_rows);
}
}
$call_ct++;
}
if ($call_ct < 1)
{
if ($DBX > 0) {print "NO CALLS FOUND IN THE LAST 7 DAYS ON THIS LEAD: $LEADlead_id[$lead_ct]|$LEADlist_id[$lead_ct]|$call_ct \n";}
}
else
{
# Gather current lead information
$stmtA = "SELECT list_id,status,rank,called_count from vicidial_list where lead_id='$LEADlead_id[$lead_ct]' and list_id='$LEADlist_id[$lead_ct]';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsLI=$sthA->rows;
if ($DBX > 0) {print "$sthArowsLI|$stmtA\n";}
if ($sthArowsLI > 0)
{
@aryA = $sthA->fetchrow_array;
$LEADINFOlist_id = $aryA[0];
$LEADINFOstatus = $aryA[1];
$LEADINFOrank = $aryA[2];
$LEADINFOcalled_count = $aryA[3];
}
$sthA->finish();
if ($sthArowsLI < 1)
{
if ($DBX > 0) {print "LEAD NOT FOUND IN THIS LIST: $LEADlead_id[$lead_ct]|$LEADlist_id[$lead_ct]| \n";}
}
else
{
# Go through each call for this lead and calculate session and day call counts
$session_one_calls=0;
$session_two_calls=0;
$session_three_calls=0;
$session_four_calls=0;
$session_five_calls=0;
$session_six_calls=0;
$session_one_today_calls=0;
$session_two_today_calls=0;
$session_three_today_calls=0;
$session_four_today_calls=0;
$session_five_today_calls=0;
$session_six_today_calls=0;
$day_one_calls=0;
$day_two_calls=0;
$day_three_calls=0;
$day_four_calls=0;
$day_five_calls=0;
$day_six_calls=0;
$day_seven_calls=0;
$call_ct=0;
$start_day=1;
while ($sthArowsCALLS > $call_ct)
{
if (length($LEADuniqueid[$call_ct]) >= 9)
{
@VDLcall_datetimeARY = split(/ /,$LEADcall_date[$call_ct]);
@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) ) {$session_one_calls++;}
if ( ($session_two_start <= $VDLcall_hourmin) and ($session_two_end > $VDLcall_hourmin) ) {$session_two_calls++;}
if ( ($session_three_start <= $VDLcall_hourmin) and ($session_three_end > $VDLcall_hourmin) ) {$session_three_calls++;}
if ( ($session_four_start <= $VDLcall_hourmin) and ($session_four_end > $VDLcall_hourmin) ) {$session_four_calls++;}
if ( ($session_five_start <= $VDLcall_hourmin) and ($session_five_end > $VDLcall_hourmin) ) {$session_five_calls++;}
if ( ($session_six_start <= $VDLcall_hourmin) and ($session_six_end > $VDLcall_hourmin) ) {$session_six_calls++;}
$VLCQClast_call_epoch = $LEADcall_epoch[$call_ct]; $VLCQClast_call_date = $LEADcall_date[$call_ct];
if ($call_ct < 1)
{
$VLCQCfirst_call_epoch = $LEADcall_epoch[$call_ct];
$VLCQCfirst_call_date = $LEADcall_date[$call_ct];
if ($VLCQCfirst_call_epoch >= $today_start_epoch)
{$start_day_epoch=$today_start_epoch; $start_day=1;}
if ( ($VLCQCfirst_call_epoch >= $day_two_start_epoch) and ($VLCQCfirst_call_epoch < $today_start_epoch) )
{$start_day_epoch=$day_two_start_epoch; $start_day=2;}
if ( ($VLCQCfirst_call_epoch >= $day_three_start_epoch) and ($VLCQCfirst_call_epoch < $day_two_start_epoch) )
{$start_day_epoch=$day_three_start_epoch; $start_day=3;}
if ( ($VLCQCfirst_call_epoch >= $day_four_start_epoch) and ($VLCQCfirst_call_epoch < $day_three_start_epoch) )
{$start_day_epoch=$day_four_start_epoch; $start_day=4;}
if ( ($VLCQCfirst_call_epoch >= $day_five_start_epoch) and ($VLCQCfirst_call_epoch < $day_four_start_epoch) )
{$start_day_epoch=$day_five_start_epoch; $start_day=5;}
if ( ($VLCQCfirst_call_epoch >= $day_six_start_epoch) and ($VLCQCfirst_call_epoch < $day_five_start_epoch) )
{$start_day_epoch=$day_six_start_epoch; $start_day=6;}
if ( ($VLCQCfirst_call_epoch >= $day_seven_start_epoch) and ($VLCQCfirst_call_epoch < $day_six_start_epoch) )
{$start_day_epoch=$day_seven_start_epoch; $start_day=7;}
$day_one_calls++;
# calculate back to day 7 starting with day 1 = $start_day_epoch
$Sday_two_start_epoch = ($start_day_epoch + (86400 * 1));
$Sday_three_start_epoch = ($start_day_epoch + (86400 * 2));
$Sday_four_start_epoch = ($start_day_epoch + (86400 * 3));
$Sday_five_start_epoch = ($start_day_epoch + (86400 * 4));
$Sday_six_start_epoch = ($start_day_epoch + (86400 * 5));
$Sday_seven_start_epoch = ($start_day_epoch + (86400 * 6));
$Sday_seven_end_epoch = ($start_day_epoch + (86400 * 7));
if ($DBX > 0) {print "CQ-Debug 0: $VLCQCfirst_call_date|$start_day|$VLCQCfirst_call_epoch|$start_day_epoch|$Sday_two_start_epoch|$Sday_three_start_epoch|$Sday_four_start_epoch|$Sday_five_start_epoch|$Sday_six_start_epoch|$Sday_seven_start_epoch|\n";}
}
else
{
if ($DBX > 0) {print "CQ-Debug 1: $call_ct|$VLCQCfirst_call_date|$start_day|$VLCQCfirst_call_epoch|$start_day_epoch(".($LEADcall_epoch[$call_ct]-$start_day_epoch).")|$Sday_two_start_epoch(".($LEADcall_epoch[$call_ct]-$Sday_two_start_epoch).")|$Sday_three_start_epoch(".($LEADcall_epoch[$call_ct]-$Sday_three_start_epoch).")|$Sday_four_start_epoch(".($LEADcall_epoch[$call_ct]-$Sday_four_start_epoch).")|$Sday_five_start_epoch(".($LEADcall_epoch[$call_ct]-$Sday_five_start_epoch).")|$Sday_six_start_epoch(".($LEADcall_epoch[$call_ct]-$Sday_six_start_epoch).")|$Sday_seven_start_epoch(".($LEADcall_epoch[$call_ct]-$Sday_seven_start_epoch).")|$Sday_seven_end_epoch(".($LEADcall_epoch[$call_ct]-$Sday_seven_end_epoch).")| |$LEADcall_epoch[$call_ct]|\n";}
if ( ($LEADcall_epoch[$call_ct] >= $start_day_epoch) && ($LEADcall_epoch[$call_ct] < $Sday_two_start_epoch) ) {$day_one_calls++;}
if ( ($LEADcall_epoch[$call_ct] >= $Sday_two_start_epoch) && ($LEADcall_epoch[$call_ct] < $Sday_three_start_epoch) ) {$day_two_calls++;}
if ( ($LEADcall_epoch[$call_ct] >= $Sday_three_start_epoch) && ($LEADcall_epoch[$call_ct] < $Sday_four_start_epoch) ) {$day_three_calls++;}
if ( ($LEADcall_epoch[$call_ct] >= $Sday_four_start_epoch) && ($LEADcall_epoch[$call_ct] < $Sday_five_start_epoch) ) {$day_four_calls++;}
if ( ($LEADcall_epoch[$call_ct] >= $Sday_five_start_epoch) && ($LEADcall_epoch[$call_ct] < $Sday_six_start_epoch) ) {$day_five_calls++;}
if ( ($LEADcall_epoch[$call_ct] >= $Sday_six_start_epoch) && ($LEADcall_epoch[$call_ct] < $Sday_seven_start_epoch) ) {$day_six_calls++;}
if ( ($LEADcall_epoch[$call_ct] >= $Sday_seven_start_epoch) && ($LEADcall_epoch[$call_ct] < $Sday_seven_end_epoch) ) {$day_seven_calls++;}
}
if ($LEADcall_epoch[$call_ct] >= $today_start_epoch)
{
if ( ($session_one_start <= $VDLcall_hourmin) and ($session_one_end > $VDLcall_hourmin) ) {$session_one_today_calls++;}
if ( ($session_two_start <= $VDLcall_hourmin) and ($session_two_end > $VDLcall_hourmin) ) {$session_two_today_calls++;}
if ( ($session_three_start <= $VDLcall_hourmin) and ($session_three_end > $VDLcall_hourmin) ) {$session_three_today_calls++;}
if ( ($session_four_start <= $VDLcall_hourmin) and ($session_four_end > $VDLcall_hourmin) ) {$session_four_today_calls++;}
if ( ($session_five_start <= $VDLcall_hourmin) and ($session_five_end > $VDLcall_hourmin) ) {$session_five_today_calls++;}
if ( ($session_six_start <= $VDLcall_hourmin) and ($session_six_end > $VDLcall_hourmin) ) {$session_six_today_calls++;}
}
}
else
{$skip_dial_log_no_uid++;}
$call_ct++;
$total_call_count++;
}
if ($DBX > 0) {print "CQ-Debug 2: $VDLcall_datetime|$VDLcall_hourmin|$SStimeclock_end_of_day|$start_day_epoch|$call_ct| |$session_one_calls|$session_two_calls|$session_three_calls|$session_four_calls|$session_five_calls|$session_six_calls| |$day_one_calls|$day_two_calls|$day_three_calls|$day_four_calls|$day_five_calls|$day_six_calls|$day_seven_calls| |$session_one_today_calls|$session_two_today_calls|$session_three_today_calls|$session_four_today_calls|$session_five_today_calls|$session_six_today_calls|\n";}
# Gather the details on existing vicidial_lead_call_quota_counts for this lead, if there is one
$stmtA = "SELECT first_call_date,last_call_date,status,called_count,session_one_calls,session_two_calls,session_three_calls,session_four_calls,session_five_calls,session_six_calls,day_one_calls,day_two_calls,day_three_calls,day_four_calls,day_five_calls,day_six_calls,day_seven_calls,rank,modify_date,session_one_today_calls,session_two_today_calls,session_three_today_calls,session_four_today_calls,session_five_today_calls,session_six_today_calls from vicidial_lead_call_quota_counts where lead_id='$LEADlead_id[$lead_ct]' and list_id='$LEADlist_id[$lead_ct]';";
if ($DBX > 0) {print "|$stmtA|\n";}
$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;
$LOGfirst_call_date = $aryA[0];
$LOGlast_call_date = $aryA[1];
$LOGstatus = $aryA[2];
$LOGcalled_count = $aryA[3];
$LOGsession_one_calls = $aryA[4];
$LOGsession_two_calls = $aryA[5];
$LOGsession_three_calls = $aryA[6];
$LOGsession_four_calls = $aryA[7];
$LOGsession_five_calls = $aryA[8];
$LOGsession_six_calls = $aryA[9];
$LOGday_one_calls = $aryA[10];
$LOGday_two_calls = $aryA[11];
$LOGday_three_calls = $aryA[12];
$LOGday_four_calls = $aryA[13];
$LOGday_five_calls = $aryA[14];
$LOGday_six_calls = $aryA[15];
$LOGday_seven_calls = $aryA[16];
$LOGrank = $aryA[17];
$LOGmodify_date = $aryA[18];
$LOGsession_one_today_calls = $aryA[19];
$LOGsession_two_today_calls = $aryA[20];
$LOGsession_three_today_calls = $aryA[21];
$LOGsession_four_today_calls = $aryA[22];
$LOGsession_five_today_calls = $aryA[23];
$LOGsession_six_today_calls = $aryA[24];
}
$sthA->finish();
if ($VLCQCinfo_ct > 0)
{
$log_update=0;
$log_updateSQL='';
if ($LOGfirst_call_date ne $VLCQCfirst_call_date) {$log_update++; $log_updateSQL.=",first_call_date='$VLCQCfirst_call_date'";}
if ($LOGlast_call_date ne $VLCQClast_call_date) {$log_update++; $log_updateSQL.=",last_call_date='$VLCQClast_call_date'";}
if ($LOGstatus ne $LEADINFOstatus) {$log_update++; $update_status_ct++; $log_updateSQL.=",status='$LEADINFOstatus'";}
if ($LOGcalled_count ne $LEADINFOcalled_count) {$log_update++; $log_updateSQL.=",called_count='$LEADINFOcalled_count'";}
if ($LOGsession_one_calls ne $session_one_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_one_calls='$session_one_calls'";}
if ($LOGsession_two_calls ne $session_two_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_two_calls='$session_two_calls'";}
if ($LOGsession_three_calls ne $session_three_calls){$log_update++; $update_session_ct++; $log_updateSQL.=",session_three_calls='$session_three_calls'";}
if ($LOGsession_four_calls ne $session_four_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_four_calls='$session_four_calls'";}
if ($LOGsession_five_calls ne $session_five_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_five_calls='$session_five_calls'";}
if ($LOGsession_six_calls ne $session_six_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_six_calls='$session_six_calls'";}
if ($LOGday_one_calls ne $day_one_calls) {$log_update++; $update_day_ct++; $log_updateSQL.=",day_one_calls='$day_one_calls'";}
if ($LOGday_two_calls ne $day_two_calls) {$log_update++; $update_day_ct++; $log_updateSQL.=",day_two_calls='$day_two_calls'";}
if ($LOGday_three_calls ne $day_three_calls) {$log_update++; $update_day_ct++; $log_updateSQL.=",day_three_calls='$day_three_calls'";}
if ($LOGday_four_calls ne $day_four_calls) {$log_update++; $update_day_ct++; $log_updateSQL.=",day_four_calls='$day_four_calls'";}
if ($LOGday_five_calls ne $day_five_calls) {$log_update++; $update_day_ct++; $log_updateSQL.=",day_five_calls='$day_five_calls'";}
if ($LOGday_six_calls ne $day_six_calls) {$log_update++; $update_day_ct++; $log_updateSQL.=",day_six_calls='$day_six_calls'";}
if ($LOGday_seven_calls ne $day_seven_calls) {$log_update++; $update_day_ct++; $log_updateSQL.=",day_seven_calls='$day_seven_calls'";}
if ($LOGrank ne $LEADINFOrank) {$log_update++; $update_day_ct++; $log_updateSQL.=",rank='$LEADINFOrank'";}
if ($LOGsession_one_today_calls ne $session_one_today_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_one_today_calls='$session_one_today_calls'";}
if ($LOGsession_two_today_calls ne $session_two_today_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_two_today_calls='$session_two_today_calls'";}
if ($LOGsession_three_today_calls ne $session_three_today_calls){$log_update++; $update_session_ct++; $log_updateSQL.=",session_three_today_calls='$session_three_today_calls'";}
if ($LOGsession_four_today_calls ne $session_four_today_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_four_today_calls='$session_four_today_calls'";}
if ($LOGsession_five_today_calls ne $session_five_today_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_five_today_calls='$session_five_today_calls'";}
if ($LOGsession_six_today_calls ne $session_six_today_calls) {$log_update++; $update_session_ct++; $log_updateSQL.=",session_six_today_calls='$session_six_today_calls'";}
if ($log_update < 1)
{
if ($DBX > 0) {print "-- VLCQC record does not need to be updated: |$LEADlead_id[$lead_ct]|$log_update| |$log_updateSQL|\n";}
$log_not_updated++;
}
else
{
$update_debug="$LOGfirst_call_date|$LOGlast_call_date|$LOGstatus|$LOGcalled_count| |$LOGsession_one_calls|$LOGsession_two_calls|$LOGsession_three_calls|$LOGsession_four_calls|$LOGsession_five_calls|$LOGsession_six_calls| |$LOGday_one_calls|$LOGday_two_calls|$LOGday_three_calls|$LOGday_four_calls|$LOGday_five_calls|$LOGday_six_calls|$LOGday_seven_calls| |$LOGrank|$LOGmodify_date| |$LOGsession_one_today_calls|$LOGsession_two_today_calls|$LOGsession_three_today_calls|$LOGsession_four_today_calls|$LOGsession_five_today_calls|$LOGsession_six_today_calls|";
# Update in the vicidial_lead_call_quota_counts table for this lead
$stmtA="UPDATE vicidial_lead_call_quota_counts SET modify_date=NOW() $log_updateSQL where lead_id='$LEADlead_id[$lead_ct]' and list_id='$LEADlist_id[$lead_ct]';";
$VLCQCaffected_rows_update = $dbhA->do($stmtA);
$event_string = "-- VLCQC record updated: |$LEADlead_id[$lead_ct]|$VLCQCaffected_rows_update| |$stmtA|$update_debug|"; &event_logger;
$log_updated++;
}
}
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='$LEADlead_id[$lead_ct]',list_id='$LEADlist_id[$lead_ct]',first_call_date='$VLCQCfirst_call_date',last_call_date='$VLCQClast_call_date',status='$LEADINFOstatus',called_count='$LEADINFOcalled_count',session_one_calls='$session_one_calls',session_two_calls='$session_two_calls',session_three_calls='$session_three_calls',session_four_calls='$session_four_calls',session_five_calls='$session_five_calls',session_six_calls='$session_six_calls',day_one_calls='$day_one_calls',day_two_calls='$day_two_calls',day_three_calls='$day_three_calls',day_four_calls='$day_four_calls',day_five_calls='$day_five_calls',day_six_calls='$day_six_calls',day_seven_calls='$day_seven_calls',rank='$LEADINFOrank',modify_date=NOW(),session_one_today_calls='$session_one_today_calls',session_two_today_calls='$session_two_today_calls',session_three_today_calls='$session_three_today_calls',session_four_today_calls='$session_four_today_calls',session_five_today_calls='$session_five_today_calls',session_six_today_calls='$session_six_today_calls';";
if ($no_insert_call_quota_logs < 1)
{
$VLCQCaffected_rows_update = $dbhA->do($stmtA);
$event_string = "-- VLCQC record inserted: |$VLCQCaffected_rows_update| |$stmtA|"; &event_logger;
}
else
{
$event_string = "-- VLCQC record inserted skipped: |0| |$stmtA|"; &event_logger;
}
$log_inserted++;
}
}
}
$lead_ct++;
if ($DB)
{
if ($lead_ct =~ /100$/i) {print STDERR "0 $lead_ct / $sthArowsLEADS \r";}
if ($lead_ct =~ /200$/i) {print STDERR "+ $lead_ct / $sthArowsLEADS \r";}
if ($lead_ct =~ /300$/i) {print STDERR "| $lead_ct / $sthArowsLEADS \r";}
if ($lead_ct =~ /400$/i) {print STDERR "\\ $lead_ct / $sthArowsLEADS \r";}
if ($lead_ct =~ /500$/i) {print STDERR "- $lead_ct / $sthArowsLEADS \r";}
if ($lead_ct =~ /600$/i) {print STDERR "/ $lead_ct / $sthArowsLEADS \r";}
if ($lead_ct =~ /700$/i) {print STDERR "| $lead_ct / $sthArowsLEADS \r";}
if ($lead_ct =~ /800$/i) {print STDERR "+ $lead_ct / $sthArowsLEADS \r";}
if ($lead_ct =~ /900$/i) {print STDERR "0 $lead_ct / $sthArowsLEADS \r";}
if ($lead_ct =~ /0000$/i)
{
print "$lead_ct / $sthArowsLEADS ($log_updated|$log_inserted|$total_call_count|$skip_dial_log_no_uid|$updated_dial_log_no_uid| |$LEADlist_id[$lead_ct]|$LEADINFOrank| \n";
}
}
}
if ($DB)
{
print "Call Quota log populate process complete: \n";
print "Logs updated: $log_updated \n";
print " status updated: $update_status_ct \n";
print " session count updated: $update_session_ct \n";
print " day count updated: $update_day_ct \n";
print "Logs did not need to be updated: $log_not_updated \n";
if ($no_insert_call_quota_logs < 1) {print "Logs inserted: $log_inserted \n";}
else {print "Logs were not inserted: $log_inserted \n";}
print "Total leads: $lead_ct \n";
print "Total call entries analyzed: $total_call_count ($skip_dial_log_no_uid|$updated_dial_log_no_uid) \n";
}
### END Gather calls for each lead, analyze and update call_quota log record ###
}
else
{
if ($DB) {print "ERROR: CALL QUOTA SETTINGS CONTAINER INCOMPLETE or INVALID: $call_quota_lead_ranking ($settings_core_score|$settings_session_score) \n$TEMPcontainer_entry \n";}
}
}
}
if($DB)
{
### calculate time to run script ###
$secY = time();
$secZ = ($secY - $secT);
if (!$q) {print "DONE. Script execution time in seconds: $secZ\n";}
}
exit;
}
##################################################
##### END populate call quota logs process #####
##################################################
####################################################################
##### BEGIN gather list of active campaigns and their settings #####
####################################################################
@campaign_id=@MT;
if (length($CLIcampaign)>1)
{
$stmtA = "SELECT campaign_id,auto_active_list_new,call_quota_lead_ranking,call_quota_process_running,call_quota_last_run_date,local_call_time,call_count_limit,local_call_time,lead_filter_id,dial_statuses,drop_lockout_time,lead_order from vicidial_campaigns where campaign_id IN('$CLIcampaign');";
}
else
{
$stmtA = "SELECT campaign_id,auto_active_list_new,call_quota_lead_ranking,call_quota_process_running,call_quota_last_run_date,local_call_time,call_count_limit,local_call_time,lead_filter_id,dial_statuses,drop_lockout_time,lead_order from vicidial_campaigns where active='Y';";
}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
if ($DBX > 0) {print "$sthArows|$stmtA\n";}
$rec_count=0;
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$campaign_id[$rec_count] = $aryA[0];
$auto_active_list_new[$rec_count] = $aryA[1];
$call_quota_lead_ranking[$rec_count] = $aryA[2];
$call_quota_process_running[$rec_count] = $aryA[3];
$call_quota_last_run_date[$rec_count] = $aryA[4];
$local_call_time[$rec_count] = $aryA[5];
$call_count_limit[$rec_count] = $aryA[6];
$local_call_time[$rec_count] = $aryA[7];
$lead_filter_id[$rec_count] = $aryA[8];
$dial_statuses[$rec_count] = $aryA[9];
$drop_lockout_time[$rec_count] = $aryA[10];
$lead_order[$rec_count] = $aryA[11];
$rec_count++;
}
$sthA->finish();
if ($DB) {print "CAMPAIGNS TO PROCESSES CALL QUOTAS FOR: $rec_count|$#campaign_id\n";}
####################################################################
##### END gather list of active campaigns and their settings #####
####################################################################
######################################################################
##### BEGIN Loop through each active campaign and process lists #####
######################################################################
$i=0;
foreach(@campaign_id)
{
$secC = time();
$active_dialable_NEW_count=0;
$next_NEW_list_to_activate='';
$recent_dial_count=0;
$rank_updates=0;
$LEADreset_check_ct=0;
$LEADreset_ct=0;
$RUNoutput='';
if ($call_quota_lead_ranking[$i] =~ /^DISABLED$/i)
{if ($DB > 0) {print "CALL QUOTAS DISABLED FOR THIS CAMPAIGN: $campaign_id[$i]|$call_quota_lead_ranking[$i]\n";}}
else
{
### BEGIN gather stats on lists for cache ###
# Get lead filter for this campaign
if ( ($lead_filter_id[$i] !~ /^NONE$/) && (length($lead_filter_id[$i])>0) )
{
### Get SQL of lead filter for the campaign ###
$stmtA = "SELECT lead_filter_sql FROM vicidial_lead_filters where lead_filter_id='$lead_filter_id[$i]';";
$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)
{
@aryA = $sthA->fetchrow_array;
$lead_filter_sql[$i] = $aryA[0];
$lead_filter_sql[$i] =~ s/\\//gi;
$rec_count++;
}
$sthA->finish();
if ($lead_filter_sql[$i] eq '' || !defined($lead_filter_sql[$i]))
{
if ($DB) {print " lead filter $lead_filter_id[$i] does not exist\n";}
if ($DBX) {print " |$lead_filter_id[$i]|\n";}
}
else
{
$lead_filter_sql[$i] =~ s/^and|and$|^or|or$|^ and|and $|^ or|or $//gi;
$lead_filter_sql[$i] =~ s/#.*\n//gi;
$lead_filter_sql[$i] =~ s/\r|\n|\t/ /gi;
$lead_filter_sql[$i] = "and ($lead_filter_sql[$i])";
if ($DB) {print " lead filter $lead_filter_id[$i] defined for $campaign_id[$i]\n";}
if ($DBX) {print " |$lead_filter_sql[$i]|\n";}
}
}
else
{
$lead_filter_sql[$i] = '';
if ($DB) {print " no lead filter defined for campaign: $campaign_id[$i]\n";}
if ($DBX) {print " |$lead_filter_id[$i]|\n";}
}
# Get list details from each list in the campaign
$stmtA = "SELECT list_id,list_name,active,local_call_time,auto_active_list_rank,cache_count,cache_count_new,cache_count_dialable_new,list_lastcalldate,UNIX_TIMESTAMP(list_lastcalldate) from vicidial_lists where expiration_date >= CURDATE() and campaign_id='$campaign_id[$i]' order by active,auto_active_list_rank desc,list_id;";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsLISTS=$sthA->rows;
if ($DB > 0) {print "NON-EXPIRED LISTS IN THIS CAMPAIGN: $campaign_id[$i]|$sthArowsLISTS \n";}
$d=0;
while ($sthArowsLISTS > $d)
{
@aryA = $sthA->fetchrow_array;
$LISTlist_id[$d] = $aryA[0];
$LISTlist_name[$d] = $aryA[1];
$LISTactive[$d] = $aryA[2];
$LISTlocal_call_time[$d] = $aryA[3];
$LISTauto_active_list_rank[$d] = $aryA[4];
$LISTcache_count[$d] = $aryA[5];
$LISTcache_count_new[$d] = $aryA[6];
$LISTcache_count_dialable_new[$d] = $aryA[7];
$LISTlist_lastcalldate[$d] = $aryA[8];
$LISTlist_lastcalldateUNIX[$d] = $aryA[9];
$d++;
}
$sthA->finish();
# look up counts for cache stats for this list
$d=0;
while ($sthArowsLISTS > $d)
{
# Gather count of number of leads in the list
$stmtA = "SELECT count(*) from vicidial_list where list_id='$LISTlist_id[$d]';";
$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;
$LISTleads_count[$d] = $aryA[0];
}
if ($DBX > 0) {print "LEADS IN THIS LIST: $LISTleads_count[$d]|$sthArows|$LISTlist_id[$d]|$campaign_id[$i]\n";}
# Gather count of number of NEW leads in the list
$stmtA = "SELECT count(*) from vicidial_list where list_id='$LISTlist_id[$d]' and status='NEW';";
$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;
$LISTleads_NEW_count[$d] = $aryA[0];
}
if ($DBX > 0) {print "NEW LEADS IN THIS LIST: $LISTleads_NEW_count[$d]|$sthArows|$LISTlist_id[$d]|$campaign_id[$i]\n";}
$SUB_local_call_time = $local_call_time[$i];
if ($LISTlocal_call_time[$d] != 'campaign')
{
$SUB_local_call_time = $LISTlocal_call_time[$d];
if ($DBX > 0) {print " List Call Time Override: $SUB_local_call_time\n";}
}
$RETURN_default_gmt='';
$RETURN_all_gmtSQL='';
$RETURN_del_gmtSQL='';
&gmt_sql_generate($SUB_local_call_time);
if ($DBX > 0) {print " DEBUG GMT Dialable SQL: $RETURN_default_gmt\n";}
# Gather count of number of dialable NEW leads in the list
$stmtA = "SELECT count(*) FROM vicidial_list $VLforce_index where list_id='$LISTlist_id[$d]' and status='NEW' and ($RETURN_all_gmtSQL) $lead_filter_sql[$i];";
$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;
$LISTleads_dialable_NEW_count[$d] = $aryA[0];
}
if ($DBX > 0) {print "DIALABLE NEW LEADS IN THIS LIST: $LISTleads_dialable_NEW_count[$d]|$sthArows|$LISTlist_id[$d]|$campaign_id[$i]|$stmtA\n";}
# Update list record with cache counts
$stmtA = "UPDATE vicidial_lists SET cache_count='$LISTleads_count[$d]',cache_count_new='$LISTleads_NEW_count[$d]',cache_count_dialable_new='$LISTleads_dialable_NEW_count[$d]',cache_date=NOW() where list_id='$LISTlist_id[$d]';";
$affected_rows = $dbhA->do($stmtA);
if ($DBX) {print "LIST CACHE STATS UPDATED: $affected_rows|$stmtA|\n";}
$sthA->finish();
$RUNoutput .= "LIST CACHE STATS UPDATED: $LISTlist_id[$d] TOTAL: $LISTleads_count[$d] NEW: $LISTleads_NEW_count[$d] DIALABLE NEW: $LISTleads_dialable_NEW_count[$d] \n";
if ($LISTactive[$d] =~ /^Y$/i)
{
$active_dialable_NEW_count = ($active_dialable_NEW_count + $LISTleads_dialable_NEW_count[$d]);
if ($DBX) {print "LIST ACTIVE DIALABLE LEADS: $LISTleads_dialable_NEW_count[$d]($active_dialable_NEW_count)\n";}
}
else
{
# set the next list(with diablable NEW leads) in order to be activated, if needed
if ( ($LISTleads_dialable_NEW_count[$d] > 0) && (length($next_NEW_list_to_activate) < 1) )
{
$next_NEW_list_to_activate = $LISTlist_id[$d];
if ($DBX) {print " Next NEW list to activate selected: $next_NEW_list_to_activate|$LISTleads_dialable_NEW_count[$d] \n";}
}
}
if ($LISTlist_lastcalldateUNIX[$d] > $VDL_hour_epoch)
{
$recent_dial_count++;
if ($DBX) {print "LIST RECENTLY DIALED: ($LISTlist_lastcalldateUNIX[$d] > $VDL_hour) $recent_dial_count \n";}
}
if ($DB) {print " LIST ".sprintf("%14s", $LISTlist_id[$d]).": $LISTactive[$d]|$LISTauto_active_list_rank[$d]|$LISTleads_count[$d]|$LISTleads_NEW_count[$d]|$LISTleads_dialable_NEW_count[$d] \n";}
$d++;
}
### END gather stats on lists for cache ###
### BEGIN auto-activate next dialable-NEW list, if needed ###
if ($auto_active_list_new[$i] !~ /^DISABLED$/i)
{
if ($DB) {print "CHECKING TO SEE IF AUTO-ACTIVE-NEW-LIST NEEDS TO BE ACTIVATED: $recent_dial_count|$next_NEW_list_to_activate ($auto_active_list_new[$i] <> $active_dialable_NEW_count) \n";}
if ( ($recent_dial_count > 0) && ($auto_active_list_new[$i] > $active_dialable_NEW_count) && (length($next_NEW_list_to_activate)>1) )
{
# Update list record to set list to active
$stmtB = "UPDATE vicidial_lists SET active='Y',list_changedate=NOW() where list_id='$next_NEW_list_to_activate';";
$affected_rowsB = $dbhA->do($stmtB);
if ($DBX) {print "LIST SET TO ACTIVE: $affected_rowsB|$stmtB|\n";}
$sthA->finish();
if ($DB) {print "NEXT AUTO-ACTIVE-NEW-LIST SET TO ACTIVE: $next_NEW_list_to_activate|$affected_rowsB \n";}
$RUNoutput .= "NEXT AUTO-ACTIVE-NEW-LIST SET TO ACTIVE: $next_NEW_list_to_activate|$affected_rowsB \n";
# Insert record into the admin log for this list modification
$SQL_log = "$stmtB|";
$SQL_log =~ s/;|\\|\'|\"//gi;
$stmtA="INSERT INTO vicidial_admin_log set event_date=NOW(), user='VDAD', ip_address='1.1.1.1', event_section='LISTS', event_type='MODIFY', record_id='$next_NEW_list_to_activate', event_code='auto_active_list_new', event_sql='$SQL_log', event_notes='$affected_rowsB |$recent_dial_count|$auto_active_list_new[$i]|$active_dialable_NEW_count';";
$affected_rows = $dbhA->do($stmtA);
if ($DBX) {print "ADMIN LOG FOR LIST SET TO ACTIVE: $affected_rows|$stmtA|\n";}
$sthA->finish();
}
}
### END auto-activate next dialable-NEW list, if needed ###
##### BEGIN run the Quota Ranking for dialed leads that have been modified since last run #####
$TEMPcontainer_entry='';
$TEMPcall_quota_lead_ranking = $call_quota_lead_ranking[$i];
&gather_call_quota_settings;
if ( ($settings_core_score >= 10) && ($settings_session_score >= 1) )
{
$test_lead_order = 'UP RANK';
if ($new_shuffle == 2) {$test_lead_order = 'UP RANK 2nd NEW';}
if ($new_shuffle == 3) {$test_lead_order = 'UP RANK 3rd NEW';}
if ($new_shuffle == 4) {$test_lead_order = 'UP RANK 4th NEW';}
if ($new_shuffle == 5) {$test_lead_order = 'UP RANK 5th NEW';}
if ($new_shuffle == 6) {$test_lead_order = 'UP RANK 6th NEW';}
if ( ($test_lead_order !~ /$lead_order[$i]/) || (length($test_lead_order) > (length($lead_order[$i]))) || (length($test_lead_order) < (length($lead_order[$i]))) )
{
# Update this campaign to use the proper List Order
$stmtC = "UPDATE vicidial_campaigns SET lead_order='$test_lead_order' where campaign_id='$campaign_id[$i]';";
$affected_rowsC = $dbhA->do($stmtC);
$sthA->finish();
if ($DB) {print "CAMPAIGN lead_order override set: $affected_rowsC|$test_lead_order|$lead_order[$i]|\n";}
$RUNoutput .= "CAMPAIGN lead_order override set: $affected_rowsC|$test_lead_order|$lead_order[$i] \n";
# Insert record into the admin log for this list modification
$SQL_log = "$stmtC|";
$SQL_log =~ s/;|\\|\'|\"//gi;
$stmtA="INSERT INTO vicidial_admin_log set event_date=NOW(), user='VDAD', ip_address='1.1.1.1', event_section='CAMPAIGNS', event_type='MODIFY', record_id='$campaign_id[$i]', event_code='call_quota_lead_order_change', event_sql='$SQL_log', event_notes='$affected_rowsC|$test_lead_order|$lead_order[$i]|';";
$affected_rows = $dbhA->do($stmtA);
if ($DBX) {print "ADMIN LOG FOR CAMPAIGN LIST ORDER CHANGE: $affected_rows|$stmtA|\n";}
$sthA->finish();
}
# Gather list of the lists in the campaign
$stmtA = "SELECT list_id from vicidial_lists where campaign_id='$campaign_id[$i]' order by auto_active_list_rank desc,list_id;";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsDLISTS=$sthA->rows;
if ($DB > 0) {print "LISTS IN THIS CAMPAIGN: $campaign_id[$i]|$sthArowsDLISTS \n";}
$d=0;
while ($sthArowsDLISTS > $d)
{
@aryA = $sthA->fetchrow_array;
$DLISTlist_id[$d] = $aryA[0];
$d++;
}
$sthA->finish();
# look up counts for cache stats for this list
$redial_statusesSQL = "'$redial_statuses'";
$redial_statusesSQL =~ s/,|\|/','/gi;
$d=0;
while ($sthArowsDLISTS > $d)
{
# Gather count of number of leads in the list ( and modify_date >= \"$VDL_hour\")
$stmtA = "SELECT lead_id,first_call_date,status,called_count,session_one_calls,session_two_calls,session_three_calls,session_four_calls,session_five_calls,session_six_calls,day_one_calls,day_two_calls,day_three_calls,day_four_calls,day_five_calls,day_six_calls,day_seven_calls,rank,modify_date,UNIX_TIMESTAMP(first_call_date),UNIX_TIMESTAMP(last_call_date),session_one_today_calls,session_two_today_calls,session_three_today_calls,session_four_today_calls,session_five_today_calls,session_six_today_calls from vicidial_lead_call_quota_counts where list_id='$DLISTlist_id[$d]' and last_call_date < \"$VDL_hour\" and status IN($redial_statusesSQL);";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsRANK=$sthA->rows;
$rc=0;
while ($sthArowsRANK > $rc)
{
@aryA = $sthA->fetchrow_array;
$RClead_id[$rc] = $aryA[0];
$RCfirst_call_date[$rc] = $aryA[1];
$RCstatus[$rc] = $aryA[2];
$RCcalled_count[$rc] = $aryA[3];
$RCsession_one_calls[$rc] = $aryA[4];
$RCsession_two_calls[$rc] = $aryA[5];
$RCsession_three_calls[$rc] = $aryA[6];
$RCsession_four_calls[$rc] = $aryA[7];
$RCsession_five_calls[$rc] = $aryA[8];
$RCsession_six_calls[$rc] = $aryA[9];
$RCday_one_calls[$rc] = $aryA[10];
$RCday_two_calls[$rc] = $aryA[11];
$RCday_three_calls[$rc] = $aryA[12];
$RCday_four_calls[$rc] = $aryA[13];
$RCday_five_calls[$rc] = $aryA[14];
$RCday_six_calls[$rc] = $aryA[15];
$RCday_seven_calls[$rc] = $aryA[16];
$RCrank[$rc] = $aryA[17];
$RCmodify_date[$rc] = $aryA[18];
$RCfirst_call_epoch[$rc] = $aryA[19];
$RClast_call_epoch[$rc] = $aryA[20];
$RCsession_one_today_calls[$rc] = $aryA[21];
$RCsession_two_today_calls[$rc] = $aryA[22];
$RCsession_three_today_calls[$rc] = $aryA[23];
$RCsession_four_today_calls[$rc] = $aryA[24];
$RCsession_five_today_calls[$rc] = $aryA[25];
$RCsession_six_today_calls[$rc] = $aryA[26];
$rc++;
}
if ($sthArowsRANK < 1)
{
if ($DBX) {print "NO CALL QUOTA RECYCLABLE LEADS FOUND IN THIS LIST: $sthArowsRANK|$DLISTlist_id[$d]|$stmtA| \n";}
}
else
{
if ($DBX > 0) {print "CALL QUOTA RECYCLABLE LEADS FOUND IN THIS LIST: $sthArowsRANK|$DLISTlist_id[$d]|$stmtA| \n";}
$rc=0;
$POINTS_uncalled_session=2000;
$POINTS_belowgoal_session=1000;
$POINTS_uncalled_today=2000;
$POINTS_belowgoal_today=1000;
$POINTS_goaldiff_multiplier=10;
$POINTS_daysleft_inverse_multiplier=10;
$POINTS_atmax_today=-10000;
$POINTS_atgoal_total=-4000;
$POINTS_atmax_session_today=-6000;
# starting the ranking of each call-quota-recyclable lead
while ($sthArowsRANK > $rc)
{
$LEADrank=0;
# session points added
if ( ($session_now == 1) && (length($session_one_start) > 0) )
{
if ($RCsession_one_calls[$rc] < $session_goal)
{
if ($RCsession_one_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_session);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_session);}
}
if ($RCsession_one_today_calls[$rc] >= $session_day_max) {$LEADrank = ($LEADrank + $POINTS_atmax_session_today);}
}
if ( ($session_now == 2) && (length($session_two_start) > 0) )
{
if ($RCsession_two_calls[$rc] < $session_goal)
{
if ($RCsession_two_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_session);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_session);}
}
if ($RCsession_two_today_calls[$rc] >= $session_day_max) {$LEADrank = ($LEADrank + $POINTS_atmax_session_today);}
}
if ( ($session_now == 3) && (length($session_three_start) > 0) )
{
if ($RCsession_three_calls[$rc] < $session_goal)
{
if ($RCsession_three_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_session);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_session);}
}
if ($RCsession_three_today_calls[$rc] >= $session_day_max) {$LEADrank = ($LEADrank + $POINTS_atmax_session_today);}
}
if ( ($session_now == 4) && (length($session_four_start) > 0) )
{
if ($RCsession_four_calls[$rc] < $session_goal)
{
if ($RCsession_four_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_session);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_session);}
}
if ($RCsession_four_today_calls[$rc] >= $session_day_max) {$LEADrank = ($LEADrank + $POINTS_atmax_session_today);}
}
if ( ($session_now == 5) && (length($session_five_start) > 0) )
{
if ($RCsession_five_calls[$rc] < $session_goal)
{
if ($RCsession_five_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_session);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_session);}
}
if ($RCsession_five_today_calls[$rc] >= $session_day_max) {$LEADrank = ($LEADrank + $POINTS_atmax_session_today);}
}
if ( ($session_now == 6) && (length($session_six_start) > 0) )
{
if ($RCsession_six_calls[$rc] < $session_goal)
{
if ($RCsession_six_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_session);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_session);}
}
if ($RCsession_six_today_calls[$rc] >= $session_day_max) {$LEADrank = ($LEADrank + $POINTS_atmax_session_today);}
}
# day points added
if ($RCfirst_call_epoch[$rc] >= $today_start_epoch)
{$start_day_epoch=$today_start_epoch; $start_day=1;}
if ( ($RCfirst_call_epoch[$rc] >= $day_two_start_epoch) && ($RCfirst_call_epoch[$rc] < $today_start_epoch) )
{$start_day_epoch=$day_two_start_epoch; $start_day=2;}
if ( ($RCfirst_call_epoch[$rc] >= $day_three_start_epoch) && ($RCfirst_call_epoch[$rc] < $day_two_start_epoch) )
{$start_day_epoch=$day_three_start_epoch; $start_day=3;}
if ( ($RCfirst_call_epoch[$rc] >= $day_four_start_epoch) && ($RCfirst_call_epoch[$rc] < $day_three_start_epoch) )
{$start_day_epoch=$day_four_start_epoch; $start_day=4;}
if ( ($RCfirst_call_epoch[$rc] >= $day_five_start_epoch) && ($RCfirst_call_epoch[$rc] < $day_four_start_epoch) )
{$start_day_epoch=$day_five_start_epoch; $start_day=5;}
if ( ($RCfirst_call_epoch[$rc] >= $day_six_start_epoch) && ($RCfirst_call_epoch[$rc] < $day_five_start_epoch) )
{$start_day_epoch=$day_six_start_epoch; $start_day=6;}
if ( ($RCfirst_call_epoch[$rc] >= $day_seven_start_epoch) && ($RCfirst_call_epoch[$rc] < $day_six_start_epoch) )
{$start_day_epoch=$day_seven_start_epoch; $start_day=7;}
if ($start_day == 1)
{
if ($RCday_one_calls[$rc] < $daily_goal)
{
if ($RCday_one_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_today);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_today);}
}
if ($RCday_one_calls[$rc] >= $daily_max) {$LEADrank = ($LEADrank + $POINTS_atmax_today);}
}
if ($start_day == 2)
{
if ($RCday_two_calls[$rc] < $daily_goal)
{
if ($RCday_two_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_today);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_today);}
}
if ($RCday_two_calls[$rc] >= $daily_max) {$LEADrank = ($LEADrank + $POINTS_atmax_today);}
}
if ($start_day == 3)
{
if ($RCday_three_calls[$rc] < $daily_goal)
{
if ($RCday_three_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_today);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_today);}
}
if ($RCday_three_calls[$rc] >= $daily_max) {$LEADrank = ($LEADrank + $POINTS_atmax_today);}
}
if ($start_day == 4)
{
if ($RCday_four_calls[$rc] < $daily_goal)
{
if ($RCday_four_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_today);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_today);}
}
if ($RCday_four_calls[$rc] >= $daily_max) {$LEADrank = ($LEADrank + $POINTS_atmax_today);}
}
if ($start_day == 5)
{
if ($RCday_five_calls[$rc] < $daily_goal)
{
if ($RCday_five_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_today);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_today);}
}
if ($RCday_five_calls[$rc] >= $daily_max) {$LEADrank = ($LEADrank + $POINTS_atmax_today);}
}
if ($start_day == 6)
{
if ($RCday_six_calls[$rc] < $daily_goal)
{
if ($RCday_six_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_today);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_today);}
}
if ($RCday_six_calls[$rc] >= $daily_max) {$LEADrank = ($LEADrank + $POINTS_atmax_today);}
}
if ($start_day == 7)
{
if ($RCday_seven_calls[$rc] < $daily_goal)
{
if ($RCday_seven_calls[$rc] < 1) {$LEADrank = ($LEADrank + $POINTS_uncalled_today);}
else {$LEADrank = ($LEADrank + $POINTS_belowgoal_today);}
}
if ($RCday_seven_calls[$rc] >= $daily_max) {$LEADrank = ($LEADrank + $POINTS_atmax_today);}
}
# daily goal points added
$temp_total_goal_diff=0;
$temp_total_calls = ($RCday_one_calls[$rc] + $RCday_two_calls[$rc] + $RCday_three_calls[$rc] + $RCday_four_calls[$rc] + $RCday_five_calls[$rc] + $RCday_six_calls[$rc] + $RCday_seven_calls[$rc]);
if ($temp_total_calls >= $total_goal)
{$LEADrank = ($LEADrank + $POINTS_atgoal_total);}
else
{
$temp_total_goal_diff = ($total_goal - $temp_total_calls);
$LEADrank = ($LEADrank + ($temp_total_goal_diff * $POINTS_goaldiff_multiplier));
}
# days-left points added, if current day is not greater than min_consecutive_days(weighted for days off)
if (length($active_days_of_week) >= 7) {$no_call_days=0;}
else
{
$no_call_days=0;
$temp_ct=1;
$temp_start_day = $start_day;
$temp_wday = $wday;
while ($temp_ct < $temp_start_day)
{
if ($temp_wday == 0) {$temp_wday = 6;}
else {$temp_wday = ($temp_wday - 1);}
if ($active_days_of_week !~ /$temp_wday/)
{$no_call_days++;}
$temp_ct++;
# print "days-off debug: $temp_ct $temp_start_day $temp_wday $active_days_of_week $no_call_days \n";
}
}
$weighted_consecutive_days = ($min_consecutive_days + $no_call_days);
if ($weighted_consecutive_days >= $start_day)
{
$temp_days_left_points=0;
$temp_days_left = ($min_consecutive_days - $start_day);
if ($temp_days_left == 0) {$temp_days_left_points = (128 * $POINTS_daysleft_inverse_multiplier);}
if ($temp_days_left == 1) {$temp_days_left_points = (64 * $POINTS_daysleft_inverse_multiplier);}
if ($temp_days_left == 2) {$temp_days_left_points = (32 * $POINTS_daysleft_inverse_multiplier);}
if ($temp_days_left == 3) {$temp_days_left_points = (16 * $POINTS_daysleft_inverse_multiplier);}
if ($temp_days_left == 4) {$temp_days_left_points = (8 * $POINTS_daysleft_inverse_multiplier);}
if ($temp_days_left == 5) {$temp_days_left_points = (4 * $POINTS_daysleft_inverse_multiplier);}
if ($temp_days_left == 6) {$temp_days_left_points = (2 * $POINTS_daysleft_inverse_multiplier);}
if ($temp_days_left == 7) {$temp_days_left_points = (1 * $POINTS_daysleft_inverse_multiplier);}
if ($temp_days_left_points > 0) {$LEADrank = ($LEADrank + $temp_days_left_points);}
# print "$min_consecutive_days|$start_day|$temp_days_left| $LEADrank ($temp_days_left_points|$POINTS_daysleft_inverse_multiplier)\n";
}
# hours-since-last-call points added, and determine if lead should be reset to call again
$temp_called_ago_hours=0;
$called_since_last_resetSQL='';
if ($LEADrank > 0)
{
if ($RClast_call_epoch[$rc] > 1000000)
{
$temp_called_ago_seconds = ($secX - $RClast_call_epoch[$rc]);
$temp_called_ago_hours = int($temp_called_ago_seconds / 3600);
if ($temp_called_ago_hours > 0)
{$LEADrank = ($LEADrank + $temp_called_ago_hours);}
}
# See if the lead is in a live call
$LEADagent_check=0;
$stmtA = "SELECT count(*) from vicidial_live_agents where lead_id='$RClead_id[$rc]';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsAGENT=$sthA->rows;
if ($sthArowsAGENT > 0)
{
@aryA = $sthA->fetchrow_array;
$LEADagent_check = $aryA[0];
}
$sthA->finish();
if ($LEADagent_check < 1)
{
# See if the lead is already in a live call
$LEADcall_check=0;
$stmtA = "SELECT count(*) from vicidial_auto_calls where lead_id='$RClead_id[$rc]';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsHOPPER=$sthA->rows;
if ($sthArowsHOPPER > 0)
{
@aryA = $sthA->fetchrow_array;
$LEADcall_check = $aryA[0];
}
$sthA->finish();
if ($LEADcall_check < 1)
{
# See if the lead is already in the hopper
$LEADhopper_check=0;
$stmtA = "SELECT count(*) from vicidial_hopper where lead_id='$RClead_id[$rc]';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsHOPPER=$sthA->rows;
if ($sthArowsHOPPER > 0)
{
@aryA = $sthA->fetchrow_array;
$LEADhopper_check = $aryA[0];
}
$sthA->finish();
if ($LEADhopper_check < 1)
{
# See if the lead is already reset to dial
$LEADreset_check=0;
$LEADreset_check_ct++;
$stmtA = "SELECT count(*) from vicidial_list where lead_id='$RClead_id[$rc]' and called_since_last_reset='N';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArowsRESET=$sthA->rows;
if ($sthArowsRESET > 0)
{
@aryA = $sthA->fetchrow_array;
$LEADreset_check = $aryA[0];
}
$sthA->finish();
if ($LEADreset_check < 1)
{
$called_since_last_resetSQL=",called_since_last_reset='N'";
$LEADreset_ct++;
}
}
}
}
}
if ($RCrank[$rc] != $LEADrank)
{
# Update lead rank and Call-Quota rank
$stmtC = "UPDATE vicidial_list SET rank='$LEADrank' $called_since_last_resetSQL where lead_id='$RClead_id[$rc]';";
$affected_rowsC = $dbhA->do($stmtC);
$sthA->finish();
$stmtD = "UPDATE vicidial_lead_call_quota_counts SET rank='$LEADrank',modify_date=NOW() where lead_id='$RClead_id[$rc]' and list_id='$DLISTlist_id[$d]';";
$affected_rowsD = $dbhA->do($stmtD);
$sthA->finish();
$event_string = "LEAD RANK: |$LEADrank|$RClead_id[$rc]|$RCfirst_call_date[$rc]|$start_day| |$temp_total_goal_diff|$temp_called_ago_hours| |$RCstatus[$rc]|$RCcalled_count[$rc]| |$RCsession_one_calls[$rc]|$RCsession_two_calls[$rc]|$RCsession_three_calls[$rc]|$RCsession_four_calls[$rc]|$RCsession_five_calls[$rc]|$RCsession_six_calls[$rc]| |$RCday_one_calls[$rc]|$RCday_two_calls[$rc]|$RCday_three_calls[$rc]|$RCday_four_calls[$rc]|$RCday_five_calls[$rc]|$RCday_six_calls[$rc]|$RCday_seven_calls[$rc]| |$RCrank[$rc]| |$affected_rowsC|$stmtC|$affected_rowsD|$stmtD|"; &event_logger;
$rank_updates++;
}
$rc++;
if ($DB)
{
if ($rc =~ /100$/i) {print STDERR "0 $rc / $sthArowsRANK \r";}
if ($rc =~ /200$/i) {print STDERR "+ $rc / $sthArowsRANK \r";}
if ($rc =~ /300$/i) {print STDERR "| $rc / $sthArowsRANK \r";}
if ($rc =~ /400$/i) {print STDERR "\\ $rc / $sthArowsRANK \r";}
if ($rc =~ /500$/i) {print STDERR "- $rc / $sthArowsRANK \r";}
if ($rc =~ /600$/i) {print STDERR "/ $rc / $sthArowsRANK \r";}
if ($rc =~ /700$/i) {print STDERR "| $rc / $sthArowsRANK \r";}
if ($rc =~ /800$/i) {print STDERR "+ $rc / $sthArowsRANK \r";}
if ($rc =~ /900$/i) {print STDERR "0 $rc / $sthArowsRANK \r";}
if ($rc =~ /0000$/i)
{
print "$rc / $sthArowsRANK ($rank_updates|$LEADreset_check_ct|$LEADreset_ct| |$RClead_id[$rc]|$RCfirst_call_date[$rc]|$start_day| \n";
}
}
}
}
$d++;
}
# Processing for this campaign is done, update campaign call_quota_last_run_date to now
$stmtC = "UPDATE vicidial_campaigns SET call_quota_last_run_date=NOW(),call_quota_process_running='0' where campaign_id='$campaign_id[$i]';";
$affected_rowsC = $dbhA->do($stmtC);
if ($DBX) {print "CAMPAIGN call_quota_last_run_date set to now: $affected_rowsC|$stmtC|\n";}
$sthA->finish();
}
else
{
if ($DB) {print "ERROR: CALL QUOTA SETTINGS CONTAINER INCOMPLETE or INVALID: $call_quota_lead_ranking[$i] ($settings_core_score|$settings_session_score) \n$TEMPcontainer_entry \n";}
}
### calculate time to run script ###
$secY = time();
$secZ = ($secY - $secC);
$ENDoutput = "$campaign_id[$i] CAMPAIGN ACTIVE DIALABLE NEW LEADS COUNT: $active_dialable_NEW_count \n";
$ENDoutput .= "$campaign_id[$i] CAMPAIGN LISTS RECENTLY DIALED COUNT: $recent_dial_count \n";
$ENDoutput .= "$campaign_id[$i] CAMPAIGN LEAD RANK UPDATES: $rank_updates \n";
$ENDoutput .= "$campaign_id[$i] CAMPAIGN LEAD CALLED RESET UPDATES: $LEADreset_ct ($LEADreset_check_ct) \n";
if ($DB) {print $ENDoutput."Call Quota run time: $secZ seconds";}
$stmtA="INSERT IGNORE INTO vicidial_campaign_stats_debug SET server_ip='CALLQUOTA',campaign_id='$campaign_id[$i]',entry_time=NOW(),debug_output='$ENDoutput$RUNoutput' ON DUPLICATE KEY UPDATE entry_time=NOW(),debug_output='$ENDoutput$RUNoutput Call Quota run time: $secZ seconds';";
$affected_rows = $dbhA->do($stmtA);
##### END run the Quota Ranking for dialed leads that have been modified since last run #####
}
$i++;
}
####################################################################
##### END Loop through each active campaign and process lists #####
####################################################################
$dbhA->disconnect();
if($DB)
{
if (length($ENDoutput) > 10)
{
print "\n";
print "SUMMARY: $i campaigns\n";
print "$ENDoutput";
}
### calculate time to run script ###
$secY = time();
$secZ = ($secY - $secT);
if (!$q) {print "DONE. Script execution time in seconds: $secZ\n";}
}
exit;
################################################################################
##### SUBROUTINES #####
################################################################################
sub event_logger
{
if ($SYSLOG)
{
### open the log file for writing ###
open(Lout, ">>$VDHLOGfile")
|| die "Can't open $VDHLOGfile: $!\n";
print Lout "$now_date|$event_string|\n";
close(Lout);
}
$event_string='';
}
##### Gather settings container for the campaign's Call Quota Lead Ranking settings #####
sub gather_call_quota_settings
{
### BEGIN Gather settings container for Call Quota Lead Ranking ###
$stmtA = "SELECT container_entry FROM vicidial_settings_containers where container_id='$TEMPcall_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;
$TEMPcontainer_entry = $aryA[0];
$TEMPcontainer_entry =~ s/\\//gi;
}
$sthA->finish();
# Define variables for Call Quota settings
$redial_statuses='';
$total_goal='';
$daily_goal='';
$daily_max='';
$session_goal='';
$session_day_max='';
$new_shuffle='';
$min_consecutive_days='';
$active_days_of_week='';
$zero_rank_after_call='';
$call_quota_run_time='';
$settings_core_score=0;
$session_one='';
$session_two='';
$session_three='';
$session_four='';
$session_five='';
$session_six='';
$settings_session_score=0;
if (length($TEMPcontainer_entry) > 5)
{
@container_lines = split(/\n/,$TEMPcontainer_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] =~ /^redial_statuses/i)
{
$redial_statuses = $container_lines[$c];
$redial_statuses =~ s/redial_statuses=>//gi;
if ( (length($redial_statuses) > 0) && (length($redial_statuses) <= 700) )
{$settings_core_score++;}
else {$redial_statuses='';}
}
if ($container_lines[$c] =~ /^total_goal/i)
{
$total_goal = $container_lines[$c];
$total_goal =~ s/total_goal=>//gi;
$total_goal =~ s/\D//gi;
if ( ($total_goal > 0) && ($total_goal <= 100) )
{$settings_core_score++;}
else {$total_goal='';}
}
if ($container_lines[$c] =~ /^daily_goal/i)
{
$daily_goal = $container_lines[$c];
$daily_goal =~ s/daily_goal=>//gi;
$daily_goal =~ s/\D//gi;
if ( ($daily_goal > 0) && ($daily_goal <= 20) )
{$settings_core_score++;}
else {$daily_goal='';}
}
if ($container_lines[$c] =~ /^daily_max/i)
{
$daily_max = $container_lines[$c];
$daily_max =~ s/daily_max=>//gi;
$daily_max =~ s/\D//gi;
if ( ($daily_max > 0) && ($daily_max <= 20) )
{$settings_core_score++;}
else {$daily_max='';}
}
if ($container_lines[$c] =~ /^session_goal/i)
{
$session_goal = $container_lines[$c];
$session_goal =~ s/session_goal=>//gi;
$session_goal =~ s/\D//gi;
if ( ($session_goal > 0) && ($session_goal <= 20) )
{$settings_core_score++;}
else {$session_goal='';}
}
if ($container_lines[$c] =~ /^session_day_max/i)
{
$session_day_max = $container_lines[$c];
$session_day_max =~ s/session_day_max=>//gi;
$session_day_max =~ s/\D//gi;
if ( ($session_day_max > 0) && ($session_day_max <= 20) )
{$settings_core_score++;}
else {$session_day_max='';}
}
if ($container_lines[$c] =~ /^new_shuffle/i)
{
$new_shuffle = $container_lines[$c];
$new_shuffle =~ s/new_shuffle=>//gi;
$new_shuffle =~ s/\D//gi;
if ( ($new_shuffle > -1) && ($new_shuffle <= 6) )
{
if ($new_shuffle == 1) {$new_shuffle=2;}
$settings_core_score++;
}
else {$new_shuffle='';}
}
if ($container_lines[$c] =~ /^min_consecutive_days/i)
{
$min_consecutive_days = $container_lines[$c];
$min_consecutive_days =~ s/min_consecutive_days=>//gi;
$min_consecutive_days =~ s/\D//gi;
if ( ($min_consecutive_days > 0) && ($min_consecutive_days <= 7) )
{$settings_core_score++;}
else {$min_consecutive_days='';}
}
if ($container_lines[$c] =~ /^active_days_of_week/i)
{
$active_days_of_week = $container_lines[$c];
$active_days_of_week =~ s/active_days_of_week=>//gi;
$active_days_of_week =~ s/\D//gi;
if ( (length($active_days_of_week) > 0) && (length($active_days_of_week) <= 7) )
{$settings_core_score++;}
else {$active_days_of_week='';}
}
if ($container_lines[$c] =~ /^zero_rank_after_call/i)
{
$zero_rank_after_call = $container_lines[$c];
$zero_rank_after_call =~ s/zero_rank_after_call=>//gi;
$zero_rank_after_call =~ s/\D//gi;
if ( (length($zero_rank_after_call) > 0) && (length($zero_rank_after_call) <= 1) )
{$settings_core_score++;}
else {$zero_rank_after_call='';}
}
if ($container_lines[$c] =~ /^call_quota_run_time/i)
{
$call_quota_run_time = $container_lines[$c];
$call_quota_run_time =~ s/call_quota_run_time=>//gi;
if ( (length($call_quota_run_time) > 0) && (length($call_quota_run_time) <= 70) )
{$settings_core_score++;}
else {$call_quota_run_time='';}
}
# 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++;
}
$session_now=0;
if ( ($session_one_start <= $now_hourmin) and ($session_one_end > $now_hourmin) ) {$session_now=1;}
if ( ($session_two_start <= $now_hourmin) and ($session_two_end > $now_hourmin) ) {$session_now=2;}
if ( ($session_three_start <= $now_hourmin) and ($session_three_end > $now_hourmin) ) {$session_now=3;}
if ( ($session_four_start <= $now_hourmin) and ($session_four_end > $now_hourmin) ) {$session_now=4;}
if ( ($session_five_start <= $now_hourmin) and ($session_five_end > $now_hourmin) ) {$session_now=5;}
if ( ($session_six_start <= $now_hourmin) and ($session_six_end > $now_hourmin) ) {$session_now=6;}
if ($DB)
{
$DEBUG_settings_output = "Call Quota Lead Ranking settings for $campaign_id[$i] ($call_quota_lead_ranking[$i]) \n";
$DEBUG_settings_output .= "redial_statuses: $redial_statuses \n";
$DEBUG_settings_output .= "total_goal: $total_goal \n";
$DEBUG_settings_output .= "daily_goal: $daily_goal \n";
$DEBUG_settings_output .= "daily_max: $daily_max \n";
$DEBUG_settings_output .= "session_goal: $session_goal \n";
$DEBUG_settings_output .= "session_day_max: $session_day_max \n";
$DEBUG_settings_output .= "new_shuffle: $new_shuffle \n";
$DEBUG_settings_output .= "min_consecutive_days: $min_consecutive_days \n";
$DEBUG_settings_output .= "active_days_of_week: $active_days_of_week \n";
$DEBUG_settings_output .= "zero_rank_after_call: $zero_rank_after_call \n";
$DEBUG_settings_output .= "call_quota_run_time: $call_quota_run_time \n";
$DEBUG_settings_output .= " settings core score: $settings_core_score / 11 \n";
$DEBUG_settings_output .= "session_one: $session_one ($session_one_start|$session_one_end) \n";
$DEBUG_settings_output .= "session_two: $session_two ($session_two_start|$session_two_end) \n";
$DEBUG_settings_output .= "session_three: $session_three ($session_three_start|$session_three_end) \n";
$DEBUG_settings_output .= "session_four: $session_four ($session_four_start|$session_four_end) \n";
$DEBUG_settings_output .= "session_five: $session_five ($session_five_start|$session_five_end) \n";
$DEBUG_settings_output .= "session_six: $session_six ($session_six_start|$session_six_end) \n";
$DEBUG_settings_output .= " sessions score: $settings_session_score / 6 \n";
$DEBUG_settings_output .= "session_now: $session_now \n";
print "$DEBUG_settings_output";
}
}
else
{
if ($DB) {print "ERROR: CALL QUOTA SETTINGS CONTAINER EMPTY: $TEMPcall_quota_lead_ranking|$TEMPcontainer_entry \n";}
}
}
##### Generate the SQL segment for the dialable call times #####
sub gmt_sql_generate
{
##### BEGIN calculate what gmt_offset_now values are within the allowed local_call_time setting ###
$g=0;
$p='13';
$GMT_gmt[0] = '';
$GMT_hour[0] = '';
$GMT_day[0] = '';
if ($DBX) {print "\n |GMT-DAY-HOUR| ";}
while ($p > -13)
{
$pzone = ($GMT_now + ($p * 3600));
($psec,$pmin,$phour,$pmday,$pmon,$pyear,$pday,$pyday,$pisdst) = localtime($pzone);
$phour=($phour * 100);
$tz = sprintf("%.2f", $p);
$GMT_gmt[$g] = "$tz";
$GMT_day[$g] = "$pday";
$GMT_hour[$g] = ($phour + $pmin);
$p = ($p - 0.25);
if ($DBX) {print "|$GMT_gmt[$g]-$GMT_day[$g]-$GMT_hour[$g]|";}
$g++;
}
if ($DBX) {print "\n";}
$stmtA = "SELECT call_time_id,call_time_name,call_time_comments,ct_default_start,ct_default_stop,ct_sunday_start,ct_sunday_stop,ct_monday_start,ct_monday_stop,ct_tuesday_start,ct_tuesday_stop,ct_wednesday_start,ct_wednesday_stop,ct_thursday_start,ct_thursday_stop,ct_friday_start,ct_friday_stop,ct_saturday_start,ct_saturday_stop,ct_state_call_times,ct_holidays FROM vicidial_call_times where call_time_id='$SUB_local_call_time';";
if ($DBX) {print " |$stmtA|\n";}
$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)
{
@aryA = $sthA->fetchrow_array;
$Gct_default_start = $aryA[3];
$Gct_default_stop = $aryA[4];
$Gct_sunday_start = $aryA[5];
$Gct_sunday_stop = $aryA[6];
$Gct_monday_start = $aryA[7];
$Gct_monday_stop = $aryA[8];
$Gct_tuesday_start = $aryA[9];
$Gct_tuesday_stop = $aryA[10];
$Gct_wednesday_start = $aryA[11];
$Gct_wednesday_stop = $aryA[12];
$Gct_thursday_start = $aryA[13];
$Gct_thursday_stop = $aryA[14];
$Gct_friday_start = $aryA[15];
$Gct_friday_stop = $aryA[16];
$Gct_saturday_start = $aryA[17];
$Gct_saturday_stop = $aryA[18];
$Gct_state_call_times = $aryA[19];
$Gct_holidays = $aryA[20];
$rec_count++;
}
$sthA->finish();
### BEGIN Check for outbound call time holiday ###
$holiday_id = '';
if (length($Gct_holidays)>2)
{
$Gct_holidaysSQL = $Gct_holidays;
$Gct_holidaysSQL =~ s/^\||\|$//gi;
$Gct_holidaysSQL =~ s/\|/','/gi;
$Gct_holidaysSQL = "'$Gct_holidaysSQL'";
$stmtC = "SELECT holiday_id,holiday_date,holiday_name,ct_default_start,ct_default_stop from vicidial_call_time_holidays where holiday_id IN($Gct_holidaysSQL) and holiday_status='ACTIVE' and holiday_date='$YMD' order by holiday_id;";
if ($DBX) {print " |$stmtC|\n";}
$sthC = $dbhA->prepare($stmtC) or die "preparing: ",$dbhA->errstr;
$sthC->execute or die "executing: $stmtC ", $dbhA->errstr;
$sthCrows=$sthC->rows;
if ($sthCrows > 0)
{
@aryC = $sthC->fetchrow_array;
$holiday_id = $aryC[0];
$holiday_date = $aryC[1];
$holiday_name = $aryC[2];
if ( ($Gct_default_start < $aryC[3]) && ($Gct_default_stop > 0) ) {$Gct_default_start = $aryC[3];}
if ( ($Gct_default_stop > $aryC[4]) && ($Gct_default_stop > 0) ) {$Gct_default_stop = $aryC[4];}
if ( ($Gct_sunday_start < $aryC[3]) && ($Gct_sunday_stop > 0) ) {$Gct_sunday_start = $aryC[3];}
if ( ($Gct_sunday_stop > $aryC[4]) && ($Gct_sunday_stop > 0) ) {$Gct_sunday_stop = $aryC[4];}
if ( ($Gct_monday_start < $aryC[3]) && ($Gct_monday_stop > 0) ) {$Gct_monday_start = $aryC[3];}
if ( ($Gct_monday_stop > $aryC[4]) && ($Gct_monday_stop > 0) ) {$Gct_monday_stop = $aryC[4];}
if ( ($Gct_tuesday_start < $aryC[3]) && ($Gct_tuesday_stop > 0) ) {$Gct_tuesday_start = $aryC[3];}
if ( ($Gct_tuesday_stop > $aryC[4]) && ($Gct_tuesday_stop > 0) ) {$Gct_tuesday_stop = $aryC[4];}
if ( ($Gct_wednesday_start < $aryC[3]) && ($Gct_wednesday_stop > 0) ) {$Gct_wednesday_start = $aryC[3];}
if ( ($Gct_wednesday_stop > $aryC[4]) && ($Gct_wednesday_stop > 0) ) {$Gct_wednesday_stop = $aryC[4];}
if ( ($Gct_thursday_start < $aryC[3]) && ($Gct_thursday_stop > 0) ) {$Gct_thursday_start = $aryC[3];}
if ( ($Gct_thursday_stop > $aryC[4]) && ($Gct_thursday_stop > 0) ) {$Gct_thursday_stop = $aryC[4];}
if ( ($Gct_friday_start < $aryC[3]) && ($Gct_friday_stop > 0) ) {$Gct_friday_start = $aryC[3];}
if ( ($Gct_friday_stop > $aryC[4]) && ($Gct_friday_stop > 0) ) {$Gct_friday_stop = $aryC[4];}
if ( ($Gct_saturday_start < $aryC[3]) && ($Gct_saturday_stop > 0) ) {$Gct_saturday_start = $aryC[3];}
if ( ($Gct_saturday_stop > $aryC[4]) && ($Gct_saturday_stop > 0) ) {$Gct_saturday_stop = $aryC[4];}
if ($DB) {print " CALL TIME HOLIDAY FOUND! $local_call_time[$i]|$holiday_id|$holiday_date|$holiday_name|$Gct_default_start|$Gct_default_stop|\n";}
}
$sthC->finish();
}
### END Check for outbound call time holiday ###
### BEGIN For lead recycling find out the no-call gap time and begin dial time for today
$lct_gap=0; # number of seconds from stopping of calling to starting of calling based on local call time
$lct_begin=0; # hour and minute of the begin time for the local call time
$lct_end=0; # hour and minute of the end time for the local call time
$secYESTERDAY = ($secX - (24 * 3600));
($ksec,$kmin,$khour,$kmday,$kmon,$kyear,$wyesterday,$kyday,$kisdst) = localtime($secYESTERDAY);
if ($wtoday < 1) #### Sunday local time
{
if (($Gct_sunday_start < 1) && ($Gct_sunday_stop < 1)) {$lct_begin = $Gct_default_start;}
else {$lct_begin = $Gct_sunday_start;}
}
if ($wtoday==1) #### Monday local time
{
if (($Gct_monday_start < 1) && ($Gct_monday_stop < 1)) {$lct_begin = $Gct_default_start;}
else {$lct_begin = $Gct_monday_start;}
}
if ($wtoday==2) #### Tuesday local time
{
if (($Gct_tuesday_start < 1) && ($Gct_tuesday_stop < 1)) {$lct_begin = $Gct_default_start;}
else {$lct_begin = $Gct_tuesday_start;}
}
if ($wtoday==3) #### Wednesday local time
{
if (($Gct_wednesday_start < 1) && ($Gct_wednesday_stop < 1)) {$lct_begin = $Gct_default_start;}
else {$lct_begin = $Gct_wednesday_start;}
}
if ($wtoday==4) #### Thursday local time
{
if (($Gct_thursday_start < 1) && ($Gct_thursday_stop < 1)) {$lct_begin = $Gct_default_start;}
else {$lct_begin = $Gct_thursday_start;}
}
if ($wtoday==5) #### Friday local time
{
if (($Gct_friday_start < 1) && ($Gct_friday_stop < 1)) {$lct_begin = $Gct_default_start;}
else {$lct_begin = $Gct_friday_start;}
}
if ($wtoday==6) #### Saturday local time
{
if (($Gct_saturday_start < 1) && ($Gct_saturday_stop < 1)) {$lct_begin = $Gct_default_start;}
else {$lct_begin = $Gct_saturday_start;}
}
$dayBACKsec=0;
$weekBACK=0;
while ( ($lct_end < 1) && ($weekBACK <= 1) )
{
if ($wyesterday==6) #### Saturday local time
{
if ($Gct_saturday_start > 2399) {$wyesterday = 0; $dayBACKsec = ($dayBACKsec + 86400); if ($DBX) {print "DayBACK: $wyesterday\n";}}
else
{
if (($Gct_saturday_start < 1) && ($Gct_saturday_stop < 1)) {$lct_end = $Gct_default_stop;}
else {$lct_end = $Gct_saturday_stop;}
}
}
if ($wyesterday==5) #### Friday local time
{
if ($Gct_friday_start > 2399) {$wyesterday = 1; $dayBACKsec = ($dayBACKsec + 86400); if ($DBX) {print "DayBACK: $wyesterday\n";}}
else
{
if (($Gct_friday_start < 1) && ($Gct_friday_stop < 1)) {$lct_end = $Gct_default_stop;}
else {$lct_end = $Gct_friday_stop;}
}
}
if ($wyesterday==4) #### Thursday local time
{
if ($Gct_thursday_start > 2399) {$wyesterday = 2; $dayBACKsec = ($dayBACKsec + 86400); if ($DBX) {print "DayBACK: $wyesterday\n";}}
else
{
if (($Gct_thursday_start < 1) && ($Gct_thursday_stop < 1)) {$lct_end = $Gct_default_stop;}
else {$lct_end = $Gct_thursday_stop;}
}
}
if ($wyesterday==3) #### Wednesday local time
{
if ($Gct_wednesday_start > 2399) {$wyesterday = 3; $dayBACKsec = ($dayBACKsec + 86400); if ($DBX) {print "DayBACK: $wyesterday\n";}}
else
{
if (($Gct_wednesday_start < 1) && ($Gct_wednesday_stop < 1)) {$lct_end = $Gct_default_stop;}
else {$lct_end = $Gct_wednesday_stop;}
}
}
if ($wyesterday==2) #### Tuesday local time
{
if ($Gct_tuesday_start > 2399) {$wyesterday = 4; $dayBACKsec = ($dayBACKsec + 86400); if ($DBX) {print "DayBACK: $wyesterday\n";}}
else
{
if (($Gct_tuesday_start < 1) && ($Gct_tuesday_stop < 1)) {$lct_end = $Gct_default_stop;}
else {$lct_end = $Gct_tuesday_stop;}
}
}
if ($wyesterday==1) #### Monday local time
{
if ($Gct_monday_start > 2399) {$wyesterday = 5; $dayBACKsec = ($dayBACKsec + 86400); if ($DBX) {print "DayBACK: $wyesterday\n";}}
else
{
if (($Gct_monday_start < 1) && ($Gct_monday_stop < 1)) {$lct_end = $Gct_default_stop;}
else {$lct_end = $Gct_monday_stop;}
}
}
if ($wyesterday==0) #### Sunday local time
{
if ($Gct_sunday_start > 2399) {$wyesterday = 6; $dayBACKsec = ($dayBACKsec + 86400); if ($DBX) {print "DayBACK: $wyesterday\n";}}
else
{
if (($Gct_sunday_start < 1) && ($Gct_sunday_stop < 1)) {$lct_end = $Gct_default_stop;}
else {$lct_end = $Gct_sunday_stop;}
}
}
$weekBACK++;
}
$lct_end = sprintf("%04d", $lct_end);
$lct_end_hour = substr($lct_end, 0, 2);
$lct_end_min = substr($lct_end, 2, 2);
$lct_begin = sprintf("%04d", $lct_begin);
$lct_begin_hour = substr($lct_begin, 0, 2);
$lct_begin_min = substr($lct_begin, 2, 2);
$lct_gap = ( ( ( ( ( (24 - $lct_end_hour) + $lct_begin_hour) * 3600) + ($lct_begin_min * 60) ) - ($lct_end_min * 60) ) + $dayBACKsec);
if ($DBX) {print "LocalCallTime No-Call Gap: |$lct_gap|$lct_end($lct_end_hour $lct_end_min)|$lct_begin($lct_begin_hour $lct_begin_min)|$wtoday|$wyesterday|\n";}
### END For lead recycling find out the no-call gap time and begin dial time for today
$ct_states = '';
$ct_state_gmt_SQL = '';
$del_state_gmt_SQL = '';
$ct_srs=0;
$b=0;
if (length($Gct_state_call_times)>2)
{
@state_rules = split(/\|/,$Gct_state_call_times);
$ct_srs = ($#state_rules - 0);
}
while($ct_srs >= $b)
{
if (length($state_rules[$b])>1)
{
if ($DBX) {print " Processing state rule $state_rules[$b]|";}
$stmtA = "SELECT state_call_time_id,state_call_time_state,state_call_time_name,state_call_time_comments,sct_default_start,sct_default_stop,sct_sunday_start,sct_sunday_stop,sct_monday_start,sct_monday_stop,sct_tuesday_start,sct_tuesday_stop,sct_wednesday_start,sct_wednesday_stop,sct_thursday_start,sct_thursday_stop,sct_friday_start,sct_friday_stop,sct_saturday_start,sct_saturday_stop,ct_holidays from vicidial_state_call_times where state_call_time_id='$state_rules[$b]';";
if ($DBX) {print " |$stmtA|\n";}
$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;
$Gstate_call_time_id = $aryA[0];
$Gstate_call_time_state = $aryA[1];
$Gsct_default_start = $aryA[4];
$Gsct_default_stop = $aryA[5];
$Gsct_sunday_start = $aryA[6];
$Gsct_sunday_stop = $aryA[7];
$Gsct_monday_start = $aryA[8];
$Gsct_monday_stop = $aryA[9];
$Gsct_tuesday_start = $aryA[10];
$Gsct_tuesday_stop = $aryA[11];
$Gsct_wednesday_start = $aryA[12];
$Gsct_wednesday_stop = $aryA[13];
$Gsct_thursday_start = $aryA[14];
$Gsct_thursday_stop = $aryA[15];
$Gsct_friday_start = $aryA[16];
$Gsct_friday_stop = $aryA[17];
$Gsct_saturday_start = $aryA[18];
$Gsct_saturday_stop = $aryA[19];
$Sct_holidays = $aryA[20];
$ct_states .="'$Gstate_call_time_state',";
}
$sthA->finish();
### BEGIN Check for outbound state holiday ###
$Sholiday_id = '';
if ( (length($Sct_holidays)>2) || ( (length($holiday_id)>2) && (length($Sholiday_id)<2) ) )
{
#Apply state holiday
if (length($Sct_holidays)>2)
{
$Sct_holidaysSQL = $Sct_holidays;
$Sct_holidaysSQL =~ s/^\||\|$//gi;
$Sct_holidaysSQL =~ s/\|/','/gi;
$Sct_holidaysSQL = "'$Sct_holidaysSQL'";
$stmtA = "SELECT holiday_id,holiday_date,holiday_name,ct_default_start,ct_default_stop from vicidial_call_time_holidays where holiday_id IN($Sct_holidaysSQL) and holiday_status='ACTIVE' and holiday_date='$YMD' order by holiday_id;";
$holidaytype = " STATE CALL TIME HOLIDAY FOUND! ";
}
#Apply call time wide holiday
elsif ( (length($holiday_id)>2) && (length($Sholiday_id)<2) )
{
$stmtA = "SELECT holiday_id,holiday_date,holiday_name,ct_default_start,ct_default_stop from vicidial_call_time_holidays where holiday_id='$holiday_id' and holiday_status='ACTIVE' and holiday_date='$YMD' order by holiday_id;";
$holidaytype = " NO STATE HOLIDAY APPLYING CALL TIME HOLIDAY! ";
}
if ($DBX) {print " |$stmtA|\n";}
$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;
$Sholiday_id = $aryA[0];
$Sholiday_date = $aryA[1];
$Sholiday_name = $aryA[2];
if ( ($Gsct_default_start < $aryA[3]) && ($Gsct_default_stop > 0) ) {$Gsct_default_start = $aryA[3];}
if ( ($Gsct_default_stop > $aryA[4]) && ($Gsct_default_stop > 0) ) {$Gsct_default_stop = $aryA[4];}
if ( ($Gsct_sunday_start < $aryA[3]) && ($Gsct_sunday_stop > 0) ) {$Gsct_sunday_start = $aryA[3];}
if ( ($Gsct_sunday_stop > $aryA[4]) && ($Gsct_sunday_stop > 0) ) {$Gsct_sunday_stop = $aryA[4];}
if ( ($Gsct_monday_start < $aryA[3]) && ($Gsct_monday_stop > 0) ) {$Gsct_monday_start = $aryA[3];}
if ( ($Gsct_monday_stop > $aryA[4]) && ($Gsct_monday_stop > 0) ) {$Gsct_monday_stop = $aryA[4];}
if ( ($Gsct_tuesday_start < $aryA[3]) && ($Gsct_tuesday_stop > 0) ) {$Gsct_tuesday_start = $aryA[3];}
if ( ($Gsct_tuesday_stop > $aryA[4]) && ($Gsct_tuesday_stop > 0) ) {$Gsct_tuesday_stop = $aryA[4];}
if ( ($Gsct_wednesday_start < $aryA[3]) && ($Gsct_wednesday_stop > 0) ) {$Gsct_wednesday_start = $aryA[3];}
if ( ($Gsct_wednesday_stop > $aryA[4]) && ($Gsct_wednesday_stop > 0) ) {$Gsct_wednesday_stop = $aryA[4];}
if ( ($Gsct_thursday_start < $aryA[3]) && ($Gsct_thursday_stop > 0) ) {$Gsct_thursday_start = $aryA[3];}
if ( ($Gsct_thursday_stop > $aryA[4]) && ($Gsct_thursday_stop > 0) ) {$Gsct_thursday_stop = $aryA[4];}
if ( ($Gsct_friday_start < $aryA[3]) && ($Gsct_friday_stop > 0) ) {$Gsct_friday_start = $aryA[3];}
if ( ($Gsct_friday_stop > $aryA[4]) && ($Gsct_friday_stop > 0) ) {$Gsct_friday_stop = $aryA[4];}
if ( ($Gsct_saturday_start < $aryA[3]) && ($Gsct_saturday_stop > 0) ) {$Gsct_saturday_start = $aryA[3];}
if ( ($Gsct_saturday_stop > $aryA[4]) && ($Gsct_saturday_stop > 0) ) {$Gsct_saturday_stop = $aryA[4];}
if ($DB) {print "$holidaytype|$Gstate_call_time_id|$Gstate_call_time_state|$Sholiday_id|$Sholiday_date|$Sholiday_name|$Gsct_default_start|$Gsct_default_stop|\n";}
}
$sthA->finish();
}
### END Check for outbound state holiday ###
$r=0;
$state_gmt='';
while($r < $g)
{
if ($GMT_day[$r]==0) #### Sunday local time
{
if (($Gsct_sunday_start==0) && ($Gsct_sunday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gsct_default_start) && ($GMT_hour[$r]<$Gsct_default_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
else
{
if ( ($GMT_hour[$r]>=$Gsct_sunday_start) && ($GMT_hour[$r]<$Gsct_sunday_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
}
if ($GMT_day[$r]==1) #### Monday local time
{
if (($Gsct_monday_start==0) && ($Gsct_monday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gsct_default_start) && ($GMT_hour[$r]<$Gsct_default_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
else
{
if ( ($GMT_hour[$r]>=$Gsct_monday_start) && ($GMT_hour[$r]<$Gsct_monday_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
}
if ($GMT_day[$r]==2) #### Tuesday local time
{
if (($Gsct_tuesday_start==0) && ($Gsct_tuesday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gsct_default_start) && ($GMT_hour[$r]<$Gsct_default_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
else
{
if ( ($GMT_hour[$r]>=$Gsct_tuesday_start) && ($GMT_hour[$r]<$Gsct_tuesday_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
}
if ($GMT_day[$r]==3) #### Wednesday local time
{
if (($Gsct_wednesday_start==0) && ($Gsct_wednesday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gsct_default_start) && ($GMT_hour[$r]<$Gsct_default_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
else
{
if ( ($GMT_hour[$r]>=$Gsct_wednesday_start) && ($GMT_hour[$r]<$Gsct_wednesday_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
}
if ($GMT_day[$r]==4) #### Thursday local time
{
if (($Gsct_thursday_start==0) && ($Gsct_thursday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gsct_default_start) && ($GMT_hour[$r]<$Gsct_default_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
else
{
if ( ($GMT_hour[$r]>=$Gsct_thursday_start) && ($GMT_hour[$r]<$Gsct_thursday_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
}
if ($GMT_day[$r]==5) #### Friday local time
{
if (($Gsct_friday_start==0) && ($Gsct_friday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gsct_default_start) && ($GMT_hour[$r]<$Gsct_default_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
else
{
if ( ($GMT_hour[$r]>=$Gsct_friday_start) && ($GMT_hour[$r]<$Gsct_friday_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
}
if ($GMT_day[$r]==6) #### Saturday local time
{
if (($Gsct_saturday_start==0) && ($Gsct_saturday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gsct_default_start) && ($GMT_hour[$r]<$Gsct_default_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
else
{
if ( ($GMT_hour[$r]>=$Gsct_saturday_start) && ($GMT_hour[$r]<$Gsct_saturday_stop) )
{$state_gmt.="'$GMT_gmt[$r]',";}
}
}
$r++;
}
$state_gmt = "$state_gmt'99'";
$ct_state_gmt_SQL .= "or (state='$Gstate_call_time_state' && gmt_offset_now IN($state_gmt)) ";
$del_state_gmt_SQL .= "or (state='$Gstate_call_time_state' && gmt_offset_now NOT IN($state_gmt)) ";
}
$b++;
}
if (length($ct_states)>2)
{
$ct_states =~ s/,$//gi;
$ct_statesSQL = "and state NOT IN($ct_states)";
}
else
{
$ct_statesSQL = "";
}
$r=0;
@default_gmt_ARY=@MT;
$dgA=0;
$default_gmt='';
while($r < $g)
{
if ($GMT_day[$r]==0) #### Sunday local time
{
if (($Gct_sunday_start==0) && ($Gct_sunday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gct_default_start) && ($GMT_hour[$r]<$Gct_default_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
else
{
if ( ($GMT_hour[$r]>=$Gct_sunday_start) && ($GMT_hour[$r]<$Gct_sunday_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
}
if ($GMT_day[$r]==1) #### Monday local time
{
if (($Gct_monday_start==0) && ($Gct_monday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gct_default_start) && ($GMT_hour[$r]<$Gct_default_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
else
{
if ( ($GMT_hour[$r]>=$Gct_monday_start) && ($GMT_hour[$r]<$Gct_monday_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
}
if ($GMT_day[$r]==2) #### Tuesday local time
{
if (($Gct_tuesday_start==0) && ($Gct_tuesday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gct_default_start) && ($GMT_hour[$r]<$Gct_default_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
else
{
if ( ($GMT_hour[$r]>=$Gct_tuesday_start) && ($GMT_hour[$r]<$Gct_tuesday_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
}
if ($GMT_day[$r]==3) #### Wednesday local time
{
if (($Gct_wednesday_start==0) && ($Gct_wednesday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gct_default_start) && ($GMT_hour[$r]<$Gct_default_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
else
{
if ( ($GMT_hour[$r]>=$Gct_wednesday_start) && ($GMT_hour[$r]<$Gct_wednesday_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
}
if ($GMT_day[$r]==4) #### Thursday local time
{
if (($Gct_thursday_start==0) && ($Gct_thursday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gct_default_start) && ($GMT_hour[$r]<$Gct_default_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
else
{
if ( ($GMT_hour[$r]>=$Gct_thursday_start) && ($GMT_hour[$r]<$Gct_thursday_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
}
if ($GMT_day[$r]==5) #### Friday local time
{
if (($Gct_friday_start==0) && ($Gct_friday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gct_default_start) && ($GMT_hour[$r]<$Gct_default_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
else
{
if ( ($GMT_hour[$r]>=$Gct_friday_start) && ($GMT_hour[$r]<$Gct_friday_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
}
if ($GMT_day[$r]==6) #### Saturday local time
{
if (($Gct_saturday_start==0) && ($Gct_saturday_stop==0))
{
if ( ($GMT_hour[$r]>=$Gct_default_start) && ($GMT_hour[$r]<$Gct_default_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
else
{
if ( ($GMT_hour[$r]>=$Gct_saturday_start) && ($GMT_hour[$r]<$Gct_saturday_stop) )
{$default_gmt.="'$GMT_gmt[$r]',"; $default_gmt_ARY[$dgA] = "$GMT_gmt[$r]"; $dgA++;}
}
}
$r++;
}
$RETURN_default_gmt = "$default_gmt'99'";
$RETURN_all_gmtSQL = "(gmt_offset_now IN($RETURN_default_gmt) $ct_statesSQL) $ct_state_gmt_SQL";
$RETURN_del_gmtSQL = "(gmt_offset_now NOT IN($RETURN_default_gmt) $ct_statesSQL) $del_state_gmt_SQL";
##### END calculate what gmt_offset_now values are within the allowed local_call_time setting ###
}