diff --git a/agc_2-X/trunk/UPGRADE b/agc_2-X/trunk/UPGRADE
index a558578b..26c3759b 100644
--- a/agc_2-X/trunk/UPGRADE
+++ b/agc_2-X/trunk/UPGRADE
@@ -351,6 +351,8 @@ OTHER CHANGES:
96. Added new 'force_fronter_leave_3way' Agent API function, allowing an API
command to be sent to the fronter of a call to leave-3way their call.
+97. Added List Daily Reset Limit option, only editable by level 9 users.
+
diff --git a/agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl b/agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl
index 902a6c67..df73269f 100644
--- a/agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl
+++ b/agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl
@@ -131,9 +131,10 @@
# 180512-2214 - Added reset of hopper_calls_today
# 180818-2229 - Added rolling of vicidial_recent_ascb_calls records
# 180908-1428 - Added daily rolling of vicidial_ccc_log records
+# 180916-1003 - Added vicidial_lists.resets_today resetting at TEOD, timed reset resets_today verification before reset
#
-$build = '180908-1428';
+$build = '180916-1003';
$DB=0; # Debug flag
$teodDB=0; # flag to log Timeclock End of Day processes to log file
@@ -1168,6 +1169,21 @@ if ($timeclock_end_of_day_NOW > 0)
if ($DB) {print "|",$aryA[0],"|",$aryA[1],"|",$aryA[2],"|",$aryA[3],"|","\n";}
$sthA->finish();
+ $stmtA = "update vicidial_lists SET resets_today=0;";
+ if($DBX){print STDERR "\n|$stmtA|\n";}
+ $affected_rows = $dbhA->do($stmtA);
+ if($DB){print STDERR "\n|$affected_rows vicidial_lists resets counts reset|\n";}
+ if ($teodDB) {$event_string = "vicidial_lists records reset: $affected_rows"; &teod_logger;}
+
+ $stmtA = "optimize table vicidial_lists;";
+ 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 = "update vicidial_campaign_agents SET calls_today=0,hopper_calls_today=0,hopper_calls_hour=0;";
if($DBX){print STDERR "\n|$stmtA|\n";}
$affected_rows = $dbhA->do($stmtA);
@@ -4312,7 +4328,7 @@ if ( ($AST_VDadapt > 0) && ($reset_test =~ /00$/) )
if ($AST_VDadapt > 0)
{
### reset lists if reset time matches
- $stmtA = "SELECT list_id FROM vicidial_lists where reset_time LIKE \"%$reset_test%\";";
+ $stmtA = "SELECT list_id,daily_reset_limit,resets_today FROM vicidial_lists where reset_time LIKE \"%$reset_test%\";";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthBrows=$sthA->rows;
@@ -4320,7 +4336,9 @@ if ($AST_VDadapt > 0)
while ($sthBrows > $i)
{
@aryA = $sthA->fetchrow_array;
- $list_id[$i] = "$aryA[0]";
+ $list_id[$i] = $aryA[0];
+ $daily_reset_limit[$i] = $aryA[1];
+ $resets_today[$i] = $aryA[2];
$i++;
}
$sthA->finish();
@@ -4330,18 +4348,32 @@ if ($AST_VDadapt > 0)
$i=0;
while ($sthBrows > $i)
{
- $stmtA="UPDATE vicidial_list set called_since_last_reset='N' where list_id='$list_id[$i]';";
- $affected_rows = $dbhA->do($stmtA);
+ if ( ($daily_reset_limit[$i] > $resets_today[$i]) || ($daily_reset_limit[$i] < 0) )
+ {
+ $stmtA="UPDATE vicidial_lists set resets_today=(resets_today + 1) where list_id='$list_id[$i]';";
+ $affected_rows = $dbhA->do($stmtA);
- $SQL_log = "$stmtA|";
- $SQL_log =~ s/;|\\|\'|\"//gi;
+ $stmtB="UPDATE vicidial_list set called_since_last_reset='N' where list_id='$list_id[$i]';";
+ $affected_rowsB = $dbhA->do($stmtB);
- if ($DB) {print "DONE\n";}
- if ($DB) {print "$trigger_results\n";}
+ $SQL_log = "$stmtA|$stmtB|";
+ $SQL_log =~ s/;|\\|\'|\"//gi;
+ $resets_today[$i] = ($resets_today[$i] + 1);
- $stmtA="INSERT INTO vicidial_admin_log set event_date='$now_date', user='VDAD', ip_address='1.1.1.1', event_section='LISTS', event_type='RESET', record_id='$list_id[$i]', event_code='ADMIN RESET LIST', event_sql=\"$SQL_log\", event_notes='$affected_rows leads reset';";
- $Iaffected_rows = $dbhA->do($stmtA);
- if ($DB) {print "FINISHED: $affected_rows|$Iaffected_rows|$stmtA";}
+ if ($DB) {print "List Reset DONE: $list_id[$i]($affected_rows)\n";}
+
+ $stmtA="INSERT INTO vicidial_admin_log set event_date='$now_date', user='VDAD', ip_address='1.1.1.1', event_section='LISTS', event_type='RESET', record_id='$list_id[$i]', event_code='ADMIN RESET LIST', event_sql=\"$SQL_log\", event_notes='$affected_rowsB leads reset, list resets today: $resets_today[$i]';";
+ $Iaffected_rows = $dbhA->do($stmtA);
+ if ($DB) {print "FINISHED: $affected_rows|$Iaffected_rows|$stmtA";}
+ }
+ else
+ {
+ if ($DB) {print "List Reset FAILED: $list_id[$i](Reset Limit $daily_reset_limit[$i] / $resets_today[$i])\n";}
+
+ $stmtA="INSERT INTO vicidial_admin_log set event_date='$now_date', user='VDAD', ip_address='1.1.1.1', event_section='LISTS', event_type='RESET', record_id='$list_id[$i]', event_code='ADMIN RESET LIST FAILED', event_sql=\"Reset Limit Reached $daily_reset_limit[$i] / $resets_today[$i]\", event_notes='Reset failed';";
+ $Iaffected_rows = $dbhA->do($stmtA);
+ if ($DB) {print "FINISHED: $affected_rows|$Iaffected_rows|$stmtA";}
+ }
$i++;
}
@@ -4376,7 +4408,6 @@ if ($AST_VDadapt > 0)
$SQL_log =~ s/;|\\|\'|\"//gi;
if ($DB) {print "DONE\n";}
- if ($DB) {print "$trigger_results\n";}
$stmtA="INSERT INTO vicidial_admin_log set event_date='$now_date', user='VDAD', ip_address='1.1.1.1', event_section='LISTS', event_type='MODIFY', record_id='$expired_list_id[$i]', event_code='ADMIN EXPIRED LIST INACTIVE', event_sql=\"$SQL_log\", event_notes='$affected_rows list expired';";
$Iaffected_rows = $dbhA->do($stmtA);
diff --git a/agc_2-X/trunk/docs/NON-AGENT_API.txt b/agc_2-X/trunk/docs/NON-AGENT_API.txt
index f2826260..67a68fee 100644
--- a/agc_2-X/trunk/docs/NON-AGENT_API.txt
+++ b/agc_2-X/trunk/docs/NON-AGENT_API.txt
@@ -1,4 +1,4 @@
-NON-AGENT API DOCUMENT Started: 2008-07-24 Updated: 2018-03-31
+NON-AGENT API DOCUMENT Started: 2008-07-24 Updated: 2018-09-16
This document describes the functions of an API(Application Programming
Interface) for all functions NOT directly relating to the VICIDIAL Agent screen.
@@ -136,6 +136,7 @@ Changes:
180109-1313 - Added call_status_stats function
180208-1655 - Added call_dispo_report function
180331-1716 - Added options to update_campaign, add_user, update_phone. Added function update_did
+180916-1059 - Added check for daily list reset limit
API Functions use the 'function' variable
@@ -1405,6 +1406,7 @@ ERROR: update_list EXPIRATION DATE IS NOT VALID, THIS IS AN OPTIONAL FIELD - 666
NOTICE: update_list NO UPDATES DEFINED - 6666|
SUCCESS: update_list LIST HAS BEEN UPDATED - 6666|1101
NOTICE: update_list LEADS IN LIST HAVE BEEN RESET - 6666|1101|324
+NOTICE: update_list LIST RESET FAILED, daily reset limit reached: 2 / 2 - 6666|1101
NOTICE: update_list USER DOES NOT HAVE PERMISSION TO DELETE LISTS - 6666|0
NOTICE: update_list LIST HAS BEEN DELETED - 6666|1101|1
NOTICE: update_list USER DOES NOT HAVE PERMISSION TO DELETE LEADS - 6666|0
diff --git a/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql b/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql
index d789fea6..a649c9b6 100644
--- a/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql
+++ b/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql
@@ -1042,7 +1042,9 @@ web_form_address_three TEXT,
status_group_id VARCHAR(20) default '',
user_new_lead_limit SMALLINT(5) default '-1',
inbound_list_script_override VARCHAR(20),
-default_xfer_group VARCHAR(20) default '---NONE---'
+default_xfer_group VARCHAR(20) default '---NONE---',
+daily_reset_limit SMALLINT(5) default '-1',
+resets_today SMALLINT(5) UNSIGNED default '0'
) ENGINE=MyISAM;
CREATE TABLE vicidial_statuses (
@@ -4299,4 +4301,4 @@ INSERT INTO vicidial_settings_containers(container_id,container_notes,container_
UPDATE system_settings set vdc_agent_api_active='1';
-UPDATE system_settings SET db_schema_version='1556',db_schema_update_date=NOW(),reload_timestamp=NOW();
+UPDATE system_settings SET db_schema_version='1557',db_schema_update_date=NOW(),reload_timestamp=NOW();
diff --git a/agc_2-X/trunk/extras/upgrade_2.14.sql b/agc_2-X/trunk/extras/upgrade_2.14.sql
index ce8bfc90..39731c42 100644
--- a/agc_2-X/trunk/extras/upgrade_2.14.sql
+++ b/agc_2-X/trunk/extras/upgrade_2.14.sql
@@ -755,3 +755,8 @@ CREATE TABLE vicidial_ccc_log_archive LIKE vicidial_ccc_log;
CREATE UNIQUE INDEX ccc_unq_key on vicidial_ccc_log_archive(uniqueid, call_date, lead_id);
UPDATE system_settings SET db_schema_version='1556',db_schema_update_date=NOW() where db_schema_version < 1556;
+
+ALTER TABLE vicidial_lists ADD daily_reset_limit SMALLINT(5) default '-1';
+ALTER TABLE vicidial_lists ADD resets_today SMALLINT(5) UNSIGNED default '0';
+
+UPDATE system_settings SET db_schema_version='1557',db_schema_update_date=NOW() where db_schema_version < 1557;
diff --git a/agc_2-X/trunk/www/vicidial/admin.php b/agc_2-X/trunk/www/vicidial/admin.php
index 3c641adf..3c7b98e2 100644
--- a/agc_2-X/trunk/www/vicidial/admin.php
+++ b/agc_2-X/trunk/www/vicidial/admin.php
@@ -2407,6 +2407,8 @@ if (isset($_GET["scheduled_callbacks_auto_reschedule"])) {$scheduled_callbacks
elseif (isset($_POST["scheduled_callbacks_auto_reschedule"])) {$scheduled_callbacks_auto_reschedule=$_POST["scheduled_callbacks_auto_reschedule"];}
if (isset($_GET["scheduled_callbacks_timezones_container"])) {$scheduled_callbacks_timezones_container=$_GET["scheduled_callbacks_timezones_container"];}
elseif (isset($_POST["scheduled_callbacks_timezones_container"])) {$scheduled_callbacks_timezones_container=$_POST["scheduled_callbacks_timezones_container"];}
+if (isset($_GET["daily_reset_limit"])) {$daily_reset_limit=$_GET["daily_reset_limit"];}
+ elseif (isset($_POST["daily_reset_limit"])) {$daily_reset_limit=$_POST["daily_reset_limit"];}
if (isset($script_id)) {$script_id= strtoupper($script_id);}
@@ -2844,6 +2846,7 @@ if ($non_latin < 1)
$inbound_no_agents_no_dial_threshold = preg_replace('/[^-0-9]/','',$inbound_no_agents_no_dial_threshold);
$dead_trigger_seconds = preg_replace('/[^-0-9]/','',$dead_trigger_seconds);
$cid_cb_valid_length = preg_replace('/[^-0-9]/','',$cid_cb_valid_length);
+ $daily_reset_limit = preg_replace('/[^-0-9]/','',$daily_reset_limit);
### DIGITS and COLONS
$shift_length = preg_replace('/[^\:0-9]/','',$shift_length);
@@ -4442,12 +4445,13 @@ else
# 180825-2100 - Added scheduled_callbacks_timezones_container campaign setting and timezones display
# 180904-1206 - Added copying of in-group user grades/ranks when copying an in-group
# 180908-1618 - Added force_fronter_leave_3way API function
+# 180916-0824 - Added daily_reset_limit Lists feature(level 9 users only)
#
# make sure you have added a user to the vicidial_users MySQL table with at least user_level 9 to access this page the first time
-$admin_version = '2.14-687a';
-$build = '180908-1618';
+$admin_version = '2.14-688a';
+$build = '180916-0824';
$STARTtime = date("U");
$SQLdate = date("Y-m-d H:i:s");
@@ -15144,9 +15148,13 @@ if ($ADD==411)
if (strlen($reset_time) < 4) {$reset_time='';}
if (strlen($expiration_date) < 10) {$expiration_date='2099-12-31';}
+
+ $daily_reset_limitSQL='';
+ if ($LOGuser_level >= 9) {$daily_reset_limitSQL = ",daily_reset_limit='$daily_reset_limit'";}
+
echo "
"._QXZ("LIST MODIFIED").": $list_id\n";
- $stmt="UPDATE vicidial_lists set list_name='$list_name',campaign_id='$campaign_id',active='$active',list_description='$list_description',list_changedate='$SQLdate',reset_time='$reset_time',agent_script_override='$agent_script_override',inbound_list_script_override='$inbound_list_script_override',campaign_cid_override='$campaign_cid_override',am_message_exten_override='$am_message_exten_override',drop_inbound_group_override='$drop_inbound_group_override',xferconf_a_number='$xferconf_a_number',xferconf_b_number='$xferconf_b_number',xferconf_c_number='$xferconf_c_number',xferconf_d_number='$xferconf_d_number',xferconf_e_number='$xferconf_e_number',web_form_address='" . mysqli_real_escape_string($link, $web_form_address) . "',web_form_address_two='" . mysqli_real_escape_string($link, $web_form_address_two) . "',time_zone_setting='$time_zone_setting',inventory_report='$inventory_report',expiration_date='$expiration_date',na_call_url='" . mysqli_real_escape_string($link, $na_call_url) . "',local_call_time='$local_call_time',web_form_address_three='" . mysqli_real_escape_string($link, $web_form_address_three) . "',status_group_id='$status_group_id',user_new_lead_limit='$user_new_lead_limit',default_xfer_group='$default_xfer_group' where list_id='$list_id';";
+ $stmt="UPDATE vicidial_lists set list_name='$list_name',campaign_id='$campaign_id',active='$active',list_description='$list_description',list_changedate='$SQLdate',reset_time='$reset_time',agent_script_override='$agent_script_override',inbound_list_script_override='$inbound_list_script_override',campaign_cid_override='$campaign_cid_override',am_message_exten_override='$am_message_exten_override',drop_inbound_group_override='$drop_inbound_group_override',xferconf_a_number='$xferconf_a_number',xferconf_b_number='$xferconf_b_number',xferconf_c_number='$xferconf_c_number',xferconf_d_number='$xferconf_d_number',xferconf_e_number='$xferconf_e_number',web_form_address='" . mysqli_real_escape_string($link, $web_form_address) . "',web_form_address_two='" . mysqli_real_escape_string($link, $web_form_address_two) . "',time_zone_setting='$time_zone_setting',inventory_report='$inventory_report',expiration_date='$expiration_date',na_call_url='" . mysqli_real_escape_string($link, $na_call_url) . "',local_call_time='$local_call_time',web_form_address_three='" . mysqli_real_escape_string($link, $web_form_address_three) . "',status_group_id='$status_group_id',user_new_lead_limit='$user_new_lead_limit',default_xfer_group='$default_xfer_group' $daily_reset_limitSQL where list_id='$list_id';";
$rslt=mysql_to_mysqli($stmt, $link);
## QC Addition for Audited Comments
@@ -15164,17 +15172,33 @@ if ($ADD==411)
if ($reset_list == 'Y')
{
- echo "
"._QXZ("RESETTING LIST-CALLED-STATUS")."\n";
- $stmtB="UPDATE vicidial_list set called_since_last_reset='N' where list_id='$list_id';";
- $rslt=mysql_to_mysqli($stmtB, $link);
-
- ### LOG INSERTION Admin Log Table ###
- $SQL_log = "$stmtB|";
- $SQL_log = preg_replace('/;/', '', $SQL_log);
- $SQL_log = addslashes($SQL_log);
- $stmt="INSERT INTO vicidial_admin_log set event_date='$SQLdate', user='$PHP_AUTH_USER', ip_address='$ip', event_section='LISTS', event_type='RESET', record_id='$list_id', event_code='ADMIN RESET LIST', event_sql=\"$SQL_log\", event_notes='';";
- if ($DB) {echo "|$stmt|\n";}
+ $stmt="SELECT daily_reset_limit,resets_today from vicidial_lists where list_id='$list_id';";
$rslt=mysql_to_mysqli($stmt, $link);
+ $row=mysqli_fetch_row($rslt);
+ if ( ($row[0] > $row[1]) or ($row[0] < 0) )
+ {
+ echo "
"._QXZ("RESETTING LIST-CALLED-STATUS")."\n";
+ $stmtB="UPDATE vicidial_lists set resets_today=(resets_today + 1) where list_id='$list_id';";
+ $rslt=mysql_to_mysqli($stmtB, $link);
+
+ $stmtC="UPDATE vicidial_list set called_since_last_reset='N' where list_id='$list_id';";
+ $rslt=mysql_to_mysqli($stmtC, $link);
+ $affected_rowsC = mysqli_affected_rows($link);
+
+ $row[1] = ($row[1] + 1);
+
+ ### LOG INSERTION Admin Log Table ###
+ $SQL_log = "$stmtB|$stmtC|";
+ $SQL_log = preg_replace('/;/', '', $SQL_log);
+ $SQL_log = addslashes($SQL_log);
+ $stmt="INSERT INTO vicidial_admin_log set event_date='$SQLdate', user='$PHP_AUTH_USER', ip_address='$ip', event_section='LISTS', event_type='RESET', record_id='$list_id', event_code='ADMIN RESET LIST', event_sql=\"$SQL_log\", event_notes='leads reset: $affected_rowsC list resets today: $row[1] limit: $row[0]';";
+ if ($DB) {echo "|$stmt|\n";}
+ $rslt=mysql_to_mysqli($stmt, $link);
+ }
+ else
+ {
+ echo "
"._QXZ("CANNOT RESET LIST, LIMIT REACHED").": $row[0] / $row[1]\n";
+ }
}
if ($campaign_id != "$old_campaign_id")
{
@@ -26323,7 +26347,7 @@ if ($ADD==311)
}
}
- $stmt="SELECT vicidial_lists.list_id,list_name,campaign_id,active,list_description,list_changedate,list_lastcalldate,reset_time,agent_script_override,campaign_cid_override,am_message_exten_override,drop_inbound_group_override,xferconf_a_number,xferconf_b_number,xferconf_c_number,xferconf_d_number,xferconf_e_number,web_form_address,web_form_address_two,time_zone_setting,inventory_report,IFNULL(audit_comments,0),expiration_date,DATE_FORMAT(expiration_date,'%Y%m%d'),na_call_url,local_call_time,web_form_address_three,status_group_id,user_new_lead_limit,inbound_list_script_override,default_xfer_group from vicidial_lists left outer join vicidial_lists_custom on vicidial_lists.list_id=vicidial_lists_custom.list_id where vicidial_lists.list_id='$list_id' $LOGallowed_campaignsSQL;";
+ $stmt="SELECT vicidial_lists.list_id,list_name,campaign_id,active,list_description,list_changedate,list_lastcalldate,reset_time,agent_script_override,campaign_cid_override,am_message_exten_override,drop_inbound_group_override,xferconf_a_number,xferconf_b_number,xferconf_c_number,xferconf_d_number,xferconf_e_number,web_form_address,web_form_address_two,time_zone_setting,inventory_report,IFNULL(audit_comments,0),expiration_date,DATE_FORMAT(expiration_date,'%Y%m%d'),na_call_url,local_call_time,web_form_address_three,status_group_id,user_new_lead_limit,inbound_list_script_override,default_xfer_group,daily_reset_limit,resets_today from vicidial_lists left outer join vicidial_lists_custom on vicidial_lists.list_id=vicidial_lists_custom.list_id where vicidial_lists.list_id='$list_id' $LOGallowed_campaignsSQL;";
$rslt=mysql_to_mysqli($stmt, $link);
if ($DB) {echo "$stmt\n";}
@@ -26358,6 +26382,8 @@ if ($ADD==311)
$user_new_lead_limit = $row[28];
$inbound_list_script_override = $row[29];
$default_xfer_group = $row[30];
+ $daily_reset_limit = $row[31];
+ $resets_today = $row[32];
# grab names of global statuses and statuses in the selected campaign
$stmt="SELECT status,status_name,selectable,human_answered,category,sale,dnc,customer_contact,not_interested,unworkable,scheduled_callback,completed,min_sec,max_sec,answering_machine from vicidial_statuses order by status;";
@@ -26457,6 +26483,17 @@ if ($ADD==311)
echo "