From 7dd071f9917b09a962bc06d7b390e345aa98b49b Mon Sep 17 00:00:00 2001 From: mattf Date: Sun, 16 Sep 2018 15:11:54 +0000 Subject: [PATCH] Added daily_reset_limit Lists feature(editable by level 9 users only) git-svn-id: svn://192.168.202.10@3032 3d104415-ff17-0410-8863-d5cf3c621b8a --- agc_2-X/trunk/UPGRADE | 2 + agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl | 57 +++++++--- agc_2-X/trunk/docs/NON-AGENT_API.txt | 4 +- .../trunk/extras/MySQL_AST_CREATE_tables.sql | 6 +- agc_2-X/trunk/extras/upgrade_2.14.sql | 5 + agc_2-X/trunk/www/vicidial/admin.php | 65 ++++++++--- .../trunk/www/vicidial/help_documentation.txt | 5 +- agc_2-X/trunk/www/vicidial/non_agent_api.php | 63 +++++++---- .../www/vicidial/reset_campaign_lists.php | 107 +++++++++++------- 9 files changed, 222 insertions(+), 92 deletions(-) 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 ""._QXZ("Reset Lead-Called-Status for this list").": $NWB#lists-reset_list$NWE\n"; echo ""._QXZ("Reset Times").": $NWB#lists-reset_time$NWE\n"; + if ($LOGuser_level >= 9) + { + echo ""._QXZ("Daily Reset Limit").":   "._QXZ("Resets Today").": $resets_today   $NWB#lists-daily_reset_limit$NWE\n"; + } + else + { + $daily_reset_limitTEXT = $daily_reset_limit; + if ($daily_reset_limit < 0) {$daily_reset_limitTEXT=_QXZ("none");} + echo ""._QXZ("Daily Reset Limit").": $daily_reset_limitTEXT   "._QXZ("Resets Today").": $resets_today   $NWB#lists-daily_reset_limit$NWE\n"; + } + echo ""._QXZ("Expiration Date").": \n"; echo "