Added daily_phone_number_call_limit campaign setting

git-svn-id: svn://192.168.202.10@3780 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
mattf
2023-11-29 15:57:14 +00:00
parent 5a7c9c9025
commit 8feab5a2ac
12 changed files with 216 additions and 37 deletions
+6
View File
@@ -831,6 +831,12 @@ OTHER CHANGES:
customer. For more information, see the AGENT_3WAY_PRESS-1_CALLS.txt
document.
235. Added HCI Screen and Hopper Hold Inserts to allow for required Human
Intervention on phone calls placed out of a campaign. See the
HCI_Human_Call_Indicator_screen.txt document for more info.
237. Added the Daily Phone Number Call Limit System-wide campaign option
+17 -1
View File
@@ -169,9 +169,10 @@
# 230909-0846 - Added purging of vicidial_khomp_log records older than 7 days
# 230925-1454 - Added -recmon settings
# 231136-2158 - Added hopper_hold_inserts HCI lead reservations clearing for old reservations
# 231129-0849 - Added reset of vicidial_phone_number_call_daily_counts table
#
$build = '231136-2158';
$build = '231129-0849';
$DB=0; # Debug flag
$teodDB=0; # flag to log Timeclock End of Day processes to log file
@@ -1397,6 +1398,21 @@ if ($timeclock_end_of_day_NOW > 0)
if ($DB) {print "|",$aryA[0],"|",$aryA[1],"|",$aryA[2],"|",$aryA[3],"|","\n";}
$sthA->finish();
$stmtA = "delete from vicidial_phone_number_call_daily_counts;";
if($DBX){print STDERR "\n|$stmtA|\n";}
$affected_rows = $dbhA->do($stmtA);
if($DB){print STDERR "\n|$affected_rows vicidial_phone_number_call_daily_counts records deleted|\n";}
if ($teodDB) {$event_string = "vicidial_phone_number_call_daily_counts records reset: $affected_rows"; &teod_logger;}
$stmtA = "optimize table vicidial_phone_number_call_daily_counts;";
if($DBX){print STDERR "\n|$stmtA|\n";}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
@aryA = $sthA->fetchrow_array;
if ($DB) {print "|",$aryA[0],"|",$aryA[1],"|",$aryA[2],"|",$aryA[3],"|","\n";}
$sthA->finish();
$stmtA = "delete from vicidial_agent_dial_campaigns where validate_time < \"$FMSQLdate\";";
if($DBX){print STDERR "\n|$stmtA|\n";}
$affected_rows = $dbhA->do($stmtA);
+8 -1
View File
@@ -156,9 +156,10 @@
# 230215-1534 - Fix for AGENTDIRECT No-Agent Call URL calls, Issue #1396
# 230223-0826 - Fix for enhanced_disconnect_logging=3 issue
# 231116-0911 - Added hopper_hold_inserts option
# 231129-0901 - Added vicidial_phone_number_call_daily_counts updates/inserts
#
$build='231116-0911';
$build='231129-0901';
$script='AST_VDauto_dial';
### begin parsing run-time options ###
if (length($ARGV[0])>1)
@@ -1934,8 +1935,14 @@ while($one_day_interval > 0)
# update daily called counts for this lead
$stmtDC = "INSERT IGNORE INTO vicidial_lead_call_daily_counts SET lead_id='$lead_id',modify_date=NOW(),list_id='$list_id',called_count_total='1',called_count_auto='1' ON DUPLICATE KEY UPDATE modify_date=NOW(),list_id='$list_id',called_count_total=(called_count_total + 1),called_count_auto=(called_count_auto + 1);";
$affected_rowsDC = $dbhA->do($stmtDC);
# update daily called counts for this phone_number
$stmtPDC = "INSERT IGNORE INTO vicidial_phone_number_call_daily_counts SET phone_number='$phone_number',modify_date=NOW(),called_count='1' ON DUPLICATE KEY UPDATE modify_date=NOW(),called_count=(called_count + 1);";
$affected_rowsPDC = $dbhA->do($stmtPDC);
if ($DB) {print "LEAD UPDATE: $affected_rows|$stmtA|\n";}
if ($DB) {print "LEAD CALL COUNT UPDATE: $affected_rowsDC|$stmtDC|\n";}
if ($DB) {print "PHONE CALL COUNT UPDATE: $affected_rowsPDC|$stmtPDC|\n";}
$PADlead_id = sprintf("%010s", $lead_id); while (length($PADlead_id) > 10) {chop($PADlead_id);}
# VmddhhmmssLLLLLLLLLL Set the callerIDname to a unique call_id string
+10
View File
@@ -54,6 +54,7 @@
# 220623-1622 - Added List dial_prefix override
# 230830-1056 - Changed outbound_calls_per_second max to allow up to 1000 CPS
# 231116-0916 - Added hopper_hold_inserts option
# 231129-0905 - Added vicidial_phone_number_call_daily_counts updates/inserts
#
### begin parsing run-time options ###
@@ -930,17 +931,22 @@ while($one_day_interval > 0)
}
# update daily called counts for this lead
$stmtDC = "INSERT IGNORE INTO vicidial_lead_call_daily_counts SET lead_id='$lead_id',modify_date=NOW(),list_id='$PSCBlist_id',called_count_total='1',called_count_auto='1' ON DUPLICATE KEY UPDATE modify_date=NOW(),list_id='$PSCBlist_id',called_count_total=(called_count_total + 1),called_count_auto=(called_count_auto + 1);";
# update daily called counts for this phone_number
$stmtPDC = "INSERT IGNORE INTO vicidial_phone_number_call_daily_counts SET phone_number='$phone_number',modify_date=NOW(),called_count='1' ON DUPLICATE KEY UPDATE modify_date=NOW(),called_count=(called_count + 1);";
if ($staggered < 1)
{
$affected_rows = $dbhA->do($stmtA);
$affected_rowsDC = $dbhA->do($stmtDC);
$affected_rowsPDC = $dbhA->do($stmtPDC);
if ($DB) {print "LEAD UPDATE: $affected_rows|$stmtA|\n";}
if ($DB) {print "LEAD CALL COUNT UPDATE: $affected_rowsDC|$stmtDC|\n";}
if ($DB) {print "PHONE CALL COUNT UPDATE: $affected_rowsPDC|$stmtPDC|\n";}
}
else
{
$vl_updates[$staggered_ct] = $stmtA;
$vdc_updates[$staggered_ct] = $stmtDC;
$vdcp_updates[$staggered_ct] = $stmtPDC;
}
$PADlead_id = sprintf("%010s", $lead_id); while (length($PADlead_id) > 10) {chop($PADlead_id);}
@@ -1433,6 +1439,7 @@ while($one_day_interval > 0)
$TEMP_vac_insert = $vac_inserts[$staggered_fill];
$TEMP_vl_update = $vl_updates[$staggered_fill];
$TEMP_vdc_update = $vdc_updates[$staggered_fill];
$TEMP_vdcp_update = $vdcp_updates[$staggered_fill];
$TEMP_st_logged = $st_logged[$staggered_fill];
$TEMP_vddl_inserts = $vddl_inserts[$staggered_fill];
$TEMP_vltfh_inserts = $vltfh_inserts[$staggered_fill];
@@ -1451,6 +1458,7 @@ while($one_day_interval > 0)
{
$affected_rows_vl = $dbhA->do($TEMP_vl_update);
$affected_rows_vdc = $dbhA->do($TEMP_vdc_update);
$affected_rows_vdcp = $dbhA->do($TEMP_vdcp_update);
$affected_rows_vm = $dbhA->do($TEMP_vm_insert);
$affected_rows_vac = $dbhA->do($TEMP_vac_insert);
$affected_rows_vddl = $dbhA->do($TEMP_vddl_inserts);
@@ -1459,6 +1467,7 @@ while($one_day_interval > 0)
if ($DB) {print "LEAD UPDATE: $affected_rows_vl|$TEMP_vl_update|\n";}
if ($DB) {print "LEAD CALL COUNT UPDATE: $affected_rows_vdc|$TEMP_vdc_update|\n";}
if ($DB) {print "PHONE CALL COUNT UPDATE: $affected_rows_vdcp|$TEMP_vdcp_update|\n";}
if ($DB) {print "VICIDIAL_MANAGER INSERT: $affected_rows_vm|$TEMP_vm_insert|\n";}
if ($DB) {print "VICIDIAL_AUTO_CALLS INSERT: $affected_rows_vac|$TEMP_vac_insert|\n";}
if ($DB) {print "VICIDIAL_DIAL_LOG INSERT: $affected_rows_vddl|$TEMP_vddl_inserts|\n";}
@@ -1492,6 +1501,7 @@ while($one_day_interval > 0)
@vac_inserts=@MT;
@vl_updates=@MT;
@vdc_updates=@MT;
@vdcp_updates=@MT;
@st_logged=@MT;
@vddl_inserts=@MT;
###############################################################################
+28 -3
View File
@@ -109,10 +109,11 @@
# 230428-2017 - Added demographic_quotas code
# 231116-0821 - Added hopper_hold_inserts system and campaign settings options
# 231126-1748 - Added RQUEUE hopper status
# 231129-1051 - Added daily_phone_number_call_limit campaign setting
#
# constants
$build = '231116-0821';
$build = '231129-1051';
$script='AST_VDhopper';
$DB=0; # Debug flag, set to 0 for no debug messages. Can be overriden with CLI --debug flag
$US='__';
@@ -1292,11 +1293,11 @@ $ANY_hopper_vlc_dup_check='N';
if (length($CLIcampaign)>1)
{
$stmtA = "SELECT campaign_id,lead_order,hopper_level,auto_dial_level,local_call_time,lead_filter_id,use_internal_dnc,dial_method,available_only_ratio_tally,adaptive_dropped_percentage,adaptive_maximum_level,dial_statuses,list_order_mix,use_campaign_dnc,drop_lockout_time,no_hopper_dialing,auto_alt_dial_statuses,dial_timeout,auto_hopper_multi,use_auto_hopper,auto_trim_hopper,lead_order_randomize,lead_order_secondary,call_count_limit,hopper_vlc_dup_check,use_other_campaign_dnc,callback_dnc,hopper_drop_run_trigger,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,demographic_quotas,demographic_quotas_container,hopper_hold_inserts from vicidial_campaigns where campaign_id IN('$CLIcampaign');";
$stmtA = "SELECT campaign_id,lead_order,hopper_level,auto_dial_level,local_call_time,lead_filter_id,use_internal_dnc,dial_method,available_only_ratio_tally,adaptive_dropped_percentage,adaptive_maximum_level,dial_statuses,list_order_mix,use_campaign_dnc,drop_lockout_time,no_hopper_dialing,auto_alt_dial_statuses,dial_timeout,auto_hopper_multi,use_auto_hopper,auto_trim_hopper,lead_order_randomize,lead_order_secondary,call_count_limit,hopper_vlc_dup_check,use_other_campaign_dnc,callback_dnc,hopper_drop_run_trigger,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,demographic_quotas,demographic_quotas_container,hopper_hold_inserts,daily_phone_number_call_limit from vicidial_campaigns where campaign_id IN('$CLIcampaign');";
}
else
{
$stmtA = "SELECT campaign_id,lead_order,hopper_level,auto_dial_level,local_call_time,lead_filter_id,use_internal_dnc,dial_method,available_only_ratio_tally,adaptive_dropped_percentage,adaptive_maximum_level,dial_statuses,list_order_mix,use_campaign_dnc,drop_lockout_time,no_hopper_dialing,auto_alt_dial_statuses,dial_timeout,auto_hopper_multi,use_auto_hopper,auto_trim_hopper,lead_order_randomize,lead_order_secondary,call_count_limit,hopper_vlc_dup_check,use_other_campaign_dnc,callback_dnc,hopper_drop_run_trigger,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,demographic_quotas,demographic_quotas_container,hopper_hold_inserts from vicidial_campaigns where active='Y';";
$stmtA = "SELECT campaign_id,lead_order,hopper_level,auto_dial_level,local_call_time,lead_filter_id,use_internal_dnc,dial_method,available_only_ratio_tally,adaptive_dropped_percentage,adaptive_maximum_level,dial_statuses,list_order_mix,use_campaign_dnc,drop_lockout_time,no_hopper_dialing,auto_alt_dial_statuses,dial_timeout,auto_hopper_multi,use_auto_hopper,auto_trim_hopper,lead_order_randomize,lead_order_secondary,call_count_limit,hopper_vlc_dup_check,use_other_campaign_dnc,callback_dnc,hopper_drop_run_trigger,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,demographic_quotas,demographic_quotas_container,hopper_hold_inserts,daily_phone_number_call_limit from vicidial_campaigns where active='Y';";
}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
@@ -1347,6 +1348,7 @@ while ($sthArows > $rec_count)
$demographic_quotasSQL[$rec_count] = '';
$hopper_hold_inserts[$rec_count] = $aryA[36];
if ($SShopper_hold_inserts < 1) {$hopper_hold_inserts[$rec_count] = 'DISABLED';}
$daily_phone_number_call_limit[$rec_count] =$aryA[37];
if ( ($demographic_quotas[$rec_count] =~ /ENABLED|COMPLETE/) && ( (length($demographic_quotas_container[$rec_count]) > 0) && ($demographic_quotas_container[$rec_count] !~ /DISABLED/) ) )
{$demographic_quotasSQL[$rec_count] = "and rank!='-9999'";}
@@ -3555,6 +3557,29 @@ foreach(@campaign_id)
}
}
## Check for system-wide daily call count limit for this phone number
if ( ($SSdaily_call_count_limit > 0) && ($daily_phone_number_call_limit[$i] > 0) )
{
$stmtA="SELECT count(*) FROM vicidial_phone_number_call_daily_counts where phone_number='$phone_to_hopper[$h]' and called_count >= '$daily_phone_number_call_limit[$i]';";
if ($DB) {print " Doing Daily Phone Call Count Check: $phone_to_hopper[$h] - $daily_phone_number_call_limit[$i]\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;
$DCCLlead = $aryA[0];
}
$sthA->finish();
if ($DCCLlead != '0')
{
$DCCL++;
$stmtA = "UPDATE vicidial_list SET called_since_last_reset='Y' where lead_id='$leads_to_hopper[$h]';";
$affected_rows = $dbhA->do($stmtA);
if ($DBX) {print "Flagging DCCLP lead: $affected_rows $leads_to_hopper[$h] ($phone_to_hopper[$h]) \n";}
}
}
## BEGIN Check for 24-Hour call count limit for this lead/phone_number
$passed_24hour_call_count=1;
if ( ($SScall_limit_24hour > 0) && ($call_limit_24hour_method[$i] =~ /PHONE_NUMBER|LEAD/) )
+14 -3
View File
@@ -1,11 +1,12 @@
CALL COUNT LIMITS Started: 2020-11-22 Updated: 2021-07-20
CALL COUNT LIMITS Started: 2020-11-22 Updated: 2023-11-29
This document will go over the various "Call Count Limit" features available within VICIdial, including:
- Lifetime Lead Call Count Limits
- Daily Call Count Limits
- 24-Hour Call Count Limits (added at svn/trunk revision 3484)
- Daily Lead Call Count Limits
- 24-Hour Lead or Phone Number Call Count Limits (added at svn/trunk revision 3484)
- Daily Phone Number Call Count Limits System-wide (added at svn/trunk revision 3780)
@@ -31,6 +32,8 @@ Daily Call Count Limits must be enabled on the "Admin -> System Settings" page(E
There is also another setting on the campaign detail page related to this Daily Call Count Limit feature: Daily Call Limit Manual. If the Daily Call Count Limit is enabled, this setting will determine if manual dial calls will be counted and or restricted in the daily call count limit. The DISABLED option will not count manual dial calls or restrict them as part of the daily call count limits, only auto-dial calls would be counted restricted. If one of the COUNT options is used, then manual dial calls would be included in the daily call counts. If one of the RESTRICT options is used, then manual dial calls would be restricted as part of the daily call count limit. Default of this setting is DISABLED.
Another campaign-level daily call count feature option is a system-wide phone number daily call count limit, which can be enabled on a per-campaign basis. This will count and affect all calls placed from a campaign that it has been enabled on. The daily called counts for each phone number will be across the whole system and will reset at the "Timeclock End of Day" time that is set in System Settings.
NOTE: This feature may conflict with Auto-Alt-Dial features if they are enabled on a campaign.
NOTE: This feature may conflict with Lead Recycling features if they are enabled on a campaign.
NOTE: This feature will not affect ANYONE Scheduled Callbacks, they can be auto-dialed even if the resulting call will go beyond the daily call count limit.
@@ -137,3 +140,11 @@ ALTER TABLE vicidial_campaigns ADD call_limit_24hour_override VARCHAR(40) defaul
ALTER TABLE system_settings ADD call_limit_24hour ENUM('0','1') default '0';
ALTER TABLE system_settings ADD call_limit_24hour_reset DATETIME default '2000-01-01 00:00:01';
ALTER TABLE vicidial_campaigns ADD daily_phone_number_call_limit TINYINT(3) UNSIGNED default '0';
CREATE TABLE vicidial_phone_number_call_daily_counts (
phone_number VARCHAR(18) NOT NULL,
called_count TINYINT(3) UNSIGNED default '0',
modify_date DATETIME,
unique index vpncdc_phone_number (phone_number)
) ENGINE=MyISAM;
@@ -1122,7 +1122,8 @@ dead_stop_recording ENUM('DISABLED','ALL_CALLS','OUTBOUND_ONLY','INBOUND_ONLY','
manual_vm_status_updates ENUM('ENABLED','DISABLED') default 'ENABLED',
force_per_call_notes ENUM('DISABLED','ENABLED','5_CHARACTERS','15_CHARACTERS','30_CHARACTERS','100_CHARACTERS') default 'DISABLED',
agent_search_ingroup_list ENUM('DISABLED','ENABLED','ENABLED_OVERRIDE') default 'DISABLED',
hopper_hold_inserts ENUM('ENABLED','DISABLED') default 'DISABLED'
hopper_hold_inserts ENUM('ENABLED','DISABLED') default 'DISABLED',
daily_phone_number_call_limit TINYINT(3) UNSIGNED default '0'
) ENGINE=MyISAM;
CREATE TABLE vicidial_lists (
@@ -5153,6 +5154,13 @@ campaign_id VARCHAR(8),
index(date)
) ENGINE=MyISAM;
CREATE TABLE vicidial_phone_number_call_daily_counts (
phone_number VARCHAR(18) NOT NULL,
called_count TINYINT(3) UNSIGNED default '0',
modify_date DATETIME,
unique index vpncdc_phone_number (phone_number)
) ENGINE=MyISAM;
ALTER TABLE vicidial_email_list MODIFY message text character set utf8;
@@ -5552,4 +5560,4 @@ INSERT INTO `wallboard_reports` VALUES ('AGENTS_AND_QUEUES','Agents and Queues',
UPDATE system_settings set vdc_agent_api_active='1';
UPDATE system_settings SET db_schema_version='1701',db_schema_update_date=NOW(),reload_timestamp=NOW();
UPDATE system_settings SET db_schema_version='1702',db_schema_update_date=NOW(),reload_timestamp=NOW();
+11
View File
@@ -2553,3 +2553,14 @@ index(date)
) ENGINE=MyISAM;
UPDATE system_settings SET db_schema_version='1701',db_schema_update_date=NOW() where db_schema_version < 1701;
ALTER TABLE vicidial_campaigns ADD daily_phone_number_call_limit TINYINT(3) UNSIGNED default '0';
CREATE TABLE vicidial_phone_number_call_daily_counts (
phone_number VARCHAR(18) NOT NULL,
called_count TINYINT(3) UNSIGNED default '0',
modify_date DATETIME,
unique index vpncdc_phone_number (phone_number)
) ENGINE=MyISAM;
UPDATE system_settings SET db_schema_version='1702',db_schema_update_date=NOW() where db_schema_version < 1702;
+78 -16
View File
@@ -541,10 +541,11 @@
# 230927-2037 - Added agent_search_ingroup_list campaign and agent_search_list ingroup options
# 231108-0819 - Added several fields to update_settings related to manual dial calls
# 231115-1851 - Added allow_vlc_lookup options.php setting
# 231129-1048 - Added daily_phone_number_call_limit campaign setting
#
$version = '2.14-434';
$build = '231115-1851';
$version = '2.14-435';
$build = '231129-1048';
$php_script = 'vdc_db_query.php';
$mel=1; # Mysql Error Log enabled = 1
$mysql_log_count=913;
@@ -2841,7 +2842,7 @@ if ($ACTION == 'manDiaLnextCaLL')
if ($lead_id_defined < 1)
{
##### gather no hopper dialing settings from campaign
$stmt="SELECT no_hopper_dialing,agent_dial_owner_only,local_call_time,dial_statuses,drop_lockout_time,lead_filter_id,lead_order,lead_order_randomize,lead_order_secondary,call_count_limit,next_dial_my_callbacks,callback_list_calltime,callback_hours_block,daily_call_count_limit,daily_limit_manual FROM vicidial_campaigns where campaign_id='$campaign';";
$stmt="SELECT no_hopper_dialing,agent_dial_owner_only,local_call_time,dial_statuses,drop_lockout_time,lead_filter_id,lead_order,lead_order_randomize,lead_order_secondary,call_count_limit,next_dial_my_callbacks,callback_list_calltime,callback_hours_block,daily_call_count_limit,daily_limit_manual,daily_phone_number_call_limit FROM vicidial_campaigns where campaign_id='$campaign';";
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00236',$user,$server_ip,$session_name,$one_mysql_log);}
if ($DB) {echo "$stmt\n";}
@@ -2864,6 +2865,7 @@ if ($ACTION == 'manDiaLnextCaLL')
$callback_hours_block = $row[12];
$daily_call_count_limit = $row[13];
$daily_limit_manual = $row[14];
$daily_phone_number_call_limit = $row[15];
}
if (preg_match("/N/i",$no_hopper_dialing))
{
@@ -4258,7 +4260,7 @@ if ($ACTION == 'manDiaLnextCaLL')
##### BEGIN check for postal_code and phone time zones if alert enabled
$post_phone_time_diff_alert_message='';
$stmt="SELECT post_phone_time_diff_alert,local_call_time,owner_populate,default_xfer_group,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override FROM vicidial_campaigns where campaign_id='$campaign';";
$stmt="SELECT post_phone_time_diff_alert,local_call_time,owner_populate,default_xfer_group,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,daily_phone_number_call_limit FROM vicidial_campaigns where campaign_id='$campaign';";
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00414',$user,$server_ip,$session_name,$one_mysql_log);}
if ($DB) {echo "$stmt\n";}
@@ -4276,6 +4278,7 @@ if ($ACTION == 'manDiaLnextCaLL')
$call_limit_24hour_scope = $row[7];
$call_limit_24hour = $row[8];
$call_limit_24hour_override = $row[9];
$daily_phone_number_call_limit = $row[10];
}
if ( ($post_phone_time_diff_alert == 'ENABLED') or (preg_match("/OUTSIDE_CALLTIME/",$post_phone_time_diff_alert)) )
{
@@ -4362,7 +4365,7 @@ if ($ACTION == 'manDiaLnextCaLL')
##### END check for postal_code and phone time zones if alert enabled
### Daily call count limit check ###
manual_dccl_check($lead_id, $no_hopper_dialing_used, 0);
manual_dccl_check($lead_id, $no_hopper_dialing_used, 0, $agent_dialed_number);
#### BEGIN check for 24-hour call count limit ####
$TFhourSTATE='';
@@ -4484,7 +4487,13 @@ if ($ACTION == 'manDiaLnextCaLL')
$stmtDC = "INSERT IGNORE INTO vicidial_lead_call_daily_counts SET lead_id='$lead_id',modify_date=NOW(),list_id='$list_id',called_count_total='1',called_count_manual='1' ON DUPLICATE KEY UPDATE modify_date=NOW(),list_id='$list_id',called_count_total=(called_count_total + 1),called_count_manual=(called_count_manual + 1);";
if ($DB) {echo "$stmtDC\n";}
$rslt=mysql_to_mysqli($stmtDC, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00840',$user,$server_ip,$session_name,$one_mysql_log);}
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmtDC,'00840',$user,$server_ip,$session_name,$one_mysql_log);}
# update daily called counts for this phone_number
$stmtPDC = "INSERT IGNORE INTO vicidial_phone_number_call_daily_counts SET phone_number='$agent_dialed_number',modify_date=NOW(),called_count='1' ON DUPLICATE KEY UPDATE modify_date=NOW(),called_count=(called_count + 1);";
if ($DB) {echo "$stmtPDC\n";}
$rslt=mysql_to_mysqli($stmtPDC, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmtPDC,'00XXX',$user,$server_ip,$session_name,$one_mysql_log);}
if (!$CBleadIDset)
{
@@ -4553,7 +4562,7 @@ if ($ACTION == 'manDiaLnextCaLL')
if ( (strlen($preview)<1) or ($preview == 'NO') or (strlen($dial_ingroup) > 1) )
{
$use_custom_cid='N';
$stmt = "SELECT use_custom_cid,manual_dial_hopper_check,start_call_url,manual_dial_filter,use_internal_dnc,use_campaign_dnc,use_other_campaign_dnc,cid_group_id,scheduled_callbacks_auto_reschedule,dial_timeout_lead_container,manual_dial_cid,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,cid_group_id_two FROM vicidial_campaigns where campaign_id='$campaign';";
$stmt = "SELECT use_custom_cid,manual_dial_hopper_check,start_call_url,manual_dial_filter,use_internal_dnc,use_campaign_dnc,use_other_campaign_dnc,cid_group_id,scheduled_callbacks_auto_reschedule,dial_timeout_lead_container,manual_dial_cid,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,cid_group_id_two,daily_phone_number_call_limit FROM vicidial_campaigns where campaign_id='$campaign';";
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00313',$user,$server_ip,$session_name,$one_mysql_log);}
if ($DB) {echo "$stmt\n";}
@@ -4579,6 +4588,7 @@ if ($ACTION == 'manDiaLnextCaLL')
$call_limit_24hour = $row[15];
$call_limit_24hour_override = $row[16];
$cid_group_id_two = $row[17];
$daily_phone_number_call_limit = $row[18];
}
### BEGIN check for Dial Timeout Lead Override ###
@@ -6166,7 +6176,7 @@ if ($ACTION == 'manDiaLskip')
$stmtDC = "UPDATE vicidial_lead_call_daily_counts SET modify_date=NOW(),called_count_total=(called_count_total - 1),called_count_manual=(called_count_manual - 1) where lead_id='$lead_id';";
if ($DB) {echo "$stmtDC\n";}
$rslt=mysql_to_mysqli($stmtDC, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00841',$user,$server_ip,$session_name,$one_mysql_log);}
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmtDC,'00841',$user,$server_ip,$session_name,$one_mysql_log);}
### log the skip event
$stmt = "INSERT INTO vicidial_agent_skip_log set campaign_id='$campaign', previous_status='$stage', previous_called_count='$called_count',user='$user', lead_id='$lead_id', event_date=NOW();";
@@ -6241,7 +6251,7 @@ if ($ACTION == 'manDiaLonly')
### check for manual dial filter and extension append settings in campaign
$use_eac=0;
$use_custom_cid='N';
$stmt = "SELECT manual_dial_filter,use_internal_dnc,use_campaign_dnc,use_other_campaign_dnc,extension_appended_cidname,start_call_url,scheduled_callbacks_auto_reschedule,dial_timeout_lead_container,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,custom_one,custom_two,custom_three,custom_four,custom_five FROM vicidial_campaigns where campaign_id='$campaign';";
$stmt = "SELECT manual_dial_filter,use_internal_dnc,use_campaign_dnc,use_other_campaign_dnc,extension_appended_cidname,start_call_url,scheduled_callbacks_auto_reschedule,dial_timeout_lead_container,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,custom_one,custom_two,custom_three,custom_four,custom_five,daily_phone_number_call_limit FROM vicidial_campaigns where campaign_id='$campaign';";
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00325',$user,$server_ip,$session_name,$one_mysql_log);}
if ($DB) {echo "$stmt\n";}
@@ -6268,6 +6278,7 @@ if ($ACTION == 'manDiaLonly')
$camp_custom_three = $row[16];
$camp_custom_four = $row[17];
$camp_custom_five = $row[18];
$daily_phone_number_call_limit = $row[19];
if ($extension_appended_cidname == 'Y')
{$use_eac++;}
}
@@ -6288,7 +6299,7 @@ if ($ACTION == 'manDiaLonly')
{$manual_dial_filter = $VU_manual_dial_filter;}
### Daily call count limit check ###
manual_dccl_check($lead_id, 0, 1);
manual_dccl_check($lead_id, 0, 1, $phone_number);
#### BEGIN check for 24-hour call count limit ####
$TFhourSTATE='';
@@ -8396,7 +8407,7 @@ if ($stage == "end")
if ($auto_dial_level > 0)
{
### check to see if campaign has alt_dial enabled
$stmt="SELECT auto_alt_dial,use_internal_dnc,use_campaign_dnc,use_other_campaign_dnc,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,auto_alt_threshold FROM vicidial_campaigns where campaign_id='$campaign';";
$stmt="SELECT auto_alt_dial,use_internal_dnc,use_campaign_dnc,use_other_campaign_dnc,daily_call_count_limit,daily_limit_manual,call_limit_24hour_method,call_limit_24hour_scope,call_limit_24hour,call_limit_24hour_override,auto_alt_threshold,daily_phone_number_call_limit FROM vicidial_campaigns where campaign_id='$campaign';";
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00064',$user,$server_ip,$session_name,$one_mysql_log);}
if ($DB) {echo "$stmt\n";}
@@ -8415,6 +8426,7 @@ if ($stage == "end")
$call_limit_24hour = $row[8];
$call_limit_24hour_override = $row[9];
$auto_alt_threshold = $row[10];
$daily_phone_number_call_limit = $row[11];
}
else {$auto_alt_dial = 'NONE';}
$alt_lead_done=0;
@@ -14106,7 +14118,7 @@ if ($ACTION == 'updateDISPO')
}
### END Call Notes Logging ###
$stmt="SELECT auto_alt_dial_statuses,use_internal_dnc,use_campaign_dnc,api_manual_dial,use_other_campaign_dnc,call_quota_lead_ranking,daily_call_count_limit,daily_limit_manual from vicidial_campaigns where campaign_id='$campaign';";
$stmt="SELECT auto_alt_dial_statuses,use_internal_dnc,use_campaign_dnc,api_manual_dial,use_other_campaign_dnc,call_quota_lead_ranking,daily_call_count_limit,daily_limit_manual,daily_phone_number_call_limit from vicidial_campaigns where campaign_id='$campaign';";
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00155',$user,$server_ip,$session_name,$one_mysql_log);}
$row=mysqli_fetch_row($rslt);
@@ -14118,6 +14130,7 @@ if ($ACTION == 'updateDISPO')
$call_quota_lead_ranking = $row[5];
$daily_call_count_limit = $row[6];
$daily_limit_manual = $row[7];
$daily_phone_number_call_limit = $row[8];
### BEGIN Call Quota Lead Renking logging ###
@@ -21160,7 +21173,7 @@ function status_group_gather($status_group_id,$record_type)
##### DNC check #####
function manual_dnc_check($temp_phone_number, $temp_no_hopper, $temp_dial_only)
{
global $manual_dial_filter, $use_internal_dnc, $use_campaign_dnc, $campaign, $user, $link, $NOW_TIME, $mel, $server_ip, $session_name, $one_mysql_log, $SSagent_debug_logging, $startMS, $ACTION, $php_script, $stage, $lead_id, $daily_call_count_limit, $daily_limit_manual;
global $manual_dial_filter, $use_internal_dnc, $use_campaign_dnc, $campaign, $user, $link, $NOW_TIME, $mel, $server_ip, $session_name, $one_mysql_log, $SSagent_debug_logging, $startMS, $ACTION, $php_script, $stage, $lead_id, $daily_call_count_limit, $daily_limit_manual, $daily_phone_number_call_limit;
$use_other_campaign_dnc='';
if (strlen($campaign) > 0)
@@ -21430,9 +21443,9 @@ function manual_dnc_check($temp_phone_number, $temp_no_hopper, $temp_dial_only)
##### Daily call count limit check #####
function manual_dccl_check($temp_lead_id, $temp_no_hopper, $temp_dial_only)
function manual_dccl_check($temp_lead_id, $temp_no_hopper, $temp_dial_only, $temp_phone_number)
{
global $manual_dial_filter, $use_internal_dnc, $use_campaign_dnc, $campaign, $user, $link, $NOW_TIME, $mel, $server_ip, $session_name, $one_mysql_log, $SSagent_debug_logging, $startMS, $ACTION, $php_script, $stage, $lead_id, $daily_call_count_limit, $daily_limit_manual, $SSdaily_call_count_limit;
global $manual_dial_filter, $use_internal_dnc, $use_campaign_dnc, $campaign, $user, $link, $NOW_TIME, $mel, $server_ip, $session_name, $one_mysql_log, $SSagent_debug_logging, $startMS, $ACTION, $php_script, $stage, $lead_id, $daily_call_count_limit, $daily_limit_manual, $SSdaily_call_count_limit, $daily_phone_number_call_limit;
# $fp = fopen ("./DCCLdebug_log.txt", "a");
# fwrite ($fp, "$NOW_TIME|1 |$lead_id|$SSdaily_call_count_limit|$daily_call_count_limit|$daily_limit_manual|\n");
@@ -21489,7 +21502,56 @@ function manual_dccl_check($temp_lead_id, $temp_no_hopper, $temp_dial_only)
}
}
}
### END Daily call count limit filtering ###
### BEGIN Daily phone_number call count limit filtering ###
if ( ($SSdaily_call_count_limit > 0) and ($daily_phone_number_call_limit > 0) )
{
$temp_daily_call_count_limit = $daily_phone_number_call_limit;
if ($temp_dial_only > 0) {$temp_daily_call_count_limit = ($daily_phone_number_call_limit + 1);}
$stmt="SELECT called_count FROM vicidial_phone_number_call_daily_counts where phone_number='$temp_phone_number';";
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00XXX',$user,$server_ip,$session_name,$one_mysql_log);}
if ($DB) {echo "$stmt\n";}
$vlcdc_ct = mysqli_num_rows($rslt);
if ($vlcdc_ct > 0)
{
$row=mysqli_fetch_row($rslt);
if ($row[0] >= $temp_daily_call_count_limit)
{
### flag the lead as called
$stmt = "UPDATE vicidial_list set called_since_last_reset='Y' where lead_id='$lead_id';";
if ($DB) {echo "$stmt\n";}
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00XXX',$user,$server_ip,$session_name,$one_mysql_log);}
if ($temp_no_hopper > 0)
{
### reset agent log record
$stmt="UPDATE vicidial_agent_log set lead_id=NULL,comments='' where agent_log_id='$agent_log_id';";
if ($format=='debug') {echo "\n<!-- $stmt -->";}
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00XXX',$user,$server_ip,$session_name,$one_mysql_log);}
echo " NO-HOPPER DAILY PHONE NUMBER CALL LIMIT\nTRY AGAIN\n";
$stage .= "|$agent_log_id|$vla_status|$agent_dialed_type|$agent_dialed_number|";
}
else
{
if ($temp_dial_only)
{
echo " CALL NOT PLACED\nDAILY PHONE NUMBER CALL LIMIT\n";
}
else
{
echo "DAILY PHONE NUMBER CALL LIMIT\n";
}
}
if ($SSagent_debug_logging > 0) {vicidial_ajax_log($NOW_TIME,$startMS,$link,$ACTION,$php_script,$user,$stage,$lead_id,$session_name,$stmt);}
exit;
}
}
}
### END Daily phone_number call count limit filtering ###
}
+18 -3
View File
@@ -728,10 +728,11 @@
# 231108-0820 - Added several fields to update_settings related to manual dial calls
# 231109-0827 - Added 2FA for agent screen logins
# 231115-1618 - Added default_consultative options.php setting
# 231129-0952 - Added phone number daily call limits
#
$version = '2.14-694c';
$build = '231115-1618';
$version = '2.14-695c';
$build = '231129-0952';
$php_script = 'vicidial.php';
$mel=1; # Mysql Error Log enabled = 1
$mysql_log_count=103;
@@ -11908,15 +11909,17 @@ function set_length(SLnumber,SLlength_goal,SLdirection)
var regMNCvar = new RegExp("HOPPER EMPTY","ig");
var regMDFvarDNC = new RegExp("DNC","ig");
var regMDFvarDCCL = new RegExp("DAILY CALL LIMIT","ig");
var regMDFvarDCCLP = new RegExp("DAILY PHONE NUMBER CALL LIMIT","ig");
var regMNHDNCvar = new RegExp("NO-HOPPER DNC","ig");
var regMNHDCCLvar = new RegExp("NO-HOPPER DAILY CALL LIMIT","ig");
var regMNHDCCLPvar = new RegExp("NO-HOPPER DAILY PHONE NUMBER CALL LIMIT","ig");
var regMDFvarCAMP = new RegExp("CAMPLISTS","ig");
var regMDFvarSYS = new RegExp("SYSTEM","ig");
var regMDFvarCB = new RegExp("CALLBACK","ig");
var regMDFvarTIME = new RegExp("OUTSIDE","ig");
var regMDFvarTFH = new RegExp("24-HOUR CALL LIMIT","ig");
var regMDFvarERR = new RegExp("ERROR","ig");
if ( (MDnextCID.match(regMNCvar)) || (MDnextCID.match(regMDFvarDNC)) || (MDnextCID.match(regMDFvarDCCL)) || (MDnextCID.match(regMDFvarCAMP)) || (MDnextCID.match(regMDFvarSYS)) ||(MDnextCID.match(regMDFvarCB)) || (MDnextCID.match(regMDFvarTIME)) || (MDnextCID.match(regMDFvarTFH)) || (MDnextCID.match(regMDFvarERR)) )
if ( (MDnextCID.match(regMNCvar)) || (MDnextCID.match(regMDFvarDNC)) || (MDnextCID.match(regMDFvarDCCL)) || (MDnextCID.match(regMDFvarCAMP)) || (MDnextCID.match(regMDFvarSYS)) ||(MDnextCID.match(regMDFvarCB)) || (MDnextCID.match(regMDFvarTIME)) || (MDnextCID.match(regMDFvarTFH)) || (MDnextCID.match(regMDFvarERR)) || (MDnextCID.match(regMDFvarDCCLP)) || (MDnextCID.match(regMNHDCCLPvar)) )
{
button_click_log = button_click_log + "" + SQLdate + "-----DialNextFailed---" + MDnextCID + " " + "|";
@@ -11947,6 +11950,12 @@ function set_length(SLnumber,SLlength_goal,SLdirection)
alert_displayed=1;
in_lead_preview_state=0;
}
if (MDnextCID.match(regMDFvarDCCLP))
{
alert_box("<?php echo _QXZ("This phone number has exceeded its daily call count limit:"); ?>\n" + mdnPhonENumbeR);
alert_displayed=1;
in_lead_preview_state=0;
}
if (MDnextCID.match(regMDFvarCAMP))
{
alert_box("<?php echo _QXZ("This phone number is not in the campaign lists:"); ?>\n" + mdnPhonENumbeR);
@@ -11996,6 +12005,12 @@ function set_length(SLnumber,SLlength_goal,SLdirection)
alert_displayed=1;
in_lead_preview_state=0;
}
if (MDnextCID.match(regMNHDCCLPvar))
{
alert_box("<?php echo _QXZ("The next lead phone number has exceeded its daily call count limit, please try again:"); ?>\n" + mdnPhonENumbeR);
alert_displayed=1;
in_lead_preview_state=0;
}
if (alert_displayed==0)
{alert_box("<?php echo _QXZ("Unspecified error:"); ?>\n" + mdnPhonENumbeR + "|" + MDnextCID); alert_displayed=1;}
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
# version: 20231119153001
# version: 20231129094101
users-user User ID <QXZ>This field is where you put the users ID number, can be up to 20 digits in length, Must be at least 2 characters in length. We strongly recommend not reusing user accounts for different users, for reporting accuracy. To disable a user account, set the Active option to -N-.</QXZ>
users-pass Password <QXZ>This field is where you put the users password. Must be at least 2 characters in length, unless the User Password Minimum Length system setting is enabled, which will require a longer password. Only letters and numbers are allowed in user passwords. A medium strength user password will be at least 10 characters in length, and a strong user password will be at least 20 characters in length and have letters as well as at least one number. It is recommended that you use a longer password if possible, stringing together several unrelated words with no spaces, and a number somewhere in the string. The maximum size of a password is 100 characters.</QXZ>
users-force_change_password Force Change Password <QXZ>If this option is set to Y then the user will be prompted to change their password the next time they log in to the administration webpage or the agent screen. Default is N.</QXZ>
@@ -158,6 +158,7 @@ campaigns-call_count_limit Call Count Limit <QXZ>This enforces a limit on the nu
campaigns-call_count_target Call Count Target <QXZ>This option is only used for reporting purposes and has no effect on leads dialed. Default is 3.</QXZ>
campaigns-daily_call_count_limit Daily Call Count Limit <QXZ>This feature, if enabled, will limit the number of times a lead can be called in a single day. Once a lead has reached this set limit, if the lead is selected to be dialed again, the called-since-last-reset flag on the lead will be changed to -Y- and the call will not be dialed. If you want to raise this daily limit during the day, you might need to reset your lists to be able to dial the leads that hit the previous limit earlier in the day. This feature may conflict with Auto-Alt-Dial features if they are enabled on a campaign. Default is 0 for disabled.</QXZ>
settings-daily_limit_manual Daily Call Limit Manual <QXZ>If the Daily Call Count Limit is enabled, this setting will determine if manual dial calls will be counted and or restricted in the daily call count limit. The DISABLED option will not count manual dial calls or restrict them as part of the daily call count limits, only auto-dial calls would be counted restricted. If one of the COUNT options is used, then manual dial calls would be included in the daily call counts. If one of the RESTRICT options is used, then manual dial calls would be restricted as part of the daily call count limit. Default is DISABLED.</QXZ>
campaigns-daily_phone_number_call_limit Daily Phone Number Call Limit System-wide <QXZ>This feature, if enabled, will limit the number of times a specific phone number can be called in a single day through this campaign. Once a phone number has reached this set limit, if the lead is selected to be dialed again, the called-since-last-reset flag on the lead will be changed to -Y- and the call will not be dialed. If you want to raise this daily limit during the day, you might need to reset your lists to be able to dial the leads that hit the previous limit earlier in the day. This feature may conflict with Auto-Alt-Dial features if they are enabled on a campaign. Default is 0 for disabled.</QXZ>
campaigns-call_limit_24hour_method 24-Hour Called Count Limit Method <QXZ>This feature will limit the number of calls that can be placed to a lead or phone number over a consecutive 24 hour time period. This setting will determine if the called count limit is based upon a lead or a phone number. Default is DISABLED.</QXZ>
campaigns-call_limit_24hour 24-Hour Called Count Limit <QXZ>If the 24-Hour Called Count Limit Method setting is not disabled, this setting determines the number of calls that can be placed within 24 hours. For example, if this option is set to -1- and a call is placed to a lead at 11:01, then the next time that lead could be called is after 11:01 the next day. There is no manual dial override for this feature, it will affect all normal customer calls placed within this campaign. If you use this feature with Lead Recycling enabled and the 24-Hour call limit is reached for a recycled lead, the recycling count for that lead will reset to 0 after the 24-Hour call count limit time expires. Default is 0.</QXZ>
campaigns-call_limit_24hour_scope 24-Hour Called Count Limit Scope <QXZ>If the 24-Hour Called Count Limit feature is enabled, this setting will determine if the called count limit is counted using system-wide call counts or only the called counts within the lists for this campaign. Default is SYSTEM_WIDE.</QXZ>
@@ -1169,7 +1170,7 @@ settings-inbound_credits Inbound Calls Credits <QXZ>If this setting is enabled,
settings-abandon_check_queue Enable Abandon Check Queue <QXZ>If enabled, this allows you to use the Abandon Check Queue to call back customers that called in to your system but did not talk to an agent. See the details for this feature at the bottom of the INBOUND_CALLBACK_QUEUE.txt document. Default is 0 for disabled.</QXZ>
settings-enable_international_dncs Enable Interational DNCs <QXZ>If enabled, this allows you to create DNC lists for individual countries and provides the option to scrub against these lists when loading lead files.</QXZ>
settings-user_new_lead_limit New Leads Per List Limit <QXZ>This setting enables the new lead limits per list to be set on the list modify page and the user list new lead limit page. This feature will only work properly if the campaign is set to either the MANUAL or INBOUND_MAN Dial Method and No Hopper dialing is enabled. Default is 0 for disabled.</QXZ>
settings-daily_call_count_limit Enable Daily Called Count Limits <QXZ>Enabling this setting will allow you to define a daily called count limit on a per campaign basis. Default is 0 for disabled.</QXZ>
settings-daily_call_count_limit Enable Daily Called Count Limits <QXZ>Enabling this setting will allow you to define a daily called count limit on a per campaign basis by either lead or phone number. Default is 0 for disabled.</QXZ>
settings-call_limit_24hour Enable 24-Hour Called Count Limits <QXZ>Enabling this setting will allow you to define a 24-hour called count limit on a per campaign basis. Default is 0 for disabled.</QXZ>
settings-call_quota_lead_ranking Call Quota Lead Ranking <QXZ>This setting allows you to use the campaign setting for Call Quota Lead Ranking, which allows for a complex set of recycle dialing priorities for non-contact calls. Default is 0 for disabled.</QXZ>
settings-demographic_quotas Demographic Quotas <QXZ>This setting allows you to use the campaign Demographic Quotas feature, which allows for a dialing pattern that is based around a set of demographic types and values with associated quota goals. This feature is not related to Call Quota Lead Ranking and the two features should not be active on any single campaign at the same time. For more information, read the DEMOGRAPHIC_QUOTAS.txt document. Default is 0 for disabled.</QXZ>