diff --git a/UPGRADE b/UPGRADE index 2a903899..13e126c6 100644 --- a/UPGRADE +++ b/UPGRADE @@ -387,6 +387,10 @@ OTHER CHANGES: 87. Added option for cross-server phone dialplan extensions in System Settings. +88. Added campaign feature to automatically adjust the hopper level to the + dialing rate and the number of active agents, also added a trim feature + to make sure the hopper is not filled too much + diff --git a/bin/AST_VDauto_dial.pl b/bin/AST_VDauto_dial.pl index 785c0d03..3c146833 100644 --- a/bin/AST_VDauto_dial.pl +++ b/bin/AST_VDauto_dial.pl @@ -91,6 +91,7 @@ # 100309-0551 - Added queuemetrics_loginout option # 100327-1359 - Fixed LAGGED issues # 100903-0041 - Changed lead_id max length to 10 digits +# 101111-1556 - Added source to vicidial_hopper inserts # @@ -1549,7 +1550,7 @@ while($one_day_interval > 0) } if ($VD_alt_dnc_count < 1) { - $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25';"; + $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25',source='A';"; $affected_rows = $dbhA->do($stmtA); $event_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &event_logger; } @@ -1627,7 +1628,7 @@ while($one_day_interval > 0) } if ($VD_alt_dnc_count < 1) { - $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20';"; + $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20',source='A';"; $affected_rows = $dbhA->do($stmtA); $event_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &event_logger; } @@ -1745,7 +1746,7 @@ while($one_day_interval > 0) { if ($alt_dial_phones_count == $Xlast) {$Xlast = 'LAST';} - $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15';"; + $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15',source='A';"; $affected_rows = $dbhA->do($stmtA); $event_string = "-- VDH record inserted: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &event_logger; $Xlast=9999999999; @@ -1756,7 +1757,7 @@ while($one_day_interval > 0) { if ($alt_dial_phones_count == $Xlast) {$Xlast = 'LAST';} - $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='DNC',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15';"; + $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='DNC',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15',source='A';"; $affected_rows = $dbhA->do($stmtA); $event_string = "-- VDH record DNC inserted: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &event_logger; $Xlast=9999999999; diff --git a/bin/AST_VDhopper.pl b/bin/AST_VDhopper.pl index fb2774d5..e495fd9c 100644 --- a/bin/AST_VDhopper.pl +++ b/bin/AST_VDhopper.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# AST_VDhopper.pl version 2.2.0 +# AST_VDhopper.pl version 2.4 # # DESCRIPTION: # Updates the VICIDIAL leads hopper for the streamlined @@ -12,6 +12,15 @@ # # It is recommended that you run this program on the local Asterisk machine # +# hopper sources: +# - A = Auto-alt-dial +# - C = Scheduled Callbacks +# - N = Xth New lead order +# - P = Non-Agent API hopper load +# - Q = No-hopper queue insert +# - R = Recycled leads +# - S = Standard hopper load +# # Copyright (C) 2010 Matt Florell LICENSE: AGPLv2 # # CHANGELOG @@ -54,6 +63,7 @@ # 100427-0429 - Fix for list mix no-status-selected issue # 100529-0843 - Changed dialable leads to calculate every run for active campaigns # 100706-2332 - Added ability to purge only one campaign's leads in the hopper +# 101108-1451 - Added ability for the hopper level to be set automatically and remove excess leads from the hopper (MikeC) # # constants @@ -118,6 +128,15 @@ if ($Vmon < 10) {$Vmon = "0$Vmon";} if ($Vmday < 10) {$Vmday = "0$Vmday";} $VDL_one = "$Vyear-$Vmon-$Vmday $Vhour:$Vmin:$Vsec"; +### get date-time of 10 seconds ago ### +$VDL_tensec = ($secX - 10); +($Vsec,$Vmin,$Vhour,$Vmday,$Vmon,$Vyear,$Vwday,$Vyday,$Visdst) = localtime($VDL_one); +$Vyear = ($Vyear + 1900); +$Vmon++; +if ($Vmon < 10) {$Vmon = "0$Vmon";} +if ($Vmday < 10) {$Vmday = "0$Vmday";} +$VDL_tensec = "$Vyear-$Vmon-$Vmday $Vhour:$Vmin:$Vsec"; + ### begin parsing run-time options ### if (length($ARGV[0])>1) { @@ -401,7 +420,7 @@ if ($CBHOLD_count > 0) $event_string = "|CALLBACKS LISTACT|$affected_rows|"; &event_logger; - $stmtA = "INSERT INTO $vicidial_hopper SET lead_id='$CA_lead_id[$CAu]',campaign_id='$CA_campaign_id[$CAu]',list_id='$CA_list_id[$CAu]',gmt_offset_now='$CA_gmt_offset_now[$CAu]',user='',state='$CA_state[$CAu]',priority='50';"; + $stmtA = "INSERT INTO $vicidial_hopper SET lead_id='$CA_lead_id[$CAu]',campaign_id='$CA_campaign_id[$CAu]',list_id='$CA_list_id[$CAu]',gmt_offset_now='$CA_gmt_offset_now[$CAu]',user='',state='$CA_state[$CAu]',priority='50',source='C';"; $affected_rows = $dbhA->do($stmtA); if ($DB) {print "ANYONE Scheduled Callback Inserted into hopper: $affected_rows|$CA_lead_id[$CAu]\n";} $CAu++; @@ -778,11 +797,11 @@ if ($hopper_dnc_count > 0) if ($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 from vicidial_campaigns where campaign_id='$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 from vicidial_campaigns where campaign_id='$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 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 from vicidial_campaigns where active='Y';"; } $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; @@ -811,7 +830,100 @@ while ($sthArows > $rec_count) $drop_lockout_time[$rec_count] = $aryA[14]; $no_hopper_dialing[$rec_count] = $aryA[15]; $auto_alt_dial_statuses[$rec_count] = $aryA[16]; + $dial_timeout[$rec_count] = $aryA[17]; + $auto_hopper_multi[$rec_count] = $aryA[18]; + $use_auto_hopper[$rec_count] = $aryA[19]; + $auto_trim_hopper[$rec_count] = $aryA[20]; + ### Auto Hopper Level + if ( $use_auto_hopper[$rec_count] =~ /Y/) + { + ### Find the number of agents + $stmtB = "SELECT COUNT(*) FROM vicidial_live_agents WHERE campaign_id='$campaign_id[$rec_count]' and status IN ('READY','QUEUE','INCALL','CLOSER') and last_update_time >= '$VDL_tensec'"; + $sthB = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr; + $sthB->execute or die "executing: $stmtB ", $dbhA->errstr; + @aryAgent = $sthB->fetchrow_array; + $num_agents = $aryAgent[0]; + $sthB->finish(); + + $stmtB = "SELECT COUNT(*) FROM vicidial_live_agents WHERE campaign_id='$campaign_id[$rec_count]' and status IN ('PAUSED') and last_update_time >= '$VDL_tensec' and last_state_change >= '$VDL_one'"; + $sthB = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr; + $sthB->execute or die "executing: $stmtB ", $dbhA->errstr; + @aryAgent = $sthB->fetchrow_array; + $num_paused_agents = $aryAgent[0]; + $sthB->finish(); + + ### Make sure the auto hopper multiplier is not set to something stupid + if ( $auto_hopper_multi[$rec_count] <= 0 ) { $auto_hopper_multi[$rec_count] = 0.1; } + + ### Save for debug info + $minimum_hopper_level = $hopper_level[$rec_count]; + + ### Number of calls per minute + $dial_timeout_mult = 60 / $dial_timeout[$rec_count]; + + $auto_hopper_level = roundup( $auto_hopper_multi[$rec_count] * ( $num_agents + $num_paused_agents ) * $auto_dial_level[$rec_count] * $dial_timeout_mult ); + + ### Make sure we are greater than the minimum hopper level + if ( $auto_hopper_level >= $minimum_hopper_level ) + { + $hopper_level[$rec_count] = $auto_hopper_level + } + else + { + $hopper_level[$rec_count] = $minimum_hopper_level; + } + + if ($DB) + { + print "---------------Auto Hopper Level Enabled For $campaign_id[$rec_count]---------------------\n"; + print "Number of Agents = $num_agents\n"; + print "Number of Paused Agents = $num_paused_agents\n"; + print "Auto Dial Level = $auto_dial_level[$rec_count]\n"; + print "Dial Timeout = $dial_timeout[$rec_count]\n"; + print "Dial Timeout Multiplier = $dial_timeout_mult\n"; + print "Auto Hopper Multipier = $auto_hopper_multi[$rec_count]\n"; + print "Minimum Hopper Level = $minimum_hopper_level\n"; + print "Auto Hopper Level Adjustment = $auto_hopper_level\n"; + print "Final Hopper Level = $hopper_level[$rec_count]\n\n"; + } + + $stmtB = "UPDATE vicidial_campaigns set auto_hopper_level = '$auto_hopper_level' where campaign_id='$campaign_id[$rec_count]'"; + $affected_rows = $dbhA->do($stmtB); + } + + ### Auto Trim Hopper code + if ( $auto_trim_hopper[$rec_count] =~ /Y/) + { + if ($DB) { print "---------------Auto Trim Hopper Enabled For $campaign_id[$rec_count]---------------------\n"; } + + $stmtB = "SELECT COUNT(*) FROM vicidial_hopper WHERE campaign_id='$campaign_id[$rec_count]' and status IN ('READY') and source IN('S','N');"; + $sthB = $dbhA->prepare($stmtB) or die "preparing: ",$dbhA->errstr; + $sthB->execute or die "executing: $stmtB ", $dbhA->errstr; + @aryLead = $sthB->fetchrow_array; + $camp_leads = $aryLead[0]; + $sthB->finish(); + + if ($DB) + { + print "Leads in Hopper for this Campaign = $camp_leads\n"; + print "Hopper Level for this Campaign = $hopper_level[$rec_count]\n"; + } + + if ( $camp_leads > ( 2 * $hopper_level[$rec_count] ) ) + { + $num_to_delete = $camp_leads - 2 * $hopper_level[$rec_count]; + $stmtB = "DELETE FROM vicidial_hopper WHERE campaign_id='$campaign_id[$rec_count]' AND source='S' AND status IN ('READY') LIMIT $num_to_delete"; + $affected_rows = $dbhA->do($stmtB); + + if ($DB) + { + print "TOO MANY LEADS IN THE HOPPER ( $camp_leads > 2 * $hopper_level[$rec_count] ). \n"; + print "DELETING $num_to_delete LEADS FROM THE HOPPER. |$affected_rows|\n"; + } + } + if ($DB) { print "\n"; } + } $rec_count++; } $sthA->finish(); @@ -1751,6 +1863,7 @@ foreach(@campaign_id) @REC_status_to_hopper=@MT; @REC_modify_to_hopper=@MT; @REC_user_to_hopper=@MT; + @REC_source_to_hopper=@MT; if ($rec_ct[$i] > 0) { if ($DB) {print " looking for RECYCLE leads, maximum of $hopper_level[$i]\n";} @@ -1773,6 +1886,7 @@ foreach(@campaign_id) $REC_status_to_hopper[$REC_rec_countLEADS] = $aryA[5]; $REC_modify_to_hopper[$REC_rec_countLEADS] = $aryA[6]; $REC_user_to_hopper[$REC_rec_countLEADS] = $aryA[7]; + $REC_source_to_hopper[$REC_rec_countLEADS] = 'R'; if ($DB_show_offset) {print "LEAD_ADD: $aryA[2] $aryA[3] $aryA[4]\n";} $REC_rec_countLEADS++; } @@ -1795,6 +1909,7 @@ foreach(@campaign_id) @NEW_status_to_hopper=@MT; @NEW_modify_to_hopper=@MT; @NEW_user_to_hopper=@MT; + @NEW_source_to_hopper=@MT; if ( ($NEW_count > 0) && ($list_order_mix[$i] =~ /DISABLED/) ) { $NEW_level = int($hopper_level[$i] / $NEW_count); @@ -1817,6 +1932,7 @@ foreach(@campaign_id) $NEW_status_to_hopper[$NEW_rec_countLEADS] = $aryA[5]; $NEW_modify_to_hopper[$NEW_rec_countLEADS] = $aryA[6]; $NEW_user_to_hopper[$NEW_rec_countLEADS] = $aryA[7]; + $NEW_source_to_hopper[$NEW_rec_countLEADS] = 'N'; if ($DB_show_offset) {print "LEAD_ADD: $aryA[2] $aryA[3] $aryA[4]\n";} $NEW_rec_countLEADS++; } @@ -1838,6 +1954,7 @@ foreach(@campaign_id) @status_to_hopper=@MT; @modify_to_hopper=@MT; @user_to_hopper=@MT; + @source_to_hopper=@MT; if ($campaign_leads_to_call[$i] > 0) { if ($DB) {print " lead call order: $order_stmt\n";} @@ -1869,6 +1986,7 @@ foreach(@campaign_id) $status_to_hopper[$rec_countLEADS] = $NEW_status_to_hopper[$NEW_in]; $modify_to_hopper[$rec_countLEADS] = $NEW_modify_to_hopper[$NEW_in]; $user_to_hopper[$rec_countLEADS] = $NEW_user_to_hopper[$NEW_in]; + $source_to_hopper[$rec_countLEADS] = $NEW_source_to_hopper[$NEW_in]; if ($DB_show_offset) {print "LEAD_ADD: $NEW_leads_to_hopper[$NEW_in] $NEW_phone_to_hopper[$NEW_in]\n";} $rec_countLEADS++; $NEW_in++; @@ -1885,6 +2003,7 @@ foreach(@campaign_id) $status_to_hopper[$rec_countLEADS] = $REC_status_to_hopper[$REC_insert_count]; $modify_to_hopper[$rec_countLEADS] = $REC_modify_to_hopper[$REC_insert_count]; $user_to_hopper[$rec_countLEADS] = $REC_user_to_hopper[$REC_insert_count]; + $source_to_hopper[$rec_countLEADS] = $REC_source_to_hopper[$REC_insert_count]; $rec_countLEADS++; $REC_insert_count++; } @@ -1896,6 +2015,7 @@ foreach(@campaign_id) $status_to_hopper[$rec_countLEADS] = $aryA[5]; $modify_to_hopper[$rec_countLEADS] = $aryA[6]; $user_to_hopper[$rec_countLEADS] = $aryA[7]; + $source_to_hopper[$rec_countLEADS] = 'S'; if ($DB_show_offset) {print "LEAD_ADD: $aryA[2] $aryA[3] $aryA[4]\n";} $rec_countLEADS++; $rec_count++; @@ -1983,6 +2103,7 @@ foreach(@campaign_id) $status_to_hopper[$rec_countLEADS] = $REC_status_to_hopper[$REC_insert_count]; $modify_to_hopper[$rec_countLEADS] = $REC_modify_to_hopper[$REC_insert_count]; $user_to_hopper[$rec_countLEADS] = $REC_user_to_hopper[$REC_insert_count]; + $source_to_hopper[$rec_countLEADS] = $REC_source_to_hopper[$REC_insert_count]; $rec_countLEADS++; $REC_insert_count++; } @@ -1994,6 +2115,7 @@ foreach(@campaign_id) $status_to_hopper[$rec_countLEADS] = $aryA[6]; $modify_to_hopper[$rec_countLEADS] = $aryA[7]; $user_to_hopper[$rec_countLEADS] = $aryA[8]; + $source_to_hopper[$rec_countLEADS] = 'S'; if ($DB_show_offset) {print "LEAD_ADD: $aryA[3] $aryA[4] $aryA[5]\n";} if ($DBX) {print " $w|$LM_results[$w]\n";} $rec_countLEADS++; @@ -2012,6 +2134,7 @@ foreach(@campaign_id) $status_to_hopper[$rec_countLEADS] = $REC_status_to_hopper[$REC_insert_count]; $modify_to_hopper[$rec_countLEADS] = $REC_modify_to_hopper[$REC_insert_count]; $user_to_hopper[$rec_countLEADS] = $REC_user_to_hopper[$REC_insert_count]; + $source_to_hopper[$rec_countLEADS] = $REC_source_to_hopper[$REC_insert_count]; $rec_countLEADS++; $REC_insert_count++; } @@ -2118,12 +2241,12 @@ foreach(@campaign_id) { if ($DNClead == '0') { - $stmtA = "INSERT INTO $vicidial_hopper (lead_id,campaign_id,status,user,list_id,gmt_offset_now,state,priority) values('$leads_to_hopper[$h]','$campaign_id[$i]','READY','','$lists_to_hopper[$h]','$gmt_to_hopper[$h]','$state_to_hopper[$h]','0');"; + $stmtA = "INSERT INTO $vicidial_hopper (lead_id,campaign_id,status,user,list_id,gmt_offset_now,state,priority,source) values('$leads_to_hopper[$h]','$campaign_id[$i]','READY','','$lists_to_hopper[$h]','$gmt_to_hopper[$h]','$state_to_hopper[$h]','0','$source_to_hopper[$h]');"; $affected_rows = $dbhA->do($stmtA); if ($DBX) {print "LEAD INSERTED: $affected_rows|$leads_to_hopper[$h]|\n";} if ($DB_detail) { - $detail_string = "|$campaign_id[$i]|$leads_to_hopper[$h]|$phone_to_hopper[$h]|$state_to_hopper[$h]|$gmt_to_hopper[$h]|$status_to_hopper[$h]|$modify_to_hopper[$h]|$user_to_hopper[$h]|"; + $detail_string = "|$campaign_id[$i]|$leads_to_hopper[$h]|$phone_to_hopper[$h]|$state_to_hopper[$h]|$gmt_to_hopper[$h]|$status_to_hopper[$h]|$modify_to_hopper[$h]|$user_to_hopper[$h]|$source_to_hopper[$h]|"; &detail_logger; } } @@ -2132,12 +2255,12 @@ foreach(@campaign_id) ##### Auto-Alt-Dial if DNCC or DNCL are set to campaign auto-alt-dial statuses, insert lead into hopper as DNC status if ( ( ($auto_alt_dial_statuses[$i] =~ / DNCC /) && ($DNCC > 0) ) || ( ($auto_alt_dial_statuses[$i] =~ / DNCL /) && ($DNCL > 0) ) ) { - $stmtA = "INSERT INTO $vicidial_hopper (lead_id,campaign_id,status,user,list_id,gmt_offset_now,state,priority) values('$leads_to_hopper[$h]','$campaign_id[$i]','DNC','','$lists_to_hopper[$h]','$gmt_to_hopper[$h]','$state_to_hopper[$h]','0');"; + $stmtA = "INSERT INTO $vicidial_hopper (lead_id,campaign_id,status,user,list_id,gmt_offset_now,state,priority,source) values('$leads_to_hopper[$h]','$campaign_id[$i]','DNC','','$lists_to_hopper[$h]','$gmt_to_hopper[$h]','$state_to_hopper[$h]','0','$source_to_hopper[$h]');"; $affected_rows = $dbhA->do($stmtA); if ($DBX) {print "LEAD INSERTED AS DNC: $affected_rows|$leads_to_hopper[$h]|\n";} if ($DB_detail) { - $detail_string = "|$campaign_id[$i]|$leads_to_hopper[$h]|$phone_to_hopper[$h]|$state_to_hopper[$h]|$gmt_to_hopper[$h]|$status_to_hopper[$h]|$modify_to_hopper[$h]|$user_to_hopper[$h]|"; + $detail_string = "|$campaign_id[$i]|$leads_to_hopper[$h]|$phone_to_hopper[$h]|$state_to_hopper[$h]|$gmt_to_hopper[$h]|$status_to_hopper[$h]|$modify_to_hopper[$h]|$user_to_hopper[$h]|$source_to_hopper[$h]|"; &detail_logger; } } @@ -2200,3 +2323,9 @@ sub detail_logger } $detail_string=''; } + +sub roundup + { + my $n = shift; + return(($n == int($n)) ? $n : int($n + 1)) + } diff --git a/bin/FastAGI_log.pl b/bin/FastAGI_log.pl index 805ae397..fd2cc5ec 100644 --- a/bin/FastAGI_log.pl +++ b/bin/FastAGI_log.pl @@ -56,6 +56,7 @@ # 100123-1449 - Added double-log end logging # 100224-1229 - Fixed manual dial park call bug # 100903-0041 - Changed lead_id max length to 10 digits +# 101111-1556 - Added source to vicidial_hopper inserts # # defaults for PreFork @@ -1267,7 +1268,7 @@ sub process_request } if ($VD_alt_dnc_count < 1) { - $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25';"; + $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25',source='A';"; $affected_rows = $dbhA->do($stmtA); if ($AGILOG) {$agi_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &agi_output;} } @@ -1347,7 +1348,7 @@ sub process_request } if ($VD_alt_dnc_count < 1) { - $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20';"; + $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20',source='A';"; $affected_rows = $dbhA->do($stmtA); if ($AGILOG) {$agi_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &agi_output;} } @@ -1468,7 +1469,7 @@ sub process_request { if ($alt_dial_phones_count eq '$Xlast') {$Xlast = 'LAST';} - $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15';"; + $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='READY',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15',source='A';"; $affected_rows = $dbhA->do($stmtA); if ($AGILOG) {$agi_string = "-- VDH record inserted: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &agi_output;} $Xlast=9999999999; @@ -1479,7 +1480,7 @@ sub process_request { if ($alt_dial_phones_count eq '$Xlast') {$Xlast = 'LAST';} - $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='DNC',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15';"; + $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='DNC',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15',source='A';"; $affected_rows = $dbhA->do($stmtA); if ($AGILOG) {$agi_string = "-- VDH record DNC inserted: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &agi_output;} $Xlast=9999999999; diff --git a/extras/MySQL_AST_CREATE_tables.sql b/extras/MySQL_AST_CREATE_tables.sql index 28f9813c..0d371bed 100644 --- a/extras/MySQL_AST_CREATE_tables.sql +++ b/extras/MySQL_AST_CREATE_tables.sql @@ -335,6 +335,7 @@ gmt_offset_now DECIMAL(4,2) DEFAULT '0.00', state VARCHAR(2) default '', alt_dial VARCHAR(6) default 'NONE', priority TINYINT(2) default '0', +source VARCHAR(1) default '', index (lead_id) ); @@ -773,7 +774,11 @@ customer_3way_hangup_action ENUM('NONE','DISPO') default 'NONE', ivr_park_call ENUM('DISABLED','ENABLED','ENABLED_PARK_ONLY','ENABLED_BUTTON_HIDDEN') default 'DISABLED', ivr_park_call_agi TEXT, manual_preview_dial ENUM('DISABLED','PREVIEW_AND_SKIP','PREVIEW_ONLY') default 'PREVIEW_AND_SKIP', -realtime_agent_time_stats ENUM('DISABLED','WAIT_CUST_ACW','WAIT_CUST_ACW_PAUSE','CALLS_WAIT_CUST_ACW_PAUSE') default 'CALLS_WAIT_CUST_ACW_PAUSE' +realtime_agent_time_stats ENUM('DISABLED','WAIT_CUST_ACW','WAIT_CUST_ACW_PAUSE','CALLS_WAIT_CUST_ACW_PAUSE') default 'CALLS_WAIT_CUST_ACW_PAUSE', +use_auto_hopper ENUM('Y','N') default 'Y', +auto_hopper_multi VARCHAR(6) default '1', +auto_hopper_level MEDIUMINT(8) UNSIGNED default '0', +auto_trim_hopper ENUM('Y','N') default 'Y' ); CREATE TABLE vicidial_lists ( @@ -2390,7 +2395,7 @@ ALTER TABLE vicidial_agent_log_archive MODIFY agent_log_id INT(9) UNSIGNED NOT N CREATE TABLE vicidial_carrier_log_archive LIKE vicidial_carrier_log; -UPDATE system_settings SET db_schema_version='1251',db_schema_update_date=NOW(); +UPDATE system_settings SET db_schema_version='1252',db_schema_update_date=NOW(); GRANT RELOAD ON *.* TO cron@'%'; GRANT RELOAD ON *.* TO cron@localhost; diff --git a/extras/upgrade_2.4.sql b/extras/upgrade_2.4.sql index 9c82f199..6ac86ff1 100644 --- a/extras/upgrade_2.4.sql +++ b/extras/upgrade_2.4.sql @@ -596,3 +596,12 @@ ALTER TABLE system_settings ADD generate_cross_server_exten ENUM('0','1') defaul ALTER TABLE system_settings ADD queuemetrics_addmember_enabled ENUM('0','1') default '0'; UPDATE system_settings SET db_schema_version='1251',db_schema_update_date=NOW(); + +ALTER TABLE vicidial_campaigns ADD use_auto_hopper ENUM('Y','N') default 'N'; +ALTER TABLE vicidial_campaigns ADD auto_hopper_multi VARCHAR(6) default '1'; +ALTER TABLE vicidial_campaigns ADD auto_hopper_level MEDIUMINT(8) UNSIGNED default '0'; +ALTER TABLE vicidial_campaigns ADD auto_trim_hopper ENUM('Y','N') default 'N'; + +ALTER TABLE vicidial_hopper ADD source VARCHAR(1) default ''; + +UPDATE system_settings SET db_schema_version='1252',db_schema_update_date=NOW(); diff --git a/translations/raw_translation_files/TO_BE_TRANSLATED_2.4.txt b/translations/raw_translation_files/TO_BE_TRANSLATED_2.4.txt index b51ad804..80dbd930 100644 --- a/translations/raw_translation_files/TO_BE_TRANSLATED_2.4.txt +++ b/translations/raw_translation_files/TO_BE_TRANSLATED_2.4.txt @@ -472,6 +472,14 @@ Generate Cross-Server Phone Extensions|| This option if set to 1 will generate dialplan entries for every phone on a multi-server system. Default is 0 for inactive|| QueueMetrics Addmember Enabled|| This option if set to 1 will generate ADDMEMBER2 and REMOVEMEMBER entries in queue_log. Default is 0 for disabled|| +Minimum Hopper Level|| +This is the minimum number of leads the VDhopper script tries to keep in the vicidial_hopper table for this campaign. If running VDhopper script every minute, make this slightly greater than the number of leads you go through in a minute|| +Automatic Hopper Level|| +Setting thing to Y will allow Vicidial to automatically adjust the hopper based off the settings you have in your campaign. The formula it uses to do this is|| +Automatic Hopper Multiplier|| +This is multiplier for the Auto Hopper. Setting this less than 1 will cause the Auto Hopper algorithm to load less leads than it normally would. Setting this greater than 1 will cause the Auto Hopper algorithm to load more leads than it normally would. Default is 1|| +Auto Trim Hopper|| +Setting thing to Y will allow Vicidial to automatically remove excess leads from the hopper. Default is Y|| AST_LISTS_campaign_stats.php diff --git a/www/agc/vdc_db_query.php b/www/agc/vdc_db_query.php index f0133293..4d2c8b9c 100644 --- a/www/agc/vdc_db_query.php +++ b/www/agc/vdc_db_query.php @@ -261,10 +261,11 @@ # 101001-1451 - Added full name display to Call Log functionality # 101022-1243 - Fixed missing variables from start and dispo call urls # 101108-0115 - Added ADDMEMBER option for queue_log +# 101111-1556 - Added source to vicidial_hopper inserts # -$version = '2.4-167'; -$build = '101108-0115'; +$version = '2.4-168'; +$build = '101111-1556'; $mel=1; # Mysql Error Log enabled = 1 $mysql_log_count=352; $one_mysql_log=0; @@ -1750,7 +1751,7 @@ if ($ACTION == 'manDiaLnextCaLL') $state = $row[3]; $entry_list_id = $row[4]; - $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$campaign',status='QUEUE',list_id='$list_id',gmt_offset_now='$gmt_offset_now',state='$state',alt_dial='MAIN',user='$user',priority='0';"; + $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$campaign',status='QUEUE',list_id='$list_id',gmt_offset_now='$gmt_offset_now',state='$state',alt_dial='MAIN',user='$user',priority='0',source='Q';"; if ($DB) {echo "$stmt\n";} $rslt=mysql_query($stmt, $link); if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00244',$user,$server_ip,$session_name,$one_mysql_log);} @@ -3198,7 +3199,7 @@ if ($stage == "end") if ($VD_alt_dnc_count < 1) { ### insert record into vicidial_hopper for alt_phone call attempt - $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$campaign',status='HOLD',list_id='$list_id',gmt_offset_now='$gmt_offset_now',state='$state',alt_dial='ALT',user='',priority='25';"; + $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$campaign',status='HOLD',list_id='$list_id',gmt_offset_now='$gmt_offset_now',state='$state',alt_dial='ALT',user='',priority='25',source='A';"; if ($DB) {echo "$stmt\n";} $rslt=mysql_query($stmt, $link); if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00068',$user,$server_ip,$session_name,$one_mysql_log);} @@ -3275,7 +3276,7 @@ if ($stage == "end") if ($VD_alt_dnc_count < 1) { ### insert record into vicidial_hopper for address3 call attempt - $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$campaign',status='HOLD',list_id='$list_id',gmt_offset_now='$gmt_offset_now',state='$state',alt_dial='ADDR3',user='',priority='20';"; + $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$campaign',status='HOLD',list_id='$list_id',gmt_offset_now='$gmt_offset_now',state='$state',alt_dial='ADDR3',user='',priority='20',source='A';"; if ($DB) {echo "$stmt\n";} $rslt=mysql_query($stmt, $link); if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00072',$user,$server_ip,$session_name,$one_mysql_log);} @@ -3391,7 +3392,7 @@ if ($stage == "end") { if ($alt_dial_phones_count == $Xlast) {$Xlast = 'LAST';} - $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$campaign',status='HOLD',list_id='$EA_list_id',gmt_offset_now='$EA_gmt_offset_now',state='$EA_state',alt_dial='X$Xlast',user='',priority='15';"; + $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$campaign',status='HOLD',list_id='$EA_list_id',gmt_offset_now='$EA_gmt_offset_now',state='$EA_state',alt_dial='X$Xlast',user='',priority='15',source='A';"; if ($DB) {echo "$stmt\n";} $rslt=mysql_query($stmt, $link); if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'00078',$user,$server_ip,$session_name,$one_mysql_log);} diff --git a/www/vicidial/AST_VICIDIAL_hopperlist.php b/www/vicidial/AST_VICIDIAL_hopperlist.php index 559da5ab..fc0bffc4 100644 --- a/www/vicidial/AST_VICIDIAL_hopperlist.php +++ b/www/vicidial/AST_VICIDIAL_hopperlist.php @@ -1,7 +1,7 @@ LICENSE: AGPLv2 +# Copyright (C) 2010 Matt Florell LICENSE: AGPLv2 # # CHANGES # @@ -12,6 +12,7 @@ # 71030-2118 - Added priority to display # 90508-0644 - Changed to PHP long tags # 91023-1540 - Changed to only show hopper status of READY +# 101111-1253 - Added source field # require("dbconnect.php"); @@ -131,11 +132,11 @@ else echo "\n"; echo "---------- LEADS IN HOPPER\n"; - echo "+------+--------+-----------+------------+------------+-------+--------+-------+--------+-------+\n"; - echo "|ORDER |PRIORITY| LEAD ID | LIST ID | PHONE NUM | STATE | STATUS | COUNT | GMT | ALT |\n"; - echo "+------+--------+-----------+------------+------------+-------+--------+-------+--------+-------+\n"; + echo "+------+--------+-----------+------------+------------+-------+--------+-------+--------+-------+-------+\n"; + echo "|ORDER |PRIORITY| LEAD ID | LIST ID | PHONE NUM | STATE | STATUS | COUNT | GMT | ALT | SOURCE|\n"; + echo "+------+--------+-----------+------------+------------+-------+--------+-------+--------+-------+-------+\n"; - $stmt="select vicidial_hopper.lead_id,phone_number,vicidial_hopper.state,vicidial_list.status,called_count,vicidial_hopper.gmt_offset_now,hopper_id,alt_dial,vicidial_hopper.list_id,vicidial_hopper.priority from vicidial_hopper,vicidial_list where vicidial_hopper.campaign_id='" . mysql_real_escape_string($group) . "' and vicidial_hopper.status='READY' and vicidial_hopper.lead_id=vicidial_list.lead_id order by priority desc,hopper_id limit 5000;"; + $stmt="select vicidial_hopper.lead_id,phone_number,vicidial_hopper.state,vicidial_list.status,called_count,vicidial_hopper.gmt_offset_now,hopper_id,alt_dial,vicidial_hopper.list_id,vicidial_hopper.priority,vicidial_hopper.source from vicidial_hopper,vicidial_list where vicidial_hopper.campaign_id='" . mysql_real_escape_string($group) . "' and vicidial_hopper.status='READY' and vicidial_hopper.lead_id=vicidial_list.lead_id order by priority desc,hopper_id limit 5000;"; $rslt=mysql_query($stmt, $link); if ($DB) {echo "$stmt\n";} $users_to_print = mysql_num_rows($rslt); @@ -155,19 +156,30 @@ else $alt_dial = sprintf("%-5s", $row[7]); $list_id = sprintf("%-10s", $row[8]); $priority = sprintf("%-6s", $row[9]); + $source = sprintf("%-5s", $row[10]); if ($DB) {echo "| $FMT_i | $priority | $lead_id | $list_id | $phone_number | $state | $status | $count | $gmt | $hopper_id |\n";} - else {echo "| $FMT_i | $priority | $lead_id | $list_id | $phone_number | $state | $status | $count | $gmt | $alt_dial |\n";} + else {echo "| $FMT_i | $priority | $lead_id | $list_id | $phone_number | $state | $status | $count | $gmt | $alt_dial | $source |\n";} $i++; } - echo "+------+--------+-----------+------------+------------+-------+--------+-------+--------+-------+\n"; + echo "+------+--------+-----------+------------+------------+-------+--------+-------+--------+-------+-------+\n"; } ?> + +Sources: +A = Auto-alt-dial +C = Scheduled Callbacks +N = Xth New lead order +P = Non-Agent API hopper load +Q = No-hopper queue insert +R = Recycled leads +S = Standard hopper load + diff --git a/www/vicidial/AST_timeonVDADall.php b/www/vicidial/AST_timeonVDADall.php index 9dccc9e6..de37e469 100644 --- a/www/vicidial/AST_timeonVDADall.php +++ b/www/vicidial/AST_timeonVDADall.php @@ -69,10 +69,11 @@ # 100912-0839 - Changed several stats to limit to 2 or 3 decimal spaces # 100914-1326 - Added lookup for user_level 7 users to set to reports only which will remove other admin links # 101024-0832 - Added Agent time stats option and agents-in-dispo counter +# 101109-1448 - Added Auto Hopper Level display (MikeC) # -$version = '2.4-60'; -$build = '101024-0832'; +$version = '2.4-61'; +$build = '101109-1448'; header ("Content-type: text/html; charset=utf-8"); @@ -1435,7 +1436,7 @@ else else {$non_inboundSQL = "and campaign_id IN($group_SQL,$closer_campaignsSQL)";} $multi_drop++; - $stmt="select avg(auto_dial_level),min(dial_status_a),min(dial_status_b),min(dial_status_c),min(dial_status_d),min(dial_status_e),min(lead_order),min(lead_filter_id),sum(hopper_level),min(dial_method),avg(adaptive_maximum_level),avg(adaptive_dropped_percentage),avg(adaptive_dl_diff_target),avg(adaptive_intensity),min(available_only_ratio_tally),min(adaptive_latest_server_time),min(local_call_time),avg(dial_timeout),min(dial_statuses),max(agent_pause_codes_active),max(list_order_mix) from vicidial_campaigns where active='Y' $group_SQLand;"; + $stmt="select avg(auto_dial_level),min(dial_status_a),min(dial_status_b),min(dial_status_c),min(dial_status_d),min(dial_status_e),min(lead_order),min(lead_filter_id),sum(hopper_level),min(dial_method),avg(adaptive_maximum_level),avg(adaptive_dropped_percentage),avg(adaptive_dl_diff_target),avg(adaptive_intensity),min(available_only_ratio_tally),min(adaptive_latest_server_time),min(local_call_time),avg(dial_timeout),min(dial_statuses),max(agent_pause_codes_active),max(list_order_mix),max(auto_hopper_level) from vicidial_campaigns where active='Y' $group_SQLand;"; $stmtB="select sum(dialable_leads),sum(calls_today),sum(drops_today),avg(drops_answers_today_pct),avg(differential_onemin),avg(agents_average_onemin),sum(balance_trunk_fill),sum(answers_today),max(status_category_1),sum(status_category_count_1),max(status_category_2),sum(status_category_count_2),max(status_category_3),sum(status_category_count_3),max(status_category_4),sum(status_category_count_4),sum(agent_calls_today),sum(agent_wait_today),sum(agent_custtalk_today),sum(agent_acw_today),sum(agent_pause_today) from vicidial_campaign_stats where calls_today > -1 $non_inboundSQL;"; } @@ -1448,13 +1449,13 @@ else $multi_drop++; if ($DB) {echo "with_inbound|$with_inbound|$campaign_allow_inbound\n";} - $stmt="select auto_dial_level,dial_status_a,dial_status_b,dial_status_c,dial_status_d,dial_status_e,lead_order,lead_filter_id,hopper_level,dial_method,adaptive_maximum_level,adaptive_dropped_percentage,adaptive_dl_diff_target,adaptive_intensity,available_only_ratio_tally,adaptive_latest_server_time,local_call_time,dial_timeout,dial_statuses,agent_pause_codes_active,list_order_mix from vicidial_campaigns where campaign_id IN ($group_SQL,$closer_campaignsSQL);"; + $stmt="select auto_dial_level,dial_status_a,dial_status_b,dial_status_c,dial_status_d,dial_status_e,lead_order,lead_filter_id,hopper_level,dial_method,adaptive_maximum_level,adaptive_dropped_percentage,adaptive_dl_diff_target,adaptive_intensity,available_only_ratio_tally,adaptive_latest_server_time,local_call_time,dial_timeout,dial_statuses,agent_pause_codes_active,list_order_mix,auto_hopper_level from vicidial_campaigns where campaign_id IN ($group_SQL,$closer_campaignsSQL);"; $stmtB="select sum(dialable_leads),sum(calls_today),sum(drops_today),avg(drops_answers_today_pct),avg(differential_onemin),avg(agents_average_onemin),sum(balance_trunk_fill),sum(answers_today),max(status_category_1),sum(status_category_count_1),max(status_category_2),sum(status_category_count_2),max(status_category_3),sum(status_category_count_3),max(status_category_4),sum(status_category_count_4),sum(agent_calls_today),sum(agent_wait_today),sum(agent_custtalk_today),sum(agent_acw_today),sum(agent_pause_today) from vicidial_campaign_stats where campaign_id IN ($group_SQL,$closer_campaignsSQL);"; } else { - $stmt="select avg(auto_dial_level),max(dial_status_a),max(dial_status_b),max(dial_status_c),max(dial_status_d),max(dial_status_e),max(lead_order),max(lead_filter_id),max(hopper_level),max(dial_method),max(adaptive_maximum_level),avg(adaptive_dropped_percentage),avg(adaptive_dl_diff_target),avg(adaptive_intensity),max(available_only_ratio_tally),max(adaptive_latest_server_time),max(local_call_time),max(dial_timeout),max(dial_statuses),max(agent_pause_codes_active),max(list_order_mix) from vicidial_campaigns where campaign_id IN($group_SQL);"; + $stmt="select avg(auto_dial_level),max(dial_status_a),max(dial_status_b),max(dial_status_c),max(dial_status_d),max(dial_status_e),max(lead_order),max(lead_filter_id),max(hopper_level),max(dial_method),max(adaptive_maximum_level),avg(adaptive_dropped_percentage),avg(adaptive_dl_diff_target),avg(adaptive_intensity),max(available_only_ratio_tally),max(adaptive_latest_server_time),max(local_call_time),max(dial_timeout),max(dial_statuses),max(agent_pause_codes_active),max(list_order_mix),max(auto_hopper_level) from vicidial_campaigns where campaign_id IN($group_SQL);"; $stmtB="select sum(dialable_leads),sum(calls_today),sum(drops_today),avg(drops_answers_today_pct),avg(differential_onemin),avg(agents_average_onemin),sum(balance_trunk_fill),sum(answers_today),max(status_category_1),sum(status_category_count_1),max(status_category_2),sum(status_category_count_2),max(status_category_3),sum(status_category_count_3),max(status_category_4),sum(status_category_count_4),sum(agent_calls_today),sum(agent_wait_today),sum(agent_custtalk_today),sum(agent_acw_today),sum(agent_pause_today) from vicidial_campaign_stats where campaign_id IN($group_SQL);"; } @@ -1484,6 +1485,7 @@ else $DIALstatuses = $row[18]; $agent_pause_codes_active = $row[19]; $DIALmix = $row[20]; + $AHOPlev = $row[21]; $stmt="select count(*) from vicidial_hopper $group_SQLwhere;"; @@ -1593,7 +1595,7 @@ else echo ""; echo ""; - echo "HOPPER LEVEL:  $HOPlev     "; + echo "HOPPER ( min/auto ):  $HOPlev / $AHOPlev     "; echo "DROPPED / ANSWERED:  $dropsTODAY / $answersTODAY   "; echo "DL DIFF:  $diffONEMIN     "; echo "STATUSES:  $DIALstatuses     "; diff --git a/www/vicidial/admin.php b/www/vicidial/admin.php index 60d53636..692a3423 100644 --- a/www/vicidial/admin.php +++ b/www/vicidial/admin.php @@ -1488,7 +1488,12 @@ if (isset($_GET["modify_page"])) {$modify_page=$_GET["modify_page"];} elseif (isset($_POST["modify_page"])) {$modify_page=$_POST["modify_page"];} if (isset($_GET["modify_url"])) {$modify_url=$_GET["modify_url"];} elseif (isset($_POST["modify_url"])) {$modify_url=$_POST["modify_url"];} - +if (isset($_GET["use_auto_hopper"])) {$use_auto_hopper=$_GET["use_auto_hopper"];} + elseif (isset($_POST["use_auto_hopper"])) {$use_auto_hopper=$_POST["use_auto_hopper"];} +if (isset($_GET["auto_hopper_multi"])) {$auto_hopper_multi=$_GET["auto_hopper_multi"];} + elseif (isset($_POST["auto_hopper_multi"])) {$auto_hopper_multi=$_POST["auto_hopper_multi"];} +if (isset($_GET["auto_trim_hopper"])) {$auto_trim_hopper=$_GET["auto_trim_hopper"];} + elseif (isset($_POST["auto_trim_hopper"])) {$auto_trim_hopper=$_POST["auto_trim_hopper"];} if (isset($script_id)) {$script_id= strtoupper($script_id);} if (isset($lead_filter_id)) {$lead_filter_id = strtoupper($lead_filter_id);} @@ -1806,6 +1811,8 @@ if ($non_latin < 1) $hold_time_option_no_block = ereg_replace("[^NY]","",$hold_time_option_no_block); $wait_time_option_no_block = ereg_replace("[^NY]","",$wait_time_option_no_block); $preset_hide_number = ereg_replace("[^NY]","",$preset_hide_number); + $use_auto_hopper = ereg_replace("[^NY]","",$use_auto_hopper); + $auto_trim_hopper = ereg_replace("[^NY]","",$auto_trim_hopper); $force_change_password = ereg_replace("[^NY]","",$force_change_password); $first_login_trigger = ereg_replace("[^NY]","",$first_login_trigger); $eht_minimum_prompt_no_block = ereg_replace("[^NY]","",$eht_minimum_prompt_no_block); @@ -1881,6 +1888,7 @@ if ($non_latin < 1) $adaptive_dropped_percentage = ereg_replace("[^\.0-9]","",$adaptive_dropped_percentage); $drop_lockout_time = ereg_replace("[^\.0-9]","",$drop_lockout_time); $filter_server_ip = ereg_replace("[^\.0-9]","",$filter_server_ip); + $auto_hopper_multi = ereg_replace("[^\.0-9]","",$auto_hopper_multi); ### ALPHA-NUMERIC and spaces and hash and star and comma $xferconf_a_dtmf = ereg_replace("[^ \,\*\#0-9a-zA-Z]","",$xferconf_a_dtmf); @@ -2599,11 +2607,13 @@ else # 101008-0349 - Added Estimated Hold Time Minimum options, Manual Dial Preview settings and two new variables for recording filenames # 101022-1427 - Added ability to change user in-group prefs from in-group mod screen, added realtime_agent_time_stats campaign option # 101106-1850 - Added admin refrech, no-cache, cross-server-exten, QM-addmember options +# 101109-1621 - Added Auto Hopper Level which allows Vicidial to adjust the hopper for a campaign as needed (MikeC) +# - Added Auto Trim Hopper which will allow Vicidial to remove excess leads from the hopper (MikeC) # # make sure you have added a user to the vicidial_users MySQL table with at least user_level 8 to access this page the first time -$admin_version = '2.4-286'; -$build = '101106-1850'; +$admin_version = '2.4-287'; +$build = '101109-1621'; $STARTtime = date("U"); $SQLdate = date("Y-m-d H:i:s"); @@ -4141,7 +4151,22 @@ if ($ADD==99999)

- Hopper Level - This is how many leads the VDhopper script tries to keep in the vicidial_hopper table for this campaign. If running VDhopper script every minute, make this slightly greater than the number of leads you go through in a minute. + Minimum Hopper Level - This is the minimum number of leads the VDhopper script tries to keep in the vicidial_hopper table for this campaign. If running VDhopper script every minute, make this slightly greater than the number of leads you go through in a minute. + +
+
+
+ Automatic Hopper Level - Setting thing to Y will allow Vicidial to automatically adjust the hopper based off the settings you have in your campaign. The formula it uses to do this is:
Number of Active Agents * Auto Dial Level * ( 60 seconds / Dial Timeout ) * Auto Hopper Multiplier
Default is Y. + +
+
+
+ Automatic Hopper Multiplier - This is multiplier for the Auto Hopper. Setting this less than 1 will cause the Auto Hopper algorithm to load less leads than it normally would. Setting this greater than 1 will cause the Auto Hopper algorithm to load more leads than it normally would. Default is 1. + +
+
+
+ Auto Trim Hopper - Setting thing to Y will allow Vicidial to automatically remove excess leads from the hopper. Default is Y.
@@ -7823,7 +7848,7 @@ if ($ADD==11) if ($SSoutbound_autodial_active > 0) { echo "Allow Closers: $NWB#vicidial_campaigns-allow_closers$NWE\n"; - echo "Hopper Level: $NWB#vicidial_campaigns-hopper_level$NWE\n"; + echo "Minimum Hopper Level: $NWB#vicidial_campaigns-hopper_level$NWE\n"; echo "Auto Dial Level: $NWB#vicidial_campaigns-drop_lockout_time$NWE\n"; - echo "Hopper Level: $NWB#vicidial_campaigns-hopper_level$NWE\n"; + echo "Minimum Hopper Level: $NWB#vicidial_campaigns-hopper_level$NWE\n"; - echo "Force Reset of Hopper: $NWB#vicidial_campaigns-force_reset_hopper$NWE\n"; + echo "Automatic Hopper Level: $NWB#vicidial_campaigns-use_auto_hopper$NWE\n"; + + echo "Automatic Hopper Multiplier: $NWB#vicidial_campaigns-hopper_level$NWE\n"; + + echo "Auto Trim Hopper: $NWB#vicidial_campaigns-auto_trim_hopper$NWE\n"; + + echo "Force Reset of Hopper: $NWB#vicidial_campaigns-force_reset_hopper$NWE\n"; echo "Dial Method: $NWB#vicidial_campaigns-dial_method$NWE\n"; @@ -20111,7 +20147,7 @@ if ($ADD==34) echo "\n"; echo "$NWB#vicidial_campaigns-lead_filter_id$NWE\n"; - echo "Hopper Level: $NWB#vicidial_campaigns-hopper_level$NWE\n"; + echo "Minimum Hopper Level: $NWB#vicidial_campaigns-hopper_level$NWE\n"; echo "Force Reset of Hopper: $NWB#vicidial_campaigns-force_reset_hopper$NWE\n"; diff --git a/www/vicidial/non_agent_api.php b/www/vicidial/non_agent_api.php index 6be8f1f4..3bb8498e 100644 --- a/www/vicidial/non_agent_api.php +++ b/www/vicidial/non_agent_api.php @@ -37,10 +37,11 @@ # 100723-1333 - Added no_update option to the update_lead function # 100728-1952 - Added delete_lead option to the update_lead function # 100924-1403 - Added called_count as an update_lead option +# 101111-1536 - Added vicidial_hopper.source to vicidial_hopper inserts # -$version = '2.4-23'; -$build = '100924-1403'; +$version = '2.4-24'; +$build = '101111-1536'; require("dbconnect.php"); @@ -1653,7 +1654,7 @@ if ($function == 'add_lead') ### code to insert into hopper goes here ### insert record into vicidial_hopper for alt_phone call attempt - $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$VD_campaign_id',status='READY',list_id='$list_id',gmt_offset_now='$gmt_offset',state='$state',user='',priority='$hopper_priority';"; + $stmt = "INSERT INTO vicidial_hopper SET lead_id='$lead_id',campaign_id='$VD_campaign_id',status='READY',list_id='$list_id',gmt_offset_now='$gmt_offset',state='$state',user='',priority='$hopper_priority',source='P';"; if ($DB>0) {echo "DEBUG: add_lead query - $stmt\n";} $rslt=mysql_query($stmt, $link); $Haffected_rows = mysql_affected_rows($link);