From 6046b12e3483545e58c676d5107bb2d99737f1ae Mon Sep 17 00:00:00 2001 From: mattf Date: Fri, 18 Jul 2025 22:38:10 +0000 Subject: [PATCH] Fixes for VERM issues Small update for admin.php version/build git-svn-id: svn://192.168.202.10@3929 3d104415-ff17-0410-8863-d5cf3c621b8a --- agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc | 90 +++++++++ .../trunk/www/VERM/VERM_ANSWERED_DT_rpt.inc | 182 +++++++++++++----- agc_2-X/trunk/www/VERM/VERM_admin.php | 34 +++- .../www/VERM/VERM_custom_form_functions.php | 78 +++++++- agc_2-X/trunk/www/VERM/VERM_custom_report.php | 13 +- agc_2-X/trunk/www/VERM/VERM_global_vars.inc | 3 +- agc_2-X/trunk/www/VERM/VERM_options.php | 4 + .../trunk/www/VERM/VERM_wallboard_widgets.php | 3 +- agc_2-X/trunk/www/VERM/VERM_wallboards.php | 3 +- agc_2-X/trunk/www/vicidial/admin.php | 4 +- 10 files changed, 353 insertions(+), 61 deletions(-) diff --git a/agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc index 4f76ee67..4d3de8e0 100644 --- a/agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc +++ b/agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc @@ -7,6 +7,7 @@ # 220825-1631 - First build # 230106-1304 - Added data flushing for large page outputs # 240801-1130 - Code updates for PHP8 compatibility +# 241001-1803 - Added agent pause code breakdown # # NANQUE, not an unanswered call? @@ -314,6 +315,9 @@ while ($vicidial_user_row=mysqli_fetch_row($vicidial_user_rslt)) } # Do round of calculations for agents logged in +# Store agent pause codes for pause code breakdown +$agent_pause_codes=array(); +$agent_pause_codes_time=array(); foreach ($agent_sessions_array as $user => $sessions) { # Purge agents with no start_hours (this is remote agents) @@ -357,6 +361,13 @@ foreach ($agent_sessions_array as $user => $sessions) $agent_sessions_array["$user"]["$start_event_date"]["billable"]+=$billable_row["total_pause"]; # $campaign_sessions_array["$campaign_id"]["$start_event_date"]["billable"]+=$billable_row["total_pause"]; } + + if (!in_array($sub_status, $agent_pause_codes)) + { + array_push($agent_pause_codes, $sub_status); + } + + $agent_pause_codes_time["$user"]["$sub_status"]+=$billable_row["total_pause"]; } ## GET CALLS, TALK AND WAIT TIME @@ -734,6 +745,7 @@ $CSV_output["agent_pause_detail"]="\""._QXZ("Agent")."\",\""._QXZ("Sessions")."\ $grand_total_duration=0; $grand_total_calls=0; $max_agent_duration=0; +$last_agent_groups=array(); foreach ($agent_sessions_array as $user => $sessions) { $total_calls=array_sum(array_column($sessions,'calls')); @@ -749,6 +761,11 @@ foreach ($agent_sessions_array as $user => $sessions) $total_dispo_time=array_sum(array_column($sessions,'dispo_sec')); $total_ALL_billable_time=($total_talk_time+$total_wait_time+$total_billable_time+$total_dispo_time); + foreach($sessions as $event_date => $session_details) + { + $last_agent_groups["$user"]=$session_details["user_group"]; + } + $average_pause_time=sprintf('%02d', floor(MathZDC($total_pause_time, $total_pauses)/3600)).gmdate(":i:s", round(MathZDC($total_pause_time, $total_pauses))); $total_sessions=count($sessions); $avg_session=sprintf('%02d', floor(MathZDC($total_duration, $total_sessions)/3600)).gmdate(":i:s", round(MathZDC($total_duration, $total_sessions))); @@ -799,6 +816,79 @@ $HTML_output.=""; if (!$download_rpt) {echo $HTML_output; ob_flush(); flush(); $HTML_output="";} ######################################## +######### AGENT PAUSE CODE BREAKDOWN ########### +# print_r($agent_sessions_array); +$HTML_output.="

"._QXZ("Agent Pause Code Breakdown")." $NWB#VERM_AGENTS-pause_detail$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["agent_pause_code_breakdown"]="\""._QXZ("Agent")."\",\""._QXZ("Current User Group")."\",\""._QXZ("Most Recent User Group")."\",\""._QXZ("Login Time")."\",\""._QXZ("Non-Pause")."\",\""._QXZ("Pause")."\""; + +sort($agent_pause_codes); +for ($i=0; $i"; + $CSV_output["agent_pause_code_breakdown"].=",\"".$agent_pause_codes[$i]."\""; + } +$CSV_output["agent_pause_code_breakdown"].="\n"; +$HTML_output.="\n"; + +# sort($agent_pause_codes_time); +ksort($agent_pause_codes_time, SORT_NATURAL | SORT_FLAG_CASE); + +$agent_pause_codes_time["$user"]["$sub_status"]+=$billable_row["total_pause"]; +foreach ($agent_pause_codes_time as $agent => $agent_pause_breakdown) + { + $agentName=($show_full_agent_info ? "$agent - ".$fullname_info["$agent"] : $fullname_info["$agent"]); + $total_pause_time=array_sum(array_column($agent_sessions_array["$agent"],'pause_sec')); + $total_duration=array_sum(array_column($agent_sessions_array["$agent"],'duration')); + $total_pause_His=sprintf('%02d', floor($total_pause_time/3600)).gmdate(":i:s", $total_pause_time); + $total_duration_His=sprintf('%02d', floor($total_duration/3600)).gmdate(":i:s", $total_duration); + $total_nonpause_time=$total_duration-$total_pause_time; + $total_nonpause_His=sprintf('%02d', floor($total_nonpause_time/3600)).gmdate(":i:s", $total_nonpause_time); + + $HTML_output.="\n"; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["agent_pause_code_breakdown"].="\"".$agentName."\",\"".$users_group_info["$agent"]."\",\"".$last_agent_groups["$agent"]."\",\"".$total_duration_His."\",\"".$total_nonpause_His."\",\"".$total_pause_His."\""; + + for ($i=0; $i"; + $CSV_output["agent_pause_code_breakdown"].=",\"".$sub_status_His."\""; + } + +# } + $HTML_output.="\n"; + $CSV_output["agent_pause_code_breakdown"].="\n"; + } + + +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Agent").""._QXZ("Current User Group").""._QXZ("Most Recent User Group").""._QXZ("Login Time").""._QXZ("Non-pause").""._QXZ("Pause")."
".$agentName."".$users_group_info["$agent"]."".$last_agent_groups["$agent"]."".$total_duration_His."".$total_nonpause_His."".$total_pause_His."
"._QXZ("Export as")."...
"; + +if (!$download_rpt) {echo $HTML_output; ob_flush(); flush(); $HTML_output="";} +######################################## + + ######### AGENT AVAILABILITY ########### $HTML_output.="

"._QXZ("Agent availability (for all the campaign/ingroups they are members of)")." $NWB#VERM_AGENTS-agent_availability$NWE

"; # Inbound $HTML_output.="
"; diff --git a/agc_2-X/trunk/www/VERM/VERM_ANSWERED_DT_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_ANSWERED_DT_rpt.inc index 25bf0b8e..8125c1b6 100644 --- a/agc_2-X/trunk/www/VERM/VERM_ANSWERED_DT_rpt.inc +++ b/agc_2-X/trunk/www/VERM/VERM_ANSWERED_DT_rpt.inc @@ -6,6 +6,7 @@ # CHANGELOG: # 220825-1630 - First build # 230106-1307 - Auto download for large data output +# 241003-1236 - Added recording link # if (isset($_GET["page_no"])) {$page_no=$_GET["page_no"];} @@ -97,24 +98,31 @@ if ($DB) {$HTML_output.="$stmt";} $rslt=mysql_to_mysqli($stmt, $link); $total_pages=ceil(mysqli_num_rows($rslt)/20); -$HTML_output.="

"._QXZ("Answered Call Details").": $NWB#VERM_ANSWERED_DT-details$NWE

"; -$HTML_output.="
"; -$HTML_output.=""; -$HTML_output.=""; -# $HTML_output.=""; -$HTML_output.=""; -$HTML_output.=""; -# $HTML_output.=""; -$HTML_output.=""; -$HTML_output.=""; -$HTML_output.=""; -$CSV_output=""; +# Reduce memory usage +if ($download_rpt) + { + $CSV_output=""; + } +else + { + $HTML_output.="

"._QXZ("Answered Call Details").": $NWB#VERM_ANSWERED_DT-details$NWE

"; + $HTML_output.="
"; + $HTML_output.="
|<    <<"; -$HTML_output.="    "; -$HTML_output.=""; -$HTML_output.=" >>    >|"; -$HTML_output.="    "; -$HTML_output.=""; -$HTML_output.="
"; + $HTML_output.=""; + # $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + # $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + } if ($total_calls>$auto_download_limit) { @@ -125,15 +133,27 @@ foreach ($selected_columns as $display_name => $column_name) { if ($display_name!="uniqueid") { - $CSV_output.="\"$display_name\","; - # $HTML_output.=""; - - $HTML_output.="\n"; + if ($download_rpt) + { + $CSV_output.="\"$display_name\","; + } + else + { + # $HTML_output.=""; + $HTML_output.="\n"; + } } } -$CSV_output.="\n"; -$HTML_output.=""; -$HTML_output.=""; +if ($download_rpt) + { + $CSV_output.="\"Link to recording\""; + $CSV_output.="\n"; + } +else + { + $HTML_output.=""; + $HTML_output.=""; + } $output_array=array(); $i=0; @@ -181,9 +201,11 @@ if ($sort_index) # print "***** $sort_index ********\n"; # array_multisort($output_array[$sort_index], SORT_ASC, SORT_STRING); - foreach ($output_array as $sorting_array) { - $sort_array_holder[] = $sorting_array["$sort_index"]; - } + foreach ($output_array as $sorting_array) + { + $sort_array_holder[] = $sorting_array["$sort_index"]; + } + if (preg_match('/ desc$/', $sort_answered_details)) { array_multisort($sort_array_holder,SORT_DESC, SORT_STRING,$output_array); @@ -210,38 +232,61 @@ foreach ($output_array as $data_row) } if ($key!="detail_id") { - $HTML_output.=""; - $CSV_output.="\"".$value."\","; + if ($download_rpt) + { + $CSV_output.="\"".trim($value)."\","; + } + else + { + $HTML_output.=""; + } } else { - $HTML_output.=""; - # $HTML_output.=""; + $asterisk_call_id=GetCallerCode($value); + $recording_array=GetRecording($value); + + if (!$download_rpt) + { + $HTML_output.=""; + # $HTML_output.=""; + } } } - $CSV_output.="\n"; - $HTML_output.=""; + if ($download_rpt) + { + $CSV_output.="\"".$recording_array[1]."\""; + $CSV_output.="\n"; + } + else + { + $HTML_output.="\n"; + } } -$HTML_output.=""; -# $HTML_output.=""; -$HTML_output.=""; -# $HTML_output.=""; -$HTML_output.=""; -# $HTML_output.=""; -$HTML_output.=""; +$output_array=null; # Free up memory just in case -$HTML_output.=""; -$HTML_output.="
|<    <<"; + $HTML_output.="    "; + $HTML_output.=""; + $HTML_output.=" >>    >|"; + $HTML_output.="    "; + $HTML_output.=""; + $HTML_output.="
".$display_name.($column_name==$sort_answered_details_preg ? " $sort_char" : "")."".$display_name.($column_name==$sort_answered_details_preg ? " $sort_char" : "")." 
 
".$value."".$value."\"HELP\"\"HELP\"
|<    <<"; -$HTML_output.="    "; -$HTML_output.=""; -$HTML_output.=""._QXZ("Export as")."...     CSV    "._QXZ("Current page").": $page_no / $total_pages"._QXZ("Export as")."...         "._QXZ("Current page").": $page_no / $total_pages>>    >|"; -$HTML_output.="    "; -$HTML_output.=""; -$HTML_output.="
"; -$HTML_output.=""; -$HTML_output.=""; +if (!$download_rpt) + { + $HTML_output.=""; + # $HTML_output.="|<    <<"; + $HTML_output.=""; + $HTML_output.="    "; + $HTML_output.=""; + $HTML_output.=""; + # $HTML_output.=""._QXZ("Export as")."...     CSV    "._QXZ("Current page").": $page_no / $total_pages"; + $HTML_output.=""._QXZ("Export as")."...         "._QXZ("Current page").": $page_no / $total_pages"; + # $HTML_output.=">>    >|"; + $HTML_output.=""; + $HTML_output.="    "; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + } if ($download_rpt) { @@ -291,7 +336,8 @@ function GetCallerCode($uniqueid) { global $link, $DB; $caller_code=""; - $cc_stmt="select caller_code from vicidial_log_extended where uniqueid='$uniqueid'"; + preg_match('/^[0-9\.]+/', $uniqueid, $uid_values); + $cc_stmt="select caller_code from vicidial_log_extended where uniqueid='$uid_values[0]'"; $cc_rslt=mysqli_query($link, $cc_stmt); $cc_row=mysqli_fetch_array($cc_rslt); $caller_code=$cc_row[0]; @@ -344,4 +390,36 @@ function GetDID($uniqueid) return $did_str; } + +function GetRecording($vicidial_id) + { + global $link, $DB, $search_archived_data, $log_recording_access; + + $rec_str=""; + + $uid_values=explode("|", $vicidial_id); + $u=count($uid_values)-1; # Get the last value, as closer_log uses a different type of ID + $rec_stmt="select filename, location, recording_id, lead_id from recording_log where vicidial_id='$uid_values[$u]'"; + $rec_rslt=mysqli_query($link, $rec_stmt); + $rec_row=mysqli_fetch_array($rec_rslt); + + if ($log_recording_access<1) + {$rec_link = $rec_row["location"];} + else + { + if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') + { + $actual_link = "https://"; + } + else + { + $actual_link = "http://"; + } + $directory=dirname($_SERVER['PHP_SELF']); + $actual_link .= $_SERVER['HTTP_HOST'].$directory."/"; + $rec_link = $actual_link."recording_log_redirect.php?recording_id=".$rec_row["recording_id"]."&lead_id=".$rec_row["lead_id"]."&search_archived_data=$search_archived_data"; + } + + return array("$rec_row[filename]", "$rec_link", "$rec_row[recording_id]", $uid_values[$u]); + } ?> diff --git a/agc_2-X/trunk/www/VERM/VERM_admin.php b/agc_2-X/trunk/www/VERM/VERM_admin.php index b9f0f291..542c4f2d 100644 --- a/agc_2-X/trunk/www/VERM/VERM_admin.php +++ b/agc_2-X/trunk/www/VERM/VERM_admin.php @@ -6,6 +6,7 @@ # CHANGELOG: # 220825-1609 - First build # 240801-1130 - Code updates for PHP8 compatibility +# 241118-1640 - added active agent toggle function # @@ -629,10 +630,19 @@ function LaunchReport(time_period, agent_flag) full_report_var_str+="&vicidial_queue_groups="+vicidial_queue_groups; } - if (agent_flag) + var users_value=$( "input[type=text][id=users]" ).val(); + if (users_value!="") + { + var users=$('#agent_filter_list [value="' + users_value + '"]').data('value'); + alert(users_value); + // full_report_var_str+="&users="+users; + } + + + if (users) { full_report_var_str+="&report_types_to_display=All+reports"; - full_report_var_str+="&users="+agent_flag; + full_report_var_str+="&users="+users; } else { @@ -698,6 +708,7 @@ function LaunchWallboard(wallboard_id) + "; echo ""; echo ""; echo ""._QXZ("Agent report")."$NWB#VERM_admin-agent$NWE
"; +/* echo " "._QXZ("Filtered for agent").":
"; +*/ + if ($toggle_inactive_agents) + { + # echo "
"; + echo "Filter active agents only:
"; + } + + + echo "\n"; + echo "\n"; + $user_stmt="select user, full_name, active from vicidial_users $whereLOGadmin_viewable_groupsSQL order by full_name"; + $user_rslt=mysql_to_mysqli($user_stmt, $link); + while ($user_row=mysqli_fetch_array($user_rslt)) + { + echo "\n"; + echo "