From c9b3722ba132577b7b1cb214378c5f7c810505ca Mon Sep 17 00:00:00 2001 From: mattf Date: Mon, 29 Aug 2022 14:43:30 +0000 Subject: [PATCH] Added testing code for VERM(VICIdial Enhanced Reporting Module) git-svn-id: svn://192.168.202.10@3627 3d104415-ff17-0410-8863-d5cf3c621b8a --- .../trunk/extras/MySQL_AST_CREATE_tables.sql | 48 +- agc_2-X/trunk/extras/upgrade_2.14.sql | 49 + agc_2-X/trunk/install.pl | 10 +- agc_2-X/trunk/www/VERM/VERM_AGENTS_DT_rpt.inc | 515 ++++ agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc | 1591 +++++++++++ .../trunk/www/VERM/VERM_AJAX_functions.php | 98 + .../trunk/www/VERM/VERM_ANSWERED_DT_rpt.inc | 340 +++ agc_2-X/trunk/www/VERM/VERM_ANSWERED_rpt.inc | 1437 ++++++++++ agc_2-X/trunk/www/VERM/VERM_AREA_rpt.inc | 299 ++ agc_2-X/trunk/www/VERM/VERM_ATT_rpt.inc | 243 ++ agc_2-X/trunk/www/VERM/VERM_CALLS_rpt.inc | 557 ++++ agc_2-X/trunk/www/VERM/VERM_DAY_rpt.inc | 684 +++++ agc_2-X/trunk/www/VERM/VERM_DOW_rpt.inc | 964 +++++++ agc_2-X/trunk/www/VERM/VERM_HOUR_rpt.inc | 977 +++++++ agc_2-X/trunk/www/VERM/VERM_IVR_rpt.inc | 729 +++++ .../www/VERM/VERM_IVR_survey_details.inc | 150 + agc_2-X/trunk/www/VERM/VERM_OUTCOMES_rpt.inc | 921 ++++++ agc_2-X/trunk/www/VERM/VERM_STATS_rpt.inc | 804 ++++++ .../trunk/www/VERM/VERM_UNANSWERED_DT_rpt.inc | 390 +++ .../trunk/www/VERM/VERM_UNANSWERED_rpt.inc | 2262 +++++++++++++++ agc_2-X/trunk/www/VERM/VERM_admin.php | 894 ++++++ .../www/VERM/VERM_custom_form_functions.php | 380 +++ agc_2-X/trunk/www/VERM/VERM_custom_report.php | 1174 ++++++++ agc_2-X/trunk/www/VERM/VERM_functions.js | 267 ++ agc_2-X/trunk/www/VERM/VERM_global_vars.inc | 461 +++ agc_2-X/trunk/www/VERM/VERM_header.inc | 366 +++ .../trunk/www/VERM/VERM_main_report_page.php | 1280 +++++++++ agc_2-X/trunk/www/VERM/VERM_options.php | 205 ++ agc_2-X/trunk/www/VERM/VERM_stylesheet.php | 460 +++ .../www/VERM/VERM_wallboard_stylesheet.php | 355 +++ .../trunk/www/VERM/VERM_wallboard_widgets.php | 1377 +++++++++ agc_2-X/trunk/www/VERM/VERM_wallboards.php | 1568 ++++++++++ agc_2-X/trunk/www/VERM/calendar.css | 95 + agc_2-X/trunk/www/VERM/calendar_db.js | 341 +++ agc_2-X/trunk/www/VERM/dbconnect_mysqli.php | 101 + .../trunk/www/VERM/display_agent_details.php | 647 +++++ .../trunk/www/VERM/display_call_details.php | 243 ++ agc_2-X/trunk/www/VERM/display_help.php | 175 ++ .../www/VERM/display_outcomes_details.php | 766 +++++ agc_2-X/trunk/www/VERM/functions.php | 2516 +++++++++++++++++ agc_2-X/trunk/www/VERM/help.js | 84 + agc_2-X/trunk/www/VERM/help.png | Bin 0 -> 1167 bytes agc_2-X/trunk/www/VERM/help_documentation.txt | 143 + agc_2-X/trunk/www/VERM/images/cal.gif | Bin 0 -> 127 bytes agc_2-X/trunk/www/VERM/images/icon_admin.png | Bin 0 -> 1466 bytes .../www/VERM/images/icon_agentsincalls.png | Bin 0 -> 1241 bytes .../VERM/images/icon_agentsindeadcalls.png | Bin 0 -> 1953 bytes .../www/VERM/images/icon_agentsindispo.png | Bin 0 -> 1651 bytes .../www/VERM/images/icon_agentspaused.png | Bin 0 -> 1501 bytes .../www/VERM/images/icon_agentswaiting.png | Bin 0 -> 1885 bytes .../www/VERM/images/icon_audiosoundboards.png | Bin 0 -> 957 bytes .../trunk/www/VERM/images/icon_audiostore.png | Bin 0 -> 696 bytes .../www/VERM/images/icon_autoreports.png | Bin 0 -> 1381 bytes .../www/VERM/images/icon_black_admin.png | Bin 0 -> 1309 bytes .../www/VERM/images/icon_black_campaigns.png | Bin 0 -> 1253 bytes .../www/VERM/images/icon_black_filters.png | Bin 0 -> 691 bytes .../www/VERM/images/icon_black_inbound.png | Bin 0 -> 1246 bytes .../www/VERM/images/icon_black_lists.png | Bin 0 -> 888 bytes .../trunk/www/VERM/images/icon_black_qc.png | Bin 0 -> 1095 bytes .../VERM/images/icon_black_remoteagents.png | Bin 0 -> 965 bytes .../www/VERM/images/icon_black_reports.png | Bin 0 -> 907 bytes .../www/VERM/images/icon_black_scripts.png | Bin 0 -> 1134 bytes .../www/VERM/images/icon_black_usergroups.png | Bin 0 -> 1518 bytes .../www/VERM/images/icon_black_users.png | Bin 0 -> 1267 bytes .../trunk/www/VERM/images/icon_callcard.png | Bin 0 -> 1532 bytes .../trunk/www/VERM/images/icon_callmenu.png | Bin 0 -> 1665 bytes agc_2-X/trunk/www/VERM/images/icon_calls.png | Bin 0 -> 1038 bytes .../trunk/www/VERM/images/icon_callsinivr.png | Bin 0 -> 2063 bytes .../www/VERM/images/icon_callswaiting.png | Bin 0 -> 1392 bytes .../trunk/www/VERM/images/icon_calltimes.png | Bin 0 -> 1434 bytes .../trunk/www/VERM/images/icon_campaigns.png | Bin 0 -> 1290 bytes .../trunk/www/VERM/images/icon_carriers.png | Bin 0 -> 717 bytes agc_2-X/trunk/www/VERM/images/icon_chat.png | Bin 0 -> 802 bytes .../www/VERM/images/icon_chatswaiting.png | Bin 0 -> 1352 bytes .../trunk/www/VERM/images/icon_cidgroups.png | Bin 0 -> 567 bytes .../www/VERM/images/icon_conferences.png | Bin 0 -> 1332 bytes .../trunk/www/VERM/images/icon_contacts.png | Bin 0 -> 1050 bytes agc_2-X/trunk/www/VERM/images/icon_email.png | Bin 0 -> 932 bytes .../www/VERM/images/icon_emailswaiting.png | Bin 0 -> 1455 bytes .../www/VERM/images/icon_filterphonegroup.png | Bin 0 -> 1013 bytes .../trunk/www/VERM/images/icon_filters.png | Bin 0 -> 743 bytes .../trunk/www/VERM/images/icon_inbound.png | Bin 0 -> 1351 bytes .../trunk/www/VERM/images/icon_iplists.png | Bin 0 -> 1018 bytes .../trunk/www/VERM/images/icon_languages.png | Bin 0 -> 1649 bytes agc_2-X/trunk/www/VERM/images/icon_lists.png | Bin 0 -> 951 bytes .../www/VERM/images/icon_musiconhold.png | Bin 0 -> 1490 bytes agc_2-X/trunk/www/VERM/images/icon_phones.png | Bin 0 -> 1770 bytes agc_2-X/trunk/www/VERM/images/icon_qc.png | Bin 0 -> 1197 bytes .../www/VERM/images/icon_queuegroups.png | Bin 0 -> 1605 bytes .../VERM/images/icon_queuegroups_white.png | Bin 0 -> 1661 bytes .../www/VERM/images/icon_remoteagents.png | Bin 0 -> 1047 bytes .../trunk/www/VERM/images/icon_reports.png | Bin 0 -> 964 bytes .../trunk/www/VERM/images/icon_ringing.png | Bin 0 -> 920 bytes .../www/VERM/images/icon_screencolors.png | Bin 0 -> 1118 bytes .../www/VERM/images/icon_screenlabels.png | Bin 0 -> 907 bytes .../trunk/www/VERM/images/icon_scripts.png | Bin 0 -> 1257 bytes .../trunk/www/VERM/images/icon_servers.png | Bin 0 -> 1650 bytes .../trunk/www/VERM/images/icon_settings.png | Bin 0 -> 1500 bytes .../VERM/images/icon_settingscontainer.png | Bin 0 -> 1566 bytes agc_2-X/trunk/www/VERM/images/icon_shifts.png | Bin 0 -> 1400 bytes .../trunk/www/VERM/images/icon_statuses.png | Bin 0 -> 479 bytes .../www/VERM/images/icon_statusgroups.png | Bin 0 -> 1088 bytes .../trunk/www/VERM/images/icon_templates.png | Bin 0 -> 643 bytes .../www/VERM/images/icon_texttospeech.png | Bin 0 -> 1097 bytes .../trunk/www/VERM/images/icon_usergroups.png | Bin 0 -> 1655 bytes agc_2-X/trunk/www/VERM/images/icon_users.png | Bin 0 -> 1375 bytes .../www/VERM/images/icon_vm_messages.png | Bin 0 -> 1314 bytes .../trunk/www/VERM/images/icon_voicemail.png | Bin 0 -> 963 bytes agc_2-X/trunk/www/VERM/images/next_mon.gif | Bin 0 -> 60 bytes agc_2-X/trunk/www/VERM/images/next_year.gif | Bin 0 -> 70 bytes agc_2-X/trunk/www/VERM/images/nl.gif | Bin 0 -> 250 bytes agc_2-X/trunk/www/VERM/images/no_cal.gif | Bin 0 -> 139 bytes agc_2-X/trunk/www/VERM/images/pixel.gif | Bin 0 -> 67 bytes agc_2-X/trunk/www/VERM/images/pl.gif | Bin 0 -> 276 bytes agc_2-X/trunk/www/VERM/images/prev_mon.gif | Bin 0 -> 59 bytes agc_2-X/trunk/www/VERM/images/prev_year.gif | Bin 0 -> 69 bytes agc_2-X/trunk/www/VERM/images/print_icon.png | Bin 0 -> 309 bytes agc_2-X/trunk/www/VERM/images/pt.gif | Bin 0 -> 208 bytes agc_2-X/trunk/www/VERM/images/shade-histo.gif | Bin 0 -> 1143 bytes agc_2-X/trunk/www/VERM/images/shade_bl.png | Bin 0 -> 185 bytes agc_2-X/trunk/www/VERM/images/shade_bm.png | Bin 0 -> 164 bytes agc_2-X/trunk/www/VERM/images/shade_br.png | Bin 0 -> 204 bytes agc_2-X/trunk/www/VERM/images/shade_mr.png | Bin 0 -> 155 bytes agc_2-X/trunk/www/VERM/images/shade_tr.png | Bin 0 -> 200 bytes .../VERM/images/vicidial_admin_web_logo.png | Bin 0 -> 6252 bytes .../vicidial_admin_web_logoDEFAULTAGENT.png | Bin 0 -> 5255 bytes .../images/vicidial_admin_web_logoSAMPLE.png | Bin 0 -> 5893 bytes agc_2-X/trunk/www/VERM/index.php | 2 + agc_2-X/trunk/www/VERM/pureknob.js | 1095 +++++++ agc_2-X/trunk/www/vicidial/admin.php | 17 +- agc_2-X/trunk/www/vicidial/admin_header.php | 61 +- 131 files changed, 28105 insertions(+), 36 deletions(-) create mode 100644 agc_2-X/trunk/www/VERM/VERM_AGENTS_DT_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_AJAX_functions.php create mode 100644 agc_2-X/trunk/www/VERM/VERM_ANSWERED_DT_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_ANSWERED_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_AREA_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_ATT_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_CALLS_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_DAY_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_DOW_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_HOUR_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_IVR_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_IVR_survey_details.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_OUTCOMES_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_STATS_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_UNANSWERED_DT_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_UNANSWERED_rpt.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_admin.php create mode 100644 agc_2-X/trunk/www/VERM/VERM_custom_form_functions.php create mode 100644 agc_2-X/trunk/www/VERM/VERM_custom_report.php create mode 100644 agc_2-X/trunk/www/VERM/VERM_functions.js create mode 100644 agc_2-X/trunk/www/VERM/VERM_global_vars.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_header.inc create mode 100644 agc_2-X/trunk/www/VERM/VERM_main_report_page.php create mode 100644 agc_2-X/trunk/www/VERM/VERM_options.php create mode 100644 agc_2-X/trunk/www/VERM/VERM_stylesheet.php create mode 100644 agc_2-X/trunk/www/VERM/VERM_wallboard_stylesheet.php create mode 100644 agc_2-X/trunk/www/VERM/VERM_wallboard_widgets.php create mode 100644 agc_2-X/trunk/www/VERM/VERM_wallboards.php create mode 100644 agc_2-X/trunk/www/VERM/calendar.css create mode 100644 agc_2-X/trunk/www/VERM/calendar_db.js create mode 100644 agc_2-X/trunk/www/VERM/dbconnect_mysqli.php create mode 100644 agc_2-X/trunk/www/VERM/display_agent_details.php create mode 100644 agc_2-X/trunk/www/VERM/display_call_details.php create mode 100644 agc_2-X/trunk/www/VERM/display_help.php create mode 100644 agc_2-X/trunk/www/VERM/display_outcomes_details.php create mode 100644 agc_2-X/trunk/www/VERM/functions.php create mode 100644 agc_2-X/trunk/www/VERM/help.js create mode 100644 agc_2-X/trunk/www/VERM/help.png create mode 100644 agc_2-X/trunk/www/VERM/help_documentation.txt create mode 100644 agc_2-X/trunk/www/VERM/images/cal.gif create mode 100644 agc_2-X/trunk/www/VERM/images/icon_admin.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_agentsincalls.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_agentsindeadcalls.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_agentsindispo.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_agentspaused.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_agentswaiting.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_audiosoundboards.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_audiostore.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_autoreports.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_admin.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_campaigns.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_filters.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_inbound.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_lists.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_qc.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_remoteagents.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_reports.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_scripts.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_usergroups.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_black_users.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_callcard.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_callmenu.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_calls.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_callsinivr.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_callswaiting.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_calltimes.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_campaigns.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_carriers.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_chat.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_chatswaiting.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_cidgroups.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_conferences.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_contacts.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_email.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_emailswaiting.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_filterphonegroup.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_filters.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_inbound.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_iplists.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_languages.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_lists.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_musiconhold.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_phones.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_qc.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_queuegroups.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_queuegroups_white.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_remoteagents.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_reports.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_ringing.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_screencolors.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_screenlabels.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_scripts.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_servers.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_settings.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_settingscontainer.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_shifts.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_statuses.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_statusgroups.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_templates.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_texttospeech.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_usergroups.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_users.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_vm_messages.png create mode 100644 agc_2-X/trunk/www/VERM/images/icon_voicemail.png create mode 100644 agc_2-X/trunk/www/VERM/images/next_mon.gif create mode 100644 agc_2-X/trunk/www/VERM/images/next_year.gif create mode 100644 agc_2-X/trunk/www/VERM/images/nl.gif create mode 100644 agc_2-X/trunk/www/VERM/images/no_cal.gif create mode 100644 agc_2-X/trunk/www/VERM/images/pixel.gif create mode 100644 agc_2-X/trunk/www/VERM/images/pl.gif create mode 100644 agc_2-X/trunk/www/VERM/images/prev_mon.gif create mode 100644 agc_2-X/trunk/www/VERM/images/prev_year.gif create mode 100644 agc_2-X/trunk/www/VERM/images/print_icon.png create mode 100644 agc_2-X/trunk/www/VERM/images/pt.gif create mode 100644 agc_2-X/trunk/www/VERM/images/shade-histo.gif create mode 100644 agc_2-X/trunk/www/VERM/images/shade_bl.png create mode 100644 agc_2-X/trunk/www/VERM/images/shade_bm.png create mode 100644 agc_2-X/trunk/www/VERM/images/shade_br.png create mode 100644 agc_2-X/trunk/www/VERM/images/shade_mr.png create mode 100644 agc_2-X/trunk/www/VERM/images/shade_tr.png create mode 100644 agc_2-X/trunk/www/VERM/images/vicidial_admin_web_logo.png create mode 100644 agc_2-X/trunk/www/VERM/images/vicidial_admin_web_logoDEFAULTAGENT.png create mode 100644 agc_2-X/trunk/www/VERM/images/vicidial_admin_web_logoSAMPLE.png create mode 100644 agc_2-X/trunk/www/VERM/index.php create mode 100644 agc_2-X/trunk/www/VERM/pureknob.js 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 8044319e..851699f3 100644 --- a/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql +++ b/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql @@ -4752,6 +4752,47 @@ UNIQUE KEY `serverconf` (`server_ip`,`conf_exten`), UNIQUE KEY `conf_exten` (`conf_exten`,`server_ip`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +CREATE TABLE `verm_custom_report_holder` ( +`custom_report_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, +`user` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`report_name` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`report_parameters` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, +`modify_date` TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), +PRIMARY KEY (`custom_report_id`), +UNIQUE KEY `verm_custom_report_holder_pkey` (`user`,`report_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +CREATE TABLE `wallboard_widgets` ( +`widget_id` VARCHAR(100) COLLATE utf8_unicode_ci NOT NULL, +`wallboard_report_id` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`view_id` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_title` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_type` VARCHAR(30) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_width` TINYINT(3) UNSIGNED DEFAULT NULL, +`widget_is_row` ENUM('Y','N') COLLATE utf8_unicode_ci DEFAULT 'N', +`widget_rowspan` TINYINT(3) UNSIGNED DEFAULT 1, +`widget_text` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_queue` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_sla_level` VARCHAR(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_agent` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_color` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_color2` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_alarms` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_order` TINYINT(3) UNSIGNED DEFAULT NULL, +PRIMARY KEY (`widget_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +CREATE TABLE `wallboard_reports` ( +`wallboard_report_id` VARCHAR(20) COLLATE utf8_unicode_ci NOT NULL, +`wallboard_name` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`wallboard_views` TINYINT(3) UNSIGNED DEFAULT NULL, +`date_created` DATETIME DEFAULT NULL, +`last_modified` TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), +`data_refresh_rate` SMALLINT(5) UNSIGNED DEFAULT 10, +`view_refresh_rate` SMALLINT(5) UNSIGNED DEFAULT 30, +PRIMARY KEY (`wallboard_report_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + ALTER TABLE vicidial_email_list MODIFY message text character set utf8; @@ -5098,7 +5139,12 @@ INSERT INTO vicidial_settings_containers(container_id,container_notes,container_ INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('INTERNATIONAL_DNC_IMPORT','Process DNC lists of various countries from FTP site','PERL_CLI','---ALL---','# This setting container is used for the international DNC system. \r\n# The below two settings are mandatory for importing suppression lists\r\n# and tell the import process where to look for new files and where to\r\n# move them when handled. These settings cannot have the same value. \r\n--file-dir=/root/ftp\r\n--file-destination=/root/ftp/DONE\r\n\r\n# Uncomment below and set the status to whatever custom disposition you \r\n# would like already-loaded leads to be set to when they dedupe against\r\n# a country\'s DNC list (default is \"DNCI\")\r\n# --dnc-status-override=BMNR\r\n\r\n# The below settings are optional for when files are stored on a remote\r\n# server. It is strongly recommended these settings are not used and\r\n# that the processing scripts and files are stored locally on the same\r\n# server. \r\n# --ftp-host=localhost\r\n# --ftp-user=user\r\n# --ftp-pwd=pwd\r\n# --ftp-port=21\r\n# --ftp-passive=1\r\n'),('DNC_IMPORT_FORMATS','Import formats for DNC files','OTHER','---ALL---','# This setting container is used for storing file formats used when \r\n# loading DNC suppression lists into the dialer. \r\n#\r\n# import template => (delimited|fixed),delimiter,phone1(,phone2,phone3)\r\n#\r\n# For delimited files, the phone1 value should be the index value of\r\n# the field where the phone appears. The first array index is 0 and\r\n# indexes continue through the natural numbers.\r\n\r\n# In delimited files, acceptable values for the \"delimiter\" field are:\r\n# - \"tab\", \"pipe\", \"comma\", \"quote-comma\"\r\nBASIC_DELIMITED_FORMAT => delimited,pipe,0\r\n\r\n# If the phone number is split into multiple fields (ex: area code in\r\n# one field, rest of the number in another), simply list additional \r\n# indices of the phone number fields separated by commas in the order \r\n# in which the data should be combined to make the complete phone \r\n# number \r\nDELIMITED_WITH_AC_AND_EXCHANGE_SPLIT => delimited,tab,0,1\r\n\r\n# For fixed-length files, the phone field values should be of the type:\r\n# - \"starting_position|length\"\r\nBASIC_FIXED_FORMAT => fixed,,0|10\r\n\r\n# (delimited|fixed) is not used for CSV/Excel files, so all that needs \r\n# providing for those is the index field value(s) of the phone number\r\nBASIC_CSV_OR_EXCEL_FORMAT => ,,0'),('DNC_CURRENT_BLOCKED_LISTS','Lists currently blocked due to pending DNC scrub','READ_ONLY','---ALL---',''); INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('USER_LOCATIONS_SYSTEM','User Locations List','OTHER','---ALL---',';location|description\n|default\n'); INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('USER_CODES_SYSTEM','User Codes List','OTHER','---ALL---',''); +INSERT INTO `vicidial_settings_containers` VALUES ('VERM_STATUS_NAMES_OVERRIDE','Override dialer status names in enhanced reporting','OTHER','---ALL---','; For each status name you want overridden, type the status followed by\r\n; a pipe, then the new status name\r\n; Ex:\r\n; NZ|Taumatawhakatangihangakoauauotamateaturipukakapikimaungahoronukupoka\r\n201214|Request To Cancel\r\n210200|No Answer-Incomplete Call\r\n210201|Contact Established\r\n210202|Provider Review - HB\r\n210203|Promise to Pay\r\n210204|Setup Payment Plan\r\n210205|Research-Inquiry\r\n210206|Voice Mail Left - HB\r\n210207|Do Not Call\r\n210208|Appeal Verification\r\n210209|Bad Phone\r\n210210|Bad Address\r\n210211|Direct Pay Verification\r\n210213|Provider Approved\r\n210215|Update Notes Only\r\n210216|Voicemail-No Status Change\r\n210217|Sent Letter Request - HB\r\n210218|Auto VoiceMail Left - HB\r\n210219|Auto VoiceMail-No Status Change\r\n210302|Provider Review - LB\r\n210306|Voice Mail Left - LB\r\n210317|Sent Letter Request - LB\r\n210318|Auto VoiceMail Left - LB\r\n211503|Provider - COVID-19\r\n211603|Transferred Call to MLA\r\n'), ('VERM_REPORT_OPTIONS','Container for customizing VERM report output','OTHER','---ALL---','; This is the report queue used if none is chosen by the user\r\n; It\'s preloaded in some forms as well\r\nVERM_default_report_queue => ALL\r\n\r\n; If there are statuses to exclude from reports, list them here\r\n; Separate with commas. Default is AFTHRS\r\nexc_addtl_statuses => AFTHRS\r\n\r\n; Set the below value to 1 (or anything non-blank/non-zero) in order to \r\n; show the agents ID in addition to their full name in the report results\r\nshow_full_agent_info => 1\r\n\r\n; Some reports count \"lost\" calls - which are defined by the below variable\r\n; listing what you define as \"lost\" dispos. Separate with commas.\r\nlost_statuses => LOST,210208,DISPO\r\n\r\n; You can create a detailed IVR survey report for ingroups by defining\r\n; \"ivr_survey_ingroups_detail\" and \"ivr_survey_ingroups_voicemails.\"\r\n; For \"details\", supply an ingroup used as a tracking group on call menus.\r\n; Then, add a pipe and after that list all call menus that use the ingroup\r\n; as the tracking group, separating each with a comma\r\n; To track whether the calls went to voicemail, list every call menu/option\r\n; combination that goes to voicemail, separating the call menu from the \r\n; option with a pipe. One callmenu/option combo per line.\r\nivr_survey_ingroups_detail => 521205|561401,561402,561403,561404,561505\r\nivr_survey_ingroups_voicemails => 561505|t\r\n\r\n; #####################################################\r\n; # ALL of the below are used in the wallboard report #\r\n; #####################################################\r\nVERM_default_outb_widget_queue => ALL_OUT\r\nVERM_default_inb_widget_queue1 => 514915v_USA_Shared\r\nVERM_default_inb_widget_queue2 => 515915v_MLA_Shared\r\n\r\n; Used specifically for the SLA widget\r\n; Uses ingroups - separate multiple ingroups by commas\r\n; Comment out or leave blank to count all ingroups\r\nSLA_LEVEL_PCT_ingroups => 514915v,515915v\r\n\r\n; This removes remote agents from the wallboard reports\r\n; Comment out to include remote agents (or set to zero)\r\nomit_remote_agents => 1\r\n'); + +INSERT INTO `wallboard_widgets` VALUES ('queues_widget_1','AGENTS_AND_QUEUES','queues','','TEXT',5,'N',1,'Queue Information','','',NULL,'','',NULL,2),('queues_widget_0','AGENTS_AND_QUEUES','queues','','LOGO',2,'N',1,NULL,'','',NULL,'','',NULL,1),('queues_widget_2','AGENTS_AND_QUEUES','queues','SLA Level %','SLA_LEVEL_PCT',1,'N',1,NULL,'','>60',NULL,'','',NULL,3),('queues_widget_3','AGENTS_AND_QUEUES','queues','Outbound calls','LIVE_QUEUE_INFO',1,'N',1,'','201201','','','','','yellow_alarm,|red_alarm,',4),('queues_widget_4','AGENTS_AND_QUEUES','queues','USA Ded Inbound','LIVE_QUEUE_INFO',1,'N',1,'','ALL_IN','','','','','yellow_alarm,|red_alarm,',5),('queues_widget_5','AGENTS_AND_QUEUES','queues','MLA Ded Inbound','LIVE_QUEUE_INFO',1,'N',1,'','514911','','','','','yellow_alarm,|red_alarm,',6),('queues_widget_6','AGENTS_AND_QUEUES','queues','N Waiting Calls','N_WAITING_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,7),('queues_widget_7','AGENTS_AND_QUEUES','queues','Offered Calls','OFFERED_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,8),('queues_widget_8','AGENTS_AND_QUEUES','queues','Answered Calls','ANSWERED_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,9),('queues_widget_9','AGENTS_AND_QUEUES','queues','Lost Calls','LOST_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,10),('queues_widget_10','AGENTS_AND_QUEUES','queues','Longest Wait','LONGEST_WAIT',1,'N',1,NULL,'','',NULL,'','',NULL,11),('queues_widget_11','AGENTS_AND_QUEUES','queues','Live Queues','LIVE_QUEUES',1,'Y',1,NULL,'','',NULL,'','',NULL,12),('queues_widget_12','AGENTS_AND_QUEUES','queues','Live Calls','LIVE_CALLS',1,'Y',2,NULL,'','',NULL,'','',NULL,13),('agent_widget_0','AGENTS_AND_QUEUES','agents','','LOGO',2,'N',1,NULL,'','',NULL,'','',NULL,1),('agent_widget_1','AGENTS_AND_QUEUES','agents','N Waiting Calls','N_WAITING_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,2),('agent_widget_2','AGENTS_AND_QUEUES','agents','Agents Ready','AGENTS_READY',1,'N',1,NULL,'','',NULL,'','',NULL,3),('agent_widget_3','AGENTS_AND_QUEUES','agents','Agents On Call','N_AGENTS_ON_CALL',1,'N',1,NULL,'','',NULL,'','',NULL,4),('agent_widget_4','AGENTS_AND_QUEUES','agents','N Answered Calls','N_ANSWERED_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,5),('agent_widget_5','AGENTS_AND_QUEUES','agents','Clock','CLOCK',1,'N',1,NULL,'','',NULL,'','',NULL,6),('agent_widget_6','AGENTS_AND_QUEUES','agents','Live Agents','LIVE_AGENTS',1,'Y',3,NULL,'','',NULL,'','',NULL,7); + +INSERT INTO `wallboard_reports` VALUES ('AGENTS_AND_QUEUES','Agents and Queues',2,'2022-01-18 09:00:23','2022-01-18 15:00:23',10,30); UPDATE system_settings set vdc_agent_api_active='1'; -UPDATE system_settings SET db_schema_version='1664',db_schema_update_date=NOW(),reload_timestamp=NOW(); +UPDATE system_settings SET db_schema_version='1665',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 a62e30be..d9ae7f46 100644 --- a/agc_2-X/trunk/extras/upgrade_2.14.sql +++ b/agc_2-X/trunk/extras/upgrade_2.14.sql @@ -1963,3 +1963,52 @@ UNIQUE KEY `conf_exten` (`conf_exten`,`server_ip`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; UPDATE system_settings SET db_schema_version='1664',db_schema_update_date=NOW() where db_schema_version < 1664; + +CREATE TABLE `verm_custom_report_holder` ( +`custom_report_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, +`user` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`report_name` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`report_parameters` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, +`modify_date` TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), +PRIMARY KEY (`custom_report_id`), +UNIQUE KEY `verm_custom_report_holder_pkey` (`user`,`report_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +CREATE TABLE `wallboard_widgets` ( +`widget_id` VARCHAR(100) COLLATE utf8_unicode_ci NOT NULL, +`wallboard_report_id` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`view_id` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_title` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_type` VARCHAR(30) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_width` TINYINT(3) UNSIGNED DEFAULT NULL, +`widget_is_row` ENUM('Y','N') COLLATE utf8_unicode_ci DEFAULT 'N', +`widget_rowspan` TINYINT(3) UNSIGNED DEFAULT 1, +`widget_text` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_queue` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_sla_level` VARCHAR(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_agent` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_color` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_color2` VARCHAR(20) COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_alarms` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, +`widget_order` TINYINT(3) UNSIGNED DEFAULT NULL, +PRIMARY KEY (`widget_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +CREATE TABLE `wallboard_reports` ( +`wallboard_report_id` VARCHAR(20) COLLATE utf8_unicode_ci NOT NULL, +`wallboard_name` VARCHAR(100) COLLATE utf8_unicode_ci DEFAULT NULL, +`wallboard_views` TINYINT(3) UNSIGNED DEFAULT NULL, +`date_created` DATETIME DEFAULT NULL, +`last_modified` TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), +`data_refresh_rate` SMALLINT(5) UNSIGNED DEFAULT 10, +`view_refresh_rate` SMALLINT(5) UNSIGNED DEFAULT 30, +PRIMARY KEY (`wallboard_report_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +INSERT INTO `wallboard_widgets` VALUES ('queues_widget_1','AGENTS_AND_QUEUES','queues','','TEXT',5,'N',1,'Queue Information','','',NULL,'','',NULL,2),('queues_widget_0','AGENTS_AND_QUEUES','queues','','LOGO',2,'N',1,NULL,'','',NULL,'','',NULL,1),('queues_widget_2','AGENTS_AND_QUEUES','queues','SLA Level %','SLA_LEVEL_PCT',1,'N',1,NULL,'','>60',NULL,'','',NULL,3),('queues_widget_3','AGENTS_AND_QUEUES','queues','Outbound calls','LIVE_QUEUE_INFO',1,'N',1,'','201201','','','','','yellow_alarm,|red_alarm,',4),('queues_widget_4','AGENTS_AND_QUEUES','queues','USA Ded Inbound','LIVE_QUEUE_INFO',1,'N',1,'','ALL_IN','','','','','yellow_alarm,|red_alarm,',5),('queues_widget_5','AGENTS_AND_QUEUES','queues','MLA Ded Inbound','LIVE_QUEUE_INFO',1,'N',1,'','SALESLINE','','','','','yellow_alarm,|red_alarm,',6),('queues_widget_6','AGENTS_AND_QUEUES','queues','N Waiting Calls','N_WAITING_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,7),('queues_widget_7','AGENTS_AND_QUEUES','queues','Offered Calls','OFFERED_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,8),('queues_widget_8','AGENTS_AND_QUEUES','queues','Answered Calls','ANSWERED_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,9),('queues_widget_9','AGENTS_AND_QUEUES','queues','Lost Calls','LOST_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,10),('queues_widget_10','AGENTS_AND_QUEUES','queues','Longest Wait','LONGEST_WAIT',1,'N',1,NULL,'','',NULL,'','',NULL,11),('queues_widget_11','AGENTS_AND_QUEUES','queues','Live Queues','LIVE_QUEUES',1,'Y',1,NULL,'','',NULL,'','',NULL,12),('queues_widget_12','AGENTS_AND_QUEUES','queues','Live Calls','LIVE_CALLS',1,'Y',2,NULL,'','',NULL,'','',NULL,13),('agent_widget_0','AGENTS_AND_QUEUES','agents','','LOGO',2,'N',1,NULL,'','',NULL,'','',NULL,1),('agent_widget_1','AGENTS_AND_QUEUES','agents','N Waiting Calls','N_WAITING_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,2),('agent_widget_2','AGENTS_AND_QUEUES','agents','Agents Ready','AGENTS_READY',1,'N',1,NULL,'','',NULL,'','',NULL,3),('agent_widget_3','AGENTS_AND_QUEUES','agents','Agents On Call','N_AGENTS_ON_CALL',1,'N',1,NULL,'','',NULL,'','',NULL,4),('agent_widget_4','AGENTS_AND_QUEUES','agents','N Answered Calls','N_ANSWERED_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,5),('agent_widget_5','AGENTS_AND_QUEUES','agents','Clock','CLOCK',1,'N',1,NULL,'','',NULL,'','',NULL,6),('agent_widget_6','AGENTS_AND_QUEUES','agents','Live Agents','LIVE_AGENTS',1,'Y',3,NULL,'','',NULL,'','',NULL,7); + +INSERT INTO `wallboard_reports` VALUES ('AGENTS_AND_QUEUES','Agents and Queues',2,'2022-01-18 09:00:23','2022-01-18 15:00:23',10,30); + +INSERT INTO `vicidial_settings_containers` VALUES ('VERM_STATUS_NAMES_OVERRIDE','Override dialer status names in enhanced reporting','OTHER','---ALL---','; For each status name you want overridden, type the status followed by\r\n; a pipe, then the new status name\r\n; Ex:\r\n; NZ|Taumatawhakatangihangakoauauotamateaturipukakapikimaungahoronukupoka\r\n201214|Request To Cancel\r\n210200|No Answer-Incomplete Call\r\n210201|Contact Established\r\n210202|Provider Review - HB\r\n210203|Promise to Pay\r\n210204|Setup Payment Plan\r\n210205|Research-Inquiry\r\n210206|Voice Mail Left - HB\r\n210207|Do Not Call\r\n210208|Appeal Verification\r\n210209|Bad Phone\r\n210210|Bad Address\r\n210211|Direct Pay Verification\r\n210213|Provider Approved\r\n210215|Update Notes Only\r\n210216|Voicemail-No Status Change\r\n210217|Sent Letter Request - HB\r\n210218|Auto VoiceMail Left - HB\r\n210219|Auto VoiceMail-No Status Change\r\n210302|Provider Review - LB\r\n210306|Voice Mail Left - LB\r\n210317|Sent Letter Request - LB\r\n210318|Auto VoiceMail Left - LB\r\n211503|Provider - COVID-19\r\n211603|Transferred Call to MLA\r\n'), ('VERM_REPORT_OPTIONS','Container for customizing VERM report output','OTHER','---ALL---','; This is the report queue used if none is chosen by the user\r\n; It\'s preloaded in some forms as well\r\nVERM_default_report_queue => ALL\r\n\r\n; If there are statuses to exclude from reports, list them here\r\n; Separate with commas. Default is AFTHRS\r\nexc_addtl_statuses => AFTHRS\r\n\r\n; Set the below value to 1 (or anything non-blank/non-zero) in order to \r\n; show the agents ID in addition to their full name in the report results\r\nshow_full_agent_info => 1\r\n\r\n; Some reports count \"lost\" calls - which are defined by the below variable\r\n; listing what you define as \"lost\" dispos. Separate with commas.\r\nlost_statuses => LOST,210208,DISPO\r\n\r\n; You can create a detailed IVR survey report for ingroups by defining\r\n; \"ivr_survey_ingroups_detail\" and \"ivr_survey_ingroups_voicemails.\"\r\n; For \"details\", supply an ingroup used as a tracking group on call menus.\r\n; Then, add a pipe and after that list all call menus that use the ingroup\r\n; as the tracking group, separating each with a comma\r\n; To track whether the calls went to voicemail, list every call menu/option\r\n; combination that goes to voicemail, separating the call menu from the \r\n; option with a pipe. One callmenu/option combo per line.\r\nivr_survey_ingroups_detail => 521205|561401,561402,561403,561404,561505\r\nivr_survey_ingroups_voicemails => 561505|t\r\n\r\n; #####################################################\r\n; # ALL of the below are used in the wallboard report #\r\n; #####################################################\r\nVERM_default_outb_widget_queue => ALL_OUT\r\nVERM_default_inb_widget_queue1 => SALESLINE\r\nVERM_default_inb_widget_queue2 => 515915v_MLA_Shared\r\n\r\n; Used specifically for the SLA widget\r\n; Uses ingroups - separate multiple ingroups by commas\r\n; Comment out or leave blank to count all ingroups\r\nSLA_LEVEL_PCT_ingroups => SALESLINE,SUPPORT\r\n\r\n; This removes remote agents from the wallboard reports\r\n; Comment out to include remote agents (or set to zero)\r\nomit_remote_agents => 1\r\n'); + +UPDATE system_settings SET db_schema_version='1665',db_schema_update_date=NOW() where db_schema_version < 1665; diff --git a/agc_2-X/trunk/install.pl b/agc_2-X/trunk/install.pl index 317a7c4e..4e103f39 100644 --- a/agc_2-X/trunk/install.pl +++ b/agc_2-X/trunk/install.pl @@ -2,7 +2,7 @@ # install.pl version 2.14 # -# Copyright (C) 2021 Matt Florell LICENSE: AGPLv2 +# Copyright (C) 2022 Matt Florell LICENSE: AGPLv2 # # CHANGES @@ -46,6 +46,7 @@ # 190530-1511 - Added 'S' keepalive option # 210813-0925 - Added Asteirsk 16 option # 210827-0926 - Added PJSIP default conf files to Asterisk 16 install +# 220827-2239 - Added VERM web directory # ############################################ @@ -2570,6 +2571,7 @@ if ($NOWEB < 1) if (!-e "$PATHweb/vicidial/agent_reports/") {`mkdir -p $PATHweb/vicidial/agent_reports/`;} if (!-e "$PATHweb/vicidial/server_reports/") {`mkdir -p $PATHweb/vicidial/server_reports/`;} if (!-e "$PATHweb/chat_customer/") {`mkdir -p $PATHweb/chat_customer/`;} + if (!-e "$PATHweb/VERM/") {`mkdir -p $PATHweb/VERM/`;} print "Copying web files...\n"; # save custom.css if its not empty @@ -2582,12 +2584,14 @@ if ($NOWEB < 1) `cp -f ./www/vicidial/robots.txt $PATHweb/vicidial/server_reports/`; if (-e "$PATHweb/agc/css/custom.css.save_user_changes") {`mv $PATHweb/agc/css/custom.css.save_user_changes $PATHweb/agc/css/custom.css`;} `cp -f ./www/vicidial/robots.txt $PATHweb/chat_customer/`; + `cp -f ./www/vicidial/robots.txt $PATHweb/VERM/`; print "setting web scripts to executable...\n"; `chmod 0777 $PATHweb/`; `chmod -R 0755 $PATHweb/agc/`; `chmod -R 0755 $PATHweb/vicidial/`; `chmod -R 0755 $PATHweb/chat_customer/`; + `chmod -R 0755 $PATHweb/VERM/`; `chmod 0777 $PATHweb/agc/`; `chmod 0777 $PATHweb/vicidial/`; `chmod 0777 $PATHweb/vicidial/ploticus/`; @@ -2603,6 +2607,9 @@ if ($NOWEB < 1) `rm -f $PATHweb/vicidial/listloader_super.pl`; `rm -f $PATHweb/vicidial/listloader.pl`; `chmod 0777 $PATHweb/chat_customer/`; + `cp -f /dev/null $PATHweb/VERM/project_auth_entries.txt`; + `chmod 0777 $PATHweb/VERM/project_auth_entries.txt`; + `chmod 0777 $PATHweb/VERM/`; } if ( ($PROMPTcopy_web_lang =~ /y/i) || ($CLIcopy_web_lang =~ /y/i) ) @@ -2632,6 +2639,7 @@ if ($PATHconf !~ /\/etc\/astguiclient.conf/) `sed -i 's/$PATHconfDEFAULT/$PATHconfEREG/g' $PATHweb/vicidial/listloader_rowdisplay.pl `; `sed -i 's/$PATHconfDEFAULT/$PATHconfEREG/g' $PATHweb/vicidial/spreadsheet_sales_viewer.pl `; `sed -i 's/$PATHconfDEFAULT/$PATHconfEREG/g' $PATHweb/chat_customer/dbconnect_mysqli.php `; + `sed -i 's/$PATHconfDEFAULT/$PATHconfEREG/g' $PATHweb/VERM/dbconnect_mysqli.php `; } if ( ($PROMPTcopy_conf_files =~ /y/i) || ($CLIcopy_conf_files =~ /y/i) ) diff --git a/agc_2-X/trunk/www/VERM/VERM_AGENTS_DT_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_AGENTS_DT_rpt.inc new file mode 100644 index 00000000..95ff75d7 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_AGENTS_DT_rpt.inc @@ -0,0 +1,515 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1632 - First build +# + +# NANQUE, not an unanswered call? +# TIMEOT, unanswered even though it was dropped into a call that was picked up +# Warm transfers count as two calls + +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +$PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); + +$vicidial_agent_log_table="vicidial_agent_log"; + +# if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} +# elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} + +if (isset($_GET["sort_agent_sessions_detail"])) {$sort_agent_sessions_detail=$_GET["sort_agent_sessions_detail"];} + elseif (isset($_POST["sort_agent_sessions_detail"])) {$sort_agent_sessions_detail=$_POST["sort_agent_sessions_detail"];} +if (isset($_GET["sort_agent_pause_detail"])) {$sort_agent_pause_detail=$_GET["sort_agent_pause_detail"];} + elseif (isset($_POST["sort_agent_pause_detail"])) {$sort_agent_pause_detail=$_POST["sort_agent_pause_detail"];} + +# No campaigns, need to query for all. +$vicidial_user_log_SQL=preg_replace('/and campaign_id in \(\'\'\)/', '', $vicidial_user_log_SQL); +$vicidial_agent_log_SQL=preg_replace('/and campaign_id in \(\'\'\)/', '', $vicidial_agent_log_SQL); + +if ($non_latin < 1) + { + $sort_agent_sessions_detail = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_agent_sessions_detail); + $sort_agent_pause_detail = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_agent_pause_detail); + } +else + { + $sort_agent_sessions_detail = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_agent_sessions_detail); + $sort_agent_pause_detail = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_agent_pause_detail); + } + +if (preg_match('/ desc$/', $sort_agent_pause_detail)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_agent_pause_detail); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_agent_pause_detail." desc"; + } +$sort_agent_pause_detail_preg=preg_replace('/ desc$/', '', $sort_agent_pause_detail); + +/* +$start_date="2021-12-20"; +$start_time="00:00:00"; +$end_date="2021-12-20"; +$end_time="23:59:59"; +*/ + +$agent_sessions_array=array(); + +$session_stmt="select *,if(event='LOGOUT' or event='TIMEOUTLOGOUT', 1, 0) as priority from vicidial_user_log $vicidial_user_log_SQL and event in ('LOGIN', 'LOGOUT', 'TIMEOUTLOGOUT') order by user, event_date, priority asc"; +if ($DB) {$HTML_output.="$session_stmt";} +# print "$session_stmt
\n"; +$session_rslt=mysql_to_mysqli($session_stmt, $link); + +# WHILE loop constants +$agent_logged_in=0; +$interval_start_date=""; +$interval_end_date=""; +$prev_user=""; +$prev_full_name=""; +$prev_date=""; +$TODAY=date("Y-m-d"); +$NOW_TIME=date("H:i:s"); + +while ($session_row=mysqli_fetch_array($session_rslt)) + { + $full_name=$fullname_info["$session_row[user]"]; + $user=$session_row["user"]; + $extension=$session_row["extension"]; + $event=$session_row["event"]; + $notes=$session_row["extension"]; + $event_epoch=$session_row["event_epoch"]; + $event_time=$session_row["event_date"]; + $server_ip=$session_row["server_ip"]; + $event_date=substr($event_time, 0, 10); + + # END date in case agent is still logged in at that time + if ($prev_date!=$TODAY) + { + $prev_date_eod="$prev_date 23:59:59"; + } + else + { + $prev_date_eod="$prev_date $NOW_TIME"; + } + + if ($event_date!=$TODAY) + { + $event_date_eod="$event_date 23:59:59"; + } + else + { + $event_date_eod="$event_date $NOW_TIME"; + } + + if (($prev_user!=$user || $event_date!=$prev_date) && $prev_user!="" && $prev_date!="") + { + # + # Agent is no longer logged in + if ($agent_logged_in) + { + $eod_epoch_stmt="select unix_timestamp('$prev_date_eod')"; # , '$prev_user' as previous_user, '$prev_full_name' as prev_full_name + $eod_epoch_rslt=mysql_to_mysqli($eod_epoch_stmt, $link); + $eod_epoch_row=mysqli_fetch_row($eod_epoch_rslt); + $agent_sessions_array["$prev_user"]["$start_date_epoch"]["end_hour"]=$eod_epoch_row[0]; + $agent_sessions_array["$prev_user"]["$start_date_epoch"]["full_name"]=$prev_full_name; + + # Agent logged in and day is today, they are currently logged in, else EOD LOGOUT + $notes=($eod_epoch_row[0]>=strtotime(date("Y-m-d 00:00:00")) ? "CURRENTLY LOGGED IN" : "EOD LOGOUT"); + $agent_sessions_array["$prev_user"]["$start_date_epoch"]["notes"]=$notes; + + $agent_logged_in=0; + } + } + + + if ($event=="LOGIN") + { + if ($agent_logged_in==0) + { + # $start_date_epoch=$event_epoch; + $start_date_epoch=$event_time; + $agent_sessions_array["$user"]["$start_date_epoch"]["full_name"]=$full_name; + $agent_sessions_array["$user"]["$start_date_epoch"]["start_hour"]=$event_epoch; + $agent_sessions_array["$user"]["$start_date_epoch"]["extension"]=$extension; + $agent_sessions_array["$user"]["$start_date_epoch"]["server_ip"]=$server_ip; + } + else + { + "$session_row[user] is already logged in at $start_date_epoch
\n"; + } + $agent_logged_in=1; + } + + # 6/3/22 - added $agent_sessions_array["$user"]["$start_date_epoch"]["start_hour"] to skip dual logouts + if (preg_match('/LOGOUT/', $event) && $agent_sessions_array["$user"]["$start_date_epoch"]["start_hour"]) # && $agent_logged_in==1 + { + $agent_sessions_array["$user"]["$start_date_epoch"]["end_hour"]=$event_epoch; + $agent_sessions_array["$user"]["$start_date_epoch"]["duration"]=($agent_sessions_array["$user"]["$start_date_epoch"]["end_hour"]-$agent_sessions_array["$user"]["$start_date_epoch"]["start_hour"]); + $agent_sessions_array["$user"]["$start_date_epoch"]["notes"]=$notes; + + $pause_stmt="select sec_to_time(sum(pause_sec)), count(*) from vicidial_agent_log where event_time>=from_unixtime(".$agent_sessions_array["$user"]["$start_date_epoch"]["start_hour"].") and event_time<=from_unixtime(".$agent_sessions_array["$user"]["$start_date_epoch"]["end_hour"].") and user='$user' and pause_sec>0"; + # print $pause_stmt."
\n"; + $pause_rslt=mysql_to_mysqli($pause_stmt, $link); + $pause_row=mysqli_fetch_row($pause_rslt); + $agent_sessions_array["$user"]["$start_date_epoch"]["pauses"]=$pause_row[1]; + $agent_sessions_array["$user"]["$start_date_epoch"]["pause_time"]=($pause_row[0]!="" ? $pause_row[0] : "00:00:00"); + + $start_date_epoch=0; + $agent_logged_in=0; + } + + $prev_user=$user; + $prev_full_name=$full_name; + $prev_date=$event_date; + $prev_event_epoch=$event_epoch; + } + +if($agent_logged_in) + { + $agent_sessions_array["$user"]["$start_date_epoch"]["end_hour"]=$event_epoch; + $agent_sessions_array["$user"]["$start_date_epoch"]["duration"]=($agent_sessions_array["$user"]["$start_date_epoch"]["end_hour"]-$agent_sessions_array["$user"]["$start_date_epoch"]["start_hour"]); + $agent_sessions_array["$user"]["$start_date_epoch"]["notes"]=$notes; + + + $pause_stmt="select sec_to_time(sum(pause_sec)), count(*) from vicidial_agent_log where event_time>=from_unixtime(".$agent_sessions_array["$user"]["$start_date_epoch"]["start_hour"].") and event_time<=from_unixtime(".$agent_sessions_array["$user"]["$start_date_epoch"]["end_hour"].") and user='$user' and pause_sec>0"; + # print $pause_stmt."
\n"; + $pause_rslt=mysql_to_mysqli($pause_stmt, $link); + $pause_row=mysqli_fetch_row($pause_rslt); + $agent_sessions_array["$user"]["$start_date_epoch"]["pauses"]=$pause_row[1]; + if ($pause_row[1]==0) {$pause_row[0]=0;} + $agent_sessions_array["$user"]["$start_date_epoch"]["pause_time"]=$pause_row[0]; + + } +ksort($agent_sessions_array, SORT_NATURAL | SORT_FLAG_CASE); +# print_r($agent_sessions_array); die; + +####### AGENT SESSION DETAIL ########## +$HTML_output.="

"._QXZ("Detail of agent sessions").": $NWB#VERM_AGENTS_DT-detail_of_agent_sessions$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; + +$sort_asd_index=preg_replace('/ desc/', '', $sort_agent_sessions_detail); +if (preg_match('/ desc$/', $sort_agent_sessions_detail)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_agent_sessions_detail); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_agent_sessions_detail." desc"; + } +$sort_agent_sessions_detail_preg=preg_replace('/ desc$/', '', $sort_agent_sessions_detail); + +$HTML_output.=""; +/* +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +*/ + + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + +$HTML_output.="\n"; + +$CSV_output["agent_sessions"]="\""._QXZ("Agent")."\",\""._QXZ("Start hour")."\",\""._QXZ("End hour")."\",\""._QXZ("Duration")."\",\""._QXZ("Ext.")."\",\""._QXZ("Termination")."\",\""._QXZ("Pause")."\",\""._QXZ("P.Time")."\",\""._QXZ("Srv")."\"\n"; + +## Compress multi-multi-dimensional array into multi-dimensional array +$agent_sessions_final_array=array(); +$i=0; +foreach ($agent_sessions_array as $user => $sessions) + { + foreach ($sessions as $login_start_date => $session_data) + { + $pauses=$session_data["pauses"]; + $pause_time=$session_data["pause_time"]; + $server_ip=$session_data["server_ip"]; + # $agentName=$session_data["full_name"]; + $agentName=($show_full_agent_info ? $user." - " : "").$session_data["full_name"]; + + + $time_stmt="select from_unixtime(".$session_data["start_hour"]."), from_unixtime(".$session_data["end_hour"]."), sec_to_time(".($session_data["end_hour"]-$session_data["start_hour"]).")"; + # print $time_stmt."
\n"; + $time_rslt=mysql_to_mysqli($time_stmt, $link); + $time_row=mysqli_fetch_row($time_rslt); + $start_hour=$time_row[0]; + $end_hour=$time_row[1]; + $duration=$time_row[2]; + + $agent_sessions_final_array[$i]["full_name"]=$agentName; + $agent_sessions_final_array[$i]["start_hour"]=$start_hour; + $agent_sessions_final_array[$i]["end_hour"]=$end_hour; + $agent_sessions_final_array[$i]["duration"]=$duration; + $agent_sessions_final_array[$i]["extension"]=$session_data["extension"]; + $agent_sessions_final_array[$i]["notes"]=$session_data["notes"]; + $agent_sessions_final_array[$i]["pauses"]=$pauses; + $agent_sessions_final_array[$i]["pause_time"]=$pause_time; + $agent_sessions_final_array[$i]["server_ip"]=$server_ip; + $i++; + } + } +/* +*/ + +if ($sort_asd_index) + { +# print_r($agent_sessions_final_array); + + $col = array_column( $agent_sessions_final_array, "$sort_asd_index" ); + if (preg_match('/ desc$/', $sort_agent_sessions_detail)) + { + array_multisort( $col, SORT_DESC, SORT_STRING, $agent_sessions_final_array ); + } + else + { + array_multisort( $col, SORT_ASC, SORT_STRING, $agent_sessions_final_array ); + } + +# print_r($agent_sessions_final_array); + + } + +foreach ($agent_sessions_final_array as $i => $row) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agent_sessions"].="\"".$row["full_name"]."\",\"".$row["start_hour"]."\",\"".$row["end_hour"]."\",\"".$row["duration"]."\",\"".$row["extension"]."\",\"".$row["notes"]."\",\"".$row["pauses"]."\",\"".$row["pause_time"]."\",\"".$row["server_ip"]."\"\n"; + } + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
Agent".("full_name"==$sort_agent_sessions_detail_preg ? " $sort_char" : "")."Start hour".("start_hour"==$sort_agent_sessions_detail_preg ? " $sort_char" : "")."End hour".("end_hour"==$sort_agent_sessions_detail_preg ? " $sort_char" : "")."Duration".("duration"==$sort_agent_sessions_detail_preg ? " $sort_char" : "")."Ext.".("extension"==$sort_agent_sessions_detail_preg ? " $sort_char" : "")."Termination".("notes"==$sort_agent_sessions_detail_preg ? " $sort_char" : "")."Pause".("pauses"==$sort_agent_sessions_detail_preg ? " $sort_char" : "")."P. Time".("pause_time"==$sort_agent_sessions_detail_preg ? " $sort_char" : "")."Srv".("server_ip"==$sort_agent_sessions_detail_preg ? " $sort_char" : "")."
".$row["full_name"]."".$row["start_hour"]."".$row["end_hour"]."".$row["duration"]."".$row["extension"]."".$row["notes"]."".$row["pauses"]."".$row["pause_time"]."".$row["server_ip"]."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
\n"; +$HTML_output.=""; +##################################### + + +####### AGENT PAUSE DETAIL ########## +$sort_apd_index=preg_replace('/ desc/', '', $sort_agent_pause_detail); +if (preg_match('/ desc$/', $sort_agent_pause_detail)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_agent_pause_detail); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_agent_pause_detail." desc"; + } +$sort_agent_pause_detail_preg=preg_replace('/ desc$/', '', $sort_agent_pause_detail); + + +$HTML_output.="

"._QXZ("Detail of agent pauses").": $NWB#VERM_AGENTS_DT-detail_of_agent_pauses$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.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +*/ + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + +$HTML_output.="\n"; + +$CSV_output["agent_pause_details"]="\""._QXZ("Agent")."\",\""._QXZ("Ext.")."\",\""._QXZ("Code")."\",\""._QXZ("Activity")."\",\"...\",\""._QXZ("Billable?")."\",\""._QXZ("Start hour")."\",\""._QXZ("End hour")."\",\""._QXZ("Duration")."\"\n"; + +$agent_pause_stmt="select campaign_id, user, '' as extension, if (sub_status in ('BLANK', '') or sub_status is null, '-', sub_status) as pause_code, event_time, event_time+INTERVAL pause_sec SECOND as end_hour, sec_to_time(pause_sec) as duration from vicidial_agent_log $vicidial_agent_log_SQL and pause_sec>0"; +if ($DB) {$HTML_output.="$agent_pause_stmt";} +$agent_pause_rslt=mysql_to_mysqli($agent_pause_stmt, $link); +$agent_pause_array=array(); $i=0; +while ($agent_pause_row=mysqli_fetch_array($agent_pause_rslt)) + { + $campaign_id=$agent_pause_row["campaign_id"]; + $user=$agent_pause_row["user"]; + $extension=$agent_pause_row["extension"]; + $start_hour=$agent_pause_row["event_time"]; + $end_hour=$agent_pause_row["end_hour"]; + $duration=$agent_pause_row["duration"]; + $pause_code=$agent_pause_row["pause_code"]; + # $agentName=$fullname_info["$user"]; + $agentName=($show_full_agent_info ? $user." - " : "").$fullname_info["$user"]; + + $pause_key=$campaign_id."-".$pause_code; + $pause_code_name=$pause_code_names["$pause_key"]; + if (strlen($pause_code_name)==0) {$pause_code_name="-";} + + $is_billable="No"; $bp="N"; $pp="N"; + if (in_array($pause_code, $billable_pause_codes["$campaign_id"]) || in_array($pause_code, $billable_pause_codes["SYSTEM"])) + { + $is_billable="Yes"; $bp=""; + } + if (!in_array($pause_code, $payable_pause_codes["$campaign_id"]) && in_array($pause_code, $payable_pause_codes["SYSTEM"])) + { + $pp=""; + } + + $billable_code=$bp."B".$pp."P"; + + $agent_pause_array[$i]["user"]=$agentName; + $agent_pause_array[$i]["extension"]=$extension; + $agent_pause_array[$i]["pause_code"]=$pause_code; + $agent_pause_array[$i]["pause_code_name"]=$pause_code_name; + $agent_pause_array[$i]["billable_code"]=$billable_code; + $agent_pause_array[$i]["is_billable"]=$is_billable; + $agent_pause_array[$i]["start_hour"]=$start_hour; + $agent_pause_array[$i]["end_hour"]=$end_hour; + $agent_pause_array[$i]["duration"]=$duration; + $i++; + } + +if ($sort_apd_index) + { + # print_r($agent_pause_array); + + $col = array_column( $agent_pause_array, "$sort_apd_index" ); + if (preg_match('/ desc$/', $sort_agent_pause_detail)) + { + array_multisort( $col, SORT_DESC, SORT_STRING, $agent_pause_array ); + } + else + { + array_multisort( $col, SORT_ASC, SORT_STRING, $agent_pause_array ); + } + + # print_r($agent_pause_array); + } + +foreach ($agent_pause_array as $i => $row) + { + + $myDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $row["start_hour"]); + $start_hour_value = $myDateTime->format('m/d - H:i:s'); + + $myDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $row["end_hour"]); + $end_hour_value = $myDateTime->format('m/d - H:i:s'); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agent_pause_details"].="\"".$row["user"]."\",\"".$row["extension"]."\",\"".$row["pause_code"]."\",\"".$row["pause_code_name"]."\",\"".$row["billable_code"]."\",\"".$row["is_billable"]."\",\"".$start_hour_value."\",\"".$end_hour_value."\",\"".$row["duration"]."\"\n"; + } + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
AgentExt.CodeActivity...Billable?Start hourEnd hourDuration
Agent".("user"==$sort_agent_pause_detail_preg ? " $sort_char" : "")."Ext.".("extension"==$sort_agent_pause_detail_preg ? " $sort_char" : "")."Code".("pause_code"==$sort_agent_pause_detail_preg ? " $sort_char" : "")."Activity".("pause_code_name"==$sort_agent_pause_detail_preg ? " $sort_char" : "")."...".("billable_code"==$sort_agent_pause_detail_preg ? " $sort_char" : "")."Billable?".("is_billable"==$sort_agent_pause_detail_preg ? " $sort_char" : "")."Start hour".("start_hour"==$sort_agent_pause_detail_preg ? " $sort_char" : "")."End hour".("end_hour"==$sort_agent_pause_detail_preg ? " $sort_char" : "")."Duration".("duration"==$sort_agent_pause_detail_preg ? " $sort_char" : "")."
".$row["user"]."".$row["extension"]."".$row["pause_code"]."".$row["pause_code_name"]."".$row["billable_code"]."".$row["is_billable"]."".$start_hour_value."".$end_hour_value."".$row["duration"]."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.=""; +##################################### + + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "AGENTS_DT_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + + +echo $HTML_output; +?> + + diff --git a/agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc new file mode 100644 index 00000000..f07a7faf --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_AGENTS_rpt.inc @@ -0,0 +1,1591 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1631 - First build +# + +# NANQUE, not an unanswered call? +# TIMEOT, unanswered even though it was dropped into a call that was picked up +# Warm transfers count as two calls + +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +$PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); + +$startMS = microtime(); + +$vicidial_agent_log_table="vicidial_agent_log"; + +if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} + elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} + +# No campaigns, need to query for all. +$vicidial_user_log_SQL=preg_replace('/and campaign_id in \(\'\'\)/', '', $vicidial_user_log_SQL); + +# Sessions +$vicidial_user_stmt="select distinct user from vicidial_user_log $vicidial_user_log_SQL and event in ('LOGIN', 'LOGOUT', 'TIMEOUTLOGOUT') order by user asc"; +if ($DB) {$HTML_output.="$vicidial_user_stmt";} +# print "$vicidial_user_stmt
\n"; +$vicidial_user_rslt=mysql_to_mysqli($vicidial_user_stmt, $link); + +# WHILE loop constants +$interval_start_date=""; +$interval_end_date=""; +$prev_user=""; +$TODAY=date("Y-m-d"); +$NOW_TIME=date("H:i:s"); + +$agent_sessions_array=array(); +$agent_sessions_hour_array=array(); +$agent_billable_hour_array=array(); +$agent_date_hour_array=array(); +$user_groups_array=array(); +$locations_array=array(); +$campaign_sessions_array=array(); + +while ($vicidial_user_row=mysqli_fetch_row($vicidial_user_rslt)) + { + $vicidial_user=$vicidial_user_row[0]; + + # 1/24/2022- Added due to occurrence of agent (Jamar Jenkins) showing LOGout first thing on 01/21/2022, but no login. + $event_date_clause_apx=""; + if (!$overnight_agents) + { + $init_start_stmt="select min(event_date) from vicidial_user_log $vicidial_user_log_SQL and event='LOGIN' and user='$vicidial_user'"; + $init_start_rslt=mysql_to_mysqli($init_start_stmt, $link); + if (mysqli_num_rows($init_start_rslt)>0) + { + $isr_row=mysqli_fetch_row($init_start_rslt); + $event_date_clause_apx=" and event_date>='$isr_row[0]' "; + } + } + + + $session_stmt="select *,if(event='LOGOUT' or event='TIMEOUTLOGOUT', 1, 0) as priority from vicidial_user_log $vicidial_user_log_SQL $event_date_clause_apx and event in ('LOGIN', 'LOGOUT', 'TIMEOUTLOGOUT') and user='$vicidial_user' order by event_date, priority asc"; + if ($DB) {$HTML_output.="$session_stmt";} + # print "$session_stmt
\n"; + $session_rslt=mysql_to_mysqli($session_stmt, $link); + $prev_date=""; + $start_event_date=""; + + ### ITERATE THROUGH ALL THE AGENTS SESSIONS MATCHING THE REPORT CRITERIA + $row_no=0; $agent_logged_in=0; + while ($session_row=mysqli_fetch_array($session_rslt)) + { + # Need this for when the report runs with a start date right in the middle of agents logged in + $original_session_start_date="$start_date $start_time"; + $original_session_cutoff_date="$start_date 00:00:00"; + $original_session_cutoff_eod="$start_date 23:59:59"; + + $full_name=$fullname_info["$session_row[user]"]; + $user=$session_row["user"]; + $campaign_id=$session_row["campaign_id"]; + $user_group=$session_row["user_group"]; + $extension=$session_row["extension"]; + $event=$session_row["event"]; + $notes=$session_row["extension"]; + $event_epoch=$session_row["event_epoch"]; + $event_time=$session_row["event_date"]; + $server_ip=$session_row["server_ip"]; + $event_date=substr($event_time, 0, 10); + if (!$prev_date) {$prev_date=$event_date;} + + $location=GetUserLocation($user); + + # END date in case agent is still logged in at that time + if ($event_date!=$TODAY) + { + $event_date_eod="$event_date 23:59:59"; + } + else + { + $event_date_eod="$event_date $NOW_TIME"; + } + + #### CHECK IF THE USER WAS LOGGED IN AT THE START DATE/TIME, BUT ONLY DO THIS FOR THE FIRST ROW RETURNED + if ($row_no==0) + { + $override_login=0; + $previous_interval_stmt="select * from vicidial_user_log where user='$user' $and_vicidial_user_log_SQL and event_date<='$original_session_start_date' and event_date>='$original_session_cutoff_date' and event in ('LOGIN', 'LOGOUT', 'TIMEOUTLOGOUT') order by user, event_date desc limit 1"; + $previous_interval_rslt=mysql_to_mysqli($previous_interval_stmt, $link); + # print "$previous_interval_stmt;\n"; + if (mysqli_num_rows($previous_interval_rslt)>0) + { + + #### GO BACKWARDS, IF THE PRECEDING RECORD IS A LOGIN, THEN USE THE SESSION DATE/TIME AS THE START TIME FOR THIS INTERVAL. + $previous_interval_row=mysqli_fetch_array($previous_interval_rslt); + if ($previous_interval_row["event"]=="LOGIN") + { + $override_login=1; + $login_notes="PRIOR LOGIN"; + } + else + { + #### IF THE LAST RECORD IS A LOGOUT, CHECK THAT THE NEXT RECORD CHRONOLOGICALLY IS ALSO NOT A LOGOUT + #### BECAUSE IF SO, THE AGENT WAS LAGGED AND WAS STILL LOGGED IN (OR THE LOGIN WASN'T LOGGED) + $next_interval_stmt="select * from vicidial_user_log where user='$user' $and_vicidial_user_log_SQL and event_date>='$original_session_start_date' and event_date<='$original_session_cutoff_eod' and event in ('LOGIN', 'LOGOUT', 'TIMEOUTLOGOUT') order by user, event_date desc limit 1"; + # print "$next_interval_stmt;\n"; + $next_interval_rslt=mysql_to_mysqli($next_interval_stmt, $link); + if (mysqli_num_rows($next_interval_rslt)>0) + { + $next_interval_row=mysqli_fetch_array($next_interval_rslt); + if (preg_match('/LOGOUT/', $next_interval_row["event"])) + { + $override_login=1; + $login_notes="DOUBLE LOGOUT"; + } + } + } + + if ($override_login==1) + { + $start_event_date=$original_session_start_date; + $start_epoch_stmt="select unix_timestamp('$start_event_date')"; + $start_epoch_rslt=mysql_to_mysqli($start_epoch_stmt, $link); + $start_epoch_row=mysqli_fetch_row($start_epoch_rslt); + $override_event_epoch=$start_epoch_row[0]; + + $agent_sessions_array["$user"]["$start_event_date"]["full_name"]=$full_name; + $agent_sessions_array["$user"]["$start_event_date"]["user_group"]=$user_group; + $agent_sessions_array["$user"]["$start_event_date"]["start_hour"]=$override_event_epoch; + $agent_sessions_array["$user"]["$start_event_date"]["extension"]=$extension; + $agent_sessions_array["$user"]["$start_event_date"]["server_ip"]=$server_ip; + $agent_sessions_array["$user"]["$start_event_date"]["login_notes"]=$login_notes; + + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"]=$override_event_epoch; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["login_notes"]=$login_notes; + + $agent_logged_in=1; + } + } + } + $row_no++; # Keeps from doing an override check + + #### CHECK IF THE DATE IS DIFFERENT FROM THE PRECEDING RECORD IF THE AGENT IS STILL LOGGED IN + #### WE'RE ASSUMING THAT THE AGENTS DON'T WORK PAST MIDNIGHT FOR NOW + /* + if ($event_date!=$prev_date && !$override_login) + { + if ($agent_logged_in) + { + # Previous agent was still logged in - mark the eod + if ($prev_date!=$TODAY) + { + $event_date_eod="$prev_date 23:59:59"; + $notes="EOD LOGOUT"; + } + else + { + $event_date_eod="$prev_date $NOW_TIME"; + $notes="STILL LOGGED IN"; + } + + $eod_epoch_stmt="select unix_timestamp('$start_event_date'), unix_timestamp('$event_date_eod')"; + $eod_epoch_rslt=mysql_to_mysqli($eod_epoch_stmt, $link); + $eod_epoch_row=mysqli_fetch_row($eod_epoch_rslt); + $agent_sessions_array["$user"]["$start_event_date"]["start_hour"]=$eod_epoch_row[0]; + $agent_sessions_array["$user"]["$start_event_date"]["full_name"]=$prev_full_name; + $agent_sessions_array["$user"]["$start_event_date"]["user_group"]=$prev_user_group; + $agent_sessions_array["$user"]["$start_event_date"]["end_hour"]=$eod_epoch_row[1]; + $agent_sessions_array["$user"]["$start_event_date"]["duration"]=($agent_sessions_array["$user"]["$start_event_date"]["end_hour"]-$agent_sessions_array["$user"]["$start_event_date"]["start_hour"]); + $agent_sessions_array["$user"]["$start_event_date"]["notes"]=$notes; + } + } + */ + + if ($event=="LOGIN") + { + #### IF AGENT IS NOT LOGGED IN, CREATE A NEW INTERVAL + # 2/23/22 - agent page when back-to-back logins, first login is overwritten, see Dougwanna Brown 2/15/22-2/22/22. Purge it here + # Will this affect that "if ($campaign_id!=$prev_campaign_id)" clause a few lines down? + # 2/25/22 - Commented out as the sessions were causing lagged agent calls to not be counted + # if ($agent_logged_in!=0) + # { + # unset($agent_sessions_array["$user"]["$start_event_date"]); + # $agent_logged_in=0; + # } + + if ($agent_logged_in==0) + { + $start_event_date=$event_time; + $agent_sessions_array["$user"]["$start_event_date"]["full_name"]=$full_name; + $agent_sessions_array["$user"]["$start_event_date"]["user_group"]=$user_group; + $agent_sessions_array["$user"]["$start_event_date"]["start_hour"]=$event_epoch; + $agent_sessions_array["$user"]["$start_event_date"]["extension"]=$extension; + $agent_sessions_array["$user"]["$start_event_date"]["server_ip"]=$server_ip; + + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"]=$event_epoch; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["notes"]="NEW INTERVAL"; + } + else + { + #### BACK TO BACK LOGINS - AGENT IS LAGGED, START A NEW CAMPAIGN INTERVAL IF THEY LOGGED INTO A NEW CAMPAIGN + #### DOES NOT AFFECT AGENT INTERVAL + if ($campaign_id!=$prev_campaign_id) + { + $campaign_sessions_array["$prev_campaign_id"]["$start_event_date"]["$user"]["end_hour"]=$event_epoch; + $campaign_sessions_array["$prev_campaign_id"]["$start_event_date"]["$user"]["duration"]=($campaign_sessions_array["$prev_campaign_id"]["$start_event_date"]["$user"]["end_hour"]-$campaign_sessions_array["$prev_campaign_id"]["$start_event_date"]["$user"]["start_hour"]); + $campaign_sessions_array["$prev_campaign_id"]["$start_event_date"]["$user"]["notes"]="LAGGED LOGOUT DIFF CAMPAIGN LOGIN"; + } + + # COMMENTED OUT, CAUSES PROBLEMS WHEN OVERWRITES BACK-TOBACK LOGIN + # $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"]=$event_epoch; + + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["notes"]="STILL LOGGED IN"; + } + + $agent_logged_in=1; + } + + if (preg_match('/LOGOUT/', $event)) # && $agent_logged_in==1, removed this due to back to back logouts (see user 105110 for 2022-01-10) + { + # 2/23/22 - agent page when back-to-back logouts, second logout is ignored, see Dougwanna Brown 2/15/22-2/22/22. + $agent_sessions_array["$user"]["$start_event_date"]["end_hour"]=$event_epoch; + $agent_sessions_array["$user"]["$start_event_date"]["end_date"]=$event_time; + $agent_sessions_array["$user"]["$start_event_date"]["duration"]=($agent_sessions_array["$user"]["$start_event_date"]["end_hour"]-$agent_sessions_array["$user"]["$start_event_date"]["start_hour"]); + + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_hour"]=$event_epoch; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_date"]=$event_time; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["duration"]=($campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_hour"]-$campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"]); + + if ($agent_logged_in==1) + { + # 2/23/22 - agent page when back-to-back logouts, second logout is ignored, see Dougwanna Brown 2/15/22-2/22/22. + # $agent_sessions_array["$user"]["$start_event_date"]["end_hour"]=$event_epoch; + # $agent_sessions_array["$user"]["$start_event_date"]["end_date"]=$event_time; + # $agent_sessions_array["$user"]["$start_event_date"]["duration"]=($agent_sessions_array["$user"]["$start_event_date"]["end_hour"]-$agent_sessions_array["$user"]["$start_event_date"]["start_hour"]); + $agent_sessions_array["$user"]["$start_event_date"]["notes"]="NORMAL LOGOUT"; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["notes"]="NORMAL LOGOUT"; + } + else + { + $agent_sessions_array["$user"]["$start_event_date"]["notes"]="REPEAT LOGOUT"; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["notes"]="REPEAT LOGOUT"; + } + + $agent_logged_in=0; + } + + $override_login=0; + $prev_date=$event_date; + $prev_event=$event; + $prev_campaign_id=$campaign_id; + } + + if($agent_logged_in) + { + if ($event_date!=$TODAY) + { + $event_date_eod="$event_date 23:59:59"; + $notes="EOD LOGOUT"; + } + else + { + $event_date_eod="$event_date $NOW_TIME"; + $notes="STILL LOGGED IN"; + } + + $eod_epoch_stmt="select unix_timestamp('$start_event_date'), unix_timestamp('$event_date_eod')"; + $eod_epoch_rslt=mysql_to_mysqli($eod_epoch_stmt, $link); + $eod_epoch_row=mysqli_fetch_row($eod_epoch_rslt); + $agent_sessions_array["$user"]["$start_event_date"]["start_hour"]=$eod_epoch_row[0]; + $agent_sessions_array["$user"]["$start_event_date"]["full_name"]=$full_name; + $agent_sessions_array["$user"]["$start_event_date"]["user_group"]=$user_group; + $agent_sessions_array["$user"]["$start_event_date"]["end_hour"]=$eod_epoch_row[1]; + $agent_sessions_array["$user"]["$start_event_date"]["end_date"]=$event_date_eod; + $agent_sessions_array["$user"]["$start_event_date"]["duration"]=($agent_sessions_array["$user"]["$start_event_date"]["end_hour"]-$agent_sessions_array["$user"]["$start_event_date"]["start_hour"]); + $agent_sessions_array["$user"]["$start_event_date"]["notes"]=$notes; + + # IS IT SAFE HERE? + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_hour"]=$eod_epoch_row[1]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_date"]=$event_date_eod; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["duration"]=($campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_hour"]-$campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"]); + + $agent_logged_in=0; + } + } + +# Do round of calculations for agents logged in +foreach ($agent_sessions_array as $user => $sessions) + { + # Purge agents with no start_hours (this is remote agents) + if (count(array_count_values(array_column($sessions,'start_hour')))==0) + { + unset($agent_sessions_array["$user"]); + } + + foreach($sessions as $start_event_date => $activity) + { + if ($agent_sessions_array["$user"]["$start_event_date"]["start_hour"]) # + { + # print_r($activity); + $full_name=$agent_sessions_array["$user"]["$start_event_date"]["full_name"]; + + $pause_stmt="select sec_to_time(sum(pause_sec)), sum(pause_sec), count(*) from vicidial_agent_log where event_time>=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["start_hour"].") and event_time<=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["end_hour"].") and user='$user' and pause_sec>0"; + $pause_rslt=mysql_to_mysqli($pause_stmt, $link); + $pause_row=mysqli_fetch_row($pause_rslt); + $agent_sessions_array["$user"]["$start_event_date"]["pauses"]=$pause_row[2]; + $agent_sessions_array["$user"]["$start_event_date"]["pause_time"]=$pause_row[0]; + $agent_sessions_array["$user"]["$start_event_date"]["pause_sec"]=$pause_row[1]; + $agent_sessions_array["$user"]["$start_event_date"]["billable"]=0; ## !!!!!!! THIS IS BILLABLE --> PAUSE <-- ONLY !!!!!!!!!!! + $agent_sessions_array["$user"]["$start_event_date"]["calls"]=0; + $agent_sessions_array["$user"]["$start_event_date"]["talk_sec"]=0; + $agent_sessions_array["$user"]["$start_event_date"]["wait_sec"]=0; + $agent_sessions_array["$user"]["$start_event_date"]["dispo_sec"]=0; + + $user_group=$agent_sessions_array["$user"]["$start_event_date"]["user_group"]; + $location=GetUserLocation($user); + + # GET PAUSE TYPES AND PAUSE TIMES + $billable_stmt="select campaign_id, sub_status, if(sum(pause_sec) is null, 0, sum(pause_sec)) as total_pause, count(*) as pauses From vicidial_agent_log where event_time>=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["start_hour"].") and event_time<=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["end_hour"].") and user='$user' and pause_sec>0 group by campaign_id, sub_status order by campaign_id, sub_status"; + $billable_rslt=mysql_to_mysqli($billable_stmt, $link); + while ($billable_row=mysqli_fetch_array($billable_rslt)) + { + $campaign_id=$billable_row["campaign_id"]; + $sub_status=$billable_row["sub_status"]; + + if (in_array($sub_status, $billable_pause_codes["$campaign_id"]) || in_array($sub_status, $billable_pause_codes["SYSTEM"])) + { + $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"]; + } + } + + ## GET CALLS, TALK AND WAIT TIME + # 02/21/2022 - need to separate for outbound-only and inbound-only + $call_stmt_outb=""; + if ($atomic_queue_campaigns_str!="") + { + $call_stmt_outb="select if(sum(talk_sec) is null, 0, sum(talk_sec)) as total_talk, if (sum(wait_sec) is null, 0, sum(wait_sec)) as total_wait, if (sum(dispo_sec) is null, 0, sum(dispo_sec)) as total_dispo, status, campaign_id, count(*) as calls, 'OUTBOUND' as direction From vicidial_agent_log where event_time>=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["start_hour"].") and event_time<=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["end_hour"].") and user='$user' and lead_id>0 and lead_id is not null and talk_epoch is not null and comments!='INBOUND' $and_atomic_queue_campaigns_clause group by status, campaign_id "; + } + + $call_stmt_inb=""; + if ($atomic_queue_ingroups_str!="") + { + $vcl_uniqueid_stmt="select uniqueid, status, length_in_sec-queue_seconds from vicidial_closer_log $vicidial_closer_log_SQL and call_date+INTERVAL ceil(queue_seconds) SECOND>=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["start_hour"].") and call_date+INTERVAL ceil(queue_seconds) SECOND<=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["end_hour"].") and user='$user' and status!='AFTHRS'"; + + # $DB=1; + if ($DB) {print "\n\n\n\n";} + + $vcl_uniqueid_rslt=mysql_to_mysqli($vcl_uniqueid_stmt, $link); + $val_uniqueid_array=array(); + while ($vcl_uniqueid_row=mysqli_fetch_row($vcl_uniqueid_rslt)) + { + array_push($val_uniqueid_array, $vcl_uniqueid_row[0]); + $status=$vcl_uniqueid_row[1]; + $talk_sec=$vcl_uniqueid_row[2]; + + $agent_sessions_array["$user"]["$start_event_date"]["calls"]++; + $agent_sessions_array["$user"]["$start_event_date"]["talk_sec"]+=$talk_sec; + + $user_groups_array["$user_group"]["calls"]++; + $user_groups_array["$user_group"]["talk_sec"]+=$talk_sec; + + $locations_array["$location"]["calls"]++; + $locations_array["$location"]["talk_sec"]+=$talk_sec; + + # Moved from below due to agent log not carrying uniqueid over - stopgap because this may still have gaps in the talk/dispo time + # due to uniqueid not carrying over + # INBOUND CALL COUNTS FOR USERS AND USER GROUPS MUST BE TALLIED HERE BECAUSE THE CORRELATION BETWEEN + if (in_array($status, $sale_array["$campaign_id"]) || in_array($status, $sale_array["SYSTEM"])) + { + $agent_sessions_array["$user"]["$start_event_date"]["sales"]++; + # $campaign_sessions_array["$campaign_id"]["$start_event_date"]["sales"]+=$call_row["calls"]; + } + if (in_array($status, $human_ans_array["$campaign_id"]) || in_array($status, $human_ans_array["SYSTEM"])) + { + $agent_sessions_array["$user"]["$start_event_date"]["human_answered"]++; + # $campaign_sessions_array["$campaign_id"]["$start_event_date"]["human_answered"]+=$call_row["calls"]; + } + if (in_array($status, $contact_array["$campaign_id"]) || in_array($status, $contact_array["SYSTEM"])) + { + $agent_sessions_array["$user"]["$start_event_date"]["contacts"]++; + # $campaign_sessions_array["$campaign_id"]["$start_event_date"]["contacts"]+=$call_row["calls"]; + } + + } + + + $call_stmt_inb="select if(sum(talk_sec) is null, 0, sum(talk_sec)) as total_talk, if (sum(wait_sec) is null, 0, sum(wait_sec)) as total_wait, if (sum(dispo_sec) is null, 0, sum(dispo_sec)) as total_dispo, status, campaign_id, count(*) as calls, 'INBOUND' as direction From vicidial_agent_log where event_time>=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["start_hour"].") and event_time<=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["end_hour"].") and user='$user' and lead_id>0 and lead_id is not null and talk_epoch is not null and comments='INBOUND' and uniqueid in ('".implode("', '", $val_uniqueid_array)."') group by status, campaign_id "; + } + + $call_stmt=$call_stmt_outb.($call_stmt_outb!="" && $call_stmt_inb!="" ? " UNION " : "").$call_stmt_inb; + + # print "\n\n\n\n"; + + # $call_stmt="select if(sum(talk_sec) is null, 0, sum(talk_sec)) as total_talk, if (sum(wait_sec) is null, 0, sum(wait_sec)) as total_wait, if (sum(dispo_sec) is null, 0, sum(dispo_sec)) as total_dispo, status, campaign_id, count(*) as calls From vicidial_agent_log where event_time>=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["start_hour"].") and event_time<=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["end_hour"].") and user='$user' and lead_id>0 and lead_id is not null group by status, campaign_id"; + + $call_rslt=mysql_to_mysqli($call_stmt, $link); + while($call_row=mysqli_fetch_array($call_rslt)) + { + $call_direction=$call_row["direction"]; + + # Commented out IN INBOUND because counts were not accurate, moved up + if ($call_direction=="OUTBOUND") + { + $agent_sessions_array["$user"]["$start_event_date"]["calls"]+=$call_row["calls"]; + $agent_sessions_array["$user"]["$start_event_date"]["talk_sec"]+=$call_row["total_talk"]; + } + $agent_sessions_array["$user"]["$start_event_date"]["wait_sec"]+=$call_row["total_wait"]; + $agent_sessions_array["$user"]["$start_event_date"]["dispo_sec"]+=$call_row["total_dispo"]; + + # Commented out IN INBOUND because counts were not accurate, moved up + if ($call_direction=="OUTBOUND") + { + $user_groups_array["$user_group"]["calls"]+=$call_row["calls"]; + $user_groups_array["$user_group"]["talk_sec"]+=$call_row["total_talk"]; + } + + # Commented out IN INBOUND because counts were not accurate, moved up + if ($call_direction=="OUTBOUND") + { + $locations_array["$location"]["calls"]+=$call_row["calls"]; + $locations_array["$location"]["talk_sec"]+=$call_row["total_talk"]; + } + $locations_array["$location"]["wait_sec"]+=$call_row["total_wait"]; + + $campaign_id=$call_row["campaign_id"]; + $status=$call_row["status"]; + $agent_sessions_array["$user"]["$start_event_date"]["sales"]+=0; + $agent_sessions_array["$user"]["$start_event_date"]["human_answered"]+=0; + $agent_sessions_array["$user"]["$start_event_date"]["contacts"]+=0; + + # Moved up to atomic_queue_ingroups_str FOR INBOUND to try and ensure accurate call/status counts + if ($call_direction=="OUTBOUND") + { + if (in_array($status, $sale_array["$campaign_id"]) || in_array($status, $sale_array["SYSTEM"])) + { + $agent_sessions_array["$user"]["$start_event_date"]["sales"]+=$call_row["calls"]; + # $campaign_sessions_array["$campaign_id"]["$start_event_date"]["sales"]+=$call_row["calls"]; + } + if (in_array($status, $human_ans_array["$campaign_id"]) || in_array($status, $human_ans_array["SYSTEM"])) + { + $agent_sessions_array["$user"]["$start_event_date"]["human_answered"]+=$call_row["calls"]; + # $campaign_sessions_array["$campaign_id"]["$start_event_date"]["human_answered"]+=$call_row["calls"]; + } + if (in_array($status, $contact_array["$campaign_id"]) || in_array($status, $contact_array["SYSTEM"])) + { + $agent_sessions_array["$user"]["$start_event_date"]["contacts"]+=$call_row["calls"]; + # $campaign_sessions_array["$campaign_id"]["$start_event_date"]["contacts"]+=$call_row["calls"]; + } + } + } + + ## POPULATE AGENT HOUR ARRAY + $session_start_time=$agent_sessions_array["$user"]["$start_event_date"]["start_hour"]; + $session_end_time=$agent_sessions_array["$user"]["$start_event_date"]["end_hour"]; + + while ($session_start_time<$session_end_time) + { + $hour_stmt="select date_format(from_unixtime($session_start_time), '%k'), date_format(from_unixtime($session_start_time), '%Y-%m-%d')"; + $hour_rslt=mysql_to_mysqli($hour_stmt, $link); + $hour_row=mysqli_fetch_row($hour_rslt); + $hour=$hour_row[0]; + $array_date=$hour_row[1]; + $agent_date_hour_array["$array_date"]["$hour"]["$user"]=1; + + $time_in_interval=(3600-($session_start_time%3600)); + if (($session_start_time+$time_in_interval)>$session_end_time) + { + $time_in_interval=$session_end_time-$session_start_time; + } + # Uses show_full_agent_info from settings container + $agentName=($show_full_agent_info ? "$user - $full_name" : $full_name); + $agent_sessions_hour_array["$agentName"]["$hour"]+=$time_in_interval; + $agent_billable_hour_array["$agentName"]["$hour"]+=$time_in_interval; + $session_start_time+=$time_in_interval; + } + + ## REMOVE NON-BILLABLE TIME FROM HOUR_ARRAY + $nonbill_stmt="select sub_status, pause_epoch, pause_sec, event_time from vicidial_agent_log where event_time>=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["start_hour"].") and event_time<=from_unixtime(".$agent_sessions_array["$user"]["$start_event_date"]["end_hour"].") and user='$user' and pause_sec>0 and sub_status is not null and sub_status not in ('BLANK')"; + $nonbill_rslt=mysql_to_mysqli($nonbill_stmt, $link); + while ($nb_row=mysqli_fetch_row($nonbill_rslt)) + { + if (!in_array($nb_row[0], $billable_pause_codes["$campaign_id"]) && !in_array($nb_row[0], $billable_pause_codes["SYSTEM"])) + { + $pause_start_time=$nb_row[1]; + $pause_end_time=$nb_row[1]+$nb_row[2]; + # print "$user - $nb_row[3] => $nb_row[0], $pause_start_time for $nb_row[2] seconds\n"; + while ($pause_start_time<$pause_end_time) + { + $hour_stmt="select date_format(from_unixtime($pause_start_time), '%k'), date_format(from_unixtime($pause_start_time), '%Y-%m-%d')"; + $hour_rslt=mysql_to_mysqli($hour_stmt, $link); + $hour_row=mysqli_fetch_row($hour_rslt); + $hour=$hour_row[0]; + + $time_in_interval=(3600-($pause_start_time%3600)); + if (($pause_start_time+$time_in_interval)>$pause_end_time) + { + $time_in_interval=$pause_end_time-$pause_start_time; + } + # Uses show_full_agent_info from settings container + $agentName=($show_full_agent_info ? "$user - $full_name" : $full_name); + $agent_billable_hour_array["$agentName"]["$hour"]-=$time_in_interval; + $pause_start_time+=$time_in_interval; + } + } + } + + ## GET TOTAL TIME AND MAX TIMES FOR HEADER REPORT + $total_agent_time+=$agent_sessions_array["$user"]["$start_event_date"]["duration"]; + if ($agent_sessions_array["$user"]["$start_event_date"]["duration"]<$min_agent_time || !$min_agent_time) + { + $min_agent_time=$agent_sessions_array["$user"]["$start_event_date"]["duration"]; + } + + if ($agent_sessions_array["$user"]["$start_event_date"]["duration"]>$max_agent_time || !$max_agent_time) + { + $max_agent_time=$agent_sessions_array["$user"]["$start_event_date"]["duration"]; + } + + + } + } + } + +# Do round of calculations for campaigns logged in +foreach ($campaign_sessions_array as $campaign_id => $logins) + { + foreach($logins as $start_event_date => $users) + { + foreach($users as $user => $activity) + { + # Purge records that have no start time - these seem to be remote agents + if (!$activity["start_hour"]) + { + unset($campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]); + } + else + { + # Fill in end date if still logged in (may need to ignore the situation where the date is not today) + if ($activity["notes"]=="STILL LOGGED IN") + { + if (substr($start_event_date, 0, 10)!=$TODAY) + { + $event_date_eod=substr($start_event_date, 0, 10)." 23:59:59"; + } + else + { + $event_date_eod=substr($start_event_date, 0, 10)." $NOW_TIME"; + } + $eod_epoch_stmt="select unix_timestamp('$start_event_date'), unix_timestamp('$event_date_eod')"; + $eod_epoch_rslt=mysql_to_mysqli($eod_epoch_stmt, $link); + $eod_epoch_row=mysqli_fetch_row($eod_epoch_rslt); + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"]=$eod_epoch_row[0]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_hour"]=$eod_epoch_row[1]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["duration"]=($campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_hour"]-$campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"]); + } + + # FINALLY... + $pause_stmt="select sec_to_time(sum(pause_sec)), sum(pause_sec), count(*) from vicidial_agent_log where event_time>=from_unixtime(".$campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"].") and event_time<=from_unixtime(".$campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_hour"].") and user='$user' and pause_sec>0"; + $pause_rslt=mysql_to_mysqli($pause_stmt, $link); + $pause_row=mysqli_fetch_row($pause_rslt); + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["pauses"]=$pause_row[2]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["pause_time"]=$pause_row[0]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["pause_sec"]=$pause_row[1]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["billable"]=0; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["calls"]=0; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["talk_sec"]=0; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["wait_sec"]=0; + + # Get pause types and pause times + $billable_stmt="select campaign_id, sub_status, if(sum(pause_sec) is null, 0, sum(pause_sec)) as total_pause, count(*) as pauses From vicidial_agent_log where event_time>=from_unixtime(".$campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"].") and event_time<=from_unixtime(".$campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_hour"].") and campaign_id='$campaign_id' and user='$user' and pause_sec>0 group by campaign_id, sub_status order by campaign_id, sub_status"; + $billable_rslt=mysql_to_mysqli($billable_stmt, $link); + while ($billable_row=mysqli_fetch_array($billable_rslt)) + { + $campaign_id=$billable_row["campaign_id"]; + $sub_status=$billable_row["sub_status"]; + + if (in_array($sub_status, $billable_pause_codes["$campaign_id"]) || in_array($sub_status, $billable_pause_codes["SYSTEM"])) + { + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["billable"]+=$billable_row["total_pause"]; + } + } + + $call_stmt="select if(sum(talk_sec) is null, 0, sum(talk_sec)) as total_talk, if (sum(wait_sec) is null, 0, sum(wait_sec)) as total_wait, if (sum(dispo_sec) is null, 0, sum(dispo_sec)) as total_dispo, status, campaign_id, count(*) as calls From vicidial_agent_log where event_time>=from_unixtime(".$campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["start_hour"].") and event_time<=from_unixtime(".$campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["end_hour"].") and user='$user' and campaign_id='$campaign_id' and lead_id>0 and lead_id is not null group by status, campaign_id"; + $call_rslt=mysql_to_mysqli($call_stmt, $link); + while($call_row=mysqli_fetch_array($call_rslt)) + { + + # $campaign_id=$call_row["campaign_id"]; + $status=$call_row["status"]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["calls"]+=$call_row["calls"]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["talk_sec"]+=$call_row["total_talk"]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["wait_sec"]+=$call_row["total_wait"]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["dispo_sec"]+=$call_row["total_dispo"]; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["sales"]+=0; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["human_answered"]+=0; + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["contacts"]+=0; + + if (in_array($status, $sale_array["$campaign_id"]) || in_array($status, $sale_array["SYSTEM"])) + { + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["sales"]+=$call_row["calls"]; + } + if (in_array($status, $human_ans_array["$campaign_id"]) || in_array($status, $human_ans_array["SYSTEM"])) + { + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["human_answered"]+=$call_row["calls"]; + } + if (in_array($status, $contact_array["$campaign_id"]) || in_array($status, $contact_array["SYSTEM"])) + { + $campaign_sessions_array["$campaign_id"]["$start_event_date"]["$user"]["contacts"]+=$call_row["calls"]; + } + } + } + } + + } + } + +# Fill in hour array +foreach ($agent_sessions_hour_array as $user => $hour) + { + + for ($i=0; $i<=23; $i++) + { + $agent_sessions_hour_array["$user"][$i]+=0; + $agent_billable_hour_array["$user"][$i]+=0; + } + } + +# print_r($agent_sessions_array); +# print_r($campaign_sessions_array); +# print_r($agent_sessions_hour_array); die; +# print_r($agent_date_hour_array); die; + +$min_agent_time+=0; # Create these if not existing +$max_agent_time+=0; # create this if not existing +$total_agent_time+=0; # create this if not existing +$agents_available=count($agent_sessions_array); +$agent_sessions=array_sum(array_map("count", $agent_sessions_array)); +$grand_total_sessions=array_sum(array_map("count", $agent_sessions_array)); +$average_agent_time=round(MathZDC($total_agent_time, $agent_sessions)); +ksort($agent_sessions_array, SORT_NATURAL | SORT_FLAG_CASE); + +######### AGENT SESSION DETAIL ######### +$HTML_output.="

"._QXZ("Agent Session Detail")." $NWB#VERM_AGENTS-session_detail$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Agent sessions").": 
"._QXZ("N. of agents available").":$agents_available
"._QXZ("Average agent time").":".($average_agent_time>=3600 ? floor($average_agent_time/3600).":" : "").gmdate("i:s", $average_agent_time)."
"._QXZ("Min agent time").":".($min_agent_time>=3600 ? floor($min_agent_time/3600).":" : "").gmdate("i:s", $min_agent_time)."
"._QXZ("Max agent time").":".($max_agent_time>=3600 ? floor($max_agent_time/3600).":" : "").gmdate("i:s", $max_agent_time)."
"._QXZ("Total agent time").":".sprintf("%.1f", ($total_agent_time/3600))." H
"._QXZ("Export as")."...
"; + +$CSV_output["agent_session_detail"]="\""._QXZ("Agent Sessions").":\"\n"; +$CSV_output["agent_session_detail"].="\""._QXZ("N. of agents available").":\",\"$agents_available\"\n"; +$CSV_output["agent_session_detail"].="\""._QXZ("Average agent time").":\",\"".($average_agent_time>=3600 ? floor($average_agent_time/3600).":" : "").gmdate("i:s", $average_agent_time)."\"\n"; +$CSV_output["agent_session_detail"].="\""._QXZ("Min agent time").":\",\"".($min_agent_time>=3600 ? floor($min_agent_time/3600).":" : "").gmdate("i:s", $min_agent_time)."\"\n"; +$CSV_output["agent_session_detail"].="\""._QXZ("Max agent time").":\",\"".($max_agent_time>=3600 ? floor($max_agent_time/3600).":" : "").gmdate("i:s", $max_agent_time)."\"\n"; +$CSV_output["agent_session_detail"].="\""._QXZ("Total agent time").":\",\"".sprintf("%.1f", ($total_agent_time/3600))." H\"\n"; +######################################## + +######### AGENT PAUSE DETAIL ########### +# print_r($agent_sessions_array); +$HTML_output.="

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

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +### Removed 5/19 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agent_pause_detail"]="\""._QXZ("Agent")."\",\""._QXZ("Sessions")."\",\""._QXZ("Avg Session")."\",\""._QXZ("Pauses")."\",\""._QXZ("Avg Pause")."\",\""._QXZ("Pause")." %\",\""._QXZ("Pauses per session")."\"\n"; + +$grand_total_duration=0; +$grand_total_calls=0; +$max_agent_duration=0; +foreach ($agent_sessions_array as $user => $sessions) + { + $total_calls=array_sum(array_column($sessions,'calls')); + $total_duration=array_sum(array_column($sessions,'duration')); + $total_pauses=array_sum(array_column($sessions,'pauses')); + $total_pause_time=array_sum(array_column($sessions,'pause_sec')); + $total_talk_time=array_sum(array_column($sessions,'talk_sec')); + $total_wait_time=array_sum(array_column($sessions,'wait_sec')); + $total_billable_time=array_sum(array_column($sessions,'billable')); + $total_sales=array_sum(array_column($sessions,'sales')); + $total_human_answered=array_sum(array_column($sessions,'human_answered')); + $total_contacts=array_sum(array_column($sessions,'contacts')); + $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); + + $average_pause_time=sprintf('%02d', floor(($total_pause_time/$total_pauses)/3600)).gmdate(":i:s", round($total_pause_time/$total_pauses)); + $total_sessions=count($sessions); + $avg_session=sprintf('%02d', floor(($total_duration/$total_sessions)/3600)).gmdate(":i:s", round($total_duration/$total_sessions)); + $pauses_pct=sprintf("%.1f", 100*($total_pause_time/$total_duration)); + $pauses_per_session=sprintf("%.1f", ($total_pauses/$total_sessions)); + + $total_pause_His=sprintf('%02d', floor($total_pause_time/3600)).gmdate(":i:s", $total_pause_time); + $total_available_His=sprintf('%02d', floor($total_available_time/3600)).gmdate(":i:s", $total_available_time); + $total_duration_His=sprintf('%02d', floor($total_duration/3600)).gmdate(":i:s", $total_duration); + $total_billable_His=sprintf('%02d', floor($total_billable_time/3600)).gmdate(":i:s", $total_billable_time); + $total_nonbillable_His=sprintf('%02d', floor($total_nonbillable_time/3600)).gmdate(":i:s", $total_nonbillable_time); + $total_ALL_billable_His=sprintf('%02d', floor($total_ALL_billable_time/3600)).gmdate(":i:s", $total_ALL_billable_time); + + # Use these in later loops + $grand_total_duration+=$total_duration; + $grand_total_calls+=$total_calls; + $grand_total_sales+=$total_sales; + $grand_total_human_answered+=$total_human_answered; + $grand_total_contacts+=$total_contacts; + $grand_total_talk_time+=$total_talk_time; + $grand_total_pause_time+=$total_pause_time; + $grand_total_wait_time+=$total_wait_time; + $grand_total_billable_time+=$total_billable_time; + + if($total_duration>$max_agent_duration) {$max_agent_duration=$total_duration;} + + $agentName=($show_full_agent_info ? "$user - ".$fullname_info["$user"] : $fullname_info["$user"]); + + $HTML_output.="\n"; + ### $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agent_pause_detail"].="\"".$agentName."\",\"".$total_sessions."\",\"".$avg_session."\",\"".$total_pauses."\",\"".$average_pause_time."\",\"".$pauses_pct." %\",\"".$pauses_per_session."\"\n"; + + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Level").""._QXZ("Agent").""._QXZ("Sessions").""._QXZ("Avg Session").""._QXZ("Pauses").""._QXZ("Avg Pause").""._QXZ("Pause")." %"._QXZ("Pauses per session")."
Undefined".$agentName."".$total_sessions."".$avg_session."".$total_pauses."".$average_pause_time."".$pauses_pct." %".$pauses_per_session."
"._QXZ("Export as")."...
"; +######################################## + +######### 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.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +### Removed 5/19 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agent_availability"]="\""._QXZ("Agent")."\",\""._QXZ("Available Time (non-paused)")."\",\""._QXZ("On Pause")."\",\""._QXZ("Billable")."\",\""._QXZ("Non bill.")."\",\"\"\n"; + +foreach ($agent_sessions_array as $user => $sessions) + { + $total_duration=array_sum(array_column($sessions,'duration')); + $total_pause_time=array_sum(array_column($sessions,'pause_sec')); + $total_wait_time=array_sum(array_column($sessions,'wait_sec')); + $total_talk_time=array_sum(array_column($sessions,'talk_sec')); + $total_dispo_time=array_sum(array_column($sessions,'dispo_sec')); + $total_available_time=$total_duration-$total_pause_time; + $total_billable_time=array_sum(array_column($sessions,'billable')); + $total_nonbillable_time=$total_pause_time-$total_billable_time; + $total_ALL_billable_time=($total_talk_time+$total_wait_time+$total_billable_time+$total_dispo_time); + + $total_pause_His=sprintf('%02d', floor($total_pause_time/3600)).gmdate(":i:s", $total_pause_time); + $total_available_His=sprintf('%02d', floor($total_available_time/3600)).gmdate(":i:s", $total_available_time); + $total_duration_His=sprintf('%02d', floor($total_duration/3600)).gmdate(":i:s", $total_duration); + $total_billable_His=sprintf('%02d', floor($total_billable_time/3600)).gmdate(":i:s", $total_billable_time); + $total_nonbillable_His=sprintf('%02d', floor($total_nonbillable_time/3600)).gmdate(":i:s", $total_nonbillable_time); + $total_ALL_billable_His=sprintf('%02d', floor($total_ALL_billable_time/3600)).gmdate(":i:s", $total_ALL_billable_time); + + $available_pct=sprintf("%.1f", 100*($total_duration/$grand_total_duration)); + + $overlapping="0:00"; + + $agentName=($show_full_agent_info ? "$user - ".$fullname_info["$user"] : $fullname_info["$user"]); + + $HTML_output.="\n"; + ### $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + ### $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agent_availability"].="\"".$agentName."\",\"".$total_available_His."\",\"".$total_pause_His."\",\"".$total_billable_His."\",\"".$total_nonbillable_His."\",\"".$available_pct." %\"\n"; + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Level").""._QXZ("Agent").""._QXZ("Available Time (non-paused)").""._QXZ("On Pause").""._QXZ("Billable").""._QXZ("Non bill.").""._QXZ("Overlapping")." ...
Undefined".$agentName."".$total_available_His."".$total_pause_His."".$total_billable_His."".$total_nonbillable_His."".$overlapping."".$available_pct." %
"._QXZ("Export as")."...
"; +######################################## + +######### ANSWERED CALLS ########### +$HTML_output.="

"._QXZ("Answered calls (for selected campaign/ingroups)")." $NWB#VERM_AGENTS-answered_calls$NWE

"; # Inbound +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +### Removed 5/19 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["answered_calls"]="\""._QXZ("Agent")."\",\""._QXZ("N. Calls")."\",\""._QXZ("Total call time")."\",\""._QXZ("Avg call time")."\",\""._QXZ("Avg agent wait time")."\",\"% "._QXZ("of calls")."\"\n"; + +foreach ($agent_sessions_array as $user => $sessions) + { + $total_duration=array_sum(array_column($sessions,'duration')); + $total_calls=array_sum(array_column($sessions,'calls')); + $total_pause_time=array_sum(array_column($sessions,'pause_sec')); + $total_wait_time=array_sum(array_column($sessions,'wait_sec')); + $total_talk_time=array_sum(array_column($sessions,'talk_sec')); + $total_dispo_time=array_sum(array_column($sessions,'dispo_sec')); + $total_billable_time=array_sum(array_column($sessions,'billable')); + $total_ALL_billable_time=($total_talk_time+$total_wait_time+$total_billable_time+$total_dispo_time); + + $total_talk_His=sprintf('%02d', floor($total_talk_time/3600)).gmdate(":i:s", $total_talk_time); + $avg_talk_His=gmdate("H:i:s", round(MathZDC($total_talk_time, $total_calls))); + $avg_wait_His=gmdate("H:i:s", round(MathZDC($total_wait_time, $total_calls))); + $total_pause_His=sprintf('%02d', floor($total_pause_time/3600)).gmdate(":i:s", $total_pause_time); + $total_available_His=sprintf('%02d', floor($total_available_time/3600)).gmdate(":i:s", $total_available_time); + $total_duration_His=sprintf('%02d', floor($total_duration/3600)).gmdate(":i:s", $total_duration); + $total_billable_His=sprintf('%02d', floor($total_billable_time/3600)).gmdate(":i:s", $total_billable_time); + $total_ALL_billable_His=sprintf('%02d', floor($total_ALL_billable_time/3600)).gmdate(":i:s", $total_ALL_billable_time); + + $queue_pct=sprintf("%.1f", 100*($total_calls/$grand_total_calls)); + + $agentName=($show_full_agent_info ? "$user - ".$fullname_info["$user"] : $fullname_info["$user"]); + + $HTML_output.="\n"; + ### $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["answered_calls"].="\"".$agentName."\",\"".$total_calls."\",\"".$total_talk_His."\",\"".$avg_talk_His."\",\"".$avg_wait_His."\",\"".$queue_pct." %\"\n"; + + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Level").""._QXZ("Agent").""._QXZ("N. Calls").""._QXZ("Total call time").""._QXZ("Avg call time").""._QXZ("Avg agent wait time")."% "._QXZ("of calls")."
"._QXZ("Undefined")."".$agentName."".$total_calls."".$total_talk_His."".$avg_talk_His."".$avg_wait_His."".$queue_pct." %
"._QXZ("Export as")."...
"; +######################################## + +######### ANSWERED CALLS BY USER GROUP ########### +# print_r($user_groups_array); +$HTML_output.="

"._QXZ("Answered calls by user group")." $NWB#VERM_AGENTS-answered_by_user_group$NWE

"; # Inbound +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["answered_calls_by_user_group"]="\""._QXZ("Agent group")."\",\""._QXZ("N. Calls")."\",\""._QXZ("Total call time")."\",\""._QXZ("Avg call time")."\",\"% "._QXZ("of calls")."\"\n"; + +foreach ($user_groups_array as $user_group => $data) + { + $total_talk_His=sprintf('%02d', floor($data["talk_sec"]/3600)).gmdate(":i:s", $data["talk_sec"]); + $avg_talk_His=gmdate("H:i:s", round($data["talk_sec"]/$data["calls"])); + + $queue_pct=sprintf("%.1f", 100*($data["calls"]/$grand_total_calls)); + + $HTML_output.="\n"; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["answered_calls_by_user_group"].="\"$user_group"."-".$usergroup_info["$user_group"]."\",\"".$data["calls"]."\",\"".$total_talk_His."\",\"".$avg_talk_His."\",\"".$queue_pct." %\"\n"; + + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Agent group").""._QXZ("N. Calls").""._QXZ("Total call time").""._QXZ("Avg call time")."% "._QXZ("of calls")."
$user_group"."-".$usergroup_info["$user_group"]."".$data["calls"]."".$total_talk_His."".$avg_talk_His."".$queue_pct." %
"._QXZ("Export as")."...
"; +#################################### + +######### ANSWERED CALLS BY LOCATION ########### +$HTML_output.="

"._QXZ("Answered calls by location")." $NWB#VERM_AGENTS-answered_by_location$NWE

"; # +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["answered_calls_by_location"]="\""._QXZ("Location")."\",\""._QXZ("N. Calls")."\",\""._QXZ("Total call time")."\",\""._QXZ("Avg call time")."\",\""._QXZ("Avg wait time")."\",\"% "._QXZ("of calls")."\"\n"; + +foreach ($locations_array as $location => $data) + { + $total_talk_His=sprintf('%02d', floor($data["talk_sec"]/3600)).gmdate(":i:s", $data["talk_sec"]); + $avg_talk_His=gmdate("H:i:s", round($data["talk_sec"]/$data["calls"])); + $avg_wait_His=gmdate("H:i:s", round($data["wait_sec"]/$data["calls"])); + + $queue_pct=sprintf("%.1f", 100*($data["calls"]/$grand_total_calls)); + + + $HTML_output.="\n"; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["answered_calls_by_location"].="\"".$location."\",\"".$data["calls"]."\",\"".$total_talk_His."\",\"".$avg_talk_His."\",\"".$avg_wait_His."\",\"".$queue_pct." %\"\n"; + + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Location").""._QXZ("N. Calls").""._QXZ("Total call time").""._QXZ("Avg call time").""._QXZ("Avg wait time")."% "._QXZ("of calls")."
".$location."".$data["calls"]."".$total_talk_His."".$avg_talk_His."".$avg_wait_His."".$queue_pct." %
"._QXZ("Export as")."...
"; +#################################### + +######### DREADED OCCUPANCY ########### +$HTML_output.="

"._QXZ("Agent Occupancy Report")." $NWB#VERM_AGENTS-occupancy$NWE

"; # Inbound +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +### Removed 5/19 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; #Overlapping +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["occupancy"]="\""._QXZ("Agent")."\",\""._QXZ("Sessions")."\",\""._QXZ("Pau Bill")."\",\""._QXZ("Pau N/Bill")."\",\""._QXZ("Pauses")."\",\""._QXZ("Total session time")."\",\""._QXZ("Total call time")."\",\""._QXZ("Out of sessions call time")."\",\""._QXZ("Occupancy")." %\"\n"; + +$grand_total_nonbillable_time=$grand_total_pause_time-$grand_total_billable_time; + +$grand_total_talk_His=sprintf('%02d', floor($grand_total_talk_time/3600)).gmdate(":i:s", $grand_total_talk_time); +$grand_total_pause_His=sprintf('%02d', floor($grand_total_pause_time/3600)).gmdate(":i:s", $grand_total_pause_time); +$grand_total_duration_His=sprintf('%02d', floor($grand_total_duration/3600)).gmdate(":i:s", $grand_total_duration); +$grand_total_billable_His=sprintf('%02d', floor($grand_total_billable_time/3600)).gmdate(":i:s", $grand_total_billable_time); +$grand_total_nonbillable_His=sprintf('%02d', floor($grand_total_nonbillable_time/3600)).gmdate(":i:s", $grand_total_nonbillable_time); +$grand_total_occupancy=sprintf("%.1f", 100*($grand_total_talk_time/($grand_total_duration-$grand_total_pause_time))); + +$HTML_output.="\n"; +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["occupancy"].="\""._QXZ("All")."\",\"".$grand_total_duration_His."\",\"".$grand_total_billable_His."\",\"".$grand_total_nonbillable_His."\",\"".$grand_total_pause_His."\",\"00:00:00\",\"".$grand_total_talk_His."\",\"00:00:00\",\"$grand_total_occupancy %\"\n"; + +foreach ($agent_sessions_array as $user => $sessions) + { + $total_calls=array_sum(array_column($sessions,'calls')); + $total_duration=array_sum(array_column($sessions,'duration')); + $total_pause_time=array_sum(array_column($sessions,'pause_sec')); + $total_wait_time=array_sum(array_column($sessions,'wait_sec')); + $total_talk_time=array_sum(array_column($sessions,'talk_sec')); + $total_dispo_time=array_sum(array_column($sessions,'dispo_sec')); + $total_billable_time=array_sum(array_column($sessions,'billable')); + $total_nonbillable_time=$total_pause_time-$total_billable_time; + $total_ALL_billable_time=($total_talk_time+$total_wait_time+$total_billable_time+$total_dispo_time); + + $total_talk_His=sprintf('%02d', floor($total_talk_time/3600)).gmdate(":i:s", $total_talk_time); + $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_billable_His=sprintf('%02d', floor($total_billable_time/3600)).gmdate(":i:s", $total_billable_time); + $total_nonbillable_His=sprintf('%02d', floor($total_nonbillable_time/3600)).gmdate(":i:s", $total_nonbillable_time); + $total_ALL_billable_His=sprintf('%02d', floor($total_ALL_billable_time/3600)).gmdate(":i:s", $total_ALL_billable_time); + + $occupancy=sprintf("%.1f", 100*MathZDC($total_talk_time, ($total_duration-$total_pause_time))); + + $agentName=($show_full_agent_info ? "$user - ".$fullname_info["$user"] : $fullname_info["$user"]); + + $HTML_output.="\n"; + ### $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["occupancy"].="\"".$agentName."\",\"".$total_duration_His."\",\"".$total_billable_His."\",\"".$total_nonbillable_His."\",\"".$total_pause_His."\",\"00:00:00\",\"".$total_talk_His."\",\"00:00:00\",\"$occupancy %\"\n"; + + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Level").""._QXZ("Agent").""._QXZ("Sessions").""._QXZ("Pau Bill").""._QXZ("Pau N/Bill").""._QXZ("Pauses").""._QXZ("Total session time").""._QXZ("Total call time").""._QXZ("Out of sessions call time").""._QXZ("Occupancy")." %
 "._QXZ("All")."".$grand_total_duration_His."".$grand_total_billable_His."".$grand_total_nonbillable_His."".$grand_total_pause_His."00:00:00".$grand_total_talk_His."00:00:00$grand_total_occupancy %
"._QXZ("Undefined")."".$agentName."".$total_duration_His."".$total_billable_His."".$total_nonbillable_His."".$total_pause_His."00:00:00".$total_talk_His."00:00:00$occupancy %
"._QXZ("Export as")."...
"; +#################################### + +##### AGENT SESSION TIME BY HOUR ### +$HTML_output.="

"._QXZ("Agent Session Time by Hour")." $NWB#VERM_AGENTS-session_time_by_hour$NWE

"; # Inbound +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; + +$CSV_output["agent_sessions_by_hour"]="\"Agent\","; + +for ($i=0; $i<=23; $i++) + { + $HTML_output.=""; + + $CSV_output["agent_sessions_by_hour"].="\"$i\","; + } +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agent_sessions_by_hour"].="\"Total time\"\n"; + +foreach ($agent_sessions_hour_array as $agent => $hours) + { + $agent_total_hours=0; + $HTML_output.="\n"; + $HTML_output.=""; + + $CSV_output["agent_sessions_by_hour"].="\"$agent\","; + + for ($i=0; $i<=23; $i++) + { + $agent_total_hours+=$hours[$i]; + $HTML_output.=""; + + $CSV_output["agent_sessions_by_hour"].="\"".sprintf('%02d', floor($hours[$i]/3600)).gmdate(":i:s", $hours[$i])."\","; + } + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agent_sessions_by_hour"].="\"".sprintf('%02d', floor($agent_total_hours/3600)).gmdate(":i:s", $agent_total_hours)."\"\n"; + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
Agent$iTotal time
$agent".sprintf('%02d', floor($hours[$i]/3600)).gmdate(":i:s", $hours[$i])."".sprintf('%02d', floor($agent_total_hours/3600)).gmdate(":i:s", $agent_total_hours)."
"._QXZ("Export as")."...
"; +#################################### + +# No payable, not used + +#### AGENT BILLABLE TIME BY HOUR ### +$HTML_output.="

"._QXZ("Agent Billable Time by Hour")." $NWB#VERM_AGENTS-billable_time_by_hour$NWE

"; # Inbound +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; + +$CSV_output["agent_billable_by_hour"]="\"Agent\","; + +for ($i=0; $i<=23; $i++) + { + $HTML_output.=""; + + $CSV_output["agent_billable_by_hour"].="\"$i\","; + } +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agent_billable_by_hour"].="\"Total time\"\n"; + +foreach ($agent_billable_hour_array as $agent => $hours) + { + $agent_total_hours=0; + $HTML_output.="\n"; + $HTML_output.=""; + + $CSV_output["agent_billable_by_hour"].="\"$agent\","; + + for ($i=0; $i<=23; $i++) + { + $agent_total_hours+=$hours[$i]; + $HTML_output.=""; + + $CSV_output["agent_billable_by_hour"].="\"".sprintf('%02d', floor($hours[$i]/3600)).gmdate(":i:s", $hours[$i])."\","; + } + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agent_billable_by_hour"].="\"".sprintf('%02d', floor($agent_total_hours/3600)).gmdate(":i:s", $agent_total_hours)."\"\n"; + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Agent")."$i"._QXZ("Total time")."
$agent".sprintf('%02d', floor($hours[$i]/3600)).gmdate(":i:s", $hours[$i])."".sprintf('%02d', floor($agent_total_hours/3600)).gmdate(":i:s", $agent_total_hours)."
"._QXZ("Export as")."...
"; +#################################### + +#### AGENTS BY HOUR ### +$HTML_output.="

"._QXZ("Agents by Hour")." $NWB#VERM_AGENTS-agents_by_hour$NWE

"; # Inbound +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; + +$CSV_output["agents_by_hour"]="\""._QXZ("Date")."\","; + +for ($i=0; $i<=23; $i++) + { + $HTML_output.=""; + + $CSV_output["agents_by_hour"].="\"$i\","; + } +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agents_by_hour"].="\""._QXZ("Total")."\"\n"; + +foreach ($agent_date_hour_array as $array_date => $hour) + { + $total_distinct_agents=array(); + $HTML_output.="\n"; + $HTML_output.=""; + + $CSV_output["agents_by_hour"].="\"$array_date\","; + + for ($i=0; $i<=23; $i++) + { + #2/10/22 - added below to remove error + if(!$hour[$i]) {$hour[$i]=array();} + + $HTML_output.=""; + + $CSV_output["agents_by_hour"].="\"".count($hour[$i])."\","; + foreach ($hour[$i] as $agent_id => $mrker) + { + array_push($total_distinct_agents, $agent_id); + } + } + # echo "*** "; print_r($total_distinct_agents); + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agents_by_hour"].="\"".count(array_unique($total_distinct_agents))."\"\n"; + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Date")."$i"._QXZ("Total")."
$array_date".count($hour[$i])."".count(array_unique($total_distinct_agents))."
"._QXZ("Export as")."...
"; +#################################### + +######## AGENT SESSIONS VIEW ####### +$HTML_output.="

"._QXZ("Agent Sessions View")." $NWB#VERM_AGENTS-agent_sessions_view$NWE

"; # Inbound +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$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.=""; +### Removed 5/19 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +### Removed 6/14, may re-instate if "taken/lost" becomes necessary/desired. Remove above td if so +### $HTML_output.=""; +### $HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agent_sessions_view"]="\""._QXZ("Agent")."\",\""._QXZ("Login")."\",\""._QXZ("Talk")."\",\""._QXZ("Pause + Wait")."\",\""._QXZ("Pause")."\",\""._QXZ("Billable (pause)")."\",\""._QXZ("Not Billable (pause)")."\",\""._QXZ("Tot. Wait")."\",\""._QXZ("Sales")."\",\""._QXZ("S PH")."\",\""._QXZ("Cust Cont")."\",\""._QXZ("CC PH")."\",\""._QXZ("Human Ans")."\",\""._QXZ("HA PH")."\",\""._QXZ("Answered")."\",\""._QXZ("HA Conv.")."\",\""._QXZ("CC Conv.")."\",\""._QXZ("Goal Ftrs")."\",\""._QXZ("Ftrs")."\",\""._QXZ("Avg")."\"\n"; + +$grand_total_idle_time=$grand_total_pause_time+$grand_total_wait_time; +$grand_sph=sprintf("%.1f", $grand_total_sales/($grand_total_duration/3600)); +$grand_haph=sprintf("%.1f", $grand_total_human_answered/($grand_total_duration/3600)); +$grand_ccph=sprintf("%.1f", $grand_total_contacts/($grand_total_duration/3600)); +$grand_ha_conv=sprintf("%.1f", 100*($grand_total_sales/$grand_total_human_answered)); +$grand_cc_conv=sprintf("%.1f", 100*($grand_total_sales/$grand_total_contacts)); +$grand_avg_talk_time=round($grand_total_talk_time/$grand_total_calls); + +$grand_total_talk_His=sprintf('%02d', floor($grand_total_talk_time/3600)).gmdate(":i:s", $grand_total_talk_time); +$grand_total_wait_His=sprintf('%02d', floor($grand_total_wait_time/3600)).gmdate(":i:s", $grand_total_wait_time); +$grand_total_idle_His=sprintf('%02d', floor($grand_total_idle_time/3600)).gmdate(":i:s", $grand_total_idle_time); +$grand_total_pause_His=sprintf('%02d', floor($grand_total_pause_time/3600)).gmdate(":i:s", $grand_total_pause_time); +$grand_total_duration_His=sprintf('%02d', floor($grand_total_duration/3600)).gmdate(":i:s", $grand_total_duration); +$grand_total_billable_His=sprintf('%02d', floor($grand_total_billable_time/3600)).gmdate(":i:s", $grand_total_billable_time); +$grand_total_nonbillable_His=sprintf('%02d', floor($grand_total_nonbillable_time/3600)).gmdate(":i:s", $grand_total_nonbillable_time); +$grand_avg_talk_His=sprintf('%02d', floor($grand_avg_talk_time/3600)).gmdate(":i:s", $grand_avg_talk_time); + +$HTML_output.="\n"; +$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.=""; +### Removed 5/19 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; # $sales/$hq +$HTML_output.=""; # $sales/$cc +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +### Removed 6/14 - may reinstate if taken/lost is desired for this +### $HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agent_sessions_view"].="\"\",\"$grand_total_duration_His\",\"$grand_total_talk_His\",\"$grand_total_idle_His\",\"$grand_total_pause_His\",\"$grand_total_billable_His\",\"$grand_total_nonbillable_His\",\"$grand_total_wait_His\",\"$grand_total_sales\",\"$grand_sph\",\"$grand_total_contacts\",\"$grand_ccph\",\"$grand_total_human_answered\",\"$grand_haph\",\"$grand_total_calls\",\"$grand_ha_conv\",\"$grand_cc_conv\",\"0\",\"0\",\"$avg_talk_His\"\n"; + +foreach ($agent_sessions_array as $user => $sessions) + { + $total_calls=array_sum(array_column($sessions,'calls')); + $total_wait_time=array_sum(array_column($sessions,'wait_sec')); + $total_talk_time=array_sum(array_column($sessions,'talk_sec')); + $total_duration=array_sum(array_column($sessions,'duration')); + $total_pause_time=array_sum(array_column($sessions,'pause_sec')); + $total_billable_time=array_sum(array_column($sessions,'billable')); + $total_nonbillable_time=$total_pause_time-$total_billable_time; + $total_idle_time=$total_pause_time+$total_wait_time; + $total_sales=array_sum(array_column($sessions,'sales')); + $total_human_answered=array_sum(array_column($sessions,'human_answered')); + $total_contacts=array_sum(array_column($sessions,'contacts')); + + $sph=sprintf("%.1f", MathZDC($total_sales, ($total_duration/3600))); + $haph=sprintf("%.1f", MathZDC($total_human_answered, ($total_duration/3600))); + $ccph=sprintf("%.1f", MathZDC($total_contacts, ($total_duration/3600))); + $ha_conv=sprintf("%.1f", 100*MathZDC($total_sales, $total_human_answered)); + $cc_conv=sprintf("%.1f", 100*MathZDC($total_sales, $total_contacts)); + $avg_talk_time=round(MathZDC($total_talk_time, $total_calls)); + + $total_talk_His=sprintf('%02d', floor($total_talk_time/3600)).gmdate(":i:s", $total_talk_time); + $total_wait_His=sprintf('%02d', floor($total_wait_time/3600)).gmdate(":i:s", $total_wait_time); + $total_idle_His=sprintf('%02d', floor($total_idle_time/3600)).gmdate(":i:s", $total_idle_time); + $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_billable_His=sprintf('%02d', floor($total_billable_time/3600)).gmdate(":i:s", $total_billable_time); + $total_nonbillable_His=sprintf('%02d', floor($total_nonbillable_time/3600)).gmdate(":i:s", $total_nonbillable_time); + $avg_talk_His=sprintf('%02d', floor($avg_talk_time/3600)).gmdate(":i:s", $avg_talk_time); + + $agentName=($show_full_agent_info ? "$user - ".$fullname_info["$user"] : $fullname_info["$user"]); + + $HTML_output.="\n"; + $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.=""; + $HTML_output.=""; # $sales/$hq + $HTML_output.=""; # $sales/$cc + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + ### Removed 6/14, may re-instate if "taken/lost" becomes necessary/desired + ### $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agent_sessions_view"].="\"".$agentName."\",\"$total_duration_His\",\"$total_talk_His\",\"$total_idle_His\",\"$total_pause_His\",\"$total_billable_His\",\"$total_nonbillable_His\",\"$total_wait_His\",\"$total_sales\",\"$sph\",\"$total_contacts\",\"$ccph\",\"$total_human_answered\",\"$haph\",\"$total_calls\",\"$ha_conv\",\"$cc_conv\",\"0\",\"0\",\"$avg_talk_His\"\n"; +} +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Agent").""._QXZ("Login").""._QXZ("Talk").""._QXZ("Pause + Wait").""._QXZ("Pause").""._QXZ("Billable (pause)").""._QXZ("Not Billable (pause)").""._QXZ("Tot. Wait").""._QXZ("Sales").""._QXZ("S PH").""._QXZ("Cust Cont").""._QXZ("CC PH").""._QXZ("Human Ans").""._QXZ("HA PH").""._QXZ("Offered").""._QXZ("Calls").""._QXZ("HA Conv.").""._QXZ("CC Conv.").""._QXZ("Goal Ftrs").""._QXZ("Ftrs").""._QXZ("Avg")." "._QXZ("T").""._QXZ("L")."
 $grand_total_duration_His$grand_total_talk_His$grand_total_idle_His$grand_total_pause_His$grand_total_billable_His$grand_total_nonbillable_His$grand_total_wait_His$grand_total_sales$grand_sph$grand_total_contacts$grand_ccph$grand_total_human_answered$grand_haph$grand_total_calls$grand_total_calls$grand_ha_conv %$grand_cc_conv %00$avg_talk_His  
".$agentName."$total_duration_His$total_talk_His$total_idle_His$total_pause_His$total_billable_His$total_nonbillable_His$total_wait_His$total_sales$sph$total_contacts$ccph$total_human_answered$haph$total_calls$total_calls$ha_conv %$cc_conv %00$avg_talk_His
"._QXZ("Export as")."...
"; +#################################### + +$HTML_output.="

"._QXZ("Campaign/Ingroup Sessions View")." $NWB#VERM_AGENTS-queue_sessions_view$NWE

"; # Inbound +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +### Removed 5/19 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +### Removed 6/14, may re-instate if "taken/lost" becomes necessary/desired +### $HTML_output.=""; +### $HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["queue_sessions_view"]="\""._QXZ("Campaign/ingroup")."\",\""._QXZ("Login")."\",\""._QXZ("Talk")."\",\""._QXZ("Pause + Wait")."\",\""._QXZ("Billable")."\",\""._QXZ("Not Billable")."\",\""._QXZ("Sales")."\",\""._QXZ("S PH")."\",\""._QXZ("QC")."\",\""._QXZ("QC PH")."\",\""._QXZ("Cont.")."\",\""._QXZ("C PH")."\",\""._QXZ("Calls")."\",\""._QXZ("Conv.")."\",\""._QXZ("QConv.")."\",\""._QXZ("Goal Ftrs")."\",\""._QXZ("Ftrs")."\",\""._QXZ("Avg")."\"\n"; + +$HTML_output.="\n"; +$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.=""; # $sales/$hq +$HTML_output.=""; # $sales/$cc +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +### Removed 6/14, may re-instate if "taken/lost" becomes necessary/desired. Add magnifying glass and pop-up if so +### $HTML_output.=""; +### $HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["queue_sessions_view"].="\" \",\"$grand_total_duration_His\",\"$grand_total_talk_His\",\"$grand_total_idle_His\",\"$grand_total_billable_His\",\"$grand_total_nonbillable_His\",\"$grand_total_sales\",\"$grand_sph\",\"$grand_total_contacts\",\"$grand_ccph\",\"$grand_total_human_answered\",\"$grand_haph\",\"$grand_total_calls\",\"$grand_ha_conv\",\"$grand_cc_conv\",\"0\",\"0\",\"$grand_avg_talk_His\"\n"; + +foreach ($campaign_sessions_array as $campaign => $start_dates) + { + $total_calls=0; + $total_wait_time=0; + $total_talk_time=0; + $total_duration=0; + $total_pause_time=0; + $total_billable_time=0; + $total_nonbillable_time=0; + $total_idle_time=0; + $total_sales=0; + $total_human_answered=0; + $total_contacts=0; + + foreach ($start_dates as $user => $sessions) + { + $total_calls+=array_sum(array_column($sessions,'calls')); + $total_wait_time+=array_sum(array_column($sessions,'wait_sec')); + $total_talk_time+=array_sum(array_column($sessions,'talk_sec')); + $total_duration+=array_sum(array_column($sessions,'duration')); + $total_pause_time+=array_sum(array_column($sessions,'pause_sec')); + $total_billable_time+=array_sum(array_column($sessions,'billable')); + $total_sales+=array_sum(array_column($sessions,'sales')); + $total_human_answered+=array_sum(array_column($sessions,'human_answered')); + $total_contacts+=array_sum(array_column($sessions,'contacts')); + } + + $total_nonbillable_time+=$total_pause_time-$total_billable_time; + $total_idle_time+=$total_pause_time+$total_wait_time; + + $sph=sprintf("%.1f", MathZDC($total_sales, ($total_duration/3600))); + $haph=sprintf("%.1f", MathZDC($total_human_answered, ($total_duration/3600))); + $ccph=sprintf("%.1f", MathZDC($total_contacts, ($total_duration/3600))); + $ha_conv=sprintf("%.1f", 100*MathZDC($total_sales, $total_human_answered)); + $cc_conv=sprintf("%.1f", 100*MathZDC($total_sales, $total_contacts)); + $avg_talk_time=round(MathZDC($total_talk_time, $total_calls)); + + $total_talk_His=sprintf('%02d', floor($total_talk_time/3600)).gmdate(":i:s", floor($total_talk_time)); + $total_wait_His=sprintf('%02d', floor($total_wait_time/3600)).gmdate(":i:s", floor($total_wait_time)); + $total_idle_His=sprintf('%02d', floor($total_idle_time/3600)).gmdate(":i:s", floor($total_idle_time)); + $total_pause_His=sprintf('%02d', floor($total_pause_time/3600)).gmdate(":i:s", floor($total_pause_time)); + $total_duration_His=sprintf('%02d', floor($total_duration/3600)).gmdate(":i:s", floor($total_duration)); + $total_billable_His=sprintf('%02d', floor($total_billable_time/3600)).gmdate(":i:s", floor($total_billable_time)); + $total_nonbillable_His=sprintf('%02d', floor($total_nonbillable_time/3600)).gmdate(":i:s", floor($total_nonbillable_time)); + $avg_talk_His=sprintf('%02d', floor($avg_talk_time/3600)).gmdate(":i:s", $avg_talk_time); + + $HTML_output.="\n"; + $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.=""; # $sales/$hq + $HTML_output.=""; # $sales/$cc + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + ### Removed 6/14, may re-instate if "taken/lost" becomes necessary/desired - add magnifying glass + ### $HTML_output.=""; + ### $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["queue_sessions_view"].="\"".$queue_names["$campaign"]."\",\"$total_duration_His\",\"$total_talk_His\",\"$total_idle_His\",\"$total_billable_His\",\"$total_nonbillable_His\",\"$total_sales\",\"$sph\",\"$total_contacts\",\"$ccph\",\"$total_human_answered\",\"$haph\",\"$total_calls\",\"$ha_conv\",\"$cc_conv\",\"0\",\"0\",\"$avg_talk_His\"\n"; + } +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Campaign/ingroup").""._QXZ("Login").""._QXZ("Talk").""._QXZ("Pause + Wait").""._QXZ("Billable").""._QXZ("Not Billable").""._QXZ("Sales").""._QXZ("S PH").""._QXZ("QC").""._QXZ("QC PH").""._QXZ("Cont.").""._QXZ("C PH").""._QXZ("Offered").""._QXZ("Calls").""._QXZ("Conv.").""._QXZ("QConv.").""._QXZ("Goal Ftrs").""._QXZ("Ftrs").""._QXZ("Avg").""._QXZ("T").""._QXZ("L")."
 $grand_total_duration_His$grand_total_talk_His$grand_total_idle_His$grand_total_billable_His$grand_total_nonbillable_His$grand_total_sales$grand_sph$grand_total_contacts$grand_ccph$grand_total_human_answered$grand_haph$grand_total_calls$grand_total_calls$grand_ha_conv %$grand_cc_conv %00$grand_avg_talk_His  
".$queue_names["$campaign"]."$total_duration_His$total_talk_His$total_idle_His$total_billable_His$total_nonbillable_His$total_sales$sph$total_contacts$ccph$total_human_answered$haph$total_calls$total_calls$ha_conv %$cc_conv %00$avg_talk_His  
"._QXZ("Export as")."...
"; + +#################################### + +/* Removed 5/19 +$HTML_output.="

Agent Performance by ACD Group

"; # Inbound +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="\n"; +$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.="\n"; +$HTML_output.="
LevelAgentLoginDur.Calls inCalls outTot callsAvg inAvg outAvg durAvail.On call inOn call outPau BillPau N/Bill
"; +*/ + + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "AGENTS_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + + +echo $HTML_output; +?> + + diff --git a/agc_2-X/trunk/www/VERM/VERM_AJAX_functions.php b/agc_2-X/trunk/www/VERM/VERM_AJAX_functions.php new file mode 100644 index 00000000..0f50cf33 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_AJAX_functions.php @@ -0,0 +1,98 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1608 - First build +# + +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +$PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); + +$startMS = microtime(); +$STARTtime = date("U"); + +require("dbconnect_mysqli.php"); +require("functions.php"); + +if (isset($_GET["function"])) {$function=$_GET["function"];} + elseif (isset($_POST["function"])) {$function=$_POST["function"];} +if (isset($_GET["custom_report_vars"])) {$custom_report_vars=$_GET["custom_report_vars"];} + elseif (isset($_POST["custom_report_vars"])) {$custom_report_vars=$_POST["custom_report_vars"];} +if (isset($_GET["custom_report_name"])) {$custom_report_name=$_GET["custom_report_name"];} + elseif (isset($_POST["custom_report_name"])) {$custom_report_name=$_POST["custom_report_name"];} + +############################################# +##### START SYSTEM_SETTINGS LOOKUP ##### +$stmt = "SELECT use_non_latin,outbound_autodial_active,slave_db_server,reports_use_slave_db,enable_languages,language_method,agent_whisper_enabled,report_default_format,enable_pause_code_limits,allow_web_debug,admin_screen_colors,admin_web_directory FROM system_settings;"; +$rslt=mysql_to_mysqli($stmt, $link); +if ($DB) {echo "$stmt\n";} +$qm_conf_ct = mysqli_num_rows($rslt); +if ($qm_conf_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $non_latin = $row[0]; + $outbound_autodial_active = $row[1]; + $slave_db_server = $row[2]; + $reports_use_slave_db = $row[3]; + $SSenable_languages = $row[4]; + $SSlanguage_method = $row[5]; + $agent_whisper_enabled = $row[6]; + $SSreport_default_format = $row[7]; + $SSenable_pause_code_limits = $row[8]; + $SSallow_web_debug = $row[9]; + $SSadmin_screen_colors = $row[10]; + $SSadmin_web_directory = $row[11]; + } +if ($SSallow_web_debug < 1) {$DB=0;} +##### END SETTINGS LOOKUP ##### +########################################### + +if ($non_latin < 1) + { + $function = preg_replace('/[^\-_0-9a-zA-Z]/','',$function); + $custom_report_vars = preg_replace('/[^-\/\|\_\#\*\,\.\_\[\]0-9a-zA-Z]/','',$custom_report_vars); + $custom_report_name = preg_replace('/[^\-_0-9a-zA-Z]/','',$custom_report_name); + } +else + { + $function = preg_replace('/[^-_0-9\p{L}/u','',$function); + $custom_report_vars = preg_replace('/[^-\/\|\_\#\*\,\.\_\[\]0-9\p{L}]/u','',$custom_report_vars); + $custom_report_name = preg_replace('/[^-_0-9\p{L}/u','',$custom_report_name); + } + + +##### BEGIN log visit to the vicidial_report_log table ##### +$LOGip = getenv("REMOTE_ADDR"); +$LOGbrowser = getenv("HTTP_USER_AGENT"); +$LOGscript_name = getenv("SCRIPT_NAME"); +$LOGserver_name = getenv("SERVER_NAME"); +$LOGserver_port = getenv("SERVER_PORT"); +$LOGrequest_uri = getenv("REQUEST_URI"); +$LOGhttp_referer = getenv("HTTP_REFERER"); +$LOGbrowser=preg_replace("/\'|\"|\\\\/","",$LOGbrowser); +$LOGrequest_uri=preg_replace("/\'|\"|\\\\/","",$LOGrequest_uri); +$LOGhttp_referer=preg_replace("/\'|\"|\\\\/","",$LOGhttp_referer); +if (preg_match("/443/i",$LOGserver_port)) {$HTTPprotocol = 'https://';} + else {$HTTPprotocol = 'http://';} +if (($LOGserver_port == '80') or ($LOGserver_port == '443') ) {$LOGserver_port='';} +else {$LOGserver_port = ":$LOGserver_port";} +$LOGfull_url = "$HTTPprotocol$LOGserver_name$LOGserver_port$LOGrequest_uri"; + +$LOGhostname = php_uname('n'); +if (strlen($LOGhostname)<1) {$LOGhostname='X';} +if (strlen($LOGserver_name)<1) {$LOGserver_name='X';} + + +if ($function=="log_custom_report") + { + $rpt_log_stmt="insert ignore into verm_custom_report_holder(user, report_name, report_parameters) values('$PHP_AUTH_USER', '$custom_report_name', '$LOGhttp_referer') ON DUPLICATE KEY UPDATE report_name='$custom_report_name', report_parameters='$custom_report_vars'"; + $rpt_log_rslt=mysql_to_mysqli($rpt_log_stmt, $link); + return mysqli_affected_rows($rpt_log_rslt); + } + + +?> 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 new file mode 100644 index 00000000..f7c8c2b6 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_ANSWERED_DT_rpt.inc @@ -0,0 +1,340 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1630 - First build +# + +if (isset($_GET["page_no"])) {$page_no=$_GET["page_no"];} + elseif (isset($_POST["page_no"])) {$page_no=$_POST["page_no"];} +if (isset($_GET["sort_answered_details"])) {$sort_answered_details=$_GET["sort_answered_details"];} + elseif (isset($_POST["sort_answered_details"])) {$sort_answered_details=$_POST["sort_answered_details"];} + +if ($non_latin < 1) + { + $sort_answered_details = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_answered_details); + } +else + { + $sort_answered_details = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_answered_details); + } +$page_no=preg_replace('/[^0-9]/', '', $page_no); +if (!$page_no || $page_no<1) {$page_no=1;} + +$ll=($page_no-1)*20; +$ul=($page_no*20); + +$available_columns=array( +"Date" => "call_date", +"Caller" => "phone_number", +"Campaign/ingroup" => "campaign_id", +"IVR" => "ivr", +"Wait" => "wait", +"Duration" => "length_in_sec", +"Pos." => "queue_position", +"Disconnection" => "term_reason", +"Transferred to" => "transferred_to", +"Handled by" => "user", +"Attempts" => "attempts", +"Code" => "status", +"Stints" => "stints", +"Srv" => "srv", +"Asterisk UID" => "caller_code", +"MOH events" => "moh_events", +"MOH duration" => "moh_duration", +"IVR duration" => "ivr_duration", +"IVR path" => "ivr_path", +"DID" => "did", +"CRM" => "", +"Tag" => "tag", +"Feat" => "feat", +"Vars" => "vars", +"Feature Codes" => "feature_codes", +"Variables" => "variables" +); + +$selected_columns=array( +_QXZ("Date") => "call_date", +_QXZ("Caller") => "phone_number", +_QXZ("Campaign/ingroup") => "campaign_id", +_QXZ("IVR") => "ivr_duration", +_QXZ("Wait") => "wait", +_QXZ("Duration") => "duration", +_QXZ("Pos.") => "queue_position", +_QXZ("Disconnection") => "term_reason", +_QXZ("Handled by") => "user", +_QXZ("Attempts") => "attempts", +_QXZ("Code") => "status", +"uniqueid" => "detail_id" +); +# "Transferred to" => "transferred_to", + + +$sort_char=""; +$sort_index=""; + +$sort_clause=" order by call_date"; +$sort_index=preg_replace('/ desc/', '', $sort_answered_details); +if (preg_match('/ desc$/', $sort_answered_details)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_answered_details); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_answered_details." desc"; + } +$sort_answered_details_preg=preg_replace('/ desc$/', '', $sort_answered_details); + +$stmt="select call_date, phone_number, campaign_id, 0 as ivr, '0:00' as wait, sec_to_time(round(length_in_sec)) as duration, '1' as queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, uniqueid as detail_id, 'O' as direction from vicidial_log $vicidial_log_SQL and user not in ('VDAD') UNION select call_date, phone_number, campaign_id, 0 as ivr, sec_to_time(round(queue_seconds)) as wait, sec_to_time(round(length_in_sec-queue_seconds)) as duration, queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, CONCAT(uniqueid, '|', closecallid) as detail_id, 'I' as direction from vicidial_closer_log $vicidial_closer_log_SQL and (user!='VDCL') $sort_clause"; + +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=""; +foreach ($selected_columns as $display_name => $column_name) + { + if ($display_name!="uniqueid") + { + $CSV_output.="\"$display_name\","; + # $HTML_output.=""; + + $HTML_output.="\n"; + } + } +$CSV_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; + +$output_array=array(); +$i=0; +while ($row=mysqli_fetch_array($rslt)) + { + $row["caller_code"]=""; + $row["ivr"]="00:00"; + $row["ivr_duration"]="00:00"; + $row["ivr_path"]=""; + $row["did"]=""; + + $uniqueid=$row["uniqueid"]; + $row["campaign_id"]=$queue_names["$row[campaign_id]"]; + $row["status"]=($status_names["$row[status]"] ? $status_names["$row[status]"] : $row["status"]); + $row["user"]=($show_full_agent_info ? "$row[user] - ".$fullname_info["$row[user]"] : $fullname_info["$row[user]"]); + + + $row["caller_code"]=GetCallerCode($row["uniqueid"]); + if ($row["direction"]=="I") + { + $ivr_info_array=GetIVRInfo($row["uniqueid"], $row["call_date"]); + $row["ivr"]=$ivr_info_array[0]; + $row["ivr_duration"]=$ivr_info_array[1]; + $row["ivr_path"]=$ivr_info_array[2]; + $row["call_date"]=$ivr_info_array[3]; + $row["did"]=GetDID($row["uniqueid"]); + } + + if ($i>=$ll && $i<$ul || $download_rpt) + { + $current_row=array(); + foreach ($selected_columns as $display_name => $column_name) + { + $current_row["$column_name"]=$row["$column_name"]; + } + + array_push($output_array, $current_row); + } + $i++; + } + +if ($sort_index) + { + #$sort_index=8; + # 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"]; + } + if (preg_match('/ desc$/', $sort_answered_details)) + { + array_multisort($sort_array_holder,SORT_DESC, SORT_STRING,$output_array); + } + else + { + array_multisort($sort_array_holder,SORT_ASC, SORT_STRING,$output_array); + } + + #usort($output_array, function($a, $b){ + # return strcmp($a[$sort_index], $b[$sort_index]); + #}); + } + +foreach ($output_array as $data_row) + { + $HTML_output.=""; + foreach ($data_row as $key => $value) + { + if ($key=="call_date") + { + $myDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $value); + $value = $myDateTime->format('m/d - H:i:s'); + } + if ($key!="detail_id") + { + $HTML_output.=""; + $CSV_output.="\"".$value."\","; + } + else + { + $HTML_output.=""; + # $HTML_output.=""; + } + } + $CSV_output.="\n"; + + $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.="
".$display_name.($column_name==$sort_answered_details_preg ? " $sort_char" : "")." 
".$value."\"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) + { + $data_to_download=$CSV_output; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "ANSWERED_DT_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + +echo $HTML_output; +?> + +=3600 ? floor($ivr_duration/3600).":" : "").gmdate("i:s", $ivr_duration); + $ivr_length_fmt=($ivr_length>=3600 ? floor($ivr_length/3600).":" : "").gmdate("i:s", $ivr_length); + + return array("$ivr_length_fmt", "$ivr_duration_fmt", "$ivr_path", "$actual_start_time"); + } + +function GetDID($uniqueid) + { + global $link, $DB, $did_id_info, $did_pattern_info; + + $did_str=""; + + $did_stmt="select extension, did_id from vicidial_did_log where uniqueid in ('$uniqueid')"; + $did_rslt=mysqli_query($link, $did_stmt); + $did_row=mysqli_fetch_array($did_rslt); + $did_str=$did_row["extension"]." - ".$did_id_info["$did_row[extension]"]; + + return $did_str; + } +?> \ No newline at end of file diff --git a/agc_2-X/trunk/www/VERM/VERM_ANSWERED_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_ANSWERED_rpt.inc new file mode 100644 index 00000000..ab693b04 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_ANSWERED_rpt.inc @@ -0,0 +1,1437 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1629 - First build +# + +# DROP, WAITTO, TIMEOT are unanswered statuses, not NANQUE +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +$PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); + +$startMS = microtime(); + +if (isset($_GET["sort_agents_on_queue"])) {$sort_agents_on_queue=$_GET["sort_agents_on_queue"];} + elseif (isset($_POST["sort_agents_on_queue"])) {$sort_agents_on_queue=$_POST["sort_agents_on_queue"];} + +if ($non_latin < 1) + { + $sort_agents_on_queue = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_agents_on_queue); + } +else + { + $sort_agents_on_queue = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_agents_on_queue); + } + + +$calls_stmt="select call_date, call_date+INTERVAL (length_in_sec) SECOND as end_date, if(call_date+INTERVAL (length_in_sec) SECOND<='$end_date $end_time', '1', '0') as within_interval, campaign_id, user, length_in_sec, '0' as queue_seconds, 'O' as direction, '1' as queue_position, term_reason, comments, status, uniqueid From vicidial_log $vicidial_log_SQL and user!='VDAD' UNION select call_date, call_date+INTERVAL (length_in_sec) SECOND as end_date, if(call_date+INTERVAL (length_in_sec) SECOND<='$end_date $end_time', '1', '0') as within_interval, campaign_id, user, if(comments='EMAIL', length_in_sec, length_in_sec-queue_seconds) as length_in_sec, if(comments='EMAIL', '0', queue_seconds) as queue_seconds, 'I' as direction, queue_position, term_reason, comments, status, uniqueid From vicidial_closer_log $vicidial_closer_log_SQL and (user!='VDCL' $or_NANQUE_clause)"; + +if ($DB) {$HTML_output.="$calls_stmt";} + +$calls_rslt=mysqli_query($link, $calls_stmt); + +### VARIABLES ### +$total_calls=0; +$total_answered_calls=0; +$total_unanswered_calls=0; +$max_call_length=0; +$min_call_length=1000000; +$total_call_length=0; +$max_wait_time=0; +$min_wait_time=1000000; +$total_wait_time=0; +$total_position=0; +$max_position=0; +$min_position=1000000; +$agent_call_counts=array(); +$transferred_counts=array(); +$agent_call_lengths=array(); +$queue_stats=array(); # campaign id breakdown BY ANSWERED CALLS +$term_reasons=array(); # ANSWERED CALLS ONLY +$call_directions=array(); # ANSWERED CALLS +$call_stints=array(); # ANSWERED CALLS +$agent_events=array(); # ANSWERED CALLS +$queue_positions=array("Untracked" => 0); # ANSWERED CALLS +$coverage="100%"; +$coverage_wi="100%"; +################# + +### WITHIN-INTERVAL VARS ### +$total_calls_wi=0; +$total_answered_calls_wi=0; +$total_unanswered_calls_wi=0; +$max_call_length_wi=0; +$min_call_length_wi=1000000; +$total_call_length_wi=0; +$max_wait_time_wi=0; +$min_wait_time_wi=1000000; +$total_wait_time_wi=0; +$total_position_wi=0; +$max_position_wi=0; +$min_position_wi=1000000; +$agent_stats_wi=array(); +############################ + +$uniqueid_array=array(); + +while ($calls_row=mysqli_fetch_array($calls_rslt)) + { + $total_calls++; + if ($calls_row["direction"]=="O") + { + $total_outbound_calls++; + } + else + { + $total_inbound_calls++; + } + # print "$total_call_length + $calls_row[length_in_sec] = "; + $total_call_length+=$calls_row["length_in_sec"]; + # print "$total_call_length
\n"; + $total_wait_time+=$calls_row["queue_seconds"]; + $stint=1; + + if (preg_match('/VDAD|VDCL/', $calls_row["user"])) + { + /* IRRELEVANT + if (preg_match('/^DROP$|TIMEOT|WAITTO/', $calls_row["status"])) + { + $total_unanswered_calls++; + if ($calls_row["direction"]=="O") + { + $unanswered_outbound_calls++; + } + else + { + $unanswered_inbound_calls++; + } + $call_was_answered=0; + } + else + { + # DO NOTHING FOR NANQUE - dunno why but phone 4698254386 shows only under one rep despite call length + } + */ + } + else + { + array_push($uniqueid_array, $calls_row["uniqueid"]); + $total_answered_calls++; + if ($calls_row["direction"]=="O") + { + $answered_outbound_calls++; + } + else + { + $answered_inbound_calls++; + } + $call_was_answered=1; + + $transferred_counts["$transfer_status"]++; + + # Use full name here so we can sort in the 'Agents on queue' section painlessly. + $agent_full_name=$fullname_info["$calls_row[user]"]; + $agent_full_name=($show_full_agent_info ? $calls_row["user"]." - " : "").$fullname_info["$calls_row[user]"]; + $agent_call_counts["$agent_full_name"]++; + $agent_call_lengths["$agent_full_name"]+=$calls_row["length_in_sec"]; + + # Events? + $agent_events["$calls_row[user]"][0]=0; + $agent_events["$calls_row[user]"][1]=0; + + $term_reasons["$calls_row[term_reason]"]++; + + $queue_stats["$calls_row[campaign_id]"]++; + + if ($calls_row["direction"]=="O") {$call_directions["Outbound calls"]++;} else {$call_directions["Inbound calls"]++;} + + $call_stints["$stint"]++; + + $total_position+=$calls_row["queue_position"]; + $queue_positions["$calls_row[queue_position]"]++; + } + + if ($calls_row["length_in_sec"]>$max_call_length && $call_was_answered) {$max_call_length=$calls_row["length_in_sec"];} + if ($calls_row["length_in_sec"]<$min_call_length && $call_was_answered) {$min_call_length=$calls_row["length_in_sec"];} + + if ($calls_row["queue_seconds"]>$max_wait_time && $call_was_answered) {$max_wait_time=$calls_row["queue_seconds"];} + if ($calls_row["queue_seconds"]<$min_wait_time && $call_was_answered) {$min_wait_time=$calls_row["queue_seconds"];} + + if ($calls_row["queue_position"]>$max_position) {$max_position=$calls_row["queue_position"];} + if ($calls_row["queue_position"]<$min_position) {$min_position=$calls_row["queue_position"];} + + ### FILTER FOR FULLY WITHIN-INTERVAL CALLS, SHOULD BE EXACTLY THE SAME (FOR NOW) + if ($calls_row["within_interval"]) + { + $total_calls_wi++; + $total_call_length_wi+=$calls_row["length_in_sec"]; + $total_wait_time_wi+=$calls_row["queue_seconds"]; + $total_position_wi+=$calls_row["queue_position"]; + + if (preg_match('/VDAD|VDCL/', $calls_row["user"]) && preg_match('/^DROP$|TIMEOT|WAITTO/', $calls_row["status"])) + { + $total_unanswered_calls_wi++; + } + else + { + $total_answered_calls_wi++; + } + + if ($calls_row["length_in_sec"]>$max_call_length_wi) {$max_call_length_wi=$calls_row["length_in_sec"];} + if ($calls_row["length_in_sec"]<$min_call_length_wi) {$min_call_length_wi=$calls_row["length_in_sec"];} + + if ($calls_row["queue_seconds"]>$max_wait_time_wi && $call_was_answered) {$max_wait_time_wi=$calls_row["queue_seconds"];} + if ($calls_row["queue_seconds"]<$min_wait_time_wi && $call_was_answered) {$min_wait_time_wi=$calls_row["queue_seconds"];} + + if ($calls_row["queue_position"]>$max_position_wi) {$max_position_wi=$calls_row["queue_position"];} + if ($calls_row["queue_position"]<$min_position_wi) {$min_position_wi=$calls_row["queue_position"];} + } + } + +$average_call_length=sprintf("%.1f", MathZDC($total_call_length, $total_answered_calls)); # Total calls instead? +$average_wait_time=sprintf("%.1f", MathZDC($total_wait_time, $total_answered_calls)); # Total calls instead? +$average_position=sprintf("%.1f", MathZDC($total_position, $total_answered_calls)); +$total_call_length_fmt=sprintf("%.1f", ($total_call_length/3600)); +$total_wait_time_fmt=sprintf("%.1f", ($total_wait_time/3600)); + +$average_call_length_wi=sprintf("%.1f", MathZDC($total_call_length_wi, $total_answered_calls_wi)); # Total calls instead? +$average_wait_time_wi=sprintf("%.1f", MathZDC($total_wait_time_wi, $answered_call_wis)); # Total calls instead? +$average_position_wi=sprintf("%.1f", MathZDC($total_position_wi, $total_answered_calls_wi)); +$total_call_length_fmt_wi=sprintf("%.1f", ($total_call_length_wi/3600)); +$total_wait_time_fmt_wi=sprintf("%.1f", ($total_wait_time_wi/3600)); + +# Wipe unadjusted variables (i.e. no records) +$min_call_length=($min_call_length==1000000 ? "0" : $min_call_length); +$min_wait_time=($min_wait_time==1000000 ? "0" : $min_wait_time); +$min_position=($min_position==1000000 ? "0" : $min_position); +$min_call_length_wi=($min_call_length_wi==1000000 ? "0" : $min_call_length_wi); +$min_wait_time_wi=($min_wait_time_wi==1000000 ? "0" : $min_wait_time_wi); +$min_position_wi=($min_position_wi==1000000 ? "0" : $min_position_wi); + +$HTML_output.="

"._QXZ("All calls")." $NWB#VERM_ANSWERED-all_calls$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +### Commented out 5/19/22 - not needed +### $HTML_output.=""; +### $HTML_output.=""; +### $HTML_output.=""; +### $HTML_output.="\n"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("All calls").": 
"._QXZ("N. calls answered by operators").":".$total_answered_calls."
"._QXZ("Average call length").": $NWB#VERM_ANSWERED-all_calls_call_length$NWE".$average_call_length." s.
"._QXZ("Min call length").":".($min_call_length>=3600 ? floor($min_call_length/3600).":" : "").gmdate("i:s", $min_call_length)."
"._QXZ("Max call length").":".($max_call_length>=3600 ? floor($max_call_length/3600).":" : "").gmdate("i:s", $max_call_length)."
"._QXZ("Total call length").":".$total_call_length_fmt." H
"._QXZ("Average call waiting time").": $NWB#VERM_ANSWERED-all_calls_waiting_time$NWE".$average_wait_time." s
"._QXZ("Min waiting time").":".($min_wait_time>=3600 ? floor($min_wait_time/3600).":" : "").gmdate("i:s", $min_wait_time)."
"._QXZ("Max waiting time").":".($max_wait_time>=3600 ? floor($max_wait_time/3600).":" : "").gmdate("i:s", $max_wait_time)."
"._QXZ("Total waiting time").":".$total_wait_time_fmt." H
"._QXZ("Average initial position").": $NWB#VERM_ANSWERED-all_calls_position$NWE".$average_position."
"._QXZ("Min initial position").":".$min_position."
"._QXZ("Max initial position").":".$max_position."
"._QXZ("Coverage").": $NWB#VERM_ANSWERED-all_calls_coverage$NWE".$coverage."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +$CSV_output["all_calls"]="\""._QXZ("All calls")."\",\"\"\n"; +$CSV_output["all_calls"].="\""._QXZ("N. calls answered by operators").":\",\"$total_answered_calls\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Average call length").":\",\"$average_call_length s.\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Min call length").":\",\"".($min_call_length>=3600 ? floor($min_call_length/3600).":" : "").gmdate("i:s", $min_call_length)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Max call length").":\",\"".($max_call_length>=3600 ? floor($max_call_length/3600).":" : "").gmdate("i:s", $max_call_length)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Total call length").":\",\"".$total_call_length_fmt." H\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Average call waiting time").":\",\"".$average_wait_time." H\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Min waiting time").":\",\"".($min_wait_time>=3600 ? floor($min_wait_time/3600).":" : "").gmdate("i:s", $min_wait_time)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Max waiting time").":\",\"".($max_wait_time>=3600 ? floor($max_wait_time/3600).":" : "").gmdate("i:s", $max_wait_time)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Total waiting time").":\",\"".$total_wait_time_fmt." H\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Average initial position").":\",\"".$average_position."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Min initial position").":\",\"".$min_position."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Max initial position").":\",\"".$max_position."\"\n"; + +### Commented out 5/19/22 - not needed +### $CSV_output["all_calls"].="\"Coverage:\",\"".$coverage."\"\n"; + +###################### + +$HTML_output.="

"._QXZ("Calls fully within the given time interval")." $NWB#VERM_ANSWERED-all_calls_wi$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +### Commented out 5/19/22 - not needed +### $HTML_output.=""; +### $HTML_output.=""; +### $HTML_output.=""; +### $HTML_output.="\n"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("All calls").": 
"._QXZ("N. calls answered by operators").":".$total_answered_calls_wi."
"._QXZ("Average call length").": $NWB#VERM_ANSWERED-all_calls_call_length_wi$NWE".$average_call_length_wi." s.
"._QXZ("Min call length").":".($min_call_length_wi>=3600 ? floor($min_call_length_wi/3600).":" : "").gmdate("i:s", $min_call_length_wi)."
"._QXZ("Max call length").":".($max_call_length_wi>=3600 ? floor($max_call_length_wi/3600).":" : "").gmdate("i:s", $max_call_length_wi)."
"._QXZ("Total call length").":".$total_call_length_fmt_wi." H
"._QXZ("Average call waiting time").": $NWB#VERM_ANSWERED-all_calls_waiting_time_wi$NWE".$average_wait_time_wi." s
"._QXZ("Min waiting time").":".($min_wait_time_wi>=3600 ? floor($min_wait_time_wi/3600).":" : "").gmdate("i:s", $min_wait_time_wi)."
"._QXZ("Max waiting time").":".($max_wait_time_wi>=3600 ? floor($max_wait_time_wi/3600).":" : "").gmdate("i:s", $max_wait_time_wi)."
"._QXZ("Total waiting time").":".$total_wait_time_fmt_wi." H
"._QXZ("Average initial position").": $NWB#VERM_ANSWERED-all_calls_position_wi$NWE".$average_position_wi." H
"._QXZ("Min initial position").":".$min_position_wi." H
"._QXZ("Max initial position").":".$max_position_wi." H
"._QXZ("Coverage").": $NWB#VERM_ANSWERED-all_calls_coverage_wi$NWE".$coverage_wi."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +$CSV_output["all_calls_wi"]="\""._QXZ("All calls fully within the given time interval")."\",\"\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("N. calls answered by operators").":\",\"$total_answered_calls_wi\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Average call length").":\",\"$average_call_length_wi s.\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Min call length").":\",\"".($min_call_length_wi>=3600 ? floor($min_call_length_wi/3600).":" : "").gmdate("i:s", $min_call_length_wi)."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Max call length").":\",\"".($max_call_length_wi>=3600 ? floor($max_call_length_wi/3600).":" : "").gmdate("i:s", $max_call_length_wi)."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Total call length").":\",\"".$total_call_length_fmt_wi." H\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Average call waiting time").":\",\"".$average_wait_time_wi." H\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Min waiting time").":\",\"".($min_wait_time_wi>=3600 ? floor($min_wait_time_wi/3600).":" : "").gmdate("i:s", $min_wait_time_wi)."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Max waiting time").":\",\"".($max_wait_time_wi>=3600 ? floor($max_wait_time_wi/3600).":" : "").gmdate("i:s", $max_wait_time_wi)."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Total waiting time").":\",\"".$total_wait_time_fmt_wi." H\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Average initial position").":\",\"".$average_position_wi."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Min initial position").":\",\"".$min_position_wi."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Max initial position").":\",\"".$max_position_wi."\"\n"; + +### Commented out 5/19/22 - not needed +### $CSV_output["all_calls_wi"].="\""._QXZ("Coverage").":\",\"".$coverage_wi."\"\n"; +###################### + +#### AGENTS IN CAMPAINS/INGROUPS #### +switch ($sort_agents_on_queue) + { + case "ncalls": + $ncalls_sort_value="ncalls desc"; + $agent_sort_value="agent"; + $ncalls_char="↑"; + $agent_char=""; + asort($agent_call_counts); + break; + case "ncalls desc": + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent"; + $ncalls_char="↓"; + $agent_char=""; + arsort($agent_call_counts); + break; + case "agent": + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent desc"; + $ncalls_char=""; + $agent_char="↑"; + ksort($agent_call_counts, SORT_NATURAL | SORT_FLAG_CASE); + break; + case "agent desc": + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent"; + $ncalls_char=""; + $agent_char="↓"; + krsort($agent_call_counts, SORT_NATURAL | SORT_FLAG_CASE); + break; + default: + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent"; + $ncalls_char=""; + $agent_char=""; + ksort($agent_call_counts, SORT_NATURAL | SORT_FLAG_CASE); + break; + } +if (preg_match('/ desc$/', $sort_agents_on_queue)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_agents_on_queue); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_agents_on_queue." desc"; + } +$sort_agents_on_queue_preg=preg_replace('/ desc$/', '', $sort_agents_on_queue); + +$HTML_output.="

"._QXZ("Agents in campaigns/ingroups").": $NWB#VERM_ANSWERED-agents_on_queue$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; + +# $HTML_output.=""; +# $HTML_output.=""; + + $HTML_output.="\n"; + $HTML_output.="\n"; + +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agents_on_queue"]="\""._QXZ("Agents on queue")."\"\n"; +$CSV_output["agents_on_queue"].="\""._QXZ("Agent")."\",\""._QXZ("N. Calls")."\",\"\",\"...\",\""._QXZ("Total call time")."\",\""._QXZ("Average call time")."\"\n"; + +$highest_agent_call_count=max($agent_call_counts); + +$agents_on_queue_graph_labels="["; +$agents_on_queue_graph_data="["; +$agents_on_queue_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$agents_on_queue_graph_hovborder="["; +$x=0; +foreach ($agent_call_counts as $agentName => $value) + { + $call_count_percent=sprintf("%.1f", (100*$value)/$total_answered_calls); + $agent_total_call_length=$agent_call_lengths["$agentName"]; + $agent_total_call_length_fmt=($agent_total_call_length>=3600 ? floor($agent_total_call_length/3600).":" : "").gmdate("i:s", $agent_total_call_length); + $agent_avg_call_length=round($agent_total_call_length/$value); + $agent_avg_call_length_fmt=($agent_avg_call_length>=3600 ? floor($agent_avg_call_length/3600).":" : "").gmdate("i:s", $agent_avg_call_length); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agents_on_queue"].="\"".$agentName."\",\"".$value."\",\"".$call_count_percent." %\",\"\",\"".$agent_total_call_length_fmt."\",\"".$agent_avg_call_length_fmt."\"\n"; + + $agents_on_queue_graph_labels.="\"$agentName\","; + $agents_on_queue_graph_data.="\"$value\","; + $agents_on_queue_graph_bgcolor.="\"".$background_colors[$x]."\","; + $agents_on_queue_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$agents_on_queue_graph_labels=preg_replace('/,$/', '', $agents_on_queue_graph_labels)."]"; +$agents_on_queue_graph_data=preg_replace('/,$/', '', $agents_on_queue_graph_data)."]"; +$agents_on_queue_graph_bgcolor=preg_replace('/,$/', '', $agents_on_queue_graph_bgcolor)."]"; +$agents_on_queue_graph_hovborder=preg_replace('/,$/', '', $agents_on_queue_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Agent")." ".$agent_char.""._QXZ("N. Calls")." ".$ncalls_char." ..."._QXZ("Total call time").""._QXZ("Average call time")."
".$agentName."".$value."".$call_count_percent." %".$agent_total_call_length_fmt."".$agent_avg_call_length_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.=""; +###################### + +#### SERVICE LEVEL #### +$HTML_output.="

"._QXZ("Service Level Agreement (inbound calls only)").": $NWB#VERM_ANSWERED-SLA$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.="\n"; + +$CSV_output["service_level_agreement"]="\""._QXZ("Service Level Agreement (inbound calls only)")."\"\n"; +$CSV_output["service_level_agreement"].="\""._QXZ("Answer")."\",\""._QXZ("N. Calls")."\",\""._QXZ("Delta")."\",\""._QXZ("Percent")."\",\""._QXZ("Of Offered")."\",\"...\"\n"; + +# $SLA_query is in VERM_global_vars.inc +$svc_lvl_stmt="select $SLA_query from vicidial_closer_log $vicidial_closer_log_SQL and (user!='VDCL')"; # and campaign_id in ($ingroup_str) and user in ('VDCL', $user_str) +$svc_lvl_rslt=mysqli_query($link, $svc_lvl_stmt); +if ($DB) {$HTML_output.="$svc_lvl_stmt";} +$svc_lvl_row=mysqli_fetch_assoc($svc_lvl_rslt); +#print_r($svc_lvl_row); +# { +# print "$interval - $sum\n"; +# } + +$service_level_agreement_graph_labels="["; +$service_level_agreement_graph_delta_data="["; +$service_level_agreement_graph_delta_bgcolor="["; # SAME FOR hoverBackgroundColor +$service_level_agreement_graph_delta_hovborder="["; +$service_level_agreement_graph_percent_data="["; +$service_level_agreement_graph_percent_bgcolor="["; # SAME FOR hoverBackgroundColor +$service_level_agreement_graph_percent_hovborder="["; + +$x=0; +foreach($svc_lvl_row as $interval => $sum) + { + $int_name=ucwords(preg_replace("/_/", " ", $interval)); + if ($prev_int) {$delta="+ ".($sum-$prev_int);} else {$delta=" ";} + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["service_level_agreement"].="\"$int_name seconds:\",\"$sum\",\"$delta\",\"".sprintf("%.1f", MathZDC((100*$sum), $answered_inbound_calls))." %\",\"".sprintf("%.1f", MathZDC((100*$sum), $total_inbound_calls))." %\"\n"; + + $service_level_agreement_graph_labels.="\"$int_name\","; + $service_level_agreement_graph_delta_data.="\"".($prev_int ? ($sum-$prev_int) : "0")."\","; + $service_level_agreement_graph_delta_bgcolor.="\"#33CCCC\","; + $service_level_agreement_graph_delta_hovborder.="\"#66FFFF\","; + $service_level_agreement_graph_percent_data.="\"".sprintf("%.1f", MathZDC((100*$sum), $answered_inbound_calls))."\","; + $service_level_agreement_graph_percent_bgcolor.="\"#FFCC66\","; + $service_level_agreement_graph_percent_hovborder.="\"#FFFF99\","; + + $prev_int=$sum; + $x++; + } + +$service_level_agreement_graph_labels=preg_replace('/,$/', '', $service_level_agreement_graph_labels)."]"; +$service_level_agreement_graph_delta_data=preg_replace('/,$/', '', $service_level_agreement_graph_delta_data)."]"; +$service_level_agreement_graph_delta_bgcolor=preg_replace('/,$/', '', $service_level_agreement_graph_delta_bgcolor)."]"; +$service_level_agreement_graph_delta_hovborder=preg_replace('/,$/', '', $service_level_agreement_graph_delta_hovborder)."]"; +$service_level_agreement_graph_percent_data=preg_replace('/,$/', '', $service_level_agreement_graph_percent_data)."]"; +$service_level_agreement_graph_percent_bgcolor=preg_replace('/,$/', '', $service_level_agreement_graph_percent_bgcolor)."]"; +$service_level_agreement_graph_percent_hovborder=preg_replace('/,$/', '', $service_level_agreement_graph_percent_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Answer").""._QXZ("N. Calls").""._QXZ("Delta").""._QXZ("Percent").""._QXZ("Of Offered")."...
$int_name seconds:".$sum."$delta  ".sprintf("%.1f", MathZDC((100*$sum), $answered_inbound_calls))." %".sprintf("%.1f", MathZDC((100*$sum), $total_inbound_calls))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +#### DISCONNECTIONS ### +$HTML_output.="

"._QXZ("Disconnection causes").": $NWB#VERM_ANSWERED-disconnections$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["disconnection_causes"]="\""._QXZ("Disconnection causes").":\"\n"; +$CSV_output["disconnection_causes"].="\""._QXZ("Cause")."\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$disconnection_causes_graph_labels="["; +$disconnection_causes_graph_data="["; +$disconnection_causes_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$disconnection_causes_graph_hovborder="["; + +$max_term_reason=max($term_reasons); +$x=0; +foreach ($term_reasons as $reason => $value) + { + $term_reason_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["disconnection_causes"].="\"".$reason."\",\"".$value."\",\"".$term_reason_pct." %\"\n"; + + $disconnection_causes_graph_labels.="\"$reason\","; + $disconnection_causes_graph_data.="\"$value\","; + $disconnection_causes_graph_bgcolor.="\"".$background_colors[$x]."\","; + $disconnection_causes_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$disconnection_causes_graph_labels=preg_replace('/,$/', '', $disconnection_causes_graph_labels)."]"; +$disconnection_causes_graph_data=preg_replace('/,$/', '', $disconnection_causes_graph_data)."]"; +$disconnection_causes_graph_bgcolor=preg_replace('/,$/', '', $disconnection_causes_graph_bgcolor)."]"; +$disconnection_causes_graph_hovborder=preg_replace('/,$/', '', $disconnection_causes_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Cause").""._QXZ("N. Calls")." ...
".$reason."".$value."".$term_reason_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +#### TRANSFERS ### +$HTML_output.="

"._QXZ("Transfers").": $NWB#VERM_ANSWERED-transfers$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["transfers"]="\""._QXZ("Transfers").":\"\n"; +$CSV_output["transfers"].="\""._QXZ("Transfer to").":\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$transferred_counts=array(); +$total_transfers=0; +$xfer_stmt="select campaign_id, count(*) from vicidial_xfer_log $vicidial_xfer_log_SQL group by campaign_id order by campaign_id"; +# print $xfer_stmt."
"; +$xfer_rslt=mysql_to_mysqli($xfer_stmt, $link); +while ($xfer_row=mysqli_fetch_row($xfer_rslt)) + { + $transferred_counts["$xfer_row[0]"]+=$xfer_row[1]; + $total_transfers+=$xfer_row[1]; + } +# print_r($transferred_counts); + +$max_xfer_count=max($transferred_counts); +$x=0; +foreach ($transferred_counts as $reason => $value) + { + $xfer_pct=sprintf("%.1f", (100*$value)/$total_transfers); # $total_answered_calls + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["transfers"].="\"".$reason."\",\"".$value."\",\"".$xfer_pct." %\"\n"; + + $x++; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Transfer to").":"._QXZ("N. Calls")." ...
".$reason."".$value."".$xfer_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +###################### + +#### ANSWERED CALLS BY CAMPAIGN/INGROUP ### +$HTML_output.="

"._QXZ("Answered calls, by campaign/ingroup").": $NWB#VERM_ANSWERED-calls_by_queue$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["answered_calls_by_queue"]="\""._QXZ("Answered calls, by queue").":\"\n"; +$CSV_output["answered_calls_by_queue"].="\"\",\""._QXZ("Campaign/ingroup")."\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$answered_calls_by_queue_graph_labels="["; +$answered_calls_by_queue_graph_data="["; +$answered_calls_by_queue_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$answered_calls_by_queue_graph_hovborder="["; + +$max_queue_count=max($queue_stats); +ksort($queue_stats); +$x=0; +foreach ($queue_stats as $queue => $value) + { + $queue_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + $CSV_output["answered_calls_by_queue"].="\"\",\"".$queue_names["$queue"]."\",\"".$value."\",\"".$queue_pct." %\",\"\"\n"; + + $answered_calls_by_queue_graph_labels.="\"".$queue_names["$queue"]."\","; + $answered_calls_by_queue_graph_data.="\"$value\","; + $answered_calls_by_queue_graph_bgcolor.="\"".$background_colors[$x]."\","; + $answered_calls_by_queue_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$answered_calls_by_queue_graph_labels=preg_replace('/,$/', '', $answered_calls_by_queue_graph_labels)."]"; +$answered_calls_by_queue_graph_data=preg_replace('/,$/', '', $answered_calls_by_queue_graph_data)."]"; +$answered_calls_by_queue_graph_bgcolor=preg_replace('/,$/', '', $answered_calls_by_queue_graph_bgcolor)."]"; +$answered_calls_by_queue_graph_hovborder=preg_replace('/,$/', '', $answered_calls_by_queue_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
 "._QXZ("Campaign/ingroup").""._QXZ("N. Calls")." ...
".($SOME_IMAGE_GOES_HERE)."".$queue_names["$queue"]."".$value."".$queue_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +#### ANSWERED CALLS BY DIRECTION ### +$HTML_output.="

"._QXZ("Answered calls, by direction").": $NWB#VERM_ANSWERED-calls_by_direction$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["answered_calls_by_direction"]="\""._QXZ("Answered calls, by direction").":\"\n"; +$CSV_output["answered_calls_by_direction"].="\"\",\""._QXZ("Direction")."\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$answered_calls_by_direction_graph_labels="["; +$answered_calls_by_direction_graph_data="["; +$answered_calls_by_direction_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$answered_calls_by_direction_graph_hovborder="["; + +$max_call_direction=max($call_directions); +ksort($call_directions); +$call_directions["Any calls"]=0; +$x=0; +foreach ($call_directions as $direction => $value) + { + $direction_pct=sprintf("%.1f", MathZDC((100*$value), $total_answered_calls)); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["answered_calls_by_direction"].="\"\",\"".$direction."\",\"".$value."\",\"".$direction_pct." %\",\"\"\n"; + + $answered_calls_by_direction_graph_labels.="\"".$direction."\","; + $answered_calls_by_direction_graph_data.="\"$value\","; + $answered_calls_by_direction_graph_bgcolor.="\"".$background_colors[$x]."\","; + $answered_calls_by_direction_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$answered_calls_by_direction_graph_labels=preg_replace('/,$/', '', $answered_calls_by_direction_graph_labels)."]"; +$answered_calls_by_direction_graph_data=preg_replace('/,$/', '', $answered_calls_by_direction_graph_data)."]"; +$answered_calls_by_direction_graph_bgcolor=preg_replace('/,$/', '', $answered_calls_by_direction_graph_bgcolor)."]"; +$answered_calls_by_direction_graph_hovborder=preg_replace('/,$/', '', $answered_calls_by_direction_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
 "._QXZ("Direction").""._QXZ("N. Calls")." ...
".($SOME_IMAGE_GOES_HERE)."".$direction."".$value."".$direction_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +/* +#### ANSWERED CALLS BY STINTS ### +$HTML_output.="

"._QXZ("Answered calls, by stints").":

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["answered_calls_by_stints"]="\""._QXZ("Answered calls, by stints").":\"\n"; +$CSV_output["answered_calls_by_stints"].="\""._QXZ("Number of stints")."\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$max_call_stint=max($call_stints); +$x=0; +foreach ($call_stints as $stint => $value) + { + $stint_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["answered_calls_by_stints"].="\"".$stint."\",\"".$value."\",\"".$stint_pct." %\",\"\"\n"; + + $x++; + } +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Number of stints").""._QXZ("N. Calls")." ...
".$stint."".$value."".$stint_pct." %
"._QXZ("Export as")."...CSV
"; +##################### +*/ + +#### ANSWERED CALLS BY POSITION ### +$HTML_output.="

"._QXZ("Queue position").": $NWB#VERM_ANSWERED-queue_position$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["queue_position"]="\""._QXZ("Queue position").":\"\n"; +$CSV_output["queue_position"].="\""._QXZ("Position at enter").":\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$queue_position_graph_labels="["; +$queue_position_graph_data="["; +$queue_position_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$queue_position_graph_hovborder="["; + +$max_queue_count=max($queue_positions); +$x=0; +foreach ($queue_positions as $position => $value) + { + $position_pct=sprintf("%.1f", MathZDC((100*$value), $total_answered_calls)); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["queue_position"].="\"".$position."\",\"".$value."\",\"".$position_pct." %\",\"\"\n"; + + $queue_position_graph_labels.="\"".$position."\","; + $queue_position_graph_data.="\"$value\","; + $queue_position_graph_bgcolor.="\"".$background_colors[$x]."\","; + $queue_position_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$queue_position_graph_labels=preg_replace('/,$/', '', $queue_position_graph_labels)."]"; +$queue_position_graph_data=preg_replace('/,$/', '', $queue_position_graph_data)."]"; +$queue_position_graph_bgcolor=preg_replace('/,$/', '', $queue_position_graph_bgcolor)."]"; +$queue_position_graph_hovborder=preg_replace('/,$/', '', $queue_position_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Position at enter").":"._QXZ("N. Calls")." ...
".$position."".$value."".$position_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +##### IVR STATS ##### +$ivr_stmt="select uniqueid,extension,start_time,comment_a,comment_b,comment_d,UNIX_TIMESTAMP(start_time),phone_ext from live_inbound_log $live_inbound_log_SQL and comment_a IN('CALLMENU') order by uniqueid,start_time"; +if ($DB) {$HTML_output.="$ivr_stmt";} +$ivr_rslt=mysql_to_mysqli($ivr_stmt, $link); +$ivr_paths=array(); # 0 - total calls, 1 - total time, 2 - min time, 3 - max time +$ivr_counts=array(); +$untracked_calls=$total_answered_calls; +while ($ivr_row=mysqli_fetch_array($ivr_rslt)) + { + $uniqueid=$ivr_row[0]; + + if (in_array($uniqueid, $uniqueid_array)) + { + if (!$prev_id) + { + $prev_id=$uniqueid; + $ivr_start_time=$ivr_row[6]; + } + + if ($uniqueid!=$prev_id) + { + $ivr_call_time=$ivr_end_time-$ivr_start_time; + $untracked_calls--; + # print "$prev_id --> $ivr_path: $ivr_end_time - $ivr_start_time = $ivr_call_time\n"; + + if (!array_key_exists("$ivr_path", $ivr_paths)) + { + $ivr_paths["$ivr_path"][0]=0; + $ivr_paths["$ivr_path"][1]=0; + $ivr_paths["$ivr_path"][2]=10000000; + $ivr_paths["$ivr_path"][3]=0; + } + + # if ($tracked>0) + # { + $ivr_counts["$ivr_path"]++; + $ivr_paths["$ivr_path"][0]++; + $ivr_paths["$ivr_path"][1]+=$ivr_call_time; + if ($ivr_paths["$ivr_path"][2]>$ivr_call_time) {$ivr_paths["$ivr_path"][2]=$ivr_call_time;} + if ($ivr_paths["$ivr_path"][3]<$ivr_call_time) {$ivr_paths["$ivr_path"][3]=$ivr_call_time;} + # } + # else + # { + # $ivr_paths["Untracked"][0]++; + # } + $tracked=0; + $ivr_path=""; + $ivr_start_time=$ivr_row[6]; + } + else + { + $tracked++; + } + + $ivr_path.=$ivr_row[4]; + $ivr_end_time=$ivr_row[6]; + $prev_id=$uniqueid; + } + + } + +if ($ivr_path!="") + { + $untracked_calls--; + $ivr_counts["$ivr_path"]++; + $ivr_paths["$ivr_path"][0]++; + $ivr_call_time=$ivr_end_time-$ivr_start_time; + $ivr_paths["$ivr_path"][1]+=$ivr_call_time; + $ivr_paths["$ivr_path"][2]+=0; + $ivr_paths["$ivr_path"][3]+=0; + if ($ivr_paths["$ivr_path"][2]>$ivr_call_time || $ivr_call_time=0) {$ivr_paths["$ivr_path"][2]=$ivr_call_time;} + if ($ivr_paths["$ivr_path"][3]<$ivr_call_time) {$ivr_paths["$ivr_path"][3]=$ivr_call_time;} + } + +$max_ivr_count=max($ivr_counts); +if ($max_ivr_count<$untracked_calls) {$max_ivr_count=$untracked_calls;} +$untracked_ivr_pct=sprintf("%.1f", MathZDC((100*$untracked_calls), $total_answered_calls)); + +$HTML_output.="

"._QXZ("IVR selection").": $NWB#VERM_ANSWERED-ivr_selection$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.="\n"; + +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$ivr_selection_graph_labels="[\""._QXZ("Untracked")."\","; +$ivr_selection_graph_data="[\"$untracked_calls\","; +$ivr_selection_graph_bgcolor="[\"".$background_colors[0]."\","; # SAME FOR hoverBackgroundColor +$ivr_selection_graph_hovborder="[\"".$border_colors[0]."\","; + +$CSV_output["ivr_selection"]="\""._QXZ("IVR selection").":\"\n"; +$CSV_output["ivr_selection"].="\""._QXZ("IVR")."\",\""._QXZ("N. Calls")."\",\"\",\"\",\""._QXZ("Total Duration")."\",\""._QXZ("Average Duration")."\",\""._QXZ("Min Duration")."\",\""._QXZ("Max Duration")."\"\n"; +$CSV_output["ivr_selection"].="\""._QXZ("Untracked")."\",\"$untracked_calls\",\"".$untracked_ivr_pct." %\",\"\",\"\",\"\",\"\",\"\"\n"; + +ksort($ivr_paths); +$x=1; +foreach ($ivr_paths as $pathname => $value) + { + $ivr_pct=sprintf("%.1f", (100*$value[0])/$total_answered_calls); + $total_duration=($value[1]>=3600 ? floor($value[1]/3600).":" : "").gmdate("i:s", $value[1]); + $avg_call_length=round($value[1]/$value[0]); + $average_duration=($avg_call_length>=3600 ? floor($avg_call_length/3600).":" : "").gmdate("i:s", $avg_call_length); + $min_duration=($value[2]>=3600 ? floor($value[2]/3600).":" : "").gmdate("i:s", $value[2]); + $max_duration=($value[3]>=3600 ? floor($value[3]/3600).":" : "").gmdate("i:s", $value[3]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["ivr_selection"].="\"".$pathname."\",\"".$value[0]."\",\"".$ivr_pct." %\",\"\",\"".$total_duration."\",\"".$average_duration."\",\"".$min_duration."\",\"".$max_duration."\"\n"; + + $ivr_selection_graph_labels.="\"".$pathname."\","; + $ivr_selection_graph_data.="\"$value[0]\","; + $ivr_selection_graph_bgcolor.="\"".$background_colors[$x]."\","; + $ivr_selection_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$ivr_selection_graph_labels=preg_replace('/,$/', '', $ivr_selection_graph_labels)."]"; +$ivr_selection_graph_data=preg_replace('/,$/', '', $ivr_selection_graph_data)."]"; +$ivr_selection_graph_bgcolor=preg_replace('/,$/', '', $ivr_selection_graph_bgcolor)."]"; +$ivr_selection_graph_hovborder=preg_replace('/,$/', '', $ivr_selection_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("IVR").""._QXZ("N. Calls")." ..."._QXZ("Total Duration").""._QXZ("Average Duration").""._QXZ("Min Duration").""._QXZ("Max Duration")."
"._QXZ("Untracked")."$untracked_calls".$untracked_ivr_pct." %    
".$pathname."".$value[0]."".$ivr_pct." %".$total_duration."".$average_duration."".$min_duration."".$max_duration."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +###### Inbound DID used ##### +$did_stmt="select extension,uniqueid from vicidial_did_log where call_date>='$start_date $start_time' and call_date<='$end_date $end_time' order by extension"; +$did_rslt=mysql_to_mysqli($did_stmt, $link); +if ($DB) {$HTML_output.="$did_stmt";} +$did_counts=array(); # 0 - total calls, 1 - total time, 2 - min time, 3 - max time +# $did_counts["Untracked"]=$untracked_calls2 +$untracked_did_calls=$total_answered_calls; +while ($did_row=mysqli_fetch_array($did_rslt)) + { + if(in_array($did_row["uniqueid"], $uniqueid_array)) + { + $did_counts["$did_row[extension]"]++; + $untracked_did_calls--; + } + } +$max_did=max($did_counts); +if ($max_did<$untracked_did_calls) {$max_did=$untracked_did_calls;} + +$untracked_did_pct=sprintf("%.1f", MathZDC((100*$untracked_did_calls), $total_answered_calls)); +$HTML_output.="

"._QXZ("Inbound DID used").":

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["did_used"]="\""._QXZ("Inbound DID used").":\"\n"; +$CSV_output["did_used"].="\""._QXZ("DID").":\",\""._QXZ("N. Calls")."\",\"\",\"\"\n"; +$CSV_output["did_used"].="\""._QXZ("Untracked")."\",\"$untracked_did_calls\",\"".$untracked_did_pct." %\",\"\",\"\"\n"; + +$did_used_graph_labels="[\""._QXZ("Untracked")."\","; +$did_used_graph_data="[\"$untracked_did_calls\","; +$did_used_graph_bgcolor="[\"".$background_colors[0]."\","; # SAME FOR hoverBackgroundColor +$did_used_graph_hovborder="[\"".$border_colors[0]."\","; + + +ksort($did_counts); +$x=1; +foreach ($did_counts as $did => $value) + { + $did_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["did_used"].="\"".$did." - ".$did_pattern_info["$did"]."\",\"$value\",\"".$did_pct." %\",\"\"\n"; + + $did_used_graph_labels.="\"".$did." - ".$did_pattern_info["$did"]."\","; + $did_used_graph_data.="\"$value\","; + $did_used_graph_bgcolor.="\"".$background_colors[$x]."\","; + $did_used_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$did_used_graph_labels=preg_replace('/,$/', '', $did_used_graph_labels)."]"; +$did_used_graph_data=preg_replace('/,$/', '', $did_used_graph_data)."]"; +$did_used_graph_bgcolor=preg_replace('/,$/', '', $did_used_graph_bgcolor)."]"; +$did_used_graph_hovborder=preg_replace('/,$/', '', $did_used_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("DID").": $NWB#VERM_ANSWERED-did_used$NWE"._QXZ("N. Calls")." ...
"._QXZ("Untracked")."$untracked_did_calls$untracked_did_pct %
".$did." - ".$did_pattern_info["$did"]."$value$did_pct %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +#### MUSIC ON HOLD #### +$HTML_output.="

"._QXZ("Parked Calls by Agent").": $NWB#VERM_ANSWERED-parked_calls_by_agent$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["moh_agent"]="\""._QXZ("Music-on-Hold by Agent").":\"\n"; +$CSV_output["moh_agent"].="\""._QXZ("Agent")."\",\""._QXZ("Total Parks")."\",\""._QXZ("Parks per Call")."\",\""._QXZ("Total Duration")."\",\""._QXZ("Average Duration")."\"\n"; + +$parked_counts=array(); +$total_parks=0; +$park_stmt="select user, sum(parked_sec), count(*) from park_log $park_log_SQL group by user order by user"; +$park_rslt=mysql_to_mysqli($park_stmt, $link); +while ($park_row=mysqli_fetch_row($park_rslt)) + { + $parked_counts["$park_row[0]"][0]=$park_row[2]; + $parked_counts["$park_row[0]"][1]=$park_row[1]; + $total_parks+=$park_row[2]; + } + +$x=0; +foreach ($parked_counts as $agent => $value) + { + $agentName=($show_full_agent_info ? "$agent - ".$fullname_info["$agent"] : $fullname_info["$agent"]); + + $parks_per_call=sprintf("%.1f", MathZDC($value[0], $agent_call_counts["$agent"])); + $average_duration=sprintf("%.1f", MathZDC($value[1], $value[0])); # Use $agent_call_counts["$agent"] if want average duration per CALL, not PARK. + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["moh_agent"].="\"".$agentName."\",\"".$value[0]."\",\"".$parks_per_call."\",\"".($value[1]>=3600 ? floor($value[1]/3600).":" : "").gmdate("i:s", $value[1])."\",\"".$average_duration." s\"\n"; + + $x++; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Agent").""._QXZ("Total Parks").""._QXZ("Parks per Call").""._QXZ("Total Duration").""._QXZ("Average Duration")."
".$agentName."".$value[0]."".$parks_per_call."".($value[1]>=3600 ? floor($value[1]/3600).":" : "").gmdate("i:s", $value[1])."".$average_duration."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
\n"; +##################### + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "ANSWERS_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + +echo $HTML_output; + +?> + diff --git a/agc_2-X/trunk/www/VERM/VERM_AREA_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_AREA_rpt.inc new file mode 100644 index 00000000..96d2c0bf --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_AREA_rpt.inc @@ -0,0 +1,299 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1627 - First build +# + +# if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} +# elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} +if (isset($_GET["CLI_digits"])) {$CLI_digits=$_GET["CLI_digits"];} + elseif (isset($_POST["CLI_digits"])) {$CLI_digits=$_POST["CLI_digits"];} +if (isset($_GET["CLI_position"])) {$CLI_position=$_GET["CLI_position"];} + elseif (isset($_POST["CLI_position"])) {$CLI_position=$_POST["CLI_position"];} + +$CLI_digits=preg_replace('/[^0-9]/', '', $CLI_digits); +$CLI_position=preg_replace('/[^0-9]/', '', $CLI_position); + +if (!$CLI_digits) {$CLI_digits=3;} +if (!$CLI_position) {$CLI_position=1;} + +$HTML_output.="

"._QXZ("Area Code Report").":

"; +$HTML_output.="
"; + +# $HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\t"; +$HTML_output.="\t"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\t"; +$HTML_output.="\t"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Number of CLID digits to search").": $NWB#VERM_AREA-CLID$NWE
"._QXZ("Starting from position").": $NWB#VERM_AREA-starting_position$NWE
 
"; +# $HTML_output.="
"; + +$answered_array=array(); +$answered_waiting_array=array(); +$unanswered_array=array(); +$unanswered_waiting_array=array(); +$uid_array=array(); + +$outb_stmt="select substr(phone_number, $CLI_position, $CLI_digits) as snippet, user, length_in_sec, uniqueid, lead_id from vicidial_log $vicidial_log_SQL $and_NANQUE_clause $exc_addtl_statuses"; +if ($DB) {$HTML_output.="$outb_stmt";} +# print $outb_stmt."\n"; +$outb_rslt=mysql_to_mysqli($outb_stmt, $link); +while ($outb_row=mysqli_fetch_array($outb_rslt)) + { + $snippet=$outb_row["snippet"]; + $user=$outb_row["user"]; + $length_in_sec=$outb_row["length_in_sec"]; + $uniqueid=$outb_row["uniqueid"]; + $lead_id=$outb_row["lead_id"]; + + if (preg_match("/VDAD/", $user)) + { + $xfer_stmt="select close_uniqueid from vicidial_xfer_log where front_uniqueid='$uniqueid'"; + $xfer_rslt=mysql_to_mysqli($xfer_stmt, $link); +# if (mysqli_num_rows($xfer_rslt)==0) +# { +# while ($xfer_row=mysqli_fetch_row($xfer_rslt)) +# { +# +# } +# } +# else +# { + $unanswered_array["$snippet"]["calls"]++; + $unanswered_array["$snippet"]["outbound_calls"]++; + $unanswered_array["$snippet"]["wait_time"]+=$length_in_sec; + + $unanswered_waiting_array["$snippet"]["calls"]++; + $unanswered_waiting_array["$snippet"]["wait_time"]+=$length_in_sec; +# } + array_push($uid_array, "$uniqueid"); + } + else + { + # $length_in_sec=GetAgentLogTalkTime($uniqueid, $user, $lead_id, $length_in_sec); + $answered_array["$snippet"]["calls"]++; + $answered_array["$snippet"]["outbound_calls"]++; + $answered_array["$snippet"]["call_time"]+=$length_in_sec; + } + } + +$inb_stmt="select substr(phone_number, $CLI_position, $CLI_digits) as snippet, user, uniqueid, length_in_sec-queue_seconds as talk_time, queue_seconds, queue_position, lead_id from vicidial_closer_log $vicidial_closer_log_SQL $and_NANQUE_clause $exc_addtl_statuses"; +if ($DB) {$HTML_output.="$inb_stmt";} +# print $inb_stmt."\n"; +$inb_rslt=mysql_to_mysqli($inb_stmt, $link); +while ($inb_row=mysqli_fetch_array($inb_rslt)) + { + $snippet=$inb_row["snippet"]; + $user=$inb_row["user"]; + $length_in_sec=$inb_row["talk_time"]; + $wait_time=$inb_row["queue_seconds"]; + $uniqueid=$inb_row["uniqueid"]; + $position=$inb_row["queue_position"]; + $lead_id=$inb_row["lead_id"]; + + if (preg_match("/VDCL/", $user)) + { +# $xfer_stmt="select close_uniqueid from vicidial_xfer_log where front_uniqueid='$uniqueid'"; +# $xfer_rslt=mysql_to_mysqli($xfer_stmt, $link); +# if (mysqli_num_rows($xfer_rslt)==0) +# { + $unanswered_array["$snippet"]["calls"]++; + $unanswered_array["$snippet"]["inbound_calls"]++; + $unanswered_array["$snippet"]["wait_time"]+=$wait_time; + $unanswered_array["$snippet"]["position"]+=$position; + + $unanswered_waiting_array["$snippet"]["calls"]++; + $unanswered_waiting_array["$snippet"]["wait_time"]+=$wait_time; +# } + } + else + { +# $length_in_sec=GetAgentLogTalkTime($uniqueid, $user, $lead_id, $length_in_sec); + $answered_array["$snippet"]["calls"]++; + $answered_array["$snippet"]["inbound_calls"]++; + $answered_array["$snippet"]["position"]+=$position; + $answered_array["$snippet"]["call_time"]+=$length_in_sec; + $answered_array["$snippet"]["wait_time"]+=$wait_time; + } + } + +ksort($answered_array); +ksort($unanswered_array); + +if ($show_an) + { + print_r($answered_array); + } +if ($show_un) + { + print_r($unanswered_array); + } + +##### ANSWERED OUTPUT ##### +$HTML_output.="

"._QXZ("Detail for answered calls").": $NWB#VERM_AREA-answered_details$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["answered_area"]="\""._QXZ("Area code/Caller id")."\",\""._QXZ("Taken calls")."\",\""._QXZ("Total calling time")."\",\""._QXZ("Average time per call")."\",\""._QXZ("Average wait time per call")."\"\n"; + +$i=0; +foreach ($answered_array as $prefix => $data) + { + $i++; + $call_time=($data["call_time"]>=3600 ? intval(floor($data["call_time"]/3600)).date(":i:s", $data["call_time"]) : intval(date("i", $data["call_time"])).":".date("s", $data["call_time"])); + + $average_time=round($data["call_time"]/$data["calls"]); + $average_time=($average_time>=3600 ? intval(floor($average_time/3600)).date(":i:s", $average_time) : intval(date("i", $average_time)).":".date("s", $average_time)); + + $average_wait_time=round($data["wait_time"]/$data["calls"]); + $average_wait_time=($average_wait_time>=3600 ? intval(floor($average_wait_time/3600)).date(":i:s", $average_wait_time) : intval(date("i", $average_wait_time)).":".date("s", $average_wait_time)); + + $CSV_output["answered_area"].="\"".$prefix."\","; + $CSV_output["answered_area"].="\"".$data["calls"]."\","; + $CSV_output["answered_area"].="\"".$call_time."\","; + $CSV_output["answered_area"].="\"".$average_time."\","; + $CSV_output["answered_area"].="\"".$average_wait_time."\""; + $CSV_output["answered_area"].="\n"; + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Area code/Caller id").""._QXZ("Taken calls").""._QXZ("Total calling time").""._QXZ("Average time per call").""._QXZ("Average wait time per call")."
".$prefix."".$data["calls"]."".$call_time."".$average_time."".$average_wait_time."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +############################# + +##### UNANSWERED OUTPUT ##### +$HTML_output.="

"._QXZ("Detail for unanswered calls").": $NWB#VERM_AREA-unanswered_details$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["unanswered_area"]="\""._QXZ("Area code/Caller id")."\",\""._QXZ("Lost calls")."\",\""._QXZ("Average wait time per call")."\",\""._QXZ("Average position")."\"\n"; +$i=0; +foreach ($unanswered_array as $prefix => $data) + { + $i++; + $call_time=($data["call_time"]>=3600 ? intval(floor($data["call_time"]/3600)).date(":i:s", $data["call_time"]) : intval(date("i", $data["call_time"])).":".date("s", $data["call_time"])); + + $average_position=sprintf("%.1f", ($data["position"]/$data["calls"])); + $average_time=($average_time>=3600 ? intval(floor($average_time/3600)).date(":i:s", $average_time) : intval(date("i", $average_time)).":".date("s", $average_time)); + + $average_wait_time=round($data["wait_time"]/$data["calls"]); + $average_wait_time=($average_wait_time>=3600 ? intval(floor($average_wait_time/3600)).date(":i:s", $average_wait_time) : intval(date("i", $average_wait_time)).":".date("s", $average_wait_time)); + + $CSV_output["unanswered_area"].="\"".$prefix."\","; + $CSV_output["unanswered_area"].="\"".$data["calls"]."\","; + $CSV_output["unanswered_area"].="\"".$average_wait_time."\""; + $CSV_output["unanswered_area"].="\"".$average_position."\""; + $CSV_output["unanswered_area"].="\n"; + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Area code/Caller id").""._QXZ("Lost calls").""._QXZ("Average wait time per call").""._QXZ("Average position")."
".$prefix."".$data["calls"]."".$average_wait_time."".$average_position."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +############################# + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "AREA_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + + +echo $HTML_output; +?> + +$current_call_time+1) + { + echo "WARNING: $call_uniqueid shows $current_call_time length, agent logs show $talk_sec\n"; + $current_call_time=$talk_sec; + } + } + + return $current_call_time; + } + +?> \ No newline at end of file diff --git a/agc_2-X/trunk/www/VERM/VERM_ATT_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_ATT_rpt.inc new file mode 100644 index 00000000..aa54e329 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_ATT_rpt.inc @@ -0,0 +1,243 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1626 - First build +# + +# if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} +# elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} + +$PHP_SELF=$_SERVER['PHP_SELF']; + +$ACD_queue_counts=array(); +$ACD_terminal_counts=array(); + +# ONLY COUNT ANSWERED CALLS +$stmt="select campaign_id, user, status, 0 as ring_time from vicidial_log $vicidial_log_SQL $and_NANQUE_clause UNION ALL select campaign_id, user, status, queue_seconds as ring_time from vicidial_closer_log $vicidial_closer_log_SQL $and_NANQUE_clause"; +if ($DB) {$HTML_output.="$stmt";} +$rslt=mysql_to_mysqli($stmt, $link); +while ($row=mysqli_fetch_array($rslt)) + { + $campaign_id=$row["campaign_id"]; + $user=$row["user"]; + $status=$row["status"]; + $ring_time=$row["ring_time"]; + + if (preg_match('/VDAD|VDCL/', $user) && preg_match('/^DROP$|TIMEOT|WAITTO/', $status)) + { + # UNANSWERED, DO NOTHING + $unanswered++; + } + else + { + if (in_array($status, $lost_statuses_array)) + { + $ACD_queue_counts["$campaign_id"]["lost"]++; + $ACD_queue_counts["$campaign_id"]["lost_ring_time"]+=$ring_time; + + $ACD_terminal_counts["$user"]["lost"]++; + $ACD_terminal_counts["$user"]["lost_ring_time"]+=$ring_time; + } + else + { + $ACD_queue_counts["$campaign_id"]["calls"]++; + $ACD_queue_counts["$campaign_id"]["ring_time"]+=$ring_time; + + $ACD_terminal_counts["$user"]["calls"]++; + $ACD_terminal_counts["$user"]["ring_time"]+=$ring_time; + } + } + } + +/* +$stmt=""; +$rslt=mysql_to_mysqli($stmt, $link); +while ($row=mysqli_fetch_array($rslt)) + { + $campaign_id=$row["campaign_id"]; + $user=$row["user"]; + $calls=$row["ct"]; + $ring_time=$row["ring_time"]; + + $ACD_queue_counts["$campaign_id"]["calls"]+=$calls; + $ACD_queue_counts["$campaign_id"]["ring_time"]+=$ring_time; + + $ACD_terminal_counts["$user"]["calls"]+=$calls; + $ACD_terminal_counts["$user"]["ring_time"]+=$ring_time; + } +*/ + +ksort($ACD_queue_counts); +ksort($ACD_terminal_counts); + + +##### ACD ATTEMPTS BY CAMPAIGN/INGROUP ##### +$HTML_output.="

"._QXZ("ACD attempts by Campaign/ingroup").": $NWB#VERM_ATT-acd_by_queue$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["acd_attempts_by_queue"]="\""._QXZ("Campaign/ingroup")."\",\""._QXZ("N. lost")."\",\""._QXZ("Avg ring")."\",\""._QXZ("Ring (s)")."\",\""._QXZ("N. Taken")."\",\""._QXZ("Avg ring")."\",\""._QXZ("Ring (s)")."\"\n"; +$i=0; +foreach ($ACD_queue_counts as $queue => $data) + { + if (!$data["lost"]) # !$data["lost_ring_time"] || - commented out 6/13/22 because we want avr ring to show zero if there ARE lost. + { + $avg_lost_time=" - "; + } + else + { + $avg_lost_time=round($data["lost_ring_time"]/$data["lost"]); + $avg_lost_time=($avg_lost_time>=3600 ? intval(floor($avg_lost_time/3600)).date(":i:s", $avg_lost_time) : intval(date("i", $avg_lost_time)).":".date("s", $avg_lost_time)); + } + + if (!$data["ring_time"] || !$data["calls"]) + { + $avg_ring_time="0:00"; + } + else + { + $avg_ring_time=round($data["ring_time"]/$data["calls"]); + $avg_ring_time=($avg_ring_time>=3600 ? intval(floor($avg_ring_time/3600)).date(":i:s", $avg_ring_time) : intval(date("i", $avg_ring_time)).":".date("s", $avg_ring_time)); + } + + + $lost_time=($data["lost_ring_time"]>=3600 ? intval(floor($data["lost_ring_time"]/3600)).date(":i:s", $data["lost_ring_time"]) : intval(date("i", $data["lost_ring_time"])).":".date("s", $data["lost_ring_time"])); + $ring_time=($data["ring_time"]>=3600 ? intval(floor($data["ring_time"]/3600)).date(":i:s", $data["ring_time"]) : intval(date("i", $data["ring_time"])).":".date("s", $data["ring_time"])); + + $queue_name=$queue_names["$queue"]; + + $CSV_output["acd_attempts_by_queue"].="\"".$queue_name."\","; + $CSV_output["acd_attempts_by_queue"].="\"".(!$data["lost"] ? "0" : $data["lost"])."\","; + $CSV_output["acd_attempts_by_queue"].="\"".$avg_lost_time."\","; + $CSV_output["acd_attempts_by_queue"].="\"".$lost_time."\","; + $CSV_output["acd_attempts_by_queue"].="\"".(!$data["calls"] ? "0" : $data["calls"])."\","; + $CSV_output["acd_attempts_by_queue"].="\"".$avg_ring_time."\","; + $CSV_output["acd_attempts_by_queue"].="\"".$ring_time."\","; + $CSV_output["acd_attempts_by_queue"].="\n"; + + $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.="
"._QXZ("Campaign/ingroup").""._QXZ("N. lost").""._QXZ("Avr ring").""._QXZ("Ring (s)").""._QXZ("N. Taken").""._QXZ("Avg ring").""._QXZ("Ring (s)")."
".$queue_name."".(!$data["lost"] ? "0" : $data["lost"])."".$avg_lost_time."".$lost_time."".(!$data["calls"] ? "0": $data["calls"])."".$avg_ring_time."".$ring_time."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...

"; +#################################### + + +##### ACD ATTEMPTS BY AGENT ##### +$HTML_output.="

"._QXZ("ACD attempts by agent").": $NWB#VERM_ATT-acd_by_agent$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["acd_attempts_by_terminal"]="\""._QXZ("Campaign/ingroup")."\",\""._QXZ("N. lost")."\",\""._QXZ("Avg ring")."\",\""._QXZ("Ring (s)")."\",\""._QXZ("N. Taken")."\",\""._QXZ("Avg ring")."\",\""._QXZ("Ring (s)")."\"\n"; +$i=0; +foreach ($ACD_terminal_counts as $queue => $data) + { + if (!$data["lost"]) # !$data["lost_ring_time"] || - commented out 6/13/22 because we want avr ring to show zero if there ARE lost. + { + $avg_lost_time=" - "; + } + else + { + $avg_lost_time=round($data["lost_ring_time"]/$data["lost"]); + $avg_lost_time=($avg_lost_time>=3600 ? intval(floor($avg_lost_time/3600)).date(":i:s", $avg_lost_time) : intval(date("i", $avg_lost_time)).":".date("s", $avg_lost_time)); + } + + if (!$data["ring_time"] || !$data["calls"]) + { + $avg_ring_time="0:00"; + } + else + { + $avg_ring_time=round($data["ring_time"]/$data["calls"]); + $avg_ring_time=($avg_ring_time>=3600 ? intval(floor($avg_ring_time/3600)).date(":i:s", $avg_ring_time) : intval(date("i", $avg_ring_time)).":".date("s", $avg_ring_time)); + } + + $terminal=($show_full_agent_info && $terminal_names["$queue"]!="" ? "$queue - " : "").($terminal_names["$queue"]!="" ? $terminal_names["$queue"] : "($queue)"); + + $lost_time=($data["lost_ring_time"]>=3600 ? intval(floor($data["lost_ring_time"]/3600)).date(":i:s", $data["lost_ring_time"]) : intval(date("i", $data["lost_ring_time"])).":".date("s", $data["lost_ring_time"])); + $ring_time=($data["ring_time"]>=3600 ? intval(floor($data["ring_time"]/3600)).date(":i:s", $data["ring_time"]) : intval(date("i", $data["ring_time"])).":".date("s", $data["ring_time"])); + + $CSV_output["acd_attempts_by_terminal"].="\"".$terminal."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".(!$data["lost"] ? "0" : $data["lost"])."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".$avg_lost_time."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".$lost_time."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".(!$data["calls"] ? "0" : $data["calls"])."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".$avg_ring_time."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".$ring_time."\","; + $CSV_output["acd_attempts_by_terminal"].="\n"; + + $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.="
"._QXZ("Agent").""._QXZ("N. lost").""._QXZ("Avr ring").""._QXZ("Ring (s)").""._QXZ("N. Taken").""._QXZ("Avg ring").""._QXZ("Ring (s)")."
".$terminal."".(!$data["lost"] ? "0": $data["lost"])."".$avg_lost_time."".$lost_time."".(!$data["calls"] ? "0" : $data["calls"])."".$avg_ring_time."".$ring_time."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...

"; +############################# + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "ATT_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + + +echo $HTML_output; +?> diff --git a/agc_2-X/trunk/www/VERM/VERM_CALLS_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_CALLS_rpt.inc new file mode 100644 index 00000000..4b7fd1e2 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_CALLS_rpt.inc @@ -0,0 +1,557 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1625 - First build +# + +if (isset($_GET["page_no"])) {$page_no=$_GET["page_no"];} + elseif (isset($_POST["page_no"])) {$page_no=$_POST["page_no"];} +if (isset($_GET["ans_page_no"])) {$ans_page_no=$_GET["ans_page_no"];} + elseif (isset($_POST["ans_page_no"])) {$ans_page_no=$_POST["ans_page_no"];} +if (isset($_GET["unans_page_no"])) {$unans_page_no=$_GET["unans_page_no"];} + elseif (isset($_POST["unans_page_no"])) {$unans_page_no=$_POST["unans_page_no"];} +if (isset($_GET["sort_answered_details"])) {$sort_answered_details=$_GET["sort_answered_details"];} + elseif (isset($_POST["sort_answered_details"])) {$sort_answered_details=$_POST["sort_answered_details"];} +if (isset($_GET["sort_unanswered_details"])) {$sort_unanswered_details=$_GET["sort_unanswered_details"];} + elseif (isset($_POST["sort_unanswered_details"])) {$sort_unanswered_details=$_POST["sort_unanswered_details"];} + +if ($non_latin < 1) + { + $sort_answered_details = preg_replace('/[^\s-_0-9a-zA-Z]/','',$sort_answered_details); + $sort_unanswered_details = preg_replace('/[^\s-_0-9a-zA-Z]/','',$sort_unanswered_details); + } +else + { + $sort_answered_details = preg_replace('/[^\s-_0-9\p{L}]/u','',$sort_answered_details); + $sort_unanswered_details = preg_replace('/[^\s-_0-9\p{L}]/u','',$sort_unanswered_details); + } +$page_no=preg_replace('/[^0-9]/', '', $page_no); +$ans_page_no=preg_replace('/[^0-9]/', '', $ans_page_no); +$unans_page_no=preg_replace('/[^0-9]/', '', $unans_page_no); + +if (!$ans_page_no || $ans_page_no<1) {$ans_page_no=1;} + +$ans_ll=($ans_page_no-1)*20; +$ans_ul=($ans_page_no*20); + +$unans_page_no=preg_replace('/[^0-9]/', '', $unans_page_no); +if (!$unans_page_no || $unans_page_no<1) {$unans_page_no=1;} + +$unans_ll=($unans_page_no-1)*20; ### !!! ### +$unans_ul=($unans_page_no*20); ### !!! ### + +#### SAME FOR BOTH ANSWERED AND UNANSWERED +$available_columns=array( +"Date" => "call_date", +"Caller" => "phone_number", +"Queue" => "campaign_id", +"IVR" => "ivr", +"Wait" => "wait", +"Duration" => "length_in_sec", +"Pos." => "queue_position", +"Disconnection" => "term_reason", +"Transferred to" => "transferred_to", +"Handled by" => "user", +"Attempts" => "attempts", +"Code" => "status", +"Stints" => "stints", +"Srv" => "srv", +"Asterisk UID" => "caller_code", +"MOH events" => "moh_events", +"MOH duration" => "moh_duration", +"IVR duration" => "ivr_duration", +"IVR path" => "ivr_path", +"DID" => "did", +"CRM" => "", +"Tag" => "tag", +"Feat" => "feat", +"Vars" => "vars", +"Feature Codes" => "feature_codes", +"Variables" => "variables" +); + + ### !!! ### +$selected_columns=array( +_QXZ("Date") => "call_date", +_QXZ("Caller") => "phone_number", +_QXZ("Queue") => "campaign_id", +_QXZ("IVR") => "ivr_duration", +_QXZ("Wait") => "wait", +_QXZ("Duration") => "duration", +_QXZ("Pos.") => "queue_position", +_QXZ("Disconnection") => "term_reason", +_QXZ("Handled by") => "user", +_QXZ("Attempts") => "attempts", +_QXZ("Code") => "status", +"uniqueid" => "detail_id" +); + + +############################################ +$sort_char=""; ### !!! ### +$sort_index=""; ### !!! ### + +$sort_clause=" order by call_date"; +$sort_index=preg_replace('/ desc/', '', $sort_answered_details); +if (preg_match('/ desc$/', $sort_answered_details)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_answered_details); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_answered_details." desc"; + } +$sort_answered_details_preg=preg_replace('/ desc$/', '', $sort_answered_details); + +$stmt="select call_date, phone_number, campaign_id, 0 as ivr, '0:00' as wait, sec_to_time(round(length_in_sec)) as duration, '1' as queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, uniqueid as detail_id, 'O' as direction from vicidial_log $vicidial_log_SQL and user not in ('VDAD') UNION select call_date, phone_number, campaign_id, 0 as ivr, sec_to_time(round(queue_seconds)) as wait, sec_to_time(round(length_in_sec-queue_seconds)) as duration, queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, CONCAT(uniqueid, '|', closecallid) as detail_id, 'I' as direction from vicidial_closer_log $vicidial_closer_log_SQL and (user!='VDCL') $sort_clause"; + +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").":

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$CSV_output["answer_details"]=""; +foreach ($selected_columns as $display_name => $column_name) + { + if ($display_name!="uniqueid") + { + $CSV_output["answer_details"].="\"$display_name\","; + # $HTML_output.=""; + + $HTML_output.="\n"; + } + } +$CSV_output["answer_details"].="\n"; +$HTML_output.=""; +$HTML_output.=""; + +$output_array=array(); +$i=0; +while ($row=mysqli_fetch_array($rslt)) + { + $row["caller_code"]=""; + $row["ivr"]="00:00"; + $row["ivr_duration"]="00:00"; + $row["ivr_path"]=""; + $row["did"]=""; + + $uniqueid=$row["uniqueid"]; + $row["campaign_id"]=$queue_names["$row[campaign_id]"]; + $row["status"]=($status_names["$row[status]"] ? $status_names["$row[status]"] : $row["status"]); + $row["user"]=$fullname_info["$row[user]"]; + + + $row["caller_code"]=GetCallerCode($row["uniqueid"]); + if ($row["direction"]=="I") + { + $ivr_info_array=GetIVRInfo($row["uniqueid"], $row["call_date"]); + $row["ivr"]=$ivr_info_array[0]; + $row["ivr_duration"]=$ivr_info_array[1]; + $row["ivr_path"]=$ivr_info_array[2]; + $row["call_date"]=$ivr_info_array[3]; + $row["did"]=GetDID($row["uniqueid"]); + } + + if ($i>=$ans_ll && $i<$ans_ul || $download_rpt) + { + $current_row=array(); + foreach ($selected_columns as $display_name => $column_name) + { + $current_row["$column_name"]=$row["$column_name"]; + } + + array_push($output_array, $current_row); + } + $i++; + } + +$sort_array_holder=array(); +if ($sort_index) + { + #$sort_index=8; + # 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"]; + } + if (preg_match('/ desc$/', $sort_answered_details)) + { + array_multisort($sort_array_holder,SORT_DESC, SORT_STRING,$output_array); + } + else + { + array_multisort($sort_array_holder,SORT_ASC, SORT_STRING,$output_array); + } + + #usort($output_array, function($a, $b){ + # return strcmp($a[$sort_index], $b[$sort_index]); + #}); + } + +foreach ($output_array as $data_row) + { + $HTML_output.=""; + foreach ($data_row as $key => $value) + { + if ($key=="call_date") + { + $myDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $value); + $value = $myDateTime->format('m/d - H:i:s'); + } + if ($key!="detail_id") + { + $HTML_output.=""; + $CSV_output["answer_details"].="\"".$value."\","; + } + else + { + $HTML_output.=""; + # $HTML_output.=""; + } + } + $CSV_output["answer_details"].="\n"; + + $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.="
".$display_name.($column_name==$sort_answered_details_preg ? " $sort_char" : "")." 
".$value."\"HELP\"
|<    <<"; +$HTML_output.="    "; +$HTML_output.=""; +$HTML_output.=""._QXZ("Export as")."...     CSV    Current page: $ans_page_no / $total_pages"._QXZ("Export as")."...         "._QXZ("Current page").": $ans_page_no / $total_pages>>    >|"; +$HTML_output.="    "; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +############################################ + +$HTML_output.="


"; + +########## UNANSWERED DETAILS ############## +$selected_columns=array( +_QXZ("Date") => "call_date", +_QXZ("Agent") => "user", +_QXZ("Caller") => "phone_number", +_QXZ("Queue") => "campaign_id", +_QXZ("Disconnection") => "term_reason", +_QXZ("Position") => "queue_position", +_QXZ("IVR") => "ivr_duration", +_QXZ("Wait") => "wait", +_QXZ("Attempts") => "attempts", +_QXZ("Code") => "status", +_QXZ("Key") => "key", +"uniqueid" => "detail_id" +); + +$sort_char=""; +$sort_index=""; + +$sort_clause=" order by call_date"; +$sort_index=preg_replace('/ desc/', '', $sort_unanswered_details); +if (preg_match('/ desc$/', $sort_unanswered_details)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_unanswered_details); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_unanswered_details." desc"; + } +$sort_unanswered_details_preg=preg_replace('/ desc$/', '', $sort_unanswered_details); + +$stmt="select call_date, phone_number, campaign_id, 0 as ivr, '0:00' as wait, sec_to_time(round(length_in_sec)) as duration, '1' as queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, uniqueid as detail_id, 'O' as direction from vicidial_log $vicidial_log_SQL and user in ('VDAD') UNION select call_date, phone_number, campaign_id, 0 as ivr, sec_to_time(round(queue_seconds)) as wait, sec_to_time(round(length_in_sec-queue_seconds)) as duration, queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, CONCAT(uniqueid, '|', closecallid) as detail_id, 'I' as direction from vicidial_closer_log $vicidial_closer_log_SQL and user in ('VDCL') $and_NANQUE_clause $sort_clause"; + +if ($DB) {$HTML_output.="$stmt";} + +$rslt=mysql_to_mysqli($stmt, $link); +$total_pages=ceil(mysqli_num_rows($rslt)/20); + +$HTML_output.="

"._QXZ("Unanswered Call Details").":

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$CSV_output["unanswered_details"]=""; +foreach ($selected_columns as $display_name => $column_name) + { + if ($display_name!="uniqueid") + { + $CSV_output["unanswered_details"].="\"$display_name\","; + # $HTML_output.=""; + + $HTML_output.="\n"; + } + } +$CSV_output["unanswered_details"].="\n"; +$HTML_output.=""; +$HTML_output.=""; + +$output_array=array(); +$i=0; +while ($row=mysqli_fetch_array($rslt)) + { + $row["caller_code"]=""; + $row["ivr"]="00:00"; + $row["ivr_duration"]="00:00"; + $row["ivr_path"]=""; + $row["did"]=""; + + $uniqueid=$row["uniqueid"]; + $row["campaign_id"]=$queue_names["$row[campaign_id]"]; + $row["status"]=($status_names["$row[status]"] ? $status_names["$row[status]"] : $row["status"]); + $row["user"]=$fullname_info["$row[user]"]; + + $row["key"]=GetKeyPress($row["uniqueid"]); + + $row["caller_code"]=GetCallerCode($row["uniqueid"]); + if ($row["direction"]=="I") + { + $ivr_info_array=GetIVRInfo($row["uniqueid"], $row["call_date"]); + $row["ivr"]=$ivr_info_array[0]; + $row["ivr_duration"]=$ivr_info_array[1]; + $row["ivr_path"]=$ivr_info_array[2]; + $row["call_date"]=$ivr_info_array[3]; + $row["did"]=GetDID($row["uniqueid"]); + } + + if ($i>=$unans_ll && $i<$unans_ul || $download_rpt) + { + $current_row=array(); + foreach ($selected_columns as $display_name => $column_name) + { + $current_row["$column_name"]=$row["$column_name"]; + } + + array_push($output_array, $current_row); + } + $i++; + } + +$sort_array_holder=array(); +if ($sort_index) + { + #$sort_index=8; + # 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"]; + } + if (preg_match('/ desc$/', $sort_unanswered_details)) + { + array_multisort($sort_array_holder,SORT_DESC, SORT_STRING,$output_array); + } + else + { + array_multisort($sort_array_holder,SORT_ASC, SORT_STRING,$output_array); + } + + #usort($output_array, function($a, $b){ + # return strcmp($a[$sort_index], $b[$sort_index]); + #}); + } + +foreach ($output_array as $data_row) + { + $HTML_output.=""; + foreach ($data_row as $key => $value) + { + if ($key=="call_date") + { + $myDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $value); + $value = $myDateTime->format('m/d - H:i:s'); + } + if ($key!="detail_id") + { + $HTML_output.=""; + $CSV_output["unanswered_details"].="\"".$value."\","; + } + else + { + $HTML_output.=""; + # $HTML_output.=""; + } + } + $CSV_output["unanswered_details"].="\n"; + + $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.="
".$display_name.($column_name==$sort_unanswered_details_preg ? " $sort_char" : "")." 
".$value."\"HELP\"
|<    <<"; +$HTML_output.="    "; +$HTML_output.=""; +$HTML_output.=""._QXZ("Export as")."...     CSV    Current page: $unans_page_no / $total_pages"._QXZ("Export as")."...    Current page: $unans_page_no / $total_pages>>    >|"; +$HTML_output.="    "; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +############################################ + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "CALLS_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + +echo $HTML_output; +?> + +=3600 ? floor($ivr_duration/3600).":" : "").gmdate("i:s", $ivr_duration); + $ivr_length_fmt=($ivr_length>=3600 ? floor($ivr_length/3600).":" : "").gmdate("i:s", $ivr_length); + + return array("$ivr_length_fmt", "$ivr_duration_fmt", "$ivr_path", "$actual_start_time"); + } + +function GetDID($uniqueid) + { + global $link, $DB, $did_id_info, $did_pattern_info; + + $did_str=""; + + $did_stmt="select extension, did_id from vicidial_did_log where uniqueid in ('$uniqueid')"; + $did_rslt=mysqli_query($link, $did_stmt); + $did_row=mysqli_fetch_array($did_rslt); + $did_str=$did_row["extension"]." - ".$did_id_info["$did_row[extension]"]; + + return $did_str; + } +?> \ No newline at end of file diff --git a/agc_2-X/trunk/www/VERM/VERM_DAY_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_DAY_rpt.inc new file mode 100644 index 00000000..26c82cd8 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_DAY_rpt.inc @@ -0,0 +1,684 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1624 - First build +# + +$vicidial_user_log_table="vicidial_user_log"; + +# if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} +# elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} + +#### CUSTOM REPORT VARIABLES #### +#if (isset($_GET["agents"])) {$agents=$_GET["agents"];} +# elseif (isset($_POST["agents"])) {$agents=$_POST["agents"];} +#if (isset($_GET["locations"])) {$locations=$_GET["locations"];} +# elseif (isset($_POST["locations"])) {$locations=$_POST["locations"];} +#if (isset($_GET["user_groups"])) {$user_groups=$_GET["user_groups"];} +# elseif (isset($_POST["user_groups"])) {$user_groups=$_POST["user_groups"];} +#if (isset($_GET["statuses"])) {$statuses=$_GET["statuses"];} +# elseif (isset($_POST["statuses"])) {$statuses=$_POST["statuses"];} +#if (isset($_GET["disconnection_causes"])) {$disconnection_causes=$_GET["disconnection_causes"];} +# elseif (isset($_POST["disconnection_causes"])) {$disconnection_causes=$_POST["disconnection_causes"];} +#if (isset($_GET["call_counts"])) {$call_counts=$_GET["call_counts"];} +# elseif (isset($_POST["call_counts"])) {$call_counts=$_POST["call_counts"];} +#if (isset($_GET["DIDs"])) {$DIDs=$_GET["DIDs"];} +# elseif (isset($_POST["DIDs"])) {$DIDs=$_POST["DIDs"];} +#if (isset($_GET["IVR_choice"])) {$IVR_choice=$_GET["IVR_choice"];} +# elseif (isset($_POST["IVR_choice"])) {$IVR_choice=$_POST["IVR_choice"];} +#if (isset($_GET["server"])) {$server=$_GET["server"];} +# elseif (isset($_POST["server"])) {$server=$_POST["server"];} +#if (isset($_GET["days_of_week"])) {$days_of_week=$_GET["days_of_week"];} +# elseif (isset($_POST["days_of_week"])) {$days_of_week=$_POST["days_of_week"];} +#if (isset($_GET["hour_of_day"])) {$hour_of_day=$_GET["hour_of_day"];} +# elseif (isset($_POST["hour_of_day"])) {$hour_of_day=$_POST["hour_of_day"];} + +### VARIABLES ### +$total_calls=0; +$total_answered_calls=0; +$unanswered_calls=0; +$max_call_length=0; +$min_call_length=1000000; +$total_call_length=0; +$max_wait_time=0; +$min_wait_time=1000000; +$total_wait_time=0; +$total_position=0; +$max_position=0; +$min_position=1000000; +$total_distinct_users_per_date=0; +$total_agent_login_time=0; +$all_calls_array=array(); # Regardless of outcome +$calls_array=array(); # Dependent on outcome +$answered_calls_array=array(); # Dependent on outcome +$unanswered_calls_array=array(); # Dependent on outcome +$user_array=array(); +$agent_login_time_array=array(); +$sales_array=array(); +$queue_array=array(); + +$agent_call_counts=array(); +$transferred_counts=array(); +$agent_call_lengths=array(); +$queue_stats=array(); # campaign id breakdown BY ANSWERED CALLS +$term_reasons=array(); # ANSWERED CALLS ONLY +$call_directions=array(); # ANSWERED CALLS +$call_stints=array(); # ANSWERED CALLS +$agent_events=array(); # ANSWERED CALLS +$coverage="100%"; +$coverage_wi="100%"; +################# + + +$stmt="select substr(call_date, 1, 10) as cdate, campaign_id, status, user, length_in_sec as call_length, uniqueid, '0' as wait_sec, 'O' as direction, '1' as queue_position, lead_id from vicidial_log $vicidial_log_SQL $and_NANQUE_clause $exc_addtl_statuses UNION ALL select substr(call_date, 1, 10) as cdate, campaign_id, status, user, length_in_sec-queue_seconds as call_length, uniqueid, queue_seconds as wait_sec, 'I' as direction, queue_position, lead_id from vicidial_closer_log $vicidial_closer_log_SQL $and_NANQUE_clause $exc_addtl_statuses"; +if ($DB) {$HTML_output.="$stmt";} +# print $stmt."\n"; +$rslt=mysql_to_mysqli($stmt, $link); +while ($row=mysqli_fetch_array($rslt)) + { + $call_date=$row["cdate"]; + $status=$row["status"]; + $user=$row["user"]; + $lead_id=$row["lead_id"]; + $length_in_sec=$row["call_length"]; + $wait_sec=$row["wait_sec"]; + $uniqueid=$row["uniqueid"]; + $direction=$row["direction"]; + $campaign_id=$row["campaign_id"]; + $queue_position=$row["queue_position"]; + + # $total_calls++; # Doesn't factor out NANQUE + + if ($direction=="I") + { + $calls_array["$call_date"]["inbound"]++; + } + else + { + $calls_array["$call_date"]["outbound"]++; + } + + if (preg_match('/VDAD|VDCL/', $user)) # && preg_match('/^DROP$|TIMEOT|WAITTO/', $status) + { + $total_unanswered_calls++; + + $unanswered_calls_array["$call_date"]["total_length"]+=$length_in_sec; + $unanswered_calls_array["$call_date"]["total_wait"]+=$wait_sec; + + $calls_array["$call_date"]["unanswered"]++; + if ($direction=="I") + { + $unanswered_calls_array["$call_date"]["inbound"]++; + } + else + { + $unanswered_calls_array["$call_date"]["outbound"]++; + } + + # Min/max call length + if (!$unanswered_calls_array["$call_date"]["min_call_length"] || $length_in_sec<$unanswered_calls_array["$call_date"]["min_call_length"]) + { + $unanswered_calls_array["$call_date"]["min_call_length"]=$length_in_sec; + } + if (!$unanswered_calls_array["$call_date"]["max_call_length"] || $length_in_sec>$unanswered_calls_array["$call_date"]["max_call_length"]) + { + $unanswered_calls_array["$call_date"]["max_call_length"]=$length_in_sec; + } + + # Min/max wait length + if (!$unanswered_calls_array["$call_date"]["min_wait_time"] || $wait_sec<$unanswered_calls_array["$call_date"]["min_wait_time"]) + { + $unanswered_calls_array["$call_date"]["min_wait_time"]=$wait_sec; + } + if (!$unanswered_calls_array["$call_date"]["max_wait_time"] || $wait_sec>$unanswered_calls_array["$call_date"]["max_wait_time"]) + { + $unanswered_calls_array["$call_date"]["max_wait_time"]=$wait_sec; + } + + } + else + { + $total_answered_calls++; + + + # Total counts/lengths + $calls_array["$call_date"]["answered"]++; + $calls_array["$call_date"]["total_length"]+=$length_in_sec; + $calls_array["$call_date"]["total_wait"]+=$wait_sec; + + $answered_calls_array["$call_date"]["total_length"]+=$length_in_sec; + $answered_calls_array["$call_date"]["total_wait"]+=$wait_sec; + + # Min/max call length + if (!$answered_calls_array["$call_date"]["min_call_length"] || $length_in_sec<$answered_calls_array["$call_date"]["min_call_length"]) + { + $answered_calls_array["$call_date"]["min_call_length"]=$length_in_sec; + } + if (!$answered_calls_array["$call_date"]["max_call_length"] || $length_in_sec>$answered_calls_array["$call_date"]["max_call_length"]) + { + $answered_calls_array["$call_date"]["max_call_length"]=$length_in_sec; + } + + # Min/max wait length + if (!$answered_calls_array["$call_date"]["min_wait_time"] || $wait_sec<$answered_calls_array["$call_date"]["min_wait_time"]) + { + $answered_calls_array["$call_date"]["min_wait_time"]=$wait_sec; + } + if (!$answered_calls_array["$call_date"]["max_wait_time"] || $wait_sec>$answered_calls_array["$call_date"]["max_wait_time"]) + { + $answered_calls_array["$call_date"]["max_wait_time"]=$wait_sec; + } + + if ($direction=="I") + { + $inbound_calls["$call_date"]++; + $answered_calls_array["$call_date"]["inbound"]++; + $campaign_id_stmt="select campaign_id from vicidial_agent_log where lead_id='$lead_id' and user='$user' and uniqueid='$uniqueid'"; + $campaign_id_rslt=mysql_to_mysqli($campaign_id_stmt, $link); + if(mysqli_num_rows($campaign_id_rslt)>0) + { + $campaign_id_row=mysqli_fetch_array($campaign_id_rslt); + $campaign_id=$campaign_id_row["campaign_id"]; + } + } + else + { + $answered_calls_array["$call_date"]["outbound"]++; + $outbound_calls["$call_date"]++; + } + + ### These counts are in here because by definition these SHOULD be answers, but you never know with some morons. + ### "Real" campaign_id should have been gotten under the direction clause above + if (in_array($status, $sale_array["$campaign_id"]) || in_array($status, $sale_array["SYSTEM"])) + { + $calls_array["$call_date"]["sales"]++; + $total_sales++; + } + if (in_array($status, $human_ans_array["$campaign_id"]) || in_array($status, $human_ans_array["SYSTEM"])) + { + $calls_array["$call_date"]["human_answered"]++; + $total_human_answered++; + } + if (in_array($status, $contact_array["$campaign_id"]) || in_array($status, $contact_array["SYSTEM"])) + { + $calls_array["$call_date"]["customer_contacts"]++; + $total_customer_contacts++; + } + + + # User counts + if (!array_key_exists("$call_date", $user_array)) {$user_array["$call_date"]=array();} + if (!in_array($user, $user_array["$call_date"]) && !preg_match('/VDAD|VDCL/', $user)) + { + $total_distinct_users_per_date++; # Need for adherence report + array_push($user_array["$call_date"], $user); + } + + # Sale check + if (in_array($status, $sale_array["SYSTEM"]) || (array_key_exists("$campaign_id", $sale_array) && in_array($status, $sale_array["$campaign_id"]))) + { + $sales_array["$call_date"]["sales"]++; + } + + # Contact check + if (in_array($status, $contact_array["SYSTEM"]) || (array_key_exists("$campaign_id", $contact_array) && in_array($status, $contact_array["$campaign_id"]))) + { + $sales_array["$call_date"]["contacts"]++; + } + } + + # Queue array + $queue_array["$call_date"]["total_calls"]++; + $queue_array["$call_date"]["total_queue"]+=$queue_position; + $queue_array["$call_date"]["avg_position"]=($queue_array["$call_date"]["total_queue"]/$queue_array["$call_date"]["total_calls"]); + # Min/max queue + if (!$queue_array["$call_date"]["min_queue_position"] || $queue_position<$queue_array["$call_date"]["min_queue_position"]) + { + $queue_array["$call_date"]["min_queue_position"]=$queue_position; + } + if (!$queue_array["$call_date"]["max_queue_position"] || $queue_position>$queue_array["$call_date"]["max_queue_position"]) + { + $queue_array["$call_date"]["max_queue_position"]=$queue_position; + } + + } +$total_calls=$total_answered_calls+$total_unanswered_calls; + +# print_r($calls_array); die; +#### ANSWERED CALL DISTRIBUTION PER DAY ### +$HTML_output.="

"._QXZ("Answered call distribution per day").": $NWB#VERM_DAY-answered_call_distribution$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.="\n"; + +$CSV_output["answered_call_distribution"]="\""._QXZ("Day")."\",\""._QXZ("Num")."\",\"\",\""._QXZ("Answered calls")."\",\""._QXZ("Avg")."\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\""._QXZ("Avg Duration")."\"\n"; + +$max_avg_call_length=0; +foreach ($calls_array as $call_date_key => $call_date_data) # Use calls array here to iterate through all dates that have calls + { + $avg_call_length=round($answered_calls_array["$call_date_key"]["total_length"]/($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"])); + $answered_calls_array["$call_date_key"]["avg_call_length"]=$avg_call_length+0; + if ($max_avg_call_length<$avg_call_length) {$max_avg_call_length=$avg_call_length;} + } +foreach ($answered_calls_array as $call_date_key => $call_date_data) + { + $total_date_calls=($call_date_data["inbound"]+$call_date_data["outbound"]); + $total_date_calls_answered=($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]); + $total_date_calls_unanswered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + + $avg_call_length=round($answered_calls_array["$call_date_key"]["total_length"]/$total_date_calls_answered); + $avg_call_length_fmt=($avg_call_length>=3600 ? floor($avg_call_length/3600).":" : "").gmdate("i:s", $avg_call_length); + + $min_call_length_fmt=($answered_calls_array["$call_date_key"]["min_call_length"]>=3600 ? floor($answered_calls_array["$call_date_key"]["min_call_length"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["min_call_length"]); + $max_call_length_fmt=($answered_calls_array["$call_date_key"]["max_call_length"]>=3600 ? floor($answered_calls_array["$call_date_key"]["max_call_length"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["max_call_length"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["answered_call_distribution"].="\"".$call_date_key."\",\"".$total_date_calls_answered."\",\"".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %\",\"\",\"".$avg_call_length_fmt."\",\"".$min_call_length_fmt."\",\"".$max_call_length_fmt."\",\"\"\n"; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Num")."..."._QXZ("Answered calls").""._QXZ("Avg").""._QXZ("Min").""._QXZ("Max").""._QXZ("Avg Duration")."
".$call_date_key."".$total_date_calls_answered."".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %".$avg_call_length_fmt."".$min_call_length_fmt."".$max_call_length_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +# $HTML_output.="
"; +$HTML_output.="
"; +########################################### + +#### ANSWERED CALL WAIT TIME PER DAY ### +$HTML_output.="

"._QXZ("Answered call wait time per day").": $NWB#VERM_DAY-answered_call_wait_time$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.="\n"; + +$CSV_output["answered_call_wait_time"]="\""._QXZ("Day")."\",\""._QXZ("Num")."\",\"\",\""._QXZ("Answered calls")."\",\""._QXZ("Avg")."\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\""._QXZ("Avg Duration")."\"\n"; + +$max_avg_wait_time=0; +foreach ($calls_array as $call_date_key => $call_date_data) + { + $avg_wait_time=round($answered_calls_array["$call_date_key"]["total_wait"]/($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"])); + $answered_calls_array["$call_date_key"]["avg_wait_time"]=$avg_wait_time+0; + if ($max_avg_wait_time<$avg_wait_time) {$max_avg_wait_time=$avg_wait_time;} + } +foreach ($answered_calls_array as $call_date_key => $call_date_data) + { + $total_date_calls=($call_date_data["inbound"]+$call_date_data["outbound"]); + $total_date_calls_answered=($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]); + $total_date_calls_unanswered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + + $avg_wait_time=round($answered_calls_array["$call_date_key"]["total_wait"]/$total_date_calls_answered); + $avg_wait_time_fmt=($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", $avg_wait_time); + + $min_wait_time_fmt=($answered_calls_array["$call_date_key"]["min_wait_time"]>=3600 ? floor($answered_calls_array["$call_date_key"]["min_wait_time"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["min_wait_time"]); + $max_wait_time_fmt=($answered_calls_array["$call_date_key"]["max_wait_time"]>=3600 ? floor($answered_calls_array["$call_date_key"]["max_wait_time"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["max_wait_time"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["answered_call_wait_time"].="\"".$call_date_key."\",\"".$total_date_calls_answered."\",\"".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %\",\"\",\"".$avg_wait_time_fmt."\",\"".$min_wait_time_fmt."\",\"".$max_wait_time_fmt."\",\"\"\n"; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Num")."..."._QXZ("Answered calls").""._QXZ("Avg").""._QXZ("Min").""._QXZ("Max").""._QXZ("Avg Duration")."
".$call_date_key."".$total_date_calls_answered."".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %".$avg_wait_time_fmt."".$min_wait_time_fmt."".$max_wait_time_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +# $HTML_output.="
"; +$HTML_output.="
"; +########################################### + +#### UNANSWERED CALL WAIT TIME PER DAY ### +$HTML_output.="

"._QXZ("Unanswered call wait time per day").": $NWB#VERM_DAY-unanswered_call_wait_time$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.="\n"; + +$CSV_output["unanswered_call_wait_time"]="\""._QXZ("Day")."\",\""._QXZ("Num")."\",\"\",\""._QXZ("Unanswered calls")."\",\""._QXZ("Avg")."\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\""._QXZ("Avg Duration")."\"\n"; + +$max_avg_wait_time=0; +foreach ($calls_array as $call_date_key => $call_date_data) + { + $avg_wait_time=round($unanswered_calls_array["$call_date_key"]["total_wait"]/($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"])); + # print $unanswered_calls_array["$call_date_key"]["total_wait"]."/".($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"])."\n"; + $unanswered_calls_array["$call_date_key"]["avg_wait_time"]=$avg_wait_time+0; + if ($max_avg_wait_time<$avg_wait_time) {$max_avg_wait_time=$avg_wait_time;} + } +# print_r($unanswered_calls_array); die; +foreach ($unanswered_calls_array as $call_date_key => $call_date_data) + { + $total_date_calls=($call_date_data["inbound"]+$call_date_data["outbound"]); + $total_date_calls_answered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + $total_date_calls_unanswered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + + $avg_wait_time=round($unanswered_calls_array["$call_date_key"]["total_wait"]/$total_date_calls_unanswered); + $avg_wait_time_fmt=($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", $avg_wait_time); + + $min_wait_time_fmt=($unanswered_calls_array["$call_date_key"]["min_wait_time"]>=3600 ? floor($unanswered_calls_array["$call_date_key"]["min_wait_time"]/3600).":" : "").gmdate("i:s", $unanswered_calls_array["$call_date_key"]["min_wait_time"]); + $max_wait_time_fmt=($unanswered_calls_array["$call_date_key"]["max_wait_time"]>=3600 ? floor($unanswered_calls_array["$call_date_key"]["max_wait_time"]/3600).":" : "").gmdate("i:s", $unanswered_calls_array["$call_date_key"]["max_wait_time"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["unanswered_call_wait_time"].="\"".$call_date_key."\",\"".$total_date_calls_unanswered."\",\"".sprintf("%.1f", ((100*$total_date_calls_unanswered)/$total_unanswered_calls))." %\",\"\",\"".$avg_wait_time_fmt."\",\"".$min_wait_time_fmt."\",\"".$max_wait_time_fmt."\",\"\"\n"; + + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Num")."..."._QXZ("Unanswered calls").""._QXZ("Avg").""._QXZ("Min").""._QXZ("Max").""._QXZ("Avg Duration")."
".$call_date_key."".$total_date_calls_unanswered."".sprintf("%.1f", ((100*$total_date_calls_unanswered)/$total_unanswered_calls))." %".$avg_wait_time_fmt."".$min_wait_time_fmt."".$max_wait_time_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +# $HTML_output.="
"; +$HTML_output.="
"; +########################################### + +#### SALES PER DAY ### +$HTML_output.="

"._QXZ("Sales per Day").": $NWB#VERM_DAY-sales_per_day$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.="\n"; + +$CSV_output["sales_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Human ans. conv")."\",\""._QXZ("Customer cont. conv")."\",\""._QXZ("Sales")."\",\"\",\"\",\""._QXZ("Human answers")."\",\""._QXZ("Customer contacts")."\",\"\",\"\"\n"; + +#print_r($calls_array); +$max_day_sales=max(array_column($calls_array, 'sales')); +$max_day_customer_contacts=max(array_column($calls_array, 'customer_contacts')); +#print "
$max_day_sales
\n"; +foreach ($calls_array as $call_date_key => $data) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["sales_per_day"].="\"$call_date_key\",\"".sprintf("%.1f", ((100*$data["sales"])/$data["human_answered"]))." %\",\"".sprintf("%.1f", ((100*$data["sales"])/$data["customer_contacts"]))." %\",\"".($data["sales"]+0)."\",\"".sprintf("%.1f", ((100*$data["sales"])/$total_sales))." %\",\"\",\"".$data["human_answered"]."\",\"".$data["customer_contacts"]."\",\"".sprintf("%.1f", ((100*$data["customer_contacts"])/$total_customer_contacts))." %\",\"\"\n"; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Human ans. conv").""._QXZ("Customer cont. conv").""._QXZ("Sales")."  "._QXZ("Human answers").""._QXZ("Customer contacts")."  
$call_date_key".sprintf("%.1f", ((100*$data["sales"])/$data["human_answered"]))." %".sprintf("%.1f", ((100*$data["sales"])/$data["customer_contacts"]))." %".($data["sales"]+0)."".sprintf("%.1f", ((100*$data["sales"])/$total_sales))." %".$data["human_answered"]."".$data["customer_contacts"]."".sprintf("%.1f", ((100*$data["customer_contacts"])/$total_customer_contacts))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +########################################### + +#### QUEUE LENGTH PER DAY ### +$HTML_output.="

"._QXZ("Queue length per day").": $NWB#VERM_DAY-queue_length_per_day$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +### Removed 5/19/22 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +### Removed Coverage column before Steps 5/19/22 - not needed +$CSV_output["queue_length_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Avg")."\",\"...\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\"...\",\""._QXZ("Average Sum of Queue Positions Per Hour")."\"\n"; + +$max_call_position=max(array_column($queue_array, 'max_queue_position')); +$max_avg_position=max(array_column($queue_array, 'avg_position')); +foreach ($queue_array as $call_date_key => $data) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + ### $HTML_output.=""; + $HTML_output.=""; # Always seems to be 24 hours for the date - even when I ran starting at 8am. + $HTML_output.="\n"; + + $CSV_output["queue_length_per_day"].="\"$call_date_key\",\"".sprintf("%.1f", $queue_array["$call_date"]["avg_position"])."\",\"...\",\"".$queue_array["$call_date_key"]["min_queue_position"]."\",\"".$queue_array["$call_date_key"]["max_queue_position"]."\",\"...\",\"".sprintf("%.1f", $queue_array["$call_date_key"]["total_queue"]/24)."\"\n"; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Avg")."..."._QXZ("Min").""._QXZ("Max")."...Cover."._QXZ("ASQPPH")." $NWB#VERM_DAY-queue_length_per_day$NWE
$call_date_key".sprintf("%.1f", $queue_array["$call_date"]["avg_position"])."".$queue_array["$call_date_key"]["min_queue_position"]."".$queue_array["$call_date_key"]["max_queue_position"]."100% **".sprintf("%.1f", $queue_array["$call_date_key"]["total_queue"]/24)."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +### $HTML_output.="** - coverage = percent of calls with queue position. Assumed 100% if including outbound with a default position of '1' - also true for avg position

"; +########################################### + +#### SCHEDULE ADHERENCE PER DAY ### +$HTML_output.="

"._QXZ("Schedule Adherence per Day").": $NWB#VERM_DAY-schedule_adherence$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["schedule_adherence_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Agents")."\",\"\",\"\"\n"; + +foreach ($user_array as $call_date_key => $users_that_day) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["schedule_adherence_per_day"].="\"$call_date_key\",\"".count($users_that_day)."\",\"".sprintf("%.1f", (100*count($users_that_day)/$total_distinct_users_per_date))." %\",\"\"\n"; + + # print "agents for $call_date_key: ".count($users_that_day)."\n"; + + for ($i=0; $i= '" . mysqli_real_escape_string($link, $call_date_key) . " 0:00:01' and event_date <= '" . mysqli_real_escape_string($link, $call_date_key) . " 23:59:59' order by event_date;"; + $rslt=mysql_to_mysqli($stmt, $link); + while ($row=mysqli_fetch_row($rslt)) + { + if (preg_match('/LOGIN/', $row[0])) + { + $event_start_seconds = $row[1]; + } + if (preg_match('/LOGOUT/', $row[0])) + { + if ($event_start_seconds) + { + $event_stop_seconds = $row[1]; + $event_seconds = ($event_stop_seconds - $event_start_seconds); + $agent_login_time_array["$call_date_key"]+=$event_seconds; + } + } + } + } + } +#print_r($agent_login_time_array); +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Agents")."  
$call_date_key".count($users_that_day)."".sprintf("%.1f", (100*count($users_that_day)/$total_distinct_users_per_date))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +#### SERVICE LEVEL PER DAY #### +$HTML_output.="

"._QXZ("Inclusive SLA per day (inbound and outbound)").": $NWB#VERM_DAY-inclusive_SLA$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["inclusive_sla_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Answered")."\",\""._QXZ("Unanswered")."\",\""._QXZ("Num")."\""; + +for ($i=0; $i"; + $CSV_output["inclusive_sla_per_day"].=",\"".$SLA_column_names[$i]."\""; + } +$HTML_output.="\n"; + +$CSV_output["inclusive_sla_per_day"].="\n"; + +foreach ($calls_array as $call_date_key => $data) + { + $svc_lvl_stmt="select $SLA_query from vicidial_closer_log where call_date>='".$call_date_key." $start_time' and call_date<='".$call_date_key." $end_time' $and_vicidial_closer_log_SQL and (user!='VDCL')"; # and campaign_id in ($ingroup_str) and user in ('VDCL', $user_str) + if ($DB) {$HTML_output.="$svc_lvl_stmt
";} + $svc_lvl_rslt=mysql_to_mysqli($svc_lvl_stmt, $link); +# print $svc_lvl_stmt."\n"; + $svc_lvl_row=mysqli_fetch_row($svc_lvl_rslt); + + $answered_calls=$answered_calls_array["$call_date_key"]["inbound"]+0; + $answered_calls+=$answered_calls_array["$call_date_key"]["outbound"]+0; # "Inclusive" remember + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["inclusive_sla_per_day"].="\"$call_date_key\",\"".($data["answered"]+0)."\",\"".($data["unanswered"]+0)."\",\"".($data["answered"]+$data["unanswered"]+0)."\""; + + for ($f=0; $f"; + $CSV_output["inclusive_sla_per_day"].=",\"".sprintf("%.1f", ((100*$svc_lvl_row[$f])/$answered_calls))." %\""; + } + $HTML_output.="\n"; + + $CSV_output["inclusive_sla_per_day"].="\n"; + + $prev_int=$interval; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Answered").""._QXZ("Unanswered").""._QXZ("Num")."
$call_date_key".($data["answered"]+0)."".($data["unanswered"]+0)."".($data["answered"]+$data["unanswered"]+0)."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "DAY_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + + +echo $HTML_output; +?> diff --git a/agc_2-X/trunk/www/VERM/VERM_DOW_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_DOW_rpt.inc new file mode 100644 index 00000000..f61402ce --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_DOW_rpt.inc @@ -0,0 +1,964 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1623 - First build +# + +# NANQUE, not an unanswered call? +# TIMEOT, unanswered even though it was dropped into a call that was picked up +# Warm transfers count as two calls + +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +$PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); + +$vicidial_user_log_table="vicidial_user_log"; + +# if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} +# elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} + +#### CUSTOM REPORT VARIABLES #### +#if (isset($_GET["agents"])) {$agents=$_GET["agents"];} +# elseif (isset($_POST["agents"])) {$agents=$_POST["agents"];} +#if (isset($_GET["locations"])) {$locations=$_GET["locations"];} +# elseif (isset($_POST["locations"])) {$locations=$_POST["locations"];} +#if (isset($_GET["user_groups"])) {$user_groups=$_GET["user_groups"];} +# elseif (isset($_POST["user_groups"])) {$user_groups=$_POST["user_groups"];} +#if (isset($_GET["statuses"])) {$statuses=$_GET["statuses"];} +# elseif (isset($_POST["statuses"])) {$statuses=$_POST["statuses"];} +#if (isset($_GET["disconnection_causes"])) {$disconnection_causes=$_GET["disconnection_causes"];} +# elseif (isset($_POST["disconnection_causes"])) {$disconnection_causes=$_POST["disconnection_causes"];} +#if (isset($_GET["call_counts"])) {$call_counts=$_GET["call_counts"];} +# elseif (isset($_POST["call_counts"])) {$call_counts=$_POST["call_counts"];} +#if (isset($_GET["DIDs"])) {$DIDs=$_GET["DIDs"];} +# elseif (isset($_POST["DIDs"])) {$DIDs=$_POST["DIDs"];} +#if (isset($_GET["IVR_choice"])) {$IVR_choice=$_GET["IVR_choice"];} +# elseif (isset($_POST["IVR_choice"])) {$IVR_choice=$_POST["IVR_choice"];} +#if (isset($_GET["server"])) {$server=$_GET["server"];} +# elseif (isset($_POST["server"])) {$server=$_POST["server"];} +#if (isset($_GET["days_of_week"])) {$days_of_week=$_GET["days_of_week"];} +# elseif (isset($_POST["days_of_week"])) {$days_of_week=$_POST["days_of_week"];} +#if (isset($_GET["hour_of_day"])) {$hour_of_day=$_GET["hour_of_day"];} +# elseif (isset($_POST["hour_of_day"])) {$hour_of_day=$_POST["hour_of_day"];} + +/* +$start_date='2021-12-14'; +$start_time='00:00:00'; +$end_date='2021-12-20'; +$end_time='23:59:59'; +*/ + +### VARIABLES ### +$total_calls=0; +$total_answered_calls=0; +$unanswered_calls=0; +$max_call_length=0; +$min_call_length=1000000; +$total_call_length=0; +$max_wait_time=0; +$min_wait_time=1000000; +$total_wait_time=0; +$total_position=0; +$max_position=0; +$min_position=1000000; +$total_distinct_users_per_date=0; +$total_agent_login_time=0; +$all_calls_array=array(); # Regardless of outcome +$calls_array=array(); # Dependent on outcome +$answered_calls_array=array(); # Dependent on outcome +$unanswered_calls_array=array(); # Dependent on outcome +$user_array=array(); +$agent_login_time_array=array(); +$sales_array=array(); +$queue_array=array(); + +$agent_call_counts=array(); +$transferred_counts=array(); +$agent_call_lengths=array(); +$queue_stats=array(); # campaign id breakdown BY ANSWERED CALLS +$term_reasons=array(); # ANSWERED CALLS ONLY +$call_directions=array(); # ANSWERED CALLS +$call_stints=array(); # ANSWERED CALLS +$agent_events=array(); # ANSWERED CALLS +$coverage="100%"; +$coverage_wi="100%"; +################# + +# Initialize variables so inactive days of the week populate... + +for ($q=0; $q<=6; $q++) + { + $key = date('l', strtotime("Sunday +{$q} days")); + + $calls_array["$key"]["outbound"]=0; + $calls_array["$key"]["inbound"]=0; + $calls_array["$key"]["human_answered"]=0; + $calls_array["$key"]["customer_contacts"]=0; + + $unanswered_calls_array["$key"]["outbound"]=0; + $unanswered_calls_array["$key"]["inbound"]=0; + + $answered_calls_array["$key"]["outbound"]=0; + $answered_calls_array["$key"]["inbound"]=0; + + $queue_array["$key"]["total_calls"]=0; + $queue_array["$key"]["total_queue"]=0; + $queue_array["$key"]["min_queue_position"]=0; + $queue_array["$key"]["max_queue_position"]=0; + $queue_array["$key"]["avg_position"]=0; + + $user_array["$key"]=array(); + } + +$stmt="select dayname(call_date) as cdate, dayofweek(call_date) as day_no, campaign_id, status, user, length_in_sec as call_length, uniqueid, '0' as wait_sec, 'O' as direction, '1' as queue_position, lead_id from vicidial_log $vicidial_log_SQL $and_NANQUE_clause $exc_addtl_statuses UNION ALL select dayname(call_date) as cdate, dayofweek(call_date) as day_no, campaign_id, status, user, length_in_sec-queue_seconds as call_length, uniqueid, queue_seconds as wait_sec, 'I' as direction, queue_position, lead_id from vicidial_closer_log $vicidial_closer_log_SQL $and_NANQUE_clause $exc_addtl_statuses order by day_no"; +if ($DB) {$HTML_output.="$stmt";} +# print $stmt."\n"; +$rslt=mysql_to_mysqli($stmt, $link); +while ($row=mysqli_fetch_array($rslt)) + { + $call_date=$row["cdate"]; + $status=$row["status"]; + $user=$row["user"]; + $lead_id=$row["lead_id"]; + $length_in_sec=$row["call_length"]; + $wait_sec=$row["wait_sec"]; + $uniqueid=$row["uniqueid"]; + $direction=$row["direction"]; + $campaign_id=$row["campaign_id"]; + $queue_position=$row["queue_position"]; + + # $total_calls++; # Doesn't factor out NANQUE + + if ($direction=="I") + { + $calls_array["$call_date"]["inbound"]++; + } + else + { + $calls_array["$call_date"]["outbound"]++; + } + + if (preg_match('/VDAD|VDCL/', $user)) # && preg_match('/^DROP$|TIMEOT|WAITTO/', $status) + { + $total_unanswered_calls++; + + $unanswered_calls_array["$call_date"]["total_length"]+=$length_in_sec; + $unanswered_calls_array["$call_date"]["total_wait"]+=$wait_sec; + + $calls_array["$call_date"]["unanswered"]++; + if ($direction=="I") + { + $unanswered_calls_array["$call_date"]["inbound"]++; + } + else + { + $unanswered_calls_array["$call_date"]["outbound"]++; + } + + # Min/max call length + if (!$unanswered_calls_array["$call_date"]["min_call_length"] || $length_in_sec<$unanswered_calls_array["$call_date"]["min_call_length"]) + { + $unanswered_calls_array["$call_date"]["min_call_length"]=$length_in_sec; + } + if (!$unanswered_calls_array["$call_date"]["max_call_length"] || $length_in_sec>$unanswered_calls_array["$call_date"]["max_call_length"]) + { + $unanswered_calls_array["$call_date"]["max_call_length"]=$length_in_sec; + } + + # Min/max wait length + if (!$unanswered_calls_array["$call_date"]["min_wait_time"] || $wait_sec<$unanswered_calls_array["$call_date"]["min_wait_time"]) + { + $unanswered_calls_array["$call_date"]["min_wait_time"]=$wait_sec; + } + if (!$unanswered_calls_array["$call_date"]["max_wait_time"] || $wait_sec>$unanswered_calls_array["$call_date"]["max_wait_time"]) + { + $unanswered_calls_array["$call_date"]["max_wait_time"]=$wait_sec; + } + + } + else + { + $total_answered_calls++; + + + # Total counts/lengths + $calls_array["$call_date"]["answered"]++; + $calls_array["$call_date"]["total_length"]+=$length_in_sec; + $calls_array["$call_date"]["total_wait"]+=$wait_sec; + + $answered_calls_array["$call_date"]["total_length"]+=$length_in_sec; + $answered_calls_array["$call_date"]["total_wait"]+=$wait_sec; + + # Min/max call length + if (!$answered_calls_array["$call_date"]["min_call_length"] || $length_in_sec<$answered_calls_array["$call_date"]["min_call_length"]) + { + $answered_calls_array["$call_date"]["min_call_length"]=$length_in_sec; + } + if (!$answered_calls_array["$call_date"]["max_call_length"] || $length_in_sec>$answered_calls_array["$call_date"]["max_call_length"]) + { + $answered_calls_array["$call_date"]["max_call_length"]=$length_in_sec; + } + + # Min/max wait length + if (!$answered_calls_array["$call_date"]["min_wait_time"] || $wait_sec<$answered_calls_array["$call_date"]["min_wait_time"]) + { + $answered_calls_array["$call_date"]["min_wait_time"]=$wait_sec; + } + if (!$answered_calls_array["$call_date"]["max_wait_time"] || $wait_sec>$answered_calls_array["$call_date"]["max_wait_time"]) + { + $answered_calls_array["$call_date"]["max_wait_time"]=$wait_sec; + } + + if ($direction=="I") + { + $inbound_calls["$call_date"]++; + $answered_calls_array["$call_date"]["inbound"]++; + $campaign_id_stmt="select campaign_id from vicidial_agent_log where lead_id='$lead_id' and user='$user' and uniqueid='$uniqueid'"; + $campaign_id_rslt=mysql_to_mysqli($campaign_id_stmt, $link); + if(mysqli_num_rows($campaign_id_rslt)>0) + { + $campaign_id_row=mysqli_fetch_array($campaign_id_rslt); + $campaign_id=$campaign_id_row["campaign_id"]; + } + } + else + { + $answered_calls_array["$call_date"]["outbound"]++; + $outbound_calls["$call_date"]++; + } + + ### These counts are in here because by definition these SHOULD be answers, but you never know with some morons. + ### "Real" campaign_id should have been gotten under the direction clause above + if (in_array($status, $sale_array["$campaign_id"]) || in_array($status, $sale_array["SYSTEM"])) + { + $calls_array["$call_date"]["sales"]++; + $total_sales++; + } + if (in_array($status, $human_ans_array["$campaign_id"]) || in_array($status, $human_ans_array["SYSTEM"])) + { + $calls_array["$call_date"]["human_answered"]++; + $total_human_answered++; + } + if (in_array($status, $contact_array["$campaign_id"]) || in_array($status, $contact_array["SYSTEM"])) + { + $calls_array["$call_date"]["customer_contacts"]++; + $total_customer_contacts++; + } + + + # User counts + if (!array_key_exists("$call_date", $user_array)) {$user_array["$call_date"]=array();} + if (!in_array($user, $user_array["$call_date"]) && !preg_match('/VDAD|VDCL/', $user)) + { + $total_distinct_users_per_date++; # Need for adherence report + array_push($user_array["$call_date"], $user); + } + + # Sale check + if (in_array($status, $sale_array["SYSTEM"]) || (array_key_exists("$campaign_id", $sale_array) && in_array($status, $sale_array["$campaign_id"]))) + { + $sales_array["$call_date"]["sales"]++; + } + + # Contact check + if (in_array($status, $contact_array["SYSTEM"]) || (array_key_exists("$campaign_id", $contact_array) && in_array($status, $contact_array["$campaign_id"]))) + { + $sales_array["$call_date"]["contacts"]++; + } + } + + # Queue array + $queue_array["$call_date"]["total_calls"]++; + $queue_array["$call_date"]["total_queue"]+=$queue_position; + $queue_array["$call_date"]["avg_position"]=($queue_array["$call_date"]["total_queue"]/$queue_array["$call_date"]["total_calls"]); + # Min/max queue + if (!$queue_array["$call_date"]["min_queue_position"] || $queue_position<$queue_array["$call_date"]["min_queue_position"]) + { + $queue_array["$call_date"]["min_queue_position"]=$queue_position; + } + if (!$queue_array["$call_date"]["max_queue_position"] || $queue_position>$queue_array["$call_date"]["max_queue_position"]) + { + $queue_array["$call_date"]["max_queue_position"]=$queue_position; + } + + } +$total_calls=$total_answered_calls+$total_unanswered_calls; + +# print_r($user_array); die; +#### ANSWERED CALL DISTRIBUTION PER DAY OF WEEK ### +$HTML_output.="

"._QXZ("Answered call distribution per day of week").": $NWB#VERM_DOW-answered_call_distribution$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.="\n"; + +$CSV_output["answered_call_distribution"]="\""._QXZ("Day")."\",\""._QXZ("Num")."\",\"\",\""._QXZ("Answered calls")."\",\""._QXZ("Avg")."\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\""._QXZ("Avg Duration")."\"\n"; + +$answered_call_distribution_graph_labels="["; +$answered_call_distribution_graph_data1="["; +$answered_call_distribution_graph_bgcolor1="["; # SAME FOR hoverBackgroundColor +$answered_call_distribution_graph_hovborder1="["; +$answered_call_distribution_graph_data2="["; +$answered_call_distribution_graph_bgcolor2="["; # SAME FOR hoverBackgroundColor +$answered_call_distribution_graph_hovborder2="["; + +$max_avg_call_length=0; +foreach ($calls_array as $call_date_key => $call_date_data) # Use calls array here to iterate through all dates that have calls + { + $avg_call_length=round(MathZDC($answered_calls_array["$call_date_key"]["total_length"], ($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]))); + $answered_calls_array["$call_date_key"]["avg_call_length"]=$avg_call_length+0; + if ($max_avg_call_length<$avg_call_length) {$max_avg_call_length=$avg_call_length;} + } +foreach ($answered_calls_array as $call_date_key => $call_date_data) + { + $total_date_calls=($call_date_data["inbound"]+$call_date_data["outbound"]); + $total_date_calls_answered=($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]); + $total_date_calls_unanswered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + + $avg_call_length=round(MathZDC($answered_calls_array["$call_date_key"]["total_length"], $total_date_calls_answered)); + $avg_call_length_fmt=($avg_call_length>=3600 ? floor($avg_call_length/3600).":" : "").gmdate("i:s", $avg_call_length); + + $min_call_length_fmt=($answered_calls_array["$call_date_key"]["min_call_length"]>=3600 ? floor($answered_calls_array["$call_date_key"]["min_call_length"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["min_call_length"]); + $max_call_length_fmt=($answered_calls_array["$call_date_key"]["max_call_length"]>=3600 ? floor($answered_calls_array["$call_date_key"]["max_call_length"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["max_call_length"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["answered_call_distribution"].="\"".$call_date_key."\",\"".$total_date_calls_answered."\",\"".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %\",\"\",\"".$avg_call_length_fmt."\",\"".$min_call_length_fmt."\",\"".$max_call_length_fmt."\",\"\"\n"; + + $answered_call_distribution_graph_labels.="\"$call_date_key\","; + $answered_call_distribution_graph_data1.="\"$total_date_calls_answered\","; + $answered_call_distribution_graph_bgcolor1.="\"".$background_colors[0]."\","; + $answered_call_distribution_graph_hovborder1.="\"".$border_colors[0]."\","; + $answered_call_distribution_graph_data2.="\"$avg_call_length\","; + $answered_call_distribution_graph_bgcolor2.="\"".$background_colors[1]."\","; + $answered_call_distribution_graph_hovborder2.="\"".$border_colors[1]."\","; + } +$answered_call_distribution_graph_labels=preg_replace('/,$/', '', $answered_call_distribution_graph_labels)."]"; +$answered_call_distribution_graph_data1=preg_replace('/,$/', '', $answered_call_distribution_graph_data1)."]"; +$answered_call_distribution_graph_bgcolor1=preg_replace('/,$/', '', $answered_call_distribution_graph_bgcolor1)."]"; +$answered_call_distribution_graph_hovborder1=preg_replace('/,$/', '', $answered_call_distribution_graph_hovborder1)."]"; +$answered_call_distribution_graph_data2=preg_replace('/,$/', '', $answered_call_distribution_graph_data2)."]"; +$answered_call_distribution_graph_bgcolor2=preg_replace('/,$/', '', $answered_call_distribution_graph_bgcolor2)."]"; +$answered_call_distribution_graph_hovborder2=preg_replace('/,$/', '', $answered_call_distribution_graph_hovborder2)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; + +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Num")."..."._QXZ("Answered calls").""._QXZ("Avg").""._QXZ("Min").""._QXZ("Max").""._QXZ("Avg Duration")."
".$call_date_key."".$total_date_calls_answered."".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %".$avg_call_length_fmt."".$min_call_length_fmt."".$max_call_length_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +########################################### + +#### ANSWERED CALL WAIT TIME PER DAY OF WEEK ### +$HTML_output.="

"._QXZ("Answered call wait time per day of week").": $NWB#VERM_DOW-answered_call_wait_time$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.="\n"; + +$CSV_output["answered_call_wait_time"]="\""._QXZ("Day")."\",\""._QXZ("Num")."\",\"\",\""._QXZ("Answered calls")."\",\""._QXZ("Avg")."\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\""._QXZ("Avg Duration")."\"\n"; + +$answered_call_wait_time_graph_labels="["; +$answered_call_wait_time_graph_data1="["; +$answered_call_wait_time_graph_bgcolor1="["; # SAME FOR hoverBackgroundColor +$answered_call_wait_time_graph_hovborder1="["; +$answered_call_wait_time_graph_data2="["; +$answered_call_wait_time_graph_bgcolor2="["; # SAME FOR hoverBackgroundColor +$answered_call_wait_time_graph_hovborder2="["; + +$max_avg_wait_time=0; +foreach ($calls_array as $call_date_key => $call_date_data) + { + $avg_wait_time=round(MathZDC($answered_calls_array["$call_date_key"]["total_wait"], ($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]))); + $answered_calls_array["$call_date_key"]["avg_wait_time"]=$avg_wait_time+0; + if ($max_avg_wait_time<$avg_wait_time) {$max_avg_wait_time=$avg_wait_time;} + } +foreach ($answered_calls_array as $call_date_key => $call_date_data) + { + $total_date_calls=($call_date_data["inbound"]+$call_date_data["outbound"]); + $total_date_calls_answered=($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]); + $total_date_calls_unanswered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + + $avg_wait_time=round(MathZDC($answered_calls_array["$call_date_key"]["total_wait"], $total_date_calls_answered)); + $avg_wait_time_fmt=($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", $avg_wait_time); + + $min_wait_time_fmt=($answered_calls_array["$call_date_key"]["min_wait_time"]>=3600 ? floor($answered_calls_array["$call_date_key"]["min_wait_time"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["min_wait_time"]); + $max_wait_time_fmt=($answered_calls_array["$call_date_key"]["max_wait_time"]>=3600 ? floor($answered_calls_array["$call_date_key"]["max_wait_time"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["max_wait_time"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["answered_call_wait_time"].="\"".$call_date_key."\",\"".$total_date_calls_answered."\",\"".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %\",\"\",\"".$avg_wait_time_fmt."\",\"".$min_wait_time_fmt."\",\"".$max_wait_time_fmt."\",\"\"\n"; + + $answered_call_wait_time_graph_labels.="\"$call_date_key\","; + $answered_call_wait_time_graph_data1.="\"$total_date_calls_answered\","; + $answered_call_wait_time_graph_bgcolor1.="\"".$background_colors[0]."\","; + $answered_call_wait_time_graph_hovborder1.="\"".$border_colors[0]."\","; + $answered_call_wait_time_graph_data2.="\"$avg_wait_time\","; + $answered_call_wait_time_graph_bgcolor2.="\"".$background_colors[1]."\","; + $answered_call_wait_time_graph_hovborder2.="\"".$border_colors[1]."\","; + } +$answered_call_wait_time_graph_labels=preg_replace('/,$/', '', $answered_call_wait_time_graph_labels)."]"; +$answered_call_wait_time_graph_data1=preg_replace('/,$/', '', $answered_call_wait_time_graph_data1)."]"; +$answered_call_wait_time_graph_bgcolor1=preg_replace('/,$/', '', $answered_call_wait_time_graph_bgcolor1)."]"; +$answered_call_wait_time_graph_hovborder1=preg_replace('/,$/', '', $answered_call_wait_time_graph_hovborder1)."]"; +$answered_call_wait_time_graph_data2=preg_replace('/,$/', '', $answered_call_wait_time_graph_data2)."]"; +$answered_call_wait_time_graph_bgcolor2=preg_replace('/,$/', '', $answered_call_wait_time_graph_bgcolor2)."]"; +$answered_call_wait_time_graph_hovborder2=preg_replace('/,$/', '', $answered_call_wait_time_graph_hovborder2)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Num")."..."._QXZ("Answered calls").""._QXZ("Avg").""._QXZ("Min").""._QXZ("Max").""._QXZ("Avg Duration")."
".$call_date_key."".$total_date_calls_answered."".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %".$avg_wait_time_fmt."".$min_wait_time_fmt."".$max_wait_time_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +########################################### + +#### UNANSWERED CALL WAIT TIME PER DAY OF WEEK ### +$HTML_output.="

"._QXZ("Unanswered call wait time per day of week").": $NWB#VERM_DOW-unanswered_call_wait_time$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.="\n"; + +$CSV_output["unanswered_call_wait_time"]="\""._QXZ("Day")."\",\""._QXZ("Num")."\",\"\",\""._QXZ("Unanswered calls")."\",\""._QXZ("Avg")."\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\""._QXZ("Avg Duration")."\"\n"; + +$unanswered_call_wait_time_graph_labels="["; +$unanswered_call_wait_time_graph_data1="["; +$unanswered_call_wait_time_graph_bgcolor1="["; # SAME FOR hoverBackgroundColor +$unanswered_call_wait_time_graph_hovborder1="["; +$unanswered_call_wait_time_graph_data2="["; +$unanswered_call_wait_time_graph_bgcolor2="["; # SAME FOR hoverBackgroundColor +$unanswered_call_wait_time_graph_hovborder2="["; + +$max_avg_wait_time=0; +foreach ($calls_array as $call_date_key => $call_date_data) + { + $avg_wait_time=round(MathZDC($unanswered_calls_array["$call_date_key"]["total_wait"], ($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]))); + # print $unanswered_calls_array["$call_date_key"]["total_wait"]."/".($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"])."\n"; + $unanswered_calls_array["$call_date_key"]["avg_wait_time"]=$avg_wait_time+0; + if ($max_avg_wait_time<$avg_wait_time) {$max_avg_wait_time=$avg_wait_time;} + } +# print_r($unanswered_calls_array); die; +foreach ($unanswered_calls_array as $call_date_key => $call_date_data) + { + $total_date_calls=($call_date_data["inbound"]+$call_date_data["outbound"]); + $total_date_calls_answered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + $total_date_calls_unanswered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + + $avg_wait_time=round(MathZDC($unanswered_calls_array["$call_date_key"]["total_wait"], $total_date_calls_unanswered)); + $avg_wait_time_fmt=($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", $avg_wait_time); + + $min_wait_time_fmt=($unanswered_calls_array["$call_date_key"]["min_wait_time"]>=3600 ? floor($unanswered_calls_array["$call_date_key"]["min_wait_time"]/3600).":" : "").gmdate("i:s", $unanswered_calls_array["$call_date_key"]["min_wait_time"]); + $max_wait_time_fmt=($unanswered_calls_array["$call_date_key"]["max_wait_time"]>=3600 ? floor($unanswered_calls_array["$call_date_key"]["max_wait_time"]/3600).":" : "").gmdate("i:s", $unanswered_calls_array["$call_date_key"]["max_wait_time"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["unanswered_call_wait_time"].="\"".$call_date_key."\",\"".$total_date_calls_unanswered."\",\"".sprintf("%.1f", ((100*$total_date_calls_unanswered)/$total_unanswered_calls))." %\",\"\",\"".$avg_wait_time_fmt."\",\"".$min_wait_time_fmt."\",\"".$max_wait_time_fmt."\",\"\"\n"; + + $unanswered_call_wait_time_graph_labels.="\"$call_date_key\","; + $unanswered_call_wait_time_graph_data1.="\"$total_date_calls_unanswered\","; + $unanswered_call_wait_time_graph_bgcolor1.="\"".$background_colors[0]."\","; + $unanswered_call_wait_time_graph_hovborder1.="\"".$border_colors[0]."\","; + $unanswered_call_wait_time_graph_data2.="\"$avg_wait_time\","; + $unanswered_call_wait_time_graph_bgcolor2.="\"".$background_colors[1]."\","; + $unanswered_call_wait_time_graph_hovborder2.="\"".$border_colors[1]."\","; + } +$unanswered_call_wait_time_graph_labels=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_labels)."]"; +$unanswered_call_wait_time_graph_data1=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_data1)."]"; +$unanswered_call_wait_time_graph_bgcolor1=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_bgcolor1)."]"; +$unanswered_call_wait_time_graph_hovborder1=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_hovborder1)."]"; +$unanswered_call_wait_time_graph_data2=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_data2)."]"; +$unanswered_call_wait_time_graph_bgcolor2=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_bgcolor2)."]"; +$unanswered_call_wait_time_graph_hovborder2=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_hovborder2)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Num")."..."._QXZ("Unanswered calls").""._QXZ("Avg").""._QXZ("Min").""._QXZ("Max").""._QXZ("Avg Duration")."
".$call_date_key."".$total_date_calls_unanswered."".sprintf("%.1f", ((100*$total_date_calls_unanswered)/$total_unanswered_calls))." %".$avg_wait_time_fmt."".$min_wait_time_fmt."".$max_wait_time_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +########################################### + +#### SALES PER DAY OF WEEK ### +$HTML_output.="

"._QXZ("Sales per day of week").": $NWB#VERM_DOW-sales_per_DOW$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.="\n"; + +$CSV_output["sales_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Human ans. conv")."\",\""._QXZ("Customer cont. conv")."\",\""._QXZ("Sales")."\",\"\",\"\",\""._QXZ("Human answers")."\",\""._QXZ("Customer contacts")."\",\"\",\"\"\n"; + +#print_r($calls_array); +$max_day_sales=max(array_column($calls_array, 'sales')); +$max_day_customer_contacts=max(array_column($calls_array, 'customer_contacts')); +#print "
$max_day_sales
\n"; +foreach ($calls_array as $call_date_key => $data) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["sales_per_day"].="\"$call_date_key\",\"".sprintf("%.1f", MathZDC((100*$data["sales"]), $data["human_answered"]))." %\",\"".sprintf("%.1f", MathZDC((100*$data["sales"]), $data["customer_contacts"]))." %\",\"".($data["sales"]+0)."\",\"".sprintf("%.1f", MathZDC((100*$data["sales"]), $total_sales))." %\",\"\",\"".$data["human_answered"]."\",\"".$data["customer_contacts"]."\",\"".sprintf("%.1f", ((100*$data["customer_contacts"])/$total_customer_contacts))." %\",\"\"\n"; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Human ans. conv").""._QXZ("Customer cont. conv").""._QXZ("Sales")."  "._QXZ("Human answers").""._QXZ("Customer contacts")."  
$call_date_key".sprintf("%.1f", MathZDC((100*$data["sales"]), $data["human_answered"]))." %".sprintf("%.1f", MathZDC((100*$data["sales"]), $data["customer_contacts"]))." %".($data["sales"]+0)."".sprintf("%.1f", ((100*$data["sales"])/$total_sales))." %".$data["human_answered"]."".$data["customer_contacts"]."".sprintf("%.1f", ((100*$data["customer_contacts"])/$total_customer_contacts))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +########################################### + +#### QUEUE LENGTH PER DAY OF WEEK ### +$HTML_output.="

"._QXZ("Queue length per day of week").": $NWB#VERM_DOW-queue_length_per_DOW$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +### Removed 5/19/22 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +### Removed Coverage column before Steps 5/19/22 - not needed +$CSV_output["queue_length_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Avg")."\",\"...\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\"...\",\""._QXZ("Average Sum of Queue Positions Per Hour")."\"\n"; + +$max_call_position=max(array_column($queue_array, 'max_queue_position')); +$max_avg_position=max(array_column($queue_array, 'avg_position')); +foreach ($queue_array as $call_date_key => $data) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + ### $HTML_output.=""; + $HTML_output.=""; # Always seems to be 24 hours for the date - even when I ran starting at 8am. + $HTML_output.="\n"; + + $CSV_output["queue_length_per_day"].="\"$call_date_key\",\"".sprintf("%.1f", $queue_array["$call_date"]["avg_position"])."\",\"...\",\"".$queue_array["$call_date_key"]["min_queue_position"]."\",\"".$queue_array["$call_date_key"]["max_queue_position"]."\",\"...\",\"".sprintf("%.1f", $queue_array["$call_date_key"]["total_queue"]/24)."\"\n"; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Avg")."..."._QXZ("Min").""._QXZ("Max")."...Cover."._QXZ("ASQPPH")." $NWB#VERM_DAY-queue_length_per_day$NWE
$call_date_key".sprintf("%.1f", $queue_array["$call_date_key"]["avg_position"])."".$queue_array["$call_date_key"]["min_queue_position"]."".$queue_array["$call_date_key"]["max_queue_position"]."100% **".sprintf("%.1f", $queue_array["$call_date_key"]["total_queue"]/24)."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +### $HTML_output.="** - coverage = percent of calls with queue position. Assumed 100% if including outbound with a default position of '1' - also true for avg position

"; +########################################### + +#### SCHEDULE ADHERENCE PER DAY OF WEEK ### +$HTML_output.="

"._QXZ("Schedule Adherence per day of week").": $NWB#VERM_DOW-schedule_adherence$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["schedule_adherence_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Agents")."\",\"\",\"\"\n"; + +foreach ($user_array as $call_date_key => $users_that_day) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["schedule_adherence_per_day"].="\"$call_date_key\",\"".count($users_that_day)."\",\"".sprintf("%.1f", (100*count($users_that_day)/$total_distinct_users_per_date))." %\",\"\"\n"; + + # print "agents for $call_date_key: ".count($users_that_day)."\n"; + + for ($i=0; $i= '" . mysqli_real_escape_string($link, $call_date_key) . " 0:00:01' and event_date <= '" . mysqli_real_escape_string($link, $call_date_key) . " 23:59:59' order by event_date;"; + $rslt=mysql_to_mysqli($stmt, $link); + while ($row=mysqli_fetch_row($rslt)) + { + if (preg_match('/LOGIN/', $row[0])) + { + $event_start_seconds = $row[1]; + } + if (preg_match('/LOGOUT/', $row[0])) + { + if ($event_start_seconds) + { + $event_stop_seconds = $row[1]; + $event_seconds = ($event_stop_seconds - $event_start_seconds); + $agent_login_time_array["$call_date_key"]+=$event_seconds; + } + } + } + } + } +#print_r($agent_login_time_array); +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Agents")."  
$call_date_key".count($users_that_day)."".sprintf("%.1f", (100*count($users_that_day)/$total_distinct_users_per_date))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +#### SERVICE LEVEL PER DAY OF WEEK #### +$HTML_output.="

"._QXZ("Inclusive SLA per day of week (inbound and outbound)").": $NWB#VERM_DOW-inclusive_SLA$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["inclusive_sla_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Answered")."\",\""._QXZ("Unanswered")."\",\""._QXZ("Num")."\""; + +for ($i=0; $i"; + $CSV_output["inclusive_sla_per_day"].=",\"".$SLA_column_names[$i]."\""; + } +$HTML_output.="\n"; + +$CSV_output["inclusive_sla_per_day"].="\n"; + +foreach ($calls_array as $call_date_key => $data) + { + $svc_lvl_stmt="select $SLA_query from vicidial_closer_log where call_date>='$start_date $start_time' and call_date<='$end_date $end_time' and dayname(call_date)='$call_date_key' $and_vicidial_closer_log_SQL and (user!='VDCL')"; # and campaign_id in ($ingroup_str) and user in ('VDCL', $user_str) + if ($DB) {$HTML_output.="$svc_lvl_stmt";} + $svc_lvl_rslt=mysql_to_mysqli($svc_lvl_stmt, $link); + # print $svc_lvl_stmt."\n"; + $svc_lvl_row=mysqli_fetch_row($svc_lvl_rslt); + + $answered_calls=$answered_calls_array["$call_date_key"]["inbound"]+0; + $answered_calls+=$answered_calls_array["$call_date_key"]["outbound"]+0; # "Inclusive" remember + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["inclusive_sla_per_day"].="\"$call_date_key\",\"".($data["answered"]+0)."\",\"".($data["unanswered"]+0)."\",\"".($data["answered"]+$data["unanswered"]+0)."\""; + + for ($f=0; $f"; + $CSV_output["inclusive_sla_per_day"].=",\"".sprintf("%.1f", MathZDC((100*$svc_lvl_row[$f]), $answered_calls))." %\""; + } + $HTML_output.="\n"; + + $CSV_output["inclusive_sla_per_day"].="\n"; + + $prev_int=$interval; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Answered").""._QXZ("Unanswered").""._QXZ("Num")."
$call_date_key".($data["answered"]+0)."".($data["unanswered"]+0)."".($data["answered"]+$data["unanswered"]+0)."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +/* +# Traffic analysis per day +$HTML_output.="

Traffic Analysis by period - per day:

"; +$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.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +*/ + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "DAY_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + + +echo $HTML_output; +?> + + + diff --git a/agc_2-X/trunk/www/VERM/VERM_HOUR_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_HOUR_rpt.inc new file mode 100644 index 00000000..9e037391 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_HOUR_rpt.inc @@ -0,0 +1,977 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1620 - First build +# + +# NANQUE, not an unanswered call? +# TIMEOT, unanswered even though it was dropped into a call that was picked up +# Warm transfers count as two calls + +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +$PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); + +$vicidial_user_log_table="vicidial_user_log"; + +# if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} +# elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} + +#### CUSTOM REPORT VARIABLES #### +#if (isset($_GET["agents"])) {$agents=$_GET["agents"];} +# elseif (isset($_POST["agents"])) {$agents=$_POST["agents"];} +#if (isset($_GET["locations"])) {$locations=$_GET["locations"];} +# elseif (isset($_POST["locations"])) {$locations=$_POST["locations"];} +#if (isset($_GET["user_groups"])) {$user_groups=$_GET["user_groups"];} +# elseif (isset($_POST["user_groups"])) {$user_groups=$_POST["user_groups"];} +#if (isset($_GET["statuses"])) {$statuses=$_GET["statuses"];} +# elseif (isset($_POST["statuses"])) {$statuses=$_POST["statuses"];} +#if (isset($_GET["disconnection_causes"])) {$disconnection_causes=$_GET["disconnection_causes"];} +# elseif (isset($_POST["disconnection_causes"])) {$disconnection_causes=$_POST["disconnection_causes"];} +#if (isset($_GET["call_counts"])) {$call_counts=$_GET["call_counts"];} +# elseif (isset($_POST["call_counts"])) {$call_counts=$_POST["call_counts"];} +#if (isset($_GET["DIDs"])) {$DIDs=$_GET["DIDs"];} +# elseif (isset($_POST["DIDs"])) {$DIDs=$_POST["DIDs"];} +#if (isset($_GET["IVR_choice"])) {$IVR_choice=$_GET["IVR_choice"];} +# elseif (isset($_POST["IVR_choice"])) {$IVR_choice=$_POST["IVR_choice"];} +#if (isset($_GET["server"])) {$server=$_GET["server"];} +# elseif (isset($_POST["server"])) {$server=$_POST["server"];} +#if (isset($_GET["days_of_week"])) {$days_of_week=$_GET["days_of_week"];} +# elseif (isset($_POST["days_of_week"])) {$days_of_week=$_POST["days_of_week"];} +#if (isset($_GET["hour_of_day"])) {$hour_of_day=$_GET["hour_of_day"];} +# elseif (isset($_POST["hour_of_day"])) {$hour_of_day=$_POST["hour_of_day"];} + +/* None of the above are used below +if ($non_latin < 1) + { + $PHP_AUTH_USER = preg_replace('/[^-_0-9a-zA-Z]/', '', $PHP_AUTH_USER); + $PHP_AUTH_PW = preg_replace('/[^-_0-9a-zA-Z]/', '', $PHP_AUTH_PW); + $agents = preg_replace('/[^-_0-9a-zA-Z]/','',$agents); + $locations = preg_replace('/[^-_0-9a-zA-Z]/','',$locations); + $user_groups = preg_replace('/[^-_0-9a-zA-Z]/','',$user_groups); + $statuses = preg_replace('/[^-_0-9a-zA-Z]/','',$statuses); + $disconnection_causes = preg_replace('/[^\s-_0-9a-zA-Z]/','',$disconnection_causes); + } +else + { + $PHP_AUTH_USER = preg_replace('/[^-_0-9\p{L}]/u', '', $PHP_AUTH_USER); + $PHP_AUTH_PW = preg_replace('/[^-_0-9\p{L}]/u', '', $PHP_AUTH_PW); + $agents = preg_replace('/[^-_0-9\p{L}]/u','',$agents); + $locations = preg_replace('/[^-_0-9\p{L}]/u','',$locations); + $user_groups = preg_replace('/[^-_0-9\p{L}]/u','',$user_groups); + $statuses = preg_replace('/[^-_0-9\p{L}]/u','',$statuses); + $disconnection_causes = preg_replace('/[^\s-_0-9\p{L}]/u','',$disconnection_causes); + } +*/ + +if (!$hourly_slot) {$hourly_slot=30;} + +### VARIABLES ### +$total_calls=0; +$total_answered_calls=0; +$unanswered_calls=0; +$max_call_length=0; +$min_call_length=1000000; +$total_call_length=0; +$max_wait_time=0; +$min_wait_time=1000000; +$total_wait_time=0; +$total_position=0; +$max_position=0; +$min_position=1000000; +$total_distinct_users_per_date=0; +$total_agent_login_time=0; +$all_calls_array=array(); # Regardless of outcome +$calls_array=array(); # Dependent on outcome +$answered_calls_array=array(); # Dependent on outcome +$unanswered_calls_array=array(); # Dependent on outcome +$user_array=array(); +$agent_login_time_array=array(); +$sales_array=array(); +$queue_array=array(); + +$agent_call_counts=array(); +$transferred_counts=array(); +$agent_call_lengths=array(); +$queue_stats=array(); # campaign id breakdown BY ANSWERED CALLS +$term_reasons=array(); # ANSWERED CALLS ONLY +$call_directions=array(); # ANSWERED CALLS +$call_stints=array(); # ANSWERED CALLS +$agent_events=array(); # ANSWERED CALLS +$coverage="100%"; +$coverage_wi="100%"; +################# + +# Initialize variables so inactive days of the week populate... + +for ($q=0; $q<1440; $q+=$hourly_slot) + { + $key=date('H:i', mktime(0,$q)); + $calls_array["$key"]["outbound"]=0; + $calls_array["$key"]["inbound"]=0; + $calls_array["$key"]["human_answered"]=0; + $calls_array["$key"]["customer_contacts"]=0; + + $unanswered_calls_array["$key"]["outbound"]=0; + $unanswered_calls_array["$key"]["inbound"]=0; + + $answered_calls_array["$key"]["outbound"]=0; + $answered_calls_array["$key"]["inbound"]=0; + + $queue_array["$key"]["total_calls"]=0; + $queue_array["$key"]["total_queue"]=0; + $queue_array["$key"]["min_queue_position"]=0; + $queue_array["$key"]["max_queue_position"]=0; + $queue_array["$key"]["avg_position"]=0; + + $user_array["$key"]=array(); + } + +$stmt="select substr(call_date-INTERVAL (unix_timestamp(call_date)%".($hourly_slot*60).") SECOND, 12, 5) as cdate, campaign_id, status, user, length_in_sec as call_length, uniqueid, '0' as wait_sec, 'O' as direction, '1' as queue_position, lead_id from vicidial_log $vicidial_log_SQL $and_NANQUE_clause $exc_addtl_statuses UNION ALL select substr(call_date-INTERVAL (unix_timestamp(call_date)%".($hourly_slot*60).") SECOND, 12, 5) as cdate, campaign_id, status, user, length_in_sec-queue_seconds as call_length, uniqueid, queue_seconds as wait_sec, 'I' as direction, queue_position, lead_id from vicidial_closer_log $vicidial_closer_log_SQL $and_NANQUE_clause $exc_addtl_statuses order by cdate"; +# print $stmt."\n"; die; +$rslt=mysql_to_mysqli($stmt, $link); +while ($row=mysqli_fetch_array($rslt)) + { + $call_date=$row["cdate"]; + $status=$row["status"]; + $user=$row["user"]; + $lead_id=$row["lead_id"]; + $length_in_sec=$row["call_length"]; + $wait_sec=$row["wait_sec"]; + $uniqueid=$row["uniqueid"]; + $direction=$row["direction"]; + $campaign_id=$row["campaign_id"]; + $queue_position=$row["queue_position"]; + + # $total_calls++; # Doesn't factor out NANQUE + + if ($direction=="I") + { + $calls_array["$call_date"]["inbound"]++; + } + else + { + $calls_array["$call_date"]["outbound"]++; + } + + if (preg_match('/VDAD|VDCL/', $user)) # && preg_match('/^DROP$|TIMEOT|WAITTO/', $status) + { + $total_unanswered_calls++; + + $unanswered_calls_array["$call_date"]["total_length"]+=$length_in_sec; + $unanswered_calls_array["$call_date"]["total_wait"]+=$wait_sec; + + $calls_array["$call_date"]["unanswered"]++; + if ($direction=="I") + { + $unanswered_calls_array["$call_date"]["inbound"]++; + } + else + { + $unanswered_calls_array["$call_date"]["outbound"]++; + } + + # Min/max call length + if (!$unanswered_calls_array["$call_date"]["min_call_length"] || $length_in_sec<$unanswered_calls_array["$call_date"]["min_call_length"]) + { + $unanswered_calls_array["$call_date"]["min_call_length"]=$length_in_sec; + } + if (!$unanswered_calls_array["$call_date"]["max_call_length"] || $length_in_sec>$unanswered_calls_array["$call_date"]["max_call_length"]) + { + $unanswered_calls_array["$call_date"]["max_call_length"]=$length_in_sec; + } + + # Min/max wait length + if (!$unanswered_calls_array["$call_date"]["min_wait_time"] || $wait_sec<$unanswered_calls_array["$call_date"]["min_wait_time"]) + { + $unanswered_calls_array["$call_date"]["min_wait_time"]=$wait_sec; + } + if (!$unanswered_calls_array["$call_date"]["max_wait_time"] || $wait_sec>$unanswered_calls_array["$call_date"]["max_wait_time"]) + { + $unanswered_calls_array["$call_date"]["max_wait_time"]=$wait_sec; + } + + } + else + { + $total_answered_calls++; + + + # Total counts/lengths + $calls_array["$call_date"]["answered"]++; + $calls_array["$call_date"]["total_length"]+=$length_in_sec; + $calls_array["$call_date"]["total_wait"]+=$wait_sec; + + $answered_calls_array["$call_date"]["total_length"]+=$length_in_sec; + $answered_calls_array["$call_date"]["total_wait"]+=$wait_sec; + + # Min/max call length + if (!$answered_calls_array["$call_date"]["min_call_length"] || $length_in_sec<$answered_calls_array["$call_date"]["min_call_length"]) + { + $answered_calls_array["$call_date"]["min_call_length"]=$length_in_sec; + } + if (!$answered_calls_array["$call_date"]["max_call_length"] || $length_in_sec>$answered_calls_array["$call_date"]["max_call_length"]) + { + $answered_calls_array["$call_date"]["max_call_length"]=$length_in_sec; + } + + # Min/max wait length + if (!$answered_calls_array["$call_date"]["min_wait_time"] || $wait_sec<$answered_calls_array["$call_date"]["min_wait_time"]) + { + $answered_calls_array["$call_date"]["min_wait_time"]=$wait_sec; + } + if (!$answered_calls_array["$call_date"]["max_wait_time"] || $wait_sec>$answered_calls_array["$call_date"]["max_wait_time"]) + { + $answered_calls_array["$call_date"]["max_wait_time"]=$wait_sec; + } + + if ($direction=="I") + { + $inbound_calls["$call_date"]++; + $answered_calls_array["$call_date"]["inbound"]++; + $campaign_id_stmt="select campaign_id from vicidial_agent_log where lead_id='$lead_id' and user='$user' and uniqueid='$uniqueid'"; + $campaign_id_rslt=mysql_to_mysqli($campaign_id_stmt, $link); + if(mysqli_num_rows($campaign_id_rslt)>0) + { + $campaign_id_row=mysqli_fetch_array($campaign_id_rslt); + $campaign_id=$campaign_id_row["campaign_id"]; + } + } + else + { + $answered_calls_array["$call_date"]["outbound"]++; + $outbound_calls["$call_date"]++; + } + + ### These counts are in here because by definition these SHOULD be answers, but you never know with some morons. + ### "Real" campaign_id should have been gotten under the direction clause above + if (in_array($status, $sale_array["$campaign_id"]) || in_array($status, $sale_array["SYSTEM"])) + { + $calls_array["$call_date"]["sales"]++; + $total_sales++; + } + if (in_array($status, $human_ans_array["$campaign_id"]) || in_array($status, $human_ans_array["SYSTEM"])) + { + $calls_array["$call_date"]["human_answered"]++; + $total_human_answered++; + } + if (in_array($status, $contact_array["$campaign_id"]) || in_array($status, $contact_array["SYSTEM"])) + { + $calls_array["$call_date"]["customer_contacts"]++; + $total_customer_contacts++; + } + + + # User counts + if (!array_key_exists("$call_date", $user_array)) {$user_array["$call_date"]=array();} + if (!in_array($user, $user_array["$call_date"]) && !preg_match('/VDAD|VDCL/', $user)) + { + $total_distinct_users_per_date++; # Need for adherence report + array_push($user_array["$call_date"], $user); + } + + # Sale check + if (in_array($status, $sale_array["SYSTEM"]) || (array_key_exists("$campaign_id", $sale_array) && in_array($status, $sale_array["$campaign_id"]))) + { + $sales_array["$call_date"]["sales"]++; + } + + # Contact check + if (in_array($status, $contact_array["SYSTEM"]) || (array_key_exists("$campaign_id", $contact_array) && in_array($status, $contact_array["$campaign_id"]))) + { + $sales_array["$call_date"]["contacts"]++; + } + } + + # Queue array + $queue_array["$call_date"]["total_calls"]++; + $queue_array["$call_date"]["total_queue"]+=$queue_position; + $queue_array["$call_date"]["avg_position"]=($queue_array["$call_date"]["total_queue"]/$queue_array["$call_date"]["total_calls"]); + # Min/max queue + if (!$queue_array["$call_date"]["min_queue_position"] || $queue_position<$queue_array["$call_date"]["min_queue_position"]) + { + $queue_array["$call_date"]["min_queue_position"]=$queue_position; + } + if (!$queue_array["$call_date"]["max_queue_position"] || $queue_position>$queue_array["$call_date"]["max_queue_position"]) + { + $queue_array["$call_date"]["max_queue_position"]=$queue_position; + } + + } +$total_calls=$total_answered_calls+$total_unanswered_calls; + +# print_r($user_array); die; +#### ANSWERED CALL DISTRIBUTION PER HOUR ### +$HTML_output.="

"._QXZ("Answered call distribution per hour").": $NWB#VERM_HOUR-acd_per_hour$NWE

"; +$HTML_output.="
"; +$HTML_output.="
DayAvg agCalls/AgSvc LvlUnansUnans shortAvg outOut/inAvg ansAvg talkMax wait ansMax wait lostMax durMax dur outOff.Ans.Ans. outMin Ag.Max Ag.
"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["answered_call_distribution"]="\""._QXZ("Day")."\",\""._QXZ("Num")."\",\"\",\""._QXZ("Answered calls")."\",\""._QXZ("Avg")."\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\""._QXZ("Avg Duration")."\"\n"; + +$answered_call_distribution_graph_labels="["; +$answered_call_distribution_graph_data1="["; +$answered_call_distribution_graph_bgcolor1="["; # SAME FOR hoverBackgroundColor +$answered_call_distribution_graph_hovborder1="["; +$answered_call_distribution_graph_data2="["; +$answered_call_distribution_graph_bgcolor2="["; # SAME FOR hoverBackgroundColor +$answered_call_distribution_graph_hovborder2="["; + +$max_avg_call_length=0; +foreach ($calls_array as $call_date_key => $call_date_data) # Use calls array here to iterate through all dates that have calls + { + $avg_call_length=round(MathZDC($answered_calls_array["$call_date_key"]["total_length"], ($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]))); + $answered_calls_array["$call_date_key"]["avg_call_length"]=$avg_call_length+0; + if ($max_avg_call_length<$avg_call_length) {$max_avg_call_length=$avg_call_length;} + } +foreach ($answered_calls_array as $call_date_key => $call_date_data) + { + $total_date_calls=($call_date_data["inbound"]+$call_date_data["outbound"]); + $total_date_calls_answered=($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]); + $total_date_calls_unanswered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + + $avg_call_length=round(MathZDC($answered_calls_array["$call_date_key"]["total_length"], $total_date_calls_answered)); + $avg_call_length_fmt=($avg_call_length>=3600 ? floor($avg_call_length/3600).":" : "").gmdate("i:s", floor($avg_call_length)); + + $min_call_length_fmt=($answered_calls_array["$call_date_key"]["min_call_length"]>=3600 ? floor($answered_calls_array["$call_date_key"]["min_call_length"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["min_call_length"]); + $max_call_length_fmt=($answered_calls_array["$call_date_key"]["max_call_length"]>=3600 ? floor($answered_calls_array["$call_date_key"]["max_call_length"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["max_call_length"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["answered_call_distribution"].="\"".$call_date_key."\",\"".$total_date_calls_answered."\",\"".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %\",\"\",\"".$avg_call_length_fmt."\",\"".$min_call_length_fmt."\",\"".$max_call_length_fmt."\",\"\"\n"; + + $answered_call_distribution_graph_labels.="\"$call_date_key\","; + $answered_call_distribution_graph_data1.="\"$total_date_calls_answered\","; + $answered_call_distribution_graph_bgcolor1.="\"".$background_colors[0]."\","; + $answered_call_distribution_graph_hovborder1.="\"".$border_colors[0]."\","; + $answered_call_distribution_graph_data2.="\"$avg_call_length\","; + $answered_call_distribution_graph_bgcolor2.="\"".$background_colors[1]."\","; + $answered_call_distribution_graph_hovborder2.="\"".$border_colors[1]."\","; + } +$answered_call_distribution_graph_labels=preg_replace('/,$/', '', $answered_call_distribution_graph_labels)."]"; +$answered_call_distribution_graph_data1=preg_replace('/,$/', '', $answered_call_distribution_graph_data1)."]"; +$answered_call_distribution_graph_bgcolor1=preg_replace('/,$/', '', $answered_call_distribution_graph_bgcolor1)."]"; +$answered_call_distribution_graph_hovborder1=preg_replace('/,$/', '', $answered_call_distribution_graph_hovborder1)."]"; +$answered_call_distribution_graph_data2=preg_replace('/,$/', '', $answered_call_distribution_graph_data2)."]"; +$answered_call_distribution_graph_bgcolor2=preg_replace('/,$/', '', $answered_call_distribution_graph_bgcolor2)."]"; +$answered_call_distribution_graph_hovborder2=preg_replace('/,$/', '', $answered_call_distribution_graph_hovborder2)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Num")."..."._QXZ("Answered calls").""._QXZ("Avg").""._QXZ("Min").""._QXZ("Max").""._QXZ("Avg Duration")."
".$call_date_key."".$total_date_calls_answered."".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %".$avg_call_length_fmt."".$min_call_length_fmt."".$max_call_length_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +########################################### + +#### ANSWERED CALL WAIT TIME PER HOUR ### +$HTML_output.="

"._QXZ("Answered call wait time per hour").": $NWB#VERM_HOUR-answered_cw_per_hour$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.="\n"; + +$CSV_output["answered_call_wait_time"]="\""._QXZ("Day")."\",\""._QXZ("Num")."\",\"\",\""._QXZ("Answered calls")."\",\""._QXZ("Avg")."\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\""._QXZ("Avg Duration")."\"\n"; + +$answered_call_wait_time_graph_labels="["; +$answered_call_wait_time_graph_data1="["; +$answered_call_wait_time_graph_bgcolor1="["; # SAME FOR hoverBackgroundColor +$answered_call_wait_time_graph_hovborder1="["; +$answered_call_wait_time_graph_data2="["; +$answered_call_wait_time_graph_bgcolor2="["; # SAME FOR hoverBackgroundColor +$answered_call_wait_time_graph_hovborder2="["; + +$max_avg_wait_time=0; +foreach ($calls_array as $call_date_key => $call_date_data) + { + $avg_wait_time=round(MathZDC($answered_calls_array["$call_date_key"]["total_wait"], ($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]))); + $answered_calls_array["$call_date_key"]["avg_wait_time"]=$avg_wait_time+0; + if ($max_avg_wait_time<$avg_wait_time) {$max_avg_wait_time=$avg_wait_time;} + } +foreach ($answered_calls_array as $call_date_key => $call_date_data) + { + $total_date_calls=($call_date_data["inbound"]+$call_date_data["outbound"]); + $total_date_calls_answered=($answered_calls_array["$call_date_key"]["inbound"]+$answered_calls_array["$call_date_key"]["outbound"]); + $total_date_calls_unanswered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + + $avg_wait_time=round(MathZDC($answered_calls_array["$call_date_key"]["total_wait"], $total_date_calls_answered)); + $avg_wait_time_fmt=($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", floor($avg_wait_time)); + + $min_wait_time_fmt=($answered_calls_array["$call_date_key"]["min_wait_time"]>=3600 ? floor($answered_calls_array["$call_date_key"]["min_wait_time"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["min_wait_time"]); + $max_wait_time_fmt=($answered_calls_array["$call_date_key"]["max_wait_time"]>=3600 ? floor($answered_calls_array["$call_date_key"]["max_wait_time"]/3600).":" : "").gmdate("i:s", $answered_calls_array["$call_date_key"]["max_wait_time"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["answered_call_wait_time"].="\"".$call_date_key."\",\"".$total_date_calls_answered."\",\"".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %\",\"\",\"".$avg_wait_time_fmt."\",\"".$min_wait_time_fmt."\",\"".$max_wait_time_fmt."\",\"\"\n"; + + $answered_call_wait_time_graph_labels.="\"$call_date_key\","; + $answered_call_wait_time_graph_data1.="\"$total_date_calls_answered\","; + $answered_call_wait_time_graph_bgcolor1.="\"".$background_colors[0]."\","; + $answered_call_wait_time_graph_hovborder1.="\"".$border_colors[0]."\","; + $answered_call_wait_time_graph_data2.="\"$avg_wait_time\","; + $answered_call_wait_time_graph_bgcolor2.="\"".$background_colors[1]."\","; + $answered_call_wait_time_graph_hovborder2.="\"".$border_colors[1]."\","; + } +$answered_call_wait_time_graph_labels=preg_replace('/,$/', '', $answered_call_wait_time_graph_labels)."]"; +$answered_call_wait_time_graph_data1=preg_replace('/,$/', '', $answered_call_wait_time_graph_data1)."]"; +$answered_call_wait_time_graph_bgcolor1=preg_replace('/,$/', '', $answered_call_wait_time_graph_bgcolor1)."]"; +$answered_call_wait_time_graph_hovborder1=preg_replace('/,$/', '', $answered_call_wait_time_graph_hovborder1)."]"; +$answered_call_wait_time_graph_data2=preg_replace('/,$/', '', $answered_call_wait_time_graph_data2)."]"; +$answered_call_wait_time_graph_bgcolor2=preg_replace('/,$/', '', $answered_call_wait_time_graph_bgcolor2)."]"; +$answered_call_wait_time_graph_hovborder2=preg_replace('/,$/', '', $answered_call_wait_time_graph_hovborder2)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Num")."..."._QXZ("Answered calls").""._QXZ("Avg").""._QXZ("Min").""._QXZ("Max").""._QXZ("Avg Duration")."
".$call_date_key."".$total_date_calls_answered."".sprintf("%.1f", ((100*$total_date_calls_answered)/$total_answered_calls))." %".$avg_wait_time_fmt."".$min_wait_time_fmt."".$max_wait_time_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +########################################### + +#### UNANSWERED CALL WAIT TIME PER HOUR ### +$HTML_output.="

"._QXZ("Unanswered call wait time per hour").": $NWB#VERM_HOUR-unanswered_cw_per_hour$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.="\n"; + +$CSV_output["unanswered_call_wait_time"]="\""._QXZ("Day")."\",\""._QXZ("Num")."\",\"\",\""._QXZ("Unanswered calls")."\",\""._QXZ("Avg")."\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\""._QXZ("Avg Duration")."\"\n"; + +$unanswered_call_wait_time_graph_labels="["; +$unanswered_call_wait_time_graph_data1="["; +$unanswered_call_wait_time_graph_bgcolor1="["; # SAME FOR hoverBackgroundColor +$unanswered_call_wait_time_graph_hovborder1="["; +$unanswered_call_wait_time_graph_data2="["; +$unanswered_call_wait_time_graph_bgcolor2="["; # SAME FOR hoverBackgroundColor +$unanswered_call_wait_time_graph_hovborder2="["; + +$max_avg_wait_time=0; +foreach ($calls_array as $call_date_key => $call_date_data) + { + $avg_wait_time=round(MathZDC($unanswered_calls_array["$call_date_key"]["total_wait"], ($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]))); + # print $unanswered_calls_array["$call_date_key"]["total_wait"]."/".($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"])."\n"; + $unanswered_calls_array["$call_date_key"]["avg_wait_time"]=$avg_wait_time+0; + if ($max_avg_wait_time<$avg_wait_time) {$max_avg_wait_time=$avg_wait_time;} + } +# print_r($unanswered_calls_array); die; +foreach ($unanswered_calls_array as $call_date_key => $call_date_data) + { + $total_date_calls=($call_date_data["inbound"]+$call_date_data["outbound"]); + $total_date_calls_answered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + $total_date_calls_unanswered=($unanswered_calls_array["$call_date_key"]["inbound"]+$unanswered_calls_array["$call_date_key"]["outbound"]); + + $avg_wait_time=round(MathZDC($unanswered_calls_array["$call_date_key"]["total_wait"], $total_date_calls_unanswered)); + $avg_wait_time_fmt=($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", floor($avg_wait_time)); + + $min_wait_time_fmt=($unanswered_calls_array["$call_date_key"]["min_wait_time"]>=3600 ? floor($unanswered_calls_array["$call_date_key"]["min_wait_time"]/3600).":" : "").gmdate("i:s", $unanswered_calls_array["$call_date_key"]["min_wait_time"]); + $max_wait_time_fmt=($unanswered_calls_array["$call_date_key"]["max_wait_time"]>=3600 ? floor($unanswered_calls_array["$call_date_key"]["max_wait_time"]/3600).":" : "").gmdate("i:s", $unanswered_calls_array["$call_date_key"]["max_wait_time"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["unanswered_call_wait_time"].="\"".$call_date_key."\",\"".$total_date_calls_unanswered."\",\"".sprintf("%.1f", MathZDC((100*$total_date_calls_unanswered), $total_unanswered_calls))." %\",\"\",\"".$avg_wait_time_fmt."\",\"".$min_wait_time_fmt."\",\"".$max_wait_time_fmt."\",\"\"\n"; + + $unanswered_call_wait_time_graph_labels.="\"$call_date_key\","; + $unanswered_call_wait_time_graph_data1.="\"$total_date_calls_unanswered\","; + $unanswered_call_wait_time_graph_bgcolor1.="\"".$background_colors[0]."\","; + $unanswered_call_wait_time_graph_hovborder1.="\"".$border_colors[0]."\","; + $unanswered_call_wait_time_graph_data2.="\"$avg_wait_time\","; + $unanswered_call_wait_time_graph_bgcolor2.="\"".$background_colors[1]."\","; + $unanswered_call_wait_time_graph_hovborder2.="\"".$border_colors[1]."\","; + } +$unanswered_call_wait_time_graph_labels=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_labels)."]"; +$unanswered_call_wait_time_graph_data1=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_data1)."]"; +$unanswered_call_wait_time_graph_bgcolor1=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_bgcolor1)."]"; +$unanswered_call_wait_time_graph_hovborder1=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_hovborder1)."]"; +$unanswered_call_wait_time_graph_data2=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_data2)."]"; +$unanswered_call_wait_time_graph_bgcolor2=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_bgcolor2)."]"; +$unanswered_call_wait_time_graph_hovborder2=preg_replace('/,$/', '', $unanswered_call_wait_time_graph_hovborder2)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Num")."..."._QXZ("Unanswered calls").""._QXZ("Avg").""._QXZ("Min").""._QXZ("Max").""._QXZ("Avg Duration")."
".$call_date_key."".$total_date_calls_unanswered."".sprintf("%.1f", MathZDC((100*$total_date_calls_unanswered), $total_unanswered_calls))." %".$avg_wait_time_fmt."".$min_wait_time_fmt."".$max_wait_time_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +########################################### + +#### SALES PER HOUR ### +$HTML_output.="

"._QXZ("Sales per hour").": $NWB#VERM_HOUR-sales_per_hour$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.="\n"; + +$CSV_output["sales_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Human ans. conv")."\",\""._QXZ("Customer cont. conv")."\",\""._QXZ("Sales")."\",\"\",\"\",\""._QXZ("Human answers")."\",\""._QXZ("Customer contacts")."\",\"\",\"\"\n"; + +#print_r($calls_array); +$max_day_sales=max(array_column($calls_array, 'sales')); +$max_day_customer_contacts=max(array_column($calls_array, 'customer_contacts')); +#print "
$max_day_sales
\n"; +foreach ($calls_array as $call_date_key => $data) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["sales_per_day"].="\"$call_date_key\",\"".sprintf("%.1f", MathZDC((100*$data["sales"]), $data["human_answered"]))." %\",\"".sprintf("%.1f", MathZDC((100*$data["sales"]), $data["customer_contacts"]))." %\",\"".($data["sales"]+0)."\",\"".sprintf("%.1f", MathZDC((100*$data["sales"]), $total_sales))." %\",\"\",\"".$data["human_answered"]."\",\"".$data["customer_contacts"]."\",\"".sprintf("%.1f", MathZDC((100*$data["customer_contacts"]), $total_customer_contacts))." %\",\"\"\n"; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Human ans. conv").""._QXZ("Customer cont. conv").""._QXZ("Sales")."  "._QXZ("Human answers").""._QXZ("Customer contacts")."  
$call_date_key".sprintf("%.1f", MathZDC((100*$data["sales"]), $data["human_answered"]))." %".sprintf("%.1f", MathZDC((100*$data["sales"]), $data["customer_contacts"]))." %".($data["sales"]+0)."".sprintf("%.1f", MathZDC((100*$data["sales"]), $total_sales))." %".$data["human_answered"]."".$data["customer_contacts"]."".sprintf("%.1f", MathZDC((100*$data["customer_contacts"]), $total_customer_contacts))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +########################################### + +#### QUEUE LENGTH PER HOUR ### +$HTML_output.="

"._QXZ("Queue length per hour").": $NWB#VERM_HOUR-queue_length_per_hour$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +### Removed 5/19/22 +### $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +### Removed Coverage column before Steps 5/19/22 - not needed +$CSV_output["queue_length_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Avg")."\",\"...\",\""._QXZ("Min")."\",\""._QXZ("Max")."\",\"...\",\""._QXZ("Average Sum of Queue Positions Per Hour")."\"\n"; + +$max_call_position=max(array_column($queue_array, 'max_queue_position')); +$max_avg_position=max(array_column($queue_array, 'avg_position')); +foreach ($queue_array as $call_date_key => $data) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + ### $HTML_output.=""; + $HTML_output.=""; # Always seems to be 24 hours for the date - even when I ran starting at 8am. + $HTML_output.="\n"; + + $CSV_output["queue_length_per_day"].="\"$call_date_key\",\"".sprintf("%.1f", $queue_array["$call_date"]["avg_position"])."\",\"...\",\"".$queue_array["$call_date_key"]["min_queue_position"]."\",\"".$queue_array["$call_date_key"]["max_queue_position"]."\",\"...\",\"".sprintf("%.1f", $queue_array["$call_date_key"]["total_queue"]/24)."\"\n"; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Avg")."..."._QXZ("Min").""._QXZ("Max")."...Cover."._QXZ("ASQPPH")." $NWB#VERM_DAY-queue_length_per_day$NWE
$call_date_key".sprintf("%.1f", $queue_array["$call_date_key"]["avg_position"])."".$queue_array["$call_date_key"]["min_queue_position"]."".$queue_array["$call_date_key"]["max_queue_position"]."100% **".sprintf("%.1f", $queue_array["$call_date_key"]["total_queue"]/24)."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +### $HTML_output.="** - coverage = percent of calls with queue position. Assumed 100% if including outbound with a default position of '1' - also true for avg position

"; +########################################### + +#### SCHEDULE ADHERENCE PER HOUR ### +$HTML_output.="

"._QXZ("Schedule Adherence per hour").": $NWB#VERM_HOUR-schedule_adherence$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["schedule_adherence_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Agents")."\",\"\",\"\"\n"; + +foreach ($user_array as $call_date_key => $users_that_day) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["schedule_adherence_per_day"].="\"$call_date_key\",\"".count($users_that_day)."\",\"".sprintf("%.1f", (100*count($users_that_day)/$total_distinct_users_per_date))." %\",\"\"\n"; + + # print "agents for $call_date_key: ".count($users_that_day)."\n"; + + for ($i=0; $i= '" . mysqli_real_escape_string($link, $call_date_key) . " 0:00:01' and event_date <= '" . mysqli_real_escape_string($link, $call_date_key) . " 23:59:59' order by event_date;"; + $rslt=mysql_to_mysqli($stmt, $link); + while ($row=mysqli_fetch_row($rslt)) + { + if (preg_match('/LOGIN/', $row[0])) + { + $event_start_seconds = $row[1]; + } + if (preg_match('/LOGOUT/', $row[0])) + { + if ($event_start_seconds) + { + $event_stop_seconds = $row[1]; + $event_seconds = ($event_stop_seconds - $event_start_seconds); + $agent_login_time_array["$call_date_key"]+=$event_seconds; + } + } + } + } + } +#print_r($agent_login_time_array); +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Agents")."  
$call_date_key".count($users_that_day)."".sprintf("%.1f", (100*count($users_that_day)/$total_distinct_users_per_date))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +#### SERVICE LEVEL PER HOUR #### +$HTML_output.="

"._QXZ("Inclusive SLA per hour (inbound and outbound)").": $NWB#VERM_HOUR-inclusive_SLA$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["inclusive_sla_per_day"]="\""._QXZ("Day")."\",\""._QXZ("Answered")."\",\""._QXZ("Unanswered")."\",\""._QXZ("Num")."\""; + +for ($i=0; $i"; + $CSV_output["inclusive_sla_per_day"].=",\"".$SLA_column_names[$i]."\""; + } +$HTML_output.="\n"; + +$CSV_output["inclusive_sla_per_day"].="\n"; + +foreach ($calls_array as $call_date_key => $data) + { + $svc_lvl_stmt="select $SLA_query from vicidial_closer_log where call_date>='$start_date $start_time' and call_date<='$end_date $end_time' and substr(call_date-INTERVAL (unix_timestamp(call_date)%".($hourly_slot*60).") SECOND, 12, 5)='$call_date_key' $and_vicidial_closer_log_SQL and (user!='VDCL')"; # and campaign_id in ($ingroup_str) and user in ('VDCL', $user_str) + if ($DB) {$HTML_output.="$svc_lvl_stmt";} + $svc_lvl_rslt=mysql_to_mysqli($svc_lvl_stmt, $link); + # print $svc_lvl_stmt."\n"; + $svc_lvl_row=mysqli_fetch_row($svc_lvl_rslt); + + $answered_calls=$answered_calls_array["$call_date_key"]["inbound"]+0; + $answered_calls+=$answered_calls_array["$call_date_key"]["outbound"]+0; # "Inclusive" remember + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["inclusive_sla_per_day"].="\"$call_date_key\",\"".($data["answered"]+0)."\",\"".($data["unanswered"]+0)."\",\"".($data["answered"]+$data["unanswered"]+0)."\""; + + for ($f=0; $f"; + $CSV_output["inclusive_sla_per_day"].=",\"".sprintf("%.1f", MathZDC((100*$svc_lvl_row[$f]), $answered_calls))." %\""; + } + $HTML_output.="\n"; + + $CSV_output["inclusive_sla_per_day"].="\n"; + + $prev_int=$interval; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Day").""._QXZ("Answered").""._QXZ("Unanswered").""._QXZ("Num")."
$call_date_key".($data["answered"]+0)."".($data["unanswered"]+0)."".($data["answered"]+$data["unanswered"]+0)."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +/* +# Traffic analysis per day +$HTML_output.="

Traffic Analysis by period - per day:

"; +$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.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +*/ + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "DAY_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + + +echo $HTML_output; +?> + diff --git a/agc_2-X/trunk/www/VERM/VERM_IVR_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_IVR_rpt.inc new file mode 100644 index 00000000..9423a5c5 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_IVR_rpt.inc @@ -0,0 +1,729 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1619 - First build +# + +if (isset($_GET["page_no"])) {$page_no=$_GET["page_no"];} + elseif (isset($_POST["page_no"])) {$page_no=$_POST["page_no"];} +if (isset($_GET["sort_ivr_details"])) {$sort_ivr_details=$_GET["sort_ivr_details"];} + elseif (isset($_POST["sort_ivr_details"])) {$sort_ivr_details=$_POST["sort_ivr_details"];} + +if ($non_latin < 1) + { + $sort_ivr_details = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_ivr_details); + } +else + { + $sort_ivr_details = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_ivr_details); + } +$page_no=preg_replace('/[^0-9]/', '', $page_no); +if (!$page_no || $page_no<1) {$page_no=1;} + +$ll=($page_no-1)*20; +$ul=($page_no*20); +$sort_clause=" order by call_date"; +$sort_index=preg_replace('/ desc/', '', $sort_ivr_details); +if (preg_match('/ desc$/', $sort_ivr_details)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_ivr_details); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_ivr_details." desc"; + } +$sort_ivr_details_preg=preg_replace('/ desc$/', '', $sort_ivr_details); + +$ivr_data=array(); +$ivr_data_totals=array(); +$path_data=array(); +$ivr_details=array(); + +# For IVR details we can't use the comment_d clause as it kicks out records that should be in there +$stmt="select distinct uniqueid, comment_a from live_inbound_log $live_inbound_log_SQL order by uniqueid asc"; +if ($DB) {$HTML_output.="$stmt";} +$rslt=mysql_to_mysqli($stmt, $link); +$i=0; +while ($row=mysqli_fetch_row($rslt)) + { + $uniqueid=$row[0]; + $comment_a=$row[1]; + $total_call_flow=""; + $prompt_stmt="select start_time, comment_d, phone_ext from live_inbound_log where uniqueid='$uniqueid' and comment_a='$comment_a' order by start_time, comment_d asc"; + # print "$prompt_stmt\n"; + $prompt_rslt=mysql_to_mysqli($prompt_stmt, $link); + + $current_call_total_time=0; + $prev_start_time=""; + $uid_is_valid=0; + while ($prompt_row=mysqli_fetch_array($prompt_rslt)) + { + $current_prompt=$prompt_row["comment_d"]; + + if (preg_match("/$ivr_choice/i", $current_prompt)) # from search results + {$uid_is_valid=1;} + + $current_start_time=$prompt_row["start_time"]; + # if (mysqli_num_rows($prompt_rslt)==1) {$prev_start_time=$current_start_time;} # Need this in case only one record is returned + if (!$prev_start_time) {$prev_start_time=$current_start_time;} + + $array_key=preg_replace('/\>[^,]+,/', ',', $total_call_flow); + $current_interval=strtotime("$current_start_time")-strtotime("$prev_start_time"); + $total_call_flow.="$current_prompt,"; + $array_key.="$current_prompt"; + $current_call_total_time+=$current_interval; + + if ($i>=$ll && $i<$ul || $download_rpt) + { + $current_call_total_time_fmt=($current_call_total_time>=3600 ? intval(floor($current_call_total_time/3600)).date(":i:s", $current_call_total_time) : intval(date("i", $current_call_total_time)).":".date("s", $current_call_total_time)); + + $ivr_details["$uniqueid"]["date"]=$prev_start_time; + $ivr_details["$uniqueid"]["caller"]=$prompt_row["phone_ext"]; + $ivr_details["$uniqueid"]["ivr"]=$current_call_total_time_fmt; + $ivr_details["$uniqueid"]["ivr_path"]=$array_key; + $ivr_details["$uniqueid"]["did"]=GetDID($uniqueid); + $ivr_details["$uniqueid"]["goal"]=""; + $ivr_details["$uniqueid"]["closecallid"]=""; + + GetGoal($uniqueid); + } + + $prev_prompt=$prompt_row["comment_d"]; + $prev_start_time=$prompt_row["start_time"]; + } + + # Does uid contain IVR choice? + if ($uid_is_valid) + { + $i++; + } + else + { + unset($ivr_details["$uniqueid"]); + } + } +$ivr_records=$i; +$total_pages=ceil($i/20); + +$stmt="select distinct uniqueid, comment_a from live_inbound_log $live_inbound_log_SQL and comment_d like '%>%' order by uniqueid asc"; +if ($DB) {$HTML_output.="$stmt";} +$rslt=mysql_to_mysqli($stmt, $link); +while ($row=mysqli_fetch_row($rslt)) + { + $uniqueid=$row[0]; + $comment_a=$row[1]; + $total_call_flow=""; + $current_call_total_time=0; + $prompt_stmt="select start_time, comment_d, phone_ext from live_inbound_log where uniqueid='$uniqueid' and comment_a='$comment_a' order by start_time, comment_d asc"; + $prompt_rslt=mysql_to_mysqli($prompt_stmt, $link); + + while ($prompt_row=mysqli_fetch_array($prompt_rslt)) + { + $current_prompt=$prompt_row["comment_d"]; + $current_start_time=$prompt_row["start_time"]; + if (preg_match('/\>/', $current_prompt)) + { + $array_key=preg_replace('/\>[^,]+,/', ',', $total_call_flow); + $total_call_flow.="$current_prompt,"; + $array_key.="$current_prompt"; + $current_interval=strtotime("$current_start_time")-strtotime("$prev_start_time"); + $current_call_total_time+=$current_interval; + $ivr_data["$array_key"]["calls"]++; + $hangup_array=GetHangups($uniqueid); + $ivr_data["$array_key"]["hangups"]+=$hangup_array[0]; + if ($hangup_array[0]==0) + { + $ivr_data["$array_key"]["goals"]++; + $ivr_data["$array_key"]["goal_time"]+=$hangup_array[1]; + } + else + { + $ivr_data["$array_key"]["goals"]+=0; + $ivr_data["$array_key"]["goal_time"]+=0; + } + $ivr_data["$array_key"]["time"]+=$current_interval; + + #$ivr_details["$uniqueid"]["date"]=$prev_start_time; + #$ivr_details["$uniqueid"]["caller"]=$prompt_row["phone_ext"]; + #$ivr_details["$uniqueid"]["ivr"]=$current_interval; + #$ivr_details["$uniqueid"]["ivr_path"]=$array_key; + #$ivr_details["$uniqueid"]["did"]=GetDID($uniqueid); + #$ivr_details["$uniqueid"]["goal"]=""; + + if (!$ivr_data["$array_key"]["minimum_time"]) {$ivr_data["$array_key"]["minimum_time"]=86400;} + if (!$ivr_data["$array_key"]["maximum_time"]) {$ivr_data["$array_key"]["maximum_time"]=0;} + if ($ivr_data["$array_key"]["minimum_time"]>$current_interval) {$ivr_data["$array_key"]["minimum_time"]=$current_interval;} + if ($ivr_data["$array_key"]["maximum_time"]<$current_interval) {$ivr_data["$array_key"]["maximum_time"]=$current_interval;} + + GetCallPath($uniqueid, $comment_a); # , $array_key, $current_interval + } + $prev_prompt=$prompt_row["comment_d"]; + $prev_start_time=$prompt_row["start_time"]; + } + + } + +ksort($ivr_data); +ksort($path_data); + +$HTML_output.="

"._QXZ("IVR Traversal").": $NWB#VERM_IVR-ivr_traversal$NWE

"; +$HTML_output.="
"; +$HTML_output.="
DayAvg agCalls/AgSvc LvlUnansUnans shortAvg outOut/inAvg ansAvg talkMax wait ansMax wait lostMax durMax dur outOff.Ans.Ans. outMin Ag.Max Ag.
\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["ivr_traversal"]="\""._QXZ("IVR path")."\",\""._QXZ("N. Calls")."\",\""._QXZ("IVR goal report")."\",\""._QXZ("Success rate")."\",\""._QXZ("Hangups")."\",\""._QXZ("Attrition rate")."\"\n"; + +$prev_ivr_key=""; +$IVR_prompt_header=array(); +$IVR_prompt_subrows=""; +foreach ($ivr_data as $ivr_path => $data) + { + if (preg_match("/$ivr_choice/i", $ivr_path)) # from search results + { + $ivr_path_array=explode(">", $ivr_path); + $ivr_path_base=$ivr_path_array[0]."-TOTAL"; + $ivr_prompt=$ivr_path_array[1]; + + $ivr_data["$ivr_path_base"]["calls"]+=$data["calls"]; + $ivr_data["$ivr_path_base"]["hangups"]+=$data["hangups"]; + $ivr_data["$ivr_path_base"]["time"]+=$data["time"]; + $ivr_data["$ivr_path_base"]["goals"]+=$data["goals"]; + $ivr_data["$ivr_path_base"]["goal_time"]+=$data["goal_time"]; + if (!$ivr_data["$ivr_path_base"]["minimum_time"]) {$ivr_data["$ivr_path_base"]["minimum_time"]=86400;} + if (!$ivr_data["$ivr_path_base"]["maximum_time"]) {$ivr_data["$ivr_path_base"]["maximum_time"]=0;} + if ($ivr_data["$ivr_path_base"]["minimum_time"]>$ivr_data["$ivr_path"]["minimum_time"]) {$ivr_data["$ivr_path_base"]["minimum_time"]=$ivr_data["$ivr_path"]["minimum_time"];} + if ($ivr_data["$ivr_path_base"]["maximum_time"]<$ivr_data["$ivr_path"]["maximum_time"]) {$ivr_data["$ivr_path_base"]["maximum_time"]=$ivr_data["$ivr_path"]["maximum_time"];} + + /* + if ($prev_ivr_key!=$ivr_path_base) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $IVR_prompt_header=array(); + } + + $prev_ivr_key=$ivr_path_base; + */ + } + } + +ksort($ivr_data); # Again, so we have totals + +# print_r($ivr_data); + +foreach ($ivr_data as $ivr_path => $data) + { + if(preg_match("/$ivr_choice/i", $ivr_path)) # from search results + { + if(preg_match('/\-TOTAL$/', $ivr_path)) + { + $ivr_value=""; + $ivr_base=preg_replace('/\-TOTAL$/', '', $ivr_path); + $ivr_array=explode(",", $ivr_base); + for($i=0; $i "; + } + # $ivr_value=$ivr_base." - ".$callmenu_names["$ivr_base"]; + # $CSV_ivr_value=$ivr_base." - ".$callmenu_names["$ivr_base"]; + $ivr_value=preg_replace('/ \=\> $/', "", $ivr_value); + $CSV_ivr_value=$ivr_value; + } + else + { + $ivr_value=preg_replace("/^$ivr_base\>/", " # ", $ivr_path); + $CSV_ivr_value=preg_replace("/^$ivr_base\>/", " # ", $ivr_path); + } + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["ivr_traversal"].="\"".$CSV_ivr_value."\",\"".$data["calls"]."\",\"".($data["calls"]-$data["hangups"])."\",\"".sprintf("%.1f", (100*($data["calls"]-$data["hangups"])/$data["calls"]))." %\",\"".$data["hangups"]."\",\"".sprintf("%.1f", (100*$data["hangups"]/$data["calls"]))." %\"\n"; + + if(preg_match('/\-TOTAL$/', $ivr_path)) {unset($ivr_data["$ivr_path"]);} # Remove total, don't need anymore + } + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("IVR path").""._QXZ("N. calls").""._QXZ("IVR goal report").""._QXZ("Success rate").""._QXZ("Hangups").""._QXZ("Attrition rate")."
".$callmenu_names["$ivr_prompt"]."".$IVR_prompt_header["$ivr_prompt"]["calls"]."IVR goal reportSuccess rateHangupsAttrition rate
".$ivr_value."".$data["calls"]."".$data["goals"]."".sprintf("%.1f", (100*($data["calls"]-$data["hangups"])/$data["calls"]))." %".$data["hangups"]."".sprintf("%.1f", (100*$data["hangups"]/$data["calls"]))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
\n"; + +# print $HTML_output; die; +# print_r($ivr_data); die; + +# IVR traversal & timing output + +$HTML_output.="

"._QXZ("IVR Timing").": $NWB#VERM_IVR-ivr_timing$NWE

"; +$HTML_output.="
"; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["ivr_timing"]="\""._QXZ("IVR path")."\",\""._QXZ("N. Calls")."\",\""._QXZ("Average time")."\",\""._QXZ("Total time")."\",\""._QXZ("Minimum time")."\",\""._QXZ("Maximum time")."\"\n"; + +foreach ($ivr_data as $comment_d => $data) + { + if (preg_match("/$ivr_choice/i", $comment_d)) # from search results + { + + $base_path=preg_replace('/\>.+$/', '', $comment_d); + $selection=preg_replace('/^[^\>]+\>/', '', $comment_d); + if(!$prev_base_path) {$prev_base_path=$base_path;} + if (!$total_minimum_time) {$total_minimum_time=86400;} + if (!$total_maximum_time) {$total_maximum_time=0;} + + if ($prev_base_path!=$base_path) + { + # Calculate totals for base path + $total_success_rate=sprintf("%.1f", (100*(($total_prompt_calls-$total_prompt_hangups)/$total_prompt_calls))); + $total_hangup_rate=sprintf("%.1f", (100*($total_prompt_hangups/$total_prompt_calls))); + $total_average_sec=round($total_prompt_time/$total_prompt_calls); + $base_average_time=($total_average_sec>=3600 ? intval(floor($total_average_sec/3600)).date(":i:s", $total_average_sec) : intval(date("i", $total_average_sec)).":".date("s", $total_average_sec)); + $base_total_time=($total_prompt_time>=3600 ? intval(floor($total_prompt_time/3600)).date(":i:s", $total_prompt_time) : intval(date("i", $total_prompt_time)).":".date("s", $total_prompt_time)); + $base_minimum_time=($total_minimum_time>=3600 ? intval(floor($total_minimum_time/3600)).date(":i:s", $total_minimum_time) : intval(date("i", $total_minimum_time)).":".date("s", $total_minimum_time)); + $base_maximum_time=($total_maximum_time>=3600 ? intval(floor($total_maximum_time/3600)).date(":i:s", $total_maximum_time) : intval(date("i", $total_maximum_time)).":".date("s", $total_maximum_time)); + + $base_path_array=explode(",", $prev_base_path); + for ($i=0; $i ", $base_path_array); + + #$traversal_header="$base_path_output -> $total_prompt_calls, ".($total_prompt_calls-$total_prompt_hangups).", $total_success_rate %, $total_prompt_hangups, $total_hangup_rate %\n"; + #$traversal_output.=$traversal_header.$traversal_outputs."\n"; + + # $time_header="$base_path_output -> $total_prompt_calls, $base_average_time, $base_total_time, $base_minimum_time, $base_maximum_time \n"; + # $CSV_time_output.=$time_header.$CSV_time_outputs."\n"; + + $HTML_subheader=""; + $HTML_output.=$HTML_subheader.$HTML_datarows; + $HTML_datarows=""; + + $CSV_header="\"$base_path_output\",\"$total_prompt_calls\",\"$base_average_time\",\"$base_total_time\",\"$base_minimum_time\",\"$base_maximum_time\"\n"; + $CSV_output["ivr_timing"].=$CSV_header.$CSV_row_output; + $CSV_row_output=""; + + + # Reset data + $traversal_outputs=""; + $CSV_time_outputs=""; + $total_prompt_calls=0; + $total_prompt_hangups=0; + $total_prompt_time=0; + $total_minimum_time=86400; + $total_maximum_time=0; + } + + $average_sec=round($data["time"]/$data["calls"]); + $average_time=($average_sec>=3600 ? intval(floor($average_sec/3600)).date(":i:s", $average_sec) : intval(date("i", $average_sec)).":".date("s", $average_sec)); + $total_time=($data["time"]>=3600 ? intval(floor($data["time"]/3600)).date(":i:s", $data["time"]) : intval(date("i", $data["time"])).":".date("s", $data["time"])); + $minimum_time=($data["minimum_time"]>=3600 ? intval(floor($data["minimum_time"]/3600)).date(":i:s", $data["minimum_time"]) : intval(date("i", $data["minimum_time"])).":".date("s", $data["minimum_time"])); + $maximum_time=($data["maximum_time"]>=3600 ? intval(floor($data["maximum_time"]/3600)).date(":i:s", $data["maximum_time"]) : intval(date("i", $data["maximum_time"])).":".date("s", $data["maximum_time"])); + + $success_rate=sprintf("%.1f", (100*(($data["calls"]-$data["hangups"])/$data["calls"]))); + $hangup_rate=sprintf("%.1f", (100*($data["hangups"]/$data["calls"]))); + #$traversal_outputs.=" - $selection -> ".$data["calls"].", ".($data["calls"]-$data["hangups"]).", $success_rate %, ".$data["hangups"].", $hangup_rate % \n"; + #$CSV_time_outputs.=" - $selection -> ".$data["calls"].", $average_time, $total_time, $minimum_time, $maximum_time\n"; + $HTML_datarows.="\n"; + $CSV_row_output.="\" # $selection\",\"".$data["calls"]."\",\"$average_time\",\"$total_time\",\"$minimum_time\",\"$maximum_time\"\n"; + $total_prompt_calls+=$data["calls"]; + $total_prompt_hangups+=$data["hangups"]; + $total_prompt_time+=$data["time"]; + + if ($total_minimum_time>$data["minimum_time"]) {$total_minimum_time=$data["minimum_time"];} + if ($total_maximum_time<$data["maximum_time"]) {$total_maximum_time=$data["maximum_time"];} + + $prev_base_path=$base_path; + } + } + +$total_average_sec=round($total_prompt_time/$total_prompt_calls); +$base_average_time=($total_average_sec>=3600 ? intval(floor($total_average_sec/3600)).date(":i:s", $total_average_sec) : intval(date("i", $total_average_sec)).":".date("s", $total_average_sec)); +$base_total_time=($total_prompt_time>=3600 ? intval(floor($total_prompt_time/3600)).date(":i:s", $total_prompt_time) : intval(date("i", $total_prompt_time)).":".date("s", $total_prompt_time)); +$base_minimum_time=($total_minimum_time>=3600 ? intval(floor($total_minimum_time/3600)).date(":i:s", $total_minimum_time) : intval(date("i", $total_minimum_time)).":".date("s", $total_minimum_time)); +$base_maximum_time=($total_maximum_time>=3600 ? intval(floor($total_maximum_time/3600)).date(":i:s", $total_maximum_time) : intval(date("i", $total_maximum_time)).":".date("s", $total_maximum_time)); + +#$traversal_header="$prev_base_path -> $total_prompt_calls, ".($total_prompt_calls-$total_prompt_hangups).", $total_success_rate %, $total_prompt_hangups, $total_hangup_rate %\n"; +#$traversal_output.=$traversal_header.$traversal_outputs; + +# $time_header="$prev_base_path -> $total_prompt_calls, $base_average_time, $base_total_time, $base_minimum_time, $base_maximum_time \n"; +# $CSV_time_output.=$time_header.$CSV_time_outputs."\n"; + +$HTML_subheader="\n"; +$HTML_output.=$HTML_subheader.$HTML_datarows; +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("IVR path").""._QXZ("N. calls").""._QXZ("Average time").""._QXZ("Total time").""._QXZ("Minimum time").""._QXZ("Maximum time")."
$base_path_output$total_prompt_calls$base_average_time$base_total_time$base_minimum_time$base_maximum_time
 #  $selection".$data["calls"]."$average_time$total_time$minimum_time$maximum_time
$prev_base_path - $callmenu_names[$prev_base_path]$total_prompt_calls$base_average_time$base_total_time$base_minimum_time$base_maximum_time
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
\n"; + +$CSV_header="\"$prev_base_path - $callmenu_names[$prev_base_path]\",\"$total_prompt_calls\",\"$base_average_time\",\"$base_total_time\",\"$base_minimum_time\",\"$base_maximum_time\"\n"; +$CSV_output["ivr_timing"].=$CSV_header.$CSV_row_output; + +# print $CSV_time_output; + +# print $CSV_output["ivr_timing"]; die; + +# print $HTML_output; + +# IVR goal output + +$HTML_output.="

"._QXZ("IVR Goals").": $NWB#VERM_IVR-ivr_goals$NWE

"; +$HTML_output.="
"; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["ivr_goal"]="\""._QXZ("Goal")."\",\""._QXZ("IVR path")."\",\""._QXZ("Selection")."\",\""._QXZ("N. calls")."\",\""._QXZ("Average time")."\",\""._QXZ("Minimum time")."\",\""._QXZ("Maximum time")."\"\n"; + +foreach ($path_data as $goal => $path) + { + ksort($path); + foreach ($path as $key => $data) + { + if (preg_match("/$ivr_choice/i", $key)) # from search results + { + $key_array=explode(">", $key); + + $final_key_path=""; + $ivr_array=explode(",", $key_array[0]); + for($i=0; $i "; + } + $final_key_path=preg_replace('/ \=\> $/', "", $final_key_path); + $CSV_final_key_path=$final_key_path; + + $average_sec=round($data["time"]/$data["calls"]); + $average_time=($average_sec>=3600 ? intval(floor($average_sec/3600)).date(":i:s", $average_sec) : intval(date("i", $average_sec)).":".date("s", $average_sec)); + $minimum_time=($data["minimum_time"]>=3600 ? intval(floor($data["minimum_time"]/3600)).date(":i:s", $data["minimum_time"]) : intval(date("i", $data["minimum_time"])).":".date("s", $data["minimum_time"])); + $maximum_time=($data["maximum_time"]>=3600 ? intval(floor($data["maximum_time"]/3600)).date(":i:s", $data["maximum_time"]) : intval(date("i", $data["maximum_time"])).":".date("s", $data["maximum_time"])); + + $HTML_output.=""; + $HTML_output.=""; +# $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["ivr_goal"].="\"Campaign/ingroup: ".$ingroup_names["$goal"]."\","; +# $CSV_output["ivr_goal"].="\"".$key_array[0]." - ".$callmenu_names["$key_array[0]"]."\","; + $CSV_output["ivr_goal"].="\"".$CSV_final_key_path."\","; + $CSV_output["ivr_goal"].="\"".$key_array[1]."\","; + $CSV_output["ivr_goal"].="\"".$data["calls"]."\","; + $CSV_output["ivr_goal"].="\"".$average_time."\","; + $CSV_output["ivr_goal"].="\"".$minimum_time."\","; + $CSV_output["ivr_goal"].="\"".$maximum_time."\""; + $CSV_output["ivr_goal"].="\n"; + } + } + } + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Goal").""._QXZ("IVR path").""._QXZ("Selection").""._QXZ("N. calls").""._QXZ("Average time").""._QXZ("Minimum time").""._QXZ("Maximum time")."
Campaign/ingroup: ".$ingroup_names["$goal"]."".$key_array[0]." - ".$callmenu_names["$key_array[0]"]."".$final_key_path."".$key_array[1]."".$data["calls"]."".$average_time."".$minimum_time."".$maximum_time."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +############################# + +$HTML_output.="

"._QXZ("IVR Details").": $NWB#VERM_IVR-ivr_details$NWE

"; +$HTML_output.="
"; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$ivr_details_columns=array( +_QXZ("Date") => "date", +_QXZ("Caller") => "caller", +_QXZ("IVR") => "ivr", +_QXZ("IVR Path") => "ivr_path", +_QXZ("DID") => "did", +_QXZ("Goal") => "goal", +); + +$CSV_output["ivr_details"]=""; +$HTML_output.=""; +foreach ($ivr_details_columns as $display_name => $column_name) + { + if ($display_name!="uniqueid") + { + $CSV_output["ivr_details"].="\"$display_name\","; + # $HTML_output.=""; + + $HTML_output.="\n"; + } + } +$CSV_output["ivr_details"].="\n"; +$HTML_output.="\n"; + +if ($sort_index) + { + foreach ($ivr_details as $sorting_array) { + $sort_array_holder[] = $sorting_array["$sort_index"]; + } + if (preg_match('/ desc$/', $sort_ivr_details)) + { + array_multisort($sort_array_holder,SORT_DESC, SORT_STRING,$ivr_details); + } + else + { + array_multisort($sort_array_holder,SORT_ASC, SORT_STRING,$ivr_details); + } + } + +foreach ($ivr_details as $uniqueid => $data_row) + { + $detail_id=$uniqueid; + + if (preg_match("/$ivr_choice/i", $data_row["ivr_path"])) # from search results + { + + $HTML_output.=""; + foreach ($data_row as $key => $value) + { + if ($key=="closecallid") + { + $detail_id.="|$value"; + } + else + { + if ($key=="date") + { + $myDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $value); + $value = $myDateTime->format('m/d - H:i:s'); + } + if ($key=="goal") + { + $value=$ingroup_names["$value"]; + } + + if ($key=="ivr_path") + { + $final_key_path=""; + $ivr_path_array=explode(">", $value); + $ivr_array=explode(",", $ivr_path_array[0]); + for($i=0; $i "; + } + $final_key_path=preg_replace('/ \=\> $/', "", $final_key_path)." > ".$ivr_path_array[1]; + $value=$final_key_path; + } + + + $HTML_output.=""; + $CSV_output["ivr_details"].="\"".$value."\","; + } + } + $HTML_output.=""; + + $CSV_output["ivr_details"].="\n"; + + $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.="
".$display_name.($column_name==$sort_ivr_details_preg ? " $sort_char" : "")." 
".$value."
|<    <<"; +$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 ($ivr_survey_ingroups_detail && count($ivr_survey_ingroups_detail)>0) + { + require("VERM_IVR_survey_details.inc"); + } +else + { + # $HTML_output.="

NOPE

"; + } + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "IVR_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + + +echo $HTML_output; +?> + +0) + { + $time_row=mysqli_fetch_row($time_rslt); + $total_call_time=$time_row[0]; + + $path_data["$vcl_row[0]"]["$array_key"]["time"]+=$total_call_time; + + if (!$path_data["$vcl_row[0]"]["$array_key"]["minimum_time"]) {$path_data["$vcl_row[0]"]["$array_key"]["minimum_time"]=86400;} + if (!$path_data["$vcl_row[0]"]["$array_key"]["maximum_time"]) {$path_data["$vcl_row[0]"]["$array_key"]["maximum_time"]=0;} + + if ($path_data["$vcl_row[0]"]["$array_key"]["minimum_time"]>$total_call_time) {$path_data["$vcl_row[0]"]["$array_key"]["minimum_time"]=$total_call_time;} + if ($path_data["$vcl_row[0]"]["$array_key"]["maximum_time"]<$total_call_time) {$path_data["$vcl_row[0]"]["$array_key"]["maximum_time"]=$total_call_time;} + } + } + } + +function GetDID($uniqueid) + { + global $link, $DB, $did_id_info, $did_pattern_info; + + $did_str=""; + + $did_stmt="select extension, did_id from vicidial_did_log where uniqueid in ('$uniqueid')"; + $did_rslt=mysqli_query($link, $did_stmt); + $did_row=mysqli_fetch_array($did_rslt); + $did_str=$did_row["extension"]." - ".$did_id_info["$did_row[did_id]"]; + + return $did_str; + } + +?> diff --git a/agc_2-X/trunk/www/VERM/VERM_IVR_survey_details.inc b/agc_2-X/trunk/www/VERM/VERM_IVR_survey_details.inc new file mode 100644 index 00000000..fe27b529 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_IVR_survey_details.inc @@ -0,0 +1,150 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1618 - First build +# + +# $DB=1; +foreach ($ivr_survey_ingroups_detail as $comment_a => $callmenu_list) + { + + $ingrp_stmt="select group_name from vicidial_inbound_groups where group_id='$comment_a' UNION select menu_name from vicidial_call_menu where menu_id='$comment_a'"; + echo "\n"; + if ($DB){$HTML_output.="$ingrp_stmt
";} + $ingrp_rslt=mysql_to_mysqli($ingrp_stmt, $link); + while($ingrp_row=mysqli_fetch_row($ingrp_rslt)) + { + $survey_name=$ingrp_row[0]; + } + + $comment_a_clause=" and comment_a='$comment_a' "; + $ivr_stmt="select distinct uniqueid from live_inbound_log $live_inbound_log_SQL $comment_a_clause order by uniqueid asc"; + if ($DB){$HTML_output.="$ivr_stmt
";} + $ivr_rslt=mysql_to_mysqli($ivr_stmt, $link); + if (mysqli_num_rows($ivr_rslt)>0) + { + + $HTML_output.="

"._QXZ("IVR Details for survey")." $survey_name: $NWB#VERM_IVR-ivr_survey_details$NWE

"; + $HTML_output.="
"; + $HTML_output.="\n"; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + for ($t=0; $t"; + } + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + while ($ivr_row=mysqli_fetch_row($ivr_rslt)) + { + $did_found=0; + $svy_uniqueid=$ivr_row[0]; + $svy_goal=$ivr_details["$svy_uniqueid"]["goal"]; + + $vcl_stmt="select user, phone_number, closecallid, xfercallid, call_date, lead_id from vicidial_closer_log where uniqueid='$svy_uniqueid' order by call_date desc limit 1"; + $vcl_rslt=mysql_to_mysqli($vcl_stmt, $link); + while($vcl_row=mysqli_fetch_array($vcl_rslt)) + { + $agent_who_handled=$fullname_info["$vcl_row[user]"]; + $caller=$vcl_row["phone_number"]; + $date=$vcl_row["call_date"]; + $vicidial_id=$vcl_row["closecallid"]; + $xfercallid=$vcl_row["xfercallid"]; + $closer_lead_id=$vcl_row["lead_id"]; + + $rec_stmt="select filename, location from recording_log where vicidial_id='$vicidial_id'"; + $rec_rslt=mysql_to_mysqli($rec_stmt, $link); + $rec_row=mysqli_fetch_row($rec_rslt); + $rec_link="$rec_row[0]"; + } + + $failsafe=0; + $did_pattern=""; + $did_uniqueid=$svy_uniqueid; + while(!$did_found) + { + $did_stmt="select call_date, did_id, extension, caller_id_number from vicidial_did_log where uniqueid='$did_uniqueid' order by call_date asc limit 1"; + if ($DB){$HTML_output.="$did_stmt
";} + $did_rslt=mysql_to_mysqli($did_stmt, $link); + if (mysqli_num_rows($did_rslt)>0) + { + $did_row=mysqli_fetch_row($did_rslt); + $did_id=$did_row[1]; + $did_pattern_stmt="select did_pattern from vicidial_inbound_dids where did_id='$did_id'"; + $did_pattern_rslt=mysql_to_mysqli($did_pattern_stmt, $link); + $did_found=1; + $did_pattern_row=mysqli_fetch_row($did_pattern_rslt); + $did_pattern=$did_pattern_row[0]; + } + + $failsafe++; + if ($failsafe>=5) {$did_found=1;} + } + + + $lil_stmt="select group_concat(comment_b) as survey_path from live_inbound_log where uniqueid='$svy_uniqueid' $comment_a_clause order by start_time"; + if ($DB){$HTML_output.="$lil_stmt
";} + $lil_rslt=mysql_to_mysqli($lil_stmt, $link); + $lil_row=mysqli_fetch_row($lil_rslt); + $lil_array=explode(",", $lil_row[0]); + $full_path=$lil_row[0]; + + $survey_array=array(); + for ($i=0; $i"; + } + + if ($ivr_survey_ingroups_voicemails) + { + $voicemail="No"; + foreach($ivr_survey_ingroups_voicemails as $callmenu => $prompt) + { + $vm_prompt="$callmenu,$prompt"; + if (preg_match("/$vm_prompt/", $full_path)) + { + $voicemail="Yes"; + } + } + } + else + { + $voicemail="N/A"; + } + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + } + + $HTML_output.="
"._QXZ("Date").""._QXZ("Caller").""._QXZ("DID").""._QXZ("Survey voicemail").""._QXZ("Agent who handled call prior to survey").""._QXZ("Link to call recording prior to survey")."
".$voicemail."$agent_who_handled$rec_link
"; + } + } +?> diff --git a/agc_2-X/trunk/www/VERM/VERM_OUTCOMES_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_OUTCOMES_rpt.inc new file mode 100644 index 00000000..4e138792 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_OUTCOMES_rpt.inc @@ -0,0 +1,921 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1617 - First build +# + +# NANQUE, not an unanswered call? +# TIMEOT, unanswered even though it was dropped into a call that was picked up +# Warm transfers count as two calls + +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +$PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); + +# if (isset($_GET["SUBMIT"])) {$SUBMIT=$_GET["SUBMIT"];} +# elseif (isset($_POST["SUBMIT"])) {$SUBMIT=$_POST["SUBMIT"];} +if (isset($_GET["sort_call_results"])) {$sort_call_results=$_GET["sort_call_results"];} + elseif (isset($_POST["sort_call_results"])) {$sort_call_results=$_POST["sort_call_results"];} +if (isset($_GET["sort_billable_activities"])) {$sort_billable_activities=$_GET["sort_billable_activities"];} + elseif (isset($_POST["sort_billable_activities"])) {$sort_billable_activities=$_POST["sort_billable_activities"];} +if (isset($_GET["sort_nonbillable_activities"])) {$sort_nonbillable_activities=$_GET["sort_nonbillable_activities"];} + elseif (isset($_POST["sort_nonbillable_activities"])) {$sort_nonbillable_activities=$_POST["sort_nonbillable_activities"];} +if (isset($_GET["sort_outcomes_per_agent"])) {$sort_outcomes_per_agent=$_GET["sort_outcomes_per_agent"];} + elseif (isset($_POST["sort_outcomes_per_agent"])) {$sort_outcomes_per_agent=$_POST["sort_outcomes_per_agent"];} + +if ($non_latin < 1) + { + $sort_call_results = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_call_results); + $sort_billable_activities = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_billable_activities); + $sort_nonbillable_activities = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_nonbillable_activities); + $sort_outcomes_per_agent = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_outcomes_per_agent); + } +else + { + $sort_call_results = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_call_results); + $sort_billable_activities = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_billable_activities); + $sort_nonbillable_activities = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_nonbillable_activities); + $sort_outcomes_per_agent = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_outcomes_per_agent); + } + +### FUNCTION +function LookUpCall($uniqueid, $comments) + { + global $link, $DB; + + $call_outcome=""; + + if ($comments=="INBOUND") + { + $table_name="vicidial_closer_log"; + } + else + { + $table_name="vicidial_log"; + } + + $vl_stmt="select status from ".$table_name." where uniqueid='$uniqueid'"; + $vl_rslt=mysqli_query($link, $vl_stmt); + if (mysqli_num_rows($vl_rslt)>0) + { + $vl_row=mysqli_fetch_row($vl_rslt); + $call_outcome=$vl_row[0]; + } + return $call_outcome; + } + + +if (preg_match('/ desc$/', $sort_agent_pause_detail)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_agent_pause_detail); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_agent_pause_detail." desc"; + } +$sort_agent_pause_detail_preg=preg_replace('/ desc$/', '', $sort_agent_pause_detail); +if ($DB) {$HTML_output.="$vcl_uniqueid_stmt
$included_campaigns_ct
";} +# COVERS AGENT ANSWERED CALLS ONLY - NEED SEPARATE SECTION FOR NON-ANSWERS!!!! +# 1/23/2022- added status!='' call, meaning calls with no dispos don't get displayed +# Had to add this otherwise the counts go screwy + +$outcomes_stmt_outb=""; +if ($atomic_queue_campaigns_str!="") + { + $outcomes_stmt_outb="select *, if (sub_status in ('BLANK', '') or sub_status is null, '-', sub_status) as pause_code from vicidial_agent_log $vicidial_agent_log_SQL and status!='' and comments!='INBOUND' "; + } + +$outcomes_stmt_inb=""; +if ($atomic_queue_ingroups_str!="" && count($val_uniqueid_array)>0) + { + $outcomes_stmt_inb="select *, if (sub_status in ('BLANK', '') or sub_status is null, '-', sub_status) as pause_code from vicidial_agent_log $vicidial_agent_log_UID_SQL and uniqueid in ('".implode("', '", $val_uniqueid_array)."')"; + } + +$outcomes_stmt=$outcomes_stmt_outb.($outcomes_stmt_outb!="" && $outcomes_stmt_inb!="" ? " UNION " : "").$outcomes_stmt_inb; + +/* +if (count($val_uniqueid_array)>0 && $atomic_queue_campaigns_str=="") // No OUTBOUND campaigns in queue, INBOUND ONLY. Need to account for this! + { + $outcomes_stmt.=" UNION select *, if (sub_status in ('BLANK', '') or sub_status is null, '-', sub_status) as pause_code from vicidial_agent_log $vicidial_agent_log_UID_SQL and uniqueid in ('".implode("', '", $val_uniqueid_array)."')"; + } +*/ + +# $HTML_output.="\n\n\n\n"; + +if ($DB) {$HTML_output.="Statuses:$outcomes_stmt
";} + +$outcomes_rslt=mysql_to_mysqli($outcomes_stmt, $link); +$outcomes_array=array(); +$call_results_array=array(); +$call_types_array=array(); +$billable_activities_array=array(); +$nonbillable_activities_array=array(); +$agent_details_array=array(); +$outcomes_per_agent_array=array(); +$call_results_total_calls=0; +while ($outcomes_row=mysqli_fetch_array($outcomes_rslt)) + { + $lead_id=$outcomes_row["lead_id"]; + $campaign_id=$outcomes_row["campaign_id"]; + $status=$outcomes_row["status"]; + $user=$outcomes_row["user"]; + $pause_code=$outcomes_row["pause_code"]; + $pause_sec=$outcomes_row["pause_sec"]; + $talk_sec=$outcomes_row["talk_sec"]; + $wait_sec=$outcomes_row["wait_sec"]; + $dispo_sec=$outcomes_row["dispo_sec"]; + $uniqueid=$outcomes_row["uniqueid"]; + $comments=$outcomes_row["comments"]; + $call_type="Unknown"; + $pause_name_key=$campaign_id."-".$pause_code; + $pause_code_name=$pause_code; + + $full_name=$fullname_info["$user"]; + if (!$agent_details_array["$full_name"]) + { + $agent_details_array["$full_name"]["available"]=0; + $agent_details_array["$full_name"]["billable"]=0; + $agent_details_array["$full_name"]["nonbillable"]=0; + $agent_details_array["$full_name"]["sales"]=0; + $agent_details_array["$full_name"]["human_answered"]=0; + $agent_details_array["$full_name"]["customer_contacts"]=0; + } + + + $outcomes_array["total_billable_time"]+=($talk_sec+$wait_sec+$dispo_sec); + $outcomes_array["total_agent_available_time"]+=($talk_sec+$wait_sec+$dispo_sec); + + $agent_details_array["$full_name"]["available"]+=($talk_sec+$wait_sec+$dispo_sec); + + # Billable/nonbillable activity + if (in_array($pause_code, $billable_pause_codes["$campaign_id"]) || in_array($pause_code, $billable_pause_codes["SYSTEM"])) + { + if ($pause_code_names["$pause_name_key"]) + { + $pause_code_name=$pause_code_names["$pause_name_key"]; + } + + $outcomes_array["total_billable_time"]+=$pause_sec; + $outcomes_array["total_agent_billable_activities"]+=$pause_sec; + + if (!$billable_activities_array["$pause_code_name"]) + { + $billable_activities_array["$pause_code_name"]["n_times"]=0; + $billable_activities_array["$pause_code_name"]["total_time"]=0; + $billable_activities_array["$pause_code_name"]["max"]=0; + $billable_activities_array["$pause_code_name"]["min"]=100000; + } + $billable_activities_array["$pause_code_name"]["n_times"]++; + $billable_activities_array["$pause_code_name"]["total_time"]+=$pause_sec; + if ($billable_activities_array["$pause_code_name"]["max"]<$pause_sec) {$billable_activities_array["$pause_code_name"]["max"]=$pause_sec;} + if ($billable_activities_array["$pause_code_name"]["min"]>$pause_sec) {$billable_activities_array["$pause_code_name"]["min"]=$pause_sec;} + + $agent_details_array["$full_name"]["billable"]+=$pause_sec; + } + else + { + if ($pause_code_names["$pause_name_key"]) + { + $pause_code_name=$pause_code_names["$pause_name_key"]; + } + + $outcomes_array["total_nonbillable_time"]+=$pause_sec; + + if (!$nonbillable_activities_array["$pause_code_name"]) + { + $nonbillable_activities_array["$pause_code_name"]["n_times"]=0; + $nonbillable_activities_array["$pause_code_name"]["total_time"]=0; + $nonbillable_activities_array["$pause_code_name"]["max"]=0; + $nonbillable_activities_array["$pause_code_name"]["min"]=100000; + } + + $nonbillable_activities_array["$pause_code_name"]["n_times"]++; + $nonbillable_activities_array["$pause_code_name"]["total_time"]+=$pause_sec; + if ($nonbillable_activities_array["$pause_code_name"]["max"]<$pause_sec) {$nonbillable_activities_array["$pause_code_name"]["max"]=$pause_sec;} + if ($nonbillable_activities_array["$pause_code_name"]["min"]>$pause_sec) {$nonbillable_activities_array["$pause_code_name"]["min"]=$pause_sec;} + + $agent_details_array["$full_name"]["nonbillable"]+=$pause_sec; + } + + $call_outcome=$status; + + if (strlen($call_outcome)<=1) + { + $call_type="None"; + $status=LookUpCall($uniqueid, $comments); + # print "$status=LookUpCall($uniqueid, $comments);
\n"; + $call_outcome=$status; + } + + + if ($status_names["$status"]) + { + $call_outcome=$status_names["$status"]; + + $call_type="Known"; + } + else + { + $call_outcome.=" (unknown)"; + } + + if (strlen($call_outcome)<=1) + { + $call_type="None"; + } + + # Human answered (contact) + if (in_array($status, $human_ans_array["$campaign_id"]) || in_array($status, $human_ans_array["SYSTEM"])) + { + $outcomes_array["human_answered"]++; + + $agent_details_array["$full_name"]["human_answered"]++; + + $call_type="Human answered"; + } + + # Customer contact (qualified contact) + if (in_array($status, $contact_array["$campaign_id"]) || in_array($status, $contact_array["SYSTEM"])) + { + $outcomes_array["customer_contacts"]++; + + $agent_details_array["$full_name"]["customer_contacts"]++; + + $call_type="Customer contact"; + } + + # Sales + if (in_array($status, $sale_array["$campaign_id"]) || in_array($status, $sale_array["SYSTEM"])) + { + $outcomes_array["sales"]++; + + $agent_details_array["$full_name"]["sales"]++; + + $call_type="Sale"; + } + + if (!$call_types_array["$call_outcome"]) {$call_types_array["$call_outcome"]=$call_type;} + + # Only count results if this is an agent log record with a lead id, i.e. an actual call + if (strlen($lead_id)>0) + { + $call_results_array["$call_outcome"]["total"]++; + $call_results_total_calls++; + + if (in_array($status, $lost_statuses_array)) + { + $call_results_array["$call_outcome"]["lost"]++; + $call_results_array["$call_outcome"]["taken"]+=0; + } + else + { + $call_results_array["$call_outcome"]["lost"]+=0; + $call_results_array["$call_outcome"]["taken"]++; + } + $call_results_array["$call_outcome"]["call_type"]=$call_type; + + # $outcomes_per_agent_array["$full_name"]["$call_type"]["$call_outcome"]["$status"]++; # + + $opa_key="$full_name|$call_type|$call_outcome|$status"; + $outcomes_per_agent_array["$opa_key"]++; + + # $outcomes_per_agent_array_agents["$full_name"]++; # + # $outcomes_per_agent_array_types["$call_type"]++; # + # $outcomes_per_agent_array_outcomes["$call_outcome"]++; # + # $outcomes_per_agent_array_statuses["$full_name"]++; # + } + } + +# print "\n\n\n\n"; +# print_r($call_results_array); die; + +# Get LOST calls here for $call_results_array values - query for VDAD and VDCL +/* COMMENTED OUT 2/17 - DOES NOTHING (missing "nousers" variables) AND ERRORS ANYWAY +$lost_stmt="select status, campaign_id, user from vicidial_log $vicidial_log_SQL_nousers and user='VDAD' $and_NANQUE_clause UNION ALL select status, campaign_id, user from vicidial_closer_log $vicidial_closer_log_SQL_nousers and user='VDCL' $and_NANQUE_clause"; +if ($DB) {$HTML_output.="Lost: $lost_stmt";} +$lost_rslt=mysql_to_mysqli($lost_stmt, $link); +while ($lost_row=mysqli_fetch_row($lost_rslt)) + { + $status=$lost_row[0]; + $campaign_id=$lost_row[1]; + # print "$status - $campaign_id
\n"; + + $call_outcome=$status; + if ($status_names["$status"]) + { + $call_outcome=$status_names["$status"]; + } + else + { + $call_outcome=$status_names["$status"]." (unknown)"; +# print "$status not in all statuses...
\n"; + } + + switch ($status) + { + case $status_names["$status"]: + $call_type="Known"; + break; + case (strlen($call_outcome)<=1): + $call_type="None"; + break; + case (in_array($status, $human_ans_array["$campaign_id"]) || in_array($status, $human_ans_array["SYSTEM"])): + $call_type="Human answered"; + break; + case (in_array($status, $contact_array["$campaign_id"]) || in_array($status, $contact_array["SYSTEM"])): + $call_type="Customer contact"; + break; + case (in_array($status, $sale_array["$campaign_id"]) || in_array($status, $sale_array["SYSTEM"])): + $call_type="Sale"; + break; + default: + $call_type="Unknown"; + } + + if (!$call_results_array["$call_outcome"]["call_type"]) {$call_results_array["$call_outcome"]["call_type"]=$call_type;} + + $call_results_array["$call_outcome"]["total"]++; + $call_results_total_calls++; + $call_results_array["$call_outcome"]["taken"]+=0; + $call_results_array["$call_outcome"]["lost"]++; + } +# print_r($status_names); +*/ + +$max_call_results_total_pct=0; +$max_call_results_taken_pct=0; +foreach ($call_results_array as $outcome => $data) + { + $call_results_array["$outcome"]["total_pct"]=sprintf("%.1f", 100*($data["total"]/$call_results_total_calls)); + $call_results_array["$outcome"]["taken_pct"]=sprintf("%.1f", 100*($data["taken"]/$call_results_total_calls)); + if ($max_call_results_total_pct<$call_results_array["$outcome"]["total_pct"]) {$max_call_results_total_pct=$call_results_array["$outcome"]["total_pct"];} + if ($max_call_results_taken_pct<$call_results_array["$outcome"]["taken_pct"]) {$max_call_results_taken_pct=$call_results_array["$outcome"]["taken_pct"];} + } + +$max_billable_activities_total_time=0; +$billable_activities_grand_total_time=0; +foreach ($billable_activities_array as $pause_code => $data) + { + $billable_activities_array["$pause_code"]["avg"]=round($data["total_time"]/$data["n_times"]); + if ($max_billable_activities_total_time<$data["total_time"]) {$max_billable_activities_total_time=$data["total_time"];} + $billable_activities_grand_total_time+=$data["total_time"]; + } + +$max_nonbillable_activities_total_time=0; +$nonbillable_activities_grand_total_time=0; +foreach ($nonbillable_activities_array as $pause_code => $data) + { + $nonbillable_activities_array["$pause_code"]["avg"]=round($data["total_time"]/$data["n_times"]); + if ($max_nonbillable_activities_total_time<$data["total_time"]) {$max_nonbillable_activities_total_time=$data["total_time"];} + $nonbillable_activities_grand_total_time+=$data["total_time"]; + } + +#### OUTCOMES #### +$sph=sprintf("%.1f", MathZDC($outcomes_array["sales"], ($outcomes_array["total_billable_time"] / 3600))); +$ccph=sprintf("%.1f", MathZDC($outcomes_array["customer_contacts"], ($outcomes_array["total_billable_time"] / 3600))); +$haph=sprintf("%.1f", MathZDC($outcomes_array["human_answered"], ($outcomes_array["total_billable_time"] / 3600))); +$ha_conv_index=sprintf("%.1f", 100*($outcomes_array["sales"]/$outcomes_array["customer_contacts"])); +$cc_conv_index=sprintf("%.1f", 100*($outcomes_array["sales"]/$outcomes_array["human_answered"])); + +$HTML_output.="

"._QXZ("Statuses").":$NWB#VERM_OUTCOMES-outcomes$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.=""; + +$CSV_output["outcomes"]="\""._QXZ("Report Details").":\",\"\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Total billable time").":\",\"".floor($outcomes_array["total_billable_time"] / 3600).gmdate(":i:s", $outcomes_array["total_billable_time"] % 3600)."\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Total agent available time").":\",\"".floor($outcomes_array["total_agent_available_time"] / 3600).gmdate(":i:s", $outcomes_array["total_agent_available_time"] % 3600)."\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Total agent billable activities").":\",\"".floor($outcomes_array["total_agent_billable_activities"] / 3600).gmdate(":i:s", $outcomes_array["total_agent_billable_activities"] % 3600)."\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Total nonbillable time").":\",\"".floor($outcomes_array["total_nonbillable_time"] / 3600).gmdate(":i:s", $outcomes_array["total_nonbillable_time"] % 3600)."\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Number of Sales").":\",\"".$outcomes_array["sales"]."\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Number of Customer Contacts").":\",\"".$outcomes_array["customer_contacts"]."\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Number of Human Answered").":\",\"".$outcomes_array["human_answered"]."\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Sales per Hour").":\",\"$sph\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Customer Contacts per Hour").":\",\"$ccph\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Human Answered per Hour").":\",\"$haph\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Conversion index").":\",\"".$ha_conv_index." %\"\n"; +$CSV_output["outcomes"].="\""._QXZ("Contact conversion index").":\",\"".$cc_conv_index." %\"\n"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Report Details").": 
"._QXZ("Total billable time").":".floor($outcomes_array["total_billable_time"] / 3600).gmdate(":i:s", $outcomes_array["total_billable_time"] % 3600)."
"._QXZ("Total agent available time").":".floor($outcomes_array["total_agent_available_time"] / 3600).gmdate(":i:s", $outcomes_array["total_agent_available_time"] % 3600)."
"._QXZ("Total agent billable activities").":".floor($outcomes_array["total_agent_billable_activities"] / 3600).gmdate(":i:s", $outcomes_array["total_agent_billable_activities"] % 3600)."
"._QXZ("Total nonbillable time").":".floor($outcomes_array["total_nonbillable_time"] / 3600).gmdate(":i:s", $outcomes_array["total_nonbillable_time"] % 3600)."
"._QXZ("Number of Sales").":".$outcomes_array["sales"]."
"._QXZ("Number of Customer Contacts").":".$outcomes_array["customer_contacts"]."
"._QXZ("Number of Human Answered").":".$outcomes_array["human_answered"]."
"._QXZ("Sales per Hour").":".$sph."
"._QXZ("Customer Contacts per Hour").":".$ccph."
"._QXZ("Human Answered per Hour").":".$haph."
"._QXZ("Conversion index").":".$ha_conv_index." %
"._QXZ("Contact conversion index").":".$cc_conv_index." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +################## + +#### CALL RESULTS OUTCOMES #### + +#### SORT RESULTS OF MULTI-DIMENSIONAL ARRAY ### +#default sort by key, always do this so the subsort is by array key +ksort($call_results_array); + +$sort_cr_index=preg_replace('/ desc/', '', $sort_call_results); +if (preg_match('/ desc$/', $sort_call_results)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_call_results); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_call_results." desc"; + } +$sort_call_results_preg=preg_replace('/ desc$/', '', $sort_call_results); + +if ($sort_call_results=="outcomes desc") + { + krsort($call_results_array); + } +else + { + if ($sort_cr_index) + { + $col = array_column( $call_results_array, "$sort_cr_index" ); + if (preg_match('/ desc$/', $sort_call_results)) + { + array_multisort( $col, SORT_DESC, $call_results_array ); + } + else + { + array_multisort( $col, SORT_ASC, $call_results_array ); + } + } + } + +$HTML_output.="

"._QXZ("Call results, by statuses").":$NWB#VERM_OUTCOMES-call_results_by_outcomes$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.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.=""; + $HTML_output.="\n"; + + +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["call_results"]="\""._QXZ("Call status")."\",\""._QXZ("Type")."\",\""._QXZ("Total")."\",\""._QXZ("Taken")."\",\""._QXZ("Lost")."\",\"%\",\"\",\"% "._QXZ("taken")."\"\n"; + +foreach ($call_results_array as $outcome => $data) + { + $dispo=array_search("$outcome", $status_names); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["call_results"].="\"$outcome\",\"$data[call_type]\",\"$data[total]\",\"$data[taken]\",\"$data[lost]\",\"$data[total_pct] %\",\"\",\"$data[taken_pct] %\",\n"; + } + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
Call outcome".("outcomes"==$sort_call_results_preg ? " $sort_char" : "")."Type".("call_type"==$sort_call_results_preg ? " $sort_char" : "")."Total".("total"==$sort_call_results_preg ? " $sort_char" : "")."Taken".("taken"==$sort_call_results_preg ? " $sort_char" : "")."Lost".("lost"==$sort_call_results_preg ? " $sort_char" : "")."%".("total_pct"==$sort_call_results_preg ? " $sort_char" : "")." % taken".("taken_pct"==$sort_call_results_preg ? " $sort_char" : "")."   
".$outcome."".$data["call_type"]."".$data["total"]."".$data["taken"]."".$data["lost"]."".$data["total_pct"]." %".$data["taken_pct"]." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.=""; +############################### + +#### BILLABLE ACTIVITIES #### +ksort($billable_activities_array); + +$sort_ba_index=preg_replace('/ desc/', '', $sort_billable_activities); +if (preg_match('/ desc$/', $sort_billable_activities)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_billable_activities); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_billable_activities." desc"; + } +$sort_billable_activities_preg=preg_replace('/ desc$/', '', $sort_billable_activities); + +if ($sort_billable_activities=="activity desc") + { + krsort($billable_activities_array); + } +else + { + if ($sort_ba_index) + { + $col = array_column( $billable_activities_array, "$sort_ba_index" ); + if (preg_match('/ desc$/', $sort_billable_activities)) + { + array_multisort( $col, SORT_DESC, $billable_activities_array ); + } + else + { + array_multisort( $col, SORT_ASC, $billable_activities_array ); + } + } + } + + +$HTML_output.="

"._QXZ("Billable activities").":$NWB#VERM_OUTCOMES-billable_activities$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +/* +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +*/ + + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["billable_activities"]="\""._QXZ("Activity")."\",\""._QXZ("N. Times")."\",\""._QXZ("Tot. Time")."\",\""._QXZ("Avg.")."\",\""._QXZ("Min.")."\",\""._QXZ("Max.")."\",\"%\"\n"; + +foreach ($billable_activities_array as $pause_code => $data) + { + $pct=sprintf("%.1f", ((100*$data["total_time"])/$billable_activities_grand_total_time)); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["billable_activities"].="\"$pause_code\",\"$data[n_times]\",\"".($data["total_time"]>=3600 ? floor($data["total_time"]/3600).":" : "").gmdate("i:s", $data["total_time"])."\",\"".($data["avg"]>=3600 ? floor($data["avg"]/3600).":" : "").gmdate("i:s", $data["avg"])."\",\"".($data["min"]>=3600 ? floor($data["min"]/3600).":" : "").gmdate("i:s", $data["min"])."\",\"".($data["max"]>=3600 ? floor($data["max"]/3600).":" : "").gmdate("i:s", $data["max"])."\",\"$pct %\"\n"; + } + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
Activity".("activity"==$sort_billable_activities_preg ? " $sort_char" : "")."N. Times".("n_times"==$sort_billable_activities_preg ? " $sort_char" : "")."Tot. Time".("total_time"==$sort_billable_activities_preg ? " $sort_char" : "")."Avg.".("avg"==$sort_billable_activities_preg ? " $sort_char" : "")."Min.".("min"==$sort_billable_activities_preg ? " $sort_char" : "")."Max.% 
".$pause_code."".$data["n_times"]."".($data["total_time"]>=3600 ? floor($data["total_time"]/3600).":" : "").gmdate("i:s", $data["total_time"])."".($data["avg"]>=3600 ? floor($data["avg"]/3600).":" : "").gmdate("i:s", $data["avg"])."".($data["min"]>=3600 ? floor($data["min"]/3600).":" : "").gmdate("i:s", $data["min"])."".($data["max"]>=3600 ? floor($data["max"]/3600).":" : "").gmdate("i:s", $data["max"])."".$pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.=""; +############################### + +#### NONBILLABLE ACTIVITIES #### +ksort($nonbillable_activities_array); + +$sort_nba_index=preg_replace('/ desc/', '', $sort_nonbillable_activities); +if (preg_match('/ desc$/', $sort_nonbillable_activities)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_nonbillable_activities); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_nonbillable_activities." desc"; + } +$sort_nonbillable_activities_preg=preg_replace('/ desc$/', '', $sort_nonbillable_activities); + +if ($sort_nonbillable_activities=="activity desc") + { + krsort($nonbillable_activities_array); + } +else + { + if ($sort_nba_index) + { + $col = array_column( $nonbillable_activities_array, "$sort_nba_index" ); + if (preg_match('/ desc$/', $sort_nonbillable_activities)) + { + array_multisort( $col, SORT_DESC, SORT_STRING, $nonbillable_activities_array ); + } + else + { + array_multisort( $col, SORT_ASC, SORT_STRING, $nonbillable_activities_array ); + } + } + } + +$HTML_output.="

"._QXZ("Nonbillable activities").":$NWB#VERM_OUTCOMES-nonbillable_activities$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +/* +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +*/ + + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["nonbillable_activities"]="\""._QXZ("Activity")."\",\""._QXZ("N. Times")."\",\""._QXZ("Tot. Time")."\",\""._QXZ("Avg.")."\",\""._QXZ("Min.")."\",\""._QXZ("Max.")."\",\"%\"\n"; + +foreach ($nonbillable_activities_array as $pause_code => $data) + { + $pct=sprintf("%.1f", ((100*$data["total_time"])/$nonbillable_activities_grand_total_time)); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["nonbillable_activities"].="\"$pause_code\",\"$data[n_times]\",\"".($data["total_time"]>=3600 ? floor($data["total_time"]/3600).":" : "").gmdate("i:s", $data["total_time"])."\",\"".($data["avg"]>=3600 ? floor($data["avg"]/3600).":" : "").gmdate("i:s", $data["avg"])."\",\"".($data["min"]>=3600 ? floor($data["min"]/3600).":" : "").gmdate("i:s", $data["min"])."\",\"".($data["max"]>=3600 ? floor($data["max"]/3600).":" : "").gmdate("i:s", $data["max"])."\",\"$pct %\"\n"; + } + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
Activity".("activity"==$sort_nonbillable_activities_preg ? " $sort_char" : "")."N. Times".("n_times"==$sort_nonbillable_activities_preg ? " $sort_char" : "")."Tot. Time".("total_time"==$sort_nonbillable_activities_preg ? " $sort_char" : "")."Avg.".("avg"==$sort_nonbillable_activities_preg ? " $sort_char" : "")."Min.".("min"==$sort_nonbillable_activities_preg ? " $sort_char" : "").""._QXZ("Max.")."% 
".$pause_code."".$data["n_times"]."".($data["total_time"]>=3600 ? floor($data["total_time"]/3600).":" : "").gmdate("i:s", $data["total_time"])."".($data["avg"]>=3600 ? floor($data["avg"]/3600).":" : "").gmdate("i:s", $data["avg"])."".($data["min"]>=3600 ? floor($data["min"]/3600).":" : "").gmdate("i:s", $data["min"])."".($data["max"]>=3600 ? floor($data["max"]/3600).":" : "").gmdate("i:s", $data["max"])."".$pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.=""; +############################### + +#### AGENT DETAILS REPORT ##### +$HTML_output.="

"._QXZ("Detailed agent report").":$NWB#VERM_OUTCOMES-detailed_agent_report$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.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agent_details"]="\""._QXZ("Agent name")."\",\""._QXZ("Avail.")."\",\" \",\""._QXZ("Bill.")."\",\" \",\""._QXZ("NonB.")."\",\" \",\""._QXZ("Sales")."\",\""._QXZ("Cust Contact")."\",\""._QXZ("Human Ans.")."\",\""._QXZ("SPH")."\",\""._QXZ("CCPH")."\",\""._QXZ("HAPH")."\",\""._QXZ("HA CONV")."\",\""._QXZ("CC CONV")."\"\n"; + +ksort($agent_details_array); +# print_r($agent_details_array); +foreach($agent_details_array as $agent_name => $data) + { + $billable_seconds=($data["available"]+$data["billable"]); + $billable_hours=$billable_seconds/3600; + + $av_pct=sprintf("%.1f", (100*($data["available"]/$billable_seconds))); + $b_pct=sprintf("%.1f", (100*($data["billable"]/$billable_seconds))); + # ??? - Not sure of the logic below, but whatever. + $ha_conv_pct=sprintf("%.1f", (100*MathZDC($data["sales"], $data["human_answered"], 0))); + $cc_conv_pct=sprintf("%.1f", (100*MathZDC($data["sales"], $data["customer_contacts"], 0))); + + $nb_pct=sprintf("%.1f", (100*($data["nonbillable"]/$billable_seconds))); + $sph=sprintf("%.1f", ($data["sales"]/$billable_hours)); + $ccph=sprintf("%.1f", ($data["customer_contacts"]/$billable_hours)); + $haph=sprintf("%.1f", ($data["human_answered"]/$billable_hours)); + + $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.=""; + $HTML_output.="\n"; + + $CSV_output["agent_details"].="\"$agent_name\",\"".($data["available"]>=3600 ? floor($data["available"]/3600).":" : "").gmdate("i:s", $data["available"])."\",\"$av_pct %\",\"".($data["billable"]>=3600 ? floor($data["billable"]/3600).":" : "").gmdate("i:s", $data["billable"])."\",\"$b_pct %\",\"".($data["nonbillable"]>=3600 ? floor($data["nonbillable"]/3600).":" : "").gmdate("i:s", $data["nonbillable"])."\",\"$nb_pct %\",\"$data[sales]\",\"$data[customer_contacts]\",\"$data[human_answered]\",\"$sph\",\"$ccph\",\"$haph\",\"$ha_conv_pct %\",\"$cc_conv_pct %\"\n"; + } + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Agent name").""._QXZ("Avail.")." "._QXZ("Bill.")." "._QXZ("Nonb.")." "._QXZ("Sales").""._QXZ("Cust Contact").""._QXZ("Human Ans.").""._QXZ("SPH").""._QXZ("CCPH").""._QXZ("HAPH").""._QXZ("HA CONV").""._QXZ("CC CONV")."
".$agent_name."".($data["available"]>=3600 ? floor($data["available"]/3600).":" : "").gmdate("i:s", $data["available"])."".$av_pct." %".($data["billable"]>=3600 ? floor($data["billable"]/3600).":" : "").gmdate("i:s", $data["billable"])."".$b_pct." %".($data["nonbillable"]>=3600 ? floor($data["nonbillable"]/3600).":" : "").gmdate("i:s", $data["nonbillable"])."".$nb_pct." %".$data["sales"]."".$data["customer_contacts"]."".$data["human_answered"]."".$sph."".$ccph."".$haph."".$ha_conv_pct." %".$cc_conv_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +############################### + +#### AGENT OUTCOMES REPORT #### +$final_opa_array=array(); +$max_total_value=0; +foreach($outcomes_per_agent_array as $key => $value) + { + if ($value>$max_total_value) {$max_total_value=$value;} + + $new_array=explode("|", $key); + $new_assoc_array=array( + "agent" => $new_array[0], + "type" => $new_array[1], + "outcome" => $new_array[2], + "status" => $new_array[3], + "total" => $value + ); + # array_push($new_array, $value); + array_push($final_opa_array, $new_assoc_array); + } + +$sort_opa_index=preg_replace('/ desc/', '', $sort_outcomes_per_agent); +if (preg_match('/ desc$/', $sort_outcomes_per_agent)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_outcomes_per_agent); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_outcomes_per_agent." desc"; + } +$sort_outcomes_per_agent_preg=preg_replace('/ desc$/', '', $sort_outcomes_per_agent); + +if (!$sort_opa_index) {$sort_opa_index="agent";} + +# Default sort +$col = array_column( $final_opa_array, "agent" ); +array_multisort( $col, SORT_ASC, $final_opa_array ); + +$col = array_column( $final_opa_array, "$sort_opa_index" ); +if (preg_match('/ desc$/', $sort_outcomes_per_agent)) + { + if ($sort_opa_index=="total") + { + array_multisort( $col, SORT_DESC, $final_opa_array ); + } + else + { + array_multisort( $col, SORT_DESC, SORT_STRING, $final_opa_array ); + } + } +else + { + if ($sort_opa_index=="total") + { + array_multisort( $col, SORT_ASC, $final_opa_array ); + } + else + { + array_multisort( $col, SORT_ASC, SORT_STRING, $final_opa_array ); + } + } + +$HTML_output.="

"._QXZ("Statuses per agent").":$NWB#VERM_OUTCOMES-outcomes_per_agent$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +/* +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +*/ + + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + $HTML_output.="\n"; + +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agent_outcomes"]="\""._QXZ("Agent name")."\",\""._QXZ("Status")."\",\""._QXZ("Status name")."\",\""._QXZ("Type")."\",\""._QXZ("Total")."\",\n"; + +foreach($final_opa_array as $key => $row) + { + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agent_outcomes"].="\"$row[agent]\",\"$row[status]\",\"$row[outcome]\",\"$row[type]\",\"$row[total]\"\n"; + } + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Agent Name").("agent"==$sort_outcomes_per_agent_preg ? " $sort_char" : "").""._QXZ("Status").("status"==$sort_outcomes_per_agent_preg ? " $sort_char" : "").""._QXZ("Status Name").("outcome"==$sort_outcomes_per_agent_preg ? " $sort_char" : "").""._QXZ("Type").("type"==$sort_outcomes_per_agent_preg ? " $sort_char" : "").""._QXZ("Total").("total"==$sort_outcomes_per_agent_preg ? " $sort_char" : "")." 
".$row["agent"]."".$row["status"]."".$row["outcome"]."".$row["type"]."".$row["total"]."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.=""; + +############################### + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "STATUSES_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + +?> + + + + \ No newline at end of file diff --git a/agc_2-X/trunk/www/VERM/VERM_STATS_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_STATS_rpt.inc new file mode 100644 index 00000000..53cf5d3a --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_STATS_rpt.inc @@ -0,0 +1,804 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1616 - First build +# + +# DROP, WAITTO, TIMEOT are unanswered statuses, not NANQUE +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +$PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); + +if (isset($_GET["sort_agents_on_queue"])) {$sort_agents_on_queue=$_GET["sort_agents_on_queue"];} + elseif (isset($_POST["sort_agents_on_queue"])) {$sort_agents_on_queue=$_POST["sort_agents_on_queue"];} + +if ($non_latin < 1) + { + $sort_agents_on_queue = preg_replace('/[^\s-_0-9a-zA-Z]/','',$sort_agents_on_queue); + } +else + { + $sort_agents_on_queue = preg_replace('/[^\s-_0-9\p{L}]/u','',$sort_agents_on_queue); + } + +$calls_stmt="select call_date, call_date+INTERVAL (length_in_sec) SECOND as end_date, if(call_date+INTERVAL (length_in_sec) SECOND<='$end_date $end_time', '1', '0') as within_interval, campaign_id, user, length_in_sec, '0' as queue_seconds, 'O' as direction, '1' as queue_position, term_reason, comments, status, uniqueid From vicidial_log $vicidial_log_SQL and user!='VDAD' UNION select call_date, call_date+INTERVAL (length_in_sec) SECOND as end_date, if(call_date+INTERVAL (length_in_sec) SECOND<='$end_date $end_time', '1', '0') as within_interval, campaign_id, user, if(comments='EMAIL', length_in_sec, length_in_sec-queue_seconds) as length_in_sec, if(comments='EMAIL', '0', queue_seconds) as queue_seconds, 'I' as direction, queue_position, term_reason, comments, status, uniqueid From vicidial_closer_log $vicidial_closer_log_SQL and (user!='VDCL' $or_NANQUE_clause)"; + +if ($DB) {$HTML_output.="$calls_stmt";} + +$calls_rslt=mysqli_query($link, $calls_stmt); + +### VARIABLES ### +$total_calls=0; +$total_answered_calls=0; +$total_unanswered_calls=0; +$max_call_length=0; +$min_call_length=1000000; +$total_call_length=0; +$max_wait_time=0; +$min_wait_time=1000000; +$total_wait_time=0; +$total_position=0; +$max_position=0; +$min_position=1000000; +$agent_call_counts=array(); +$transferred_counts=array(); +$agent_call_lengths=array(); +$queue_stats=array(); # campaign id breakdown BY ANSWERED CALLS +$term_reasons=array(); # ANSWERED CALLS ONLY +$call_directions=array(); # ANSWERED CALLS +$call_stints=array(); # ANSWERED CALLS +$agent_events=array(); # ANSWERED CALLS +$queue_positions=array("Untracked" => 0); # ANSWERED CALLS +$coverage="100%"; +$coverage_wi="100%"; +################# + +### WITHIN-INTERVAL VARS ### +$total_calls_wi=0; +$total_answered_calls_wi=0; +$total_unanswered_calls_wi=0; +$max_call_length_wi=0; +$min_call_length_wi=1000000; +$total_call_length_wi=0; +$max_wait_time_wi=0; +$min_wait_time_wi=1000000; +$total_wait_time_wi=0; +$total_position_wi=0; +$max_position_wi=0; +$min_position_wi=1000000; +$agent_stats_wi=array(); +############################ + +$uniqueid_array=array(); + +while ($calls_row=mysqli_fetch_array($calls_rslt)) + { + $total_calls++; + if ($calls_row["direction"]=="O") + { + $total_outbound_calls++; + } + else + { + $total_inbound_calls++; + } + # print "$total_call_length + $calls_row[length_in_sec] = "; + $total_call_length+=$calls_row["length_in_sec"]; + # print "$total_call_length
\n"; + $total_wait_time+=$calls_row["queue_seconds"]; + $stint=1; + + if (preg_match('/VDAD|VDCL/', $calls_row["user"])) + { + /* IRRELEVANT + if (preg_match('/^DROP$|TIMEOT|WAITTO/', $calls_row["status"])) + { + $total_unanswered_calls++; + if ($calls_row["direction"]=="O") + { + $unanswered_outbound_calls++; + } + else + { + $unanswered_inbound_calls++; + } + $call_was_answered=0; + } + else + { + # DO NOTHING FOR NANQUE - dunno why but phone 4698254386 shows only under one rep despite call length + } + */ + } + else + { + array_push($uniqueid_array, $calls_row["uniqueid"]); + $total_answered_calls++; + if ($calls_row["direction"]=="O") + { + $answered_outbound_calls++; + } + else + { + $answered_inbound_calls++; + } + $call_was_answered=1; + + $transferred_counts["$transfer_status"]++; + + # Use full name here so we can sort in the 'Agents on queue' section painlessly. + $agent_full_name=$fullname_info["$calls_row[user]"]; + $agent_call_counts["$agent_full_name"]++; + $agent_call_lengths["$agent_full_name"]+=$calls_row["length_in_sec"]; + + # Events? + $agent_events["$calls_row[user]"][0]=0; + $agent_events["$calls_row[user]"][1]=0; + + $term_reasons["$calls_row[term_reason]"]++; + + $queue_stats["$calls_row[campaign_id]"]++; + + if ($calls_row["direction"]=="O") {$call_directions["Outbound calls"]++;} else {$call_directions["Inbound calls"]++;} + + $call_stints["$stint"]++; + + $total_position+=$calls_row["queue_position"]; + $queue_positions["$calls_row[queue_position]"]++; + } + + if ($calls_row["length_in_sec"]>$max_call_length && $call_was_answered) {$max_call_length=$calls_row["length_in_sec"];} + if ($calls_row["length_in_sec"]<$min_call_length && $call_was_answered) {$min_call_length=$calls_row["length_in_sec"];} + + if ($calls_row["queue_seconds"]>$max_wait_time && $call_was_answered) {$max_wait_time=$calls_row["queue_seconds"];} + if ($calls_row["queue_seconds"]<$min_wait_time && $call_was_answered) {$min_wait_time=$calls_row["queue_seconds"];} + + if ($calls_row["queue_position"]>$max_position) {$max_position=$calls_row["queue_position"];} + if ($calls_row["queue_position"]<$min_position) {$min_position=$calls_row["queue_position"];} + + ### FILTER FOR FULLY WITHIN-INTERVAL CALLS, SHOULD BE EXACTLY THE SAME (FOR NOW) + if ($calls_row["within_interval"]) + { + $total_calls_wi++; + $total_call_length_wi+=$calls_row["length_in_sec"]; + $total_wait_time_wi+=$calls_row["queue_seconds"]; + $total_position_wi+=$calls_row["queue_position"]; + + if (preg_match('/VDAD|VDCL/', $calls_row["user"]) && preg_match('/^DROP$|TIMEOT|WAITTO/', $calls_row["status"])) + { + $total_unanswered_calls_wi++; + } + else + { + $total_answered_calls_wi++; + } + + if ($calls_row["length_in_sec"]>$max_call_length_wi) {$max_call_length_wi=$calls_row["length_in_sec"];} + if ($calls_row["length_in_sec"]<$min_call_length_wi) {$min_call_length_wi=$calls_row["length_in_sec"];} + + if ($calls_row["queue_seconds"]>$max_wait_time_wi && $call_was_answered) {$max_wait_time_wi=$calls_row["queue_seconds"];} + if ($calls_row["queue_seconds"]<$min_wait_time_wi && $call_was_answered) {$min_wait_time_wi=$calls_row["queue_seconds"];} + + if ($calls_row["queue_position"]>$max_position_wi) {$max_position_wi=$calls_row["queue_position"];} + if ($calls_row["queue_position"]<$min_position_wi) {$min_position_wi=$calls_row["queue_position"];} + } + } + +$average_call_length=sprintf("%.1f", $total_call_length/$total_answered_calls); # Total calls instead? +$average_wait_time=sprintf("%.1f", $total_wait_time/$total_answered_calls); # Total calls instead? +$average_position=sprintf("%.1f", $total_position/$total_answered_calls); +$total_call_length_fmt=sprintf("%.1f", ($total_call_length/3600)); +$total_wait_time_fmt=sprintf("%.1f", ($total_wait_time/3600)); + +$average_call_length_wi=sprintf("%.1f", $total_call_length_wi/$total_answered_calls_wi); # Total calls instead? +$average_wait_time_wi=sprintf("%.1f", $total_wait_time_wi/$answered_call_wis); # Total calls instead? +$average_position_wi=sprintf("%.1f", $total_position_wi/$total_answered_calls_wi); +$total_call_length_fmt_wi=sprintf("%.1f", ($total_call_length_wi/3600)); +$total_wait_time_fmt_wi=sprintf("%.1f", ($total_wait_time_wi/3600)); + +# Wipe unadjusted variables (i.e. no records) +$min_call_length=($min_call_length==1000000 ? "0" : $min_call_length); +$min_wait_time=($min_wait_time==1000000 ? "0" : $min_wait_time); +$min_position=($min_position==1000000 ? "0" : $min_position); +$min_call_length_wi=($min_call_length_wi==1000000 ? "0" : $min_call_length_wi); +$min_wait_time_wi=($min_wait_time_wi==1000000 ? "0" : $min_wait_time_wi); +$min_position_wi=($min_position_wi==1000000 ? "0" : $min_position_wi); + +$HTML_output.="

"._QXZ("All calls")."

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +### Commented out 5/19/22 - not needed +### $HTML_output.=""; +### $HTML_output.=""; +### $HTML_output.=""; +### $HTML_output.="\n"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("All calls").": 
"._QXZ("N. calls answered by operators").":".$total_answered_calls."
"._QXZ("Average call length").":".$average_call_length." s.
"._QXZ("Min call length").":".($min_call_length>=3600 ? floor($min_call_length/3600).":" : "").gmdate("i:s", $min_call_length)."
"._QXZ("Max call length").":".($max_call_length>=3600 ? floor($max_call_length/3600).":" : "").gmdate("i:s", $max_call_length)."
"._QXZ("Total call length").":".$total_call_length_fmt." H
"._QXZ("Average call waiting time").":".$average_wait_time." s
"._QXZ("Min waiting time").":".($min_wait_time>=3600 ? floor($min_wait_time/3600).":" : "").gmdate("i:s", $min_wait_time)."
"._QXZ("Max waiting time").":".($max_wait_time>=3600 ? floor($max_wait_time/3600).":" : "").gmdate("i:s", $max_wait_time)."
"._QXZ("Total waiting time").":".$total_wait_time_fmt." H
"._QXZ("Average initial position").":".$average_position."
"._QXZ("Min initial position").":".$min_position."
"._QXZ("Max initial position").":".$max_position."
Coverage:".$coverage."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +$CSV_output["all_calls"]="\""._QXZ("All calls")."\",\"\"\n"; +$CSV_output["all_calls"].="\""._QXZ("N. calls answered by operators").":\",\"$total_answered_calls\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Average call length").":\",\"$average_call_length s.\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Min call length").":\",\"".($min_call_length>=3600 ? floor($min_call_length/3600).":" : "").gmdate("i:s", $min_call_length)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Max call length").":\",\"".($max_call_length>=3600 ? floor($max_call_length/3600).":" : "").gmdate("i:s", $max_call_length)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Total call length").":\",\"".$total_call_length_fmt." H\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Average call waiting time").":\",\"".$average_wait_time." H\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Min waiting time").":\",\"".($min_wait_time>=3600 ? floor($min_wait_time/3600).":" : "").gmdate("i:s", $min_wait_time)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Max waiting time").":\",\"".($max_wait_time>=3600 ? floor($max_wait_time/3600).":" : "").gmdate("i:s", $max_wait_time)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Total waiting time").":\",\"".$total_wait_time_fmt." H\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Average initial position").":\",\"".$average_position."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Min initial position").":\",\"".$min_position."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Max initial position").":\",\"".$max_position."\"\n"; + +### Commented out 5/19/22 - not needed +### $CSV_output["all_calls"].="\"Coverage:\",\"".$coverage."\"\n"; +###################### + +#### AGENTS ON QUEUE #### +switch ($sort_agents_on_queue) + { + case "ncalls": + $ncalls_sort_value="ncalls desc"; + $agent_sort_value="agent"; + $ncalls_char="↑"; + $agent_char=""; + asort($agent_call_counts); + break; + case "ncalls desc": + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent"; + $ncalls_char="↓"; + $agent_char=""; + arsort($agent_call_counts); + break; + case "agent": + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent desc"; + $ncalls_char=""; + $agent_char="↑"; + ksort($agent_call_counts, SORT_NATURAL | SORT_FLAG_CASE); + break; + case "agent desc": + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent"; + $ncalls_char=""; + $agent_char="↓"; + krsort($agent_call_counts, SORT_NATURAL | SORT_FLAG_CASE); + break; + default: + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent"; + $ncalls_char=""; + $agent_char=""; + ksort($agent_call_counts, SORT_NATURAL | SORT_FLAG_CASE); + break; + } +if (preg_match('/ desc$/', $sort_agents_on_queue)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_agents_on_queue); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_agents_on_queue." desc"; + } +$sort_agents_on_queue_preg=preg_replace('/ desc$/', '', $sort_agents_on_queue); + +$HTML_output.="

"._QXZ("Agents on queue").":

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; + +# $HTML_output.=""; +# $HTML_output.=""; + + $HTML_output.="\n"; + $HTML_output.="\n"; + +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["agents_on_queue"]="\""._QXZ("Agents on queue")."\"\n"; +$CSV_output["agents_on_queue"].="\""._QXZ("Agent")."\",\""._QXZ("N. Calls")."\",\"\",\"...\",\""._QXZ("Total call time")."\",\""._QXZ("Average call time")."\"\n"; + +$highest_agent_call_count=max($agent_call_counts); + +$agents_on_queue_graph_labels="["; +$agents_on_queue_graph_data="["; +$agents_on_queue_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$agents_on_queue_graph_hovborder="["; +$x=0; +foreach ($agent_call_counts as $agentName => $value) + { + $call_count_percent=sprintf("%.1f", (100*$value)/$total_answered_calls); + $agent_total_call_length=$agent_call_lengths["$agentName"]; + $agent_total_call_length_fmt=($agent_total_call_length>=3600 ? floor($agent_total_call_length/3600).":" : "").gmdate("i:s", $agent_total_call_length); + $agent_avg_call_length=round($agent_total_call_length/$value); + $agent_avg_call_length_fmt=($agent_avg_call_length>=3600 ? floor($agent_avg_call_length/3600).":" : "").gmdate("i:s", $agent_avg_call_length); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["agents_on_queue"].="\"".$agentName."\",\"".$value."\",\"".$call_count_percent." %\",\"\",\"".$agent_total_call_length_fmt."\",\"".$agent_avg_call_length_fmt."\"\n"; + + $agents_on_queue_graph_labels.="\"$agentName\","; + $agents_on_queue_graph_data.="\"$value\","; + $agents_on_queue_graph_bgcolor.="\"".$background_colors[$x]."\","; + $agents_on_queue_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$agents_on_queue_graph_labels=preg_replace('/,$/', '', $agents_on_queue_graph_labels)."]"; +$agents_on_queue_graph_data=preg_replace('/,$/', '', $agents_on_queue_graph_data)."]"; +$agents_on_queue_graph_bgcolor=preg_replace('/,$/', '', $agents_on_queue_graph_bgcolor)."]"; +$agents_on_queue_graph_hovborder=preg_replace('/,$/', '', $agents_on_queue_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Agent")." ".$agent_char.""._QXZ("N. Calls")." ".$ncalls_char." ..."._QXZ("Total call time").""._QXZ("Average call time")."
".$agentName."".$value."".$call_count_percent." %".$agent_total_call_length_fmt."".$agent_avg_call_length_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.=""; +###################### + +#### SERVICE LEVEL #### +$HTML_output.="

"._QXZ("Service Level Agreement (inbound calls only)").":

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["service_level_agreement"]="\""._QXZ("Service Level Agreement (inbound calls only)").\"\n"; +$CSV_output["service_level_agreement"].="\""._QXZ("Answer").\",\""._QXZ("N. Calls").\",\""._QXZ("Delta").\",\""._QXZ("Percent").\",\""._QXZ("Of Offered").\",\"...\"\n"; + +# $SLA_query is in VERM_global_vars.inc +$svc_lvl_stmt="select $SLA_query from vicidial_closer_log $vicidial_closer_log_SQL and (user!='VDCL')"; # and campaign_id in ($ingroup_str) and user in ('VDCL', $user_str) +$svc_lvl_rslt=mysqli_query($link, $svc_lvl_stmt); +if ($DB) {$HTML_output.="$svc_lvl_stmt";} +$svc_lvl_row=mysqli_fetch_assoc($svc_lvl_rslt); +#print_r($svc_lvl_row); +# { +# print "$interval - $sum\n"; +# } + +$service_level_agreement_graph_labels="["; +$service_level_agreement_graph_delta_data="["; +$service_level_agreement_graph_delta_bgcolor="["; # SAME FOR hoverBackgroundColor +$service_level_agreement_graph_delta_hovborder="["; +$service_level_agreement_graph_percent_data="["; +$service_level_agreement_graph_percent_bgcolor="["; # SAME FOR hoverBackgroundColor +$service_level_agreement_graph_percent_hovborder="["; + +$x=0; +foreach($svc_lvl_row as $interval => $sum) + { + $int_name=ucwords(preg_replace("/_/", " ", $interval)); + if ($prev_int) {$delta="+ ".($sum-$prev_int);} else {$delta=" ";} + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["service_level_agreement"].="\"$int_name seconds:\",\"$sum\",\"$delta\",\"".sprintf("%.1f", ((100*$sum)/$answered_inbound_calls))." %\",\"".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))." %\"\n"; + + $service_level_agreement_graph_labels.="\"$int_name\","; + $service_level_agreement_graph_delta_data.="\"".($prev_int ? ($sum-$prev_int) : "0")."\","; + $service_level_agreement_graph_delta_bgcolor.="\"#33CCCC\","; + $service_level_agreement_graph_delta_hovborder.="\"#66FFFF\","; + $service_level_agreement_graph_percent_data.="\"".sprintf("%.1f", ((100*$sum)/$answered_inbound_calls))."\","; + $service_level_agreement_graph_percent_bgcolor.="\"#FFCC66\","; + $service_level_agreement_graph_percent_hovborder.="\"#FFFF99\","; + + $prev_int=$sum; + $x++; + } + +$service_level_agreement_graph_labels=preg_replace('/,$/', '', $service_level_agreement_graph_labels)."]"; +$service_level_agreement_graph_delta_data=preg_replace('/,$/', '', $service_level_agreement_graph_delta_data)."]"; +$service_level_agreement_graph_delta_bgcolor=preg_replace('/,$/', '', $service_level_agreement_graph_delta_bgcolor)."]"; +$service_level_agreement_graph_delta_hovborder=preg_replace('/,$/', '', $service_level_agreement_graph_delta_hovborder)."]"; +$service_level_agreement_graph_percent_data=preg_replace('/,$/', '', $service_level_agreement_graph_percent_data)."]"; +$service_level_agreement_graph_percent_bgcolor=preg_replace('/,$/', '', $service_level_agreement_graph_percent_bgcolor)."]"; +$service_level_agreement_graph_percent_hovborder=preg_replace('/,$/', '', $service_level_agreement_graph_percent_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Answer").""._QXZ("N. Calls").""._QXZ("Delta").""._QXZ("Percent").""._QXZ("Of Offered")."...
$int_name "._QXZ("seconds").:".$sum."$delta  ".sprintf("%.1f", ((100*$sum)/$answered_inbound_calls))." %".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +############ ALL UNANSWERED CALLLS ########### +############################################## + + +#### DISCONNECTIONS ### +$HTML_output.="

"._QXZ("Disconnection causes").":

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; + +$CSV_output["disconnection_causes"]="\""._QXZ("Disconnection causes").":\"\n"; +$CSV_output["disconnection_causes"].="\""._QXZ("Cause")."\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$disconnection_causes_graph_labels="["; +$disconnection_causes_graph_data="["; +$disconnection_causes_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$disconnection_causes_graph_hovborder="["; + +$max_term_reason=max($term_reasons); +$x=0; +foreach ($term_reasons as $reason => $value) + { + $term_reason_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.="\n"; + + $CSV_output["disconnection_causes"].="\"".$reason."\",\"".$value."\",\"".$term_reason_pct." %\"\n"; + + $disconnection_causes_graph_labels.="\"$reason\","; + $disconnection_causes_graph_data.="\"$value\","; + $disconnection_causes_graph_bgcolor.="\"".$background_colors[$x]."\","; + $disconnection_causes_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$disconnection_causes_graph_labels=preg_replace('/,$/', '', $disconnection_causes_graph_labels)."]"; +$disconnection_causes_graph_data=preg_replace('/,$/', '', $disconnection_causes_graph_data)."]"; +$disconnection_causes_graph_bgcolor=preg_replace('/,$/', '', $disconnection_causes_graph_bgcolor)."]"; +$disconnection_causes_graph_hovborder=preg_replace('/,$/', '', $disconnection_causes_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.="\n"; +$HTML_output.="
"._QXZ("Cause").""._QXZ("N. Calls")." ...
".$reason."".$value."".$term_reason_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + + +$ACD_queue_counts=array(); +$ACD_terminal_counts=array(); + +# ONLY COUNT ANSWERED CALLS +$stmt="select campaign_id, user, status, 0 as ring_time from vicidial_log $vicidial_log_SQL $and_NANQUE_clause UNION ALL select campaign_id, user, status, queue_seconds as ring_time from vicidial_closer_log $vicidial_closer_log_SQL $and_NANQUE_clause"; +if ($DB) {$HTML_output.="$stmt";} +$rslt=mysql_to_mysqli($stmt, $link); +while ($row=mysqli_fetch_array($rslt)) + { + $campaign_id=$row["campaign_id"]; + $user=$row["user"]; + $status=$row["status"]; + $ring_time=$row["ring_time"]; + + if (preg_match('/VDAD|VDCL/', $user)) # && preg_match('/^DROP$|TIMEOT|WAITTO/', $status) + { + # UNANSWERED, DO NOTHING + $unanswered++; + } + else + { + $ACD_queue_counts["$campaign_id"]["calls"]++; + $ACD_queue_counts["$campaign_id"]["ring_time"]+=$ring_time; + + $ACD_terminal_counts["$user"]["calls"]++; + $ACD_terminal_counts["$user"]["ring_time"]+=$ring_time; + } + } + +ksort($ACD_queue_counts); +ksort($ACD_terminal_counts); + + +##### ACD ATTEMPTS BY TERMINAL ##### +$HTML_output.="

"._QXZ("ACD attempts by terminal").":

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["acd_attempts_by_terminal"]="\""._QXZ("Queue")."\",\""._QXZ("N. lost")."\",\""._QXZ("Avg ring")."\",\""._QXZ("Ring (s)")."\",\""._QXZ("N. Taken")."\",\""._QXZ("Avg ring")."\",\""._QXZ("Ring (s)")."\"\n"; +$i=0; +foreach ($ACD_terminal_counts as $queue => $data) + { + if (!$data["lost_ring_time"] || !$data["lost"]) + { + $avg_lost_time=" - "; + } + else + { + $avg_lost_time=round($data["lost_ring_time"]/$data["lost"]); + $avg_lost_time=($avg_lost_time>=3600 ? intval(floor($avg_lost_time/3600)).date(":i:s", $avg_lost_time) : intval(date("i", $avg_lost_time)).":".date("s", $avg_lost_time)); + } + + if (!$data["ring_time"] || !$data["calls"]) + { + $avg_ring_time="0:00"; + } + else + { + $avg_ring_time=round($data["ring_time"]/$data["calls"]); + $avg_ring_time=($avg_ring_time>=3600 ? intval(floor($avg_ring_time/3600)).date(":i:s", $avg_ring_time) : intval(date("i", $avg_ring_time)).":".date("s", $avg_ring_time)); + } + + $terminal=($terminal_names["$queue"]!="" ? $terminal_names["$queue"] : "($queue)"); + $lost_time=($data["lost_ring_time"]>=3600 ? intval(floor($data["lost_ring_time"]/3600)).date(":i:s", $data["lost_ring_time"]) : intval(date("i", $data["lost_ring_time"])).":".date("s", $data["lost_ring_time"])); + $ring_time=($data["ring_time"]>=3600 ? intval(floor($data["ring_time"]/3600)).date(":i:s", $data["ring_time"]) : intval(date("i", $data["ring_time"])).":".date("s", $data["ring_time"])); + + $CSV_output["acd_attempts_by_terminal"].="\"".$terminal."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".(!$data["lost"] ? "0" : $data["lost"])."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".$avg_lost_time."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".$lost_time."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".(!$data["calls"] ? "0" : $data["calls"])."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".$avg_ring_time."\","; + $CSV_output["acd_attempts_by_terminal"].="\"".$ring_time."\","; + $CSV_output["acd_attempts_by_terminal"].="\n"; + + $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.="
"._QXZ("Queue").""._QXZ("N. lost").""._QXZ("Avr ring").""._QXZ("Ring (s)").""._QXZ("N. Taken"._QXZ("Avg ring").""._QXZ("Ring (s)")."
".$terminal."".(!$data["lost"] ? "0": $data["lost"])."".$avg_lost_time."".$lost_time."".(!$data["calls"] ? "0" : $data["calls"])."".$avg_ring_time."".$ring_time."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...

"; +############################# + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "STATS_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + +echo $HTML_output; + +?> + diff --git a/agc_2-X/trunk/www/VERM/VERM_UNANSWERED_DT_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_UNANSWERED_DT_rpt.inc new file mode 100644 index 00000000..9f06f21b --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_UNANSWERED_DT_rpt.inc @@ -0,0 +1,390 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1615 - First build +# + +if (isset($_GET["page_no"])) {$page_no=$_GET["page_no"];} + elseif (isset($_POST["page_no"])) {$page_no=$_POST["page_no"];} +if (isset($_GET["sort_unanswered_details"])) {$sort_unanswered_details=$_GET["sort_unanswered_details"];} + elseif (isset($_POST["sort_unanswered_details"])) {$sort_unanswered_details=$_POST["sort_unanswered_details"];} + +if ($non_latin < 1) + { + $sort_unanswered_details = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_unanswered_details); + } +else + { + $sort_unanswered_details = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_unanswered_details); + } + +$page_no=preg_replace('/[^0-9]/', '', $page_no); +if (!$page_no || $page_no<1) {$page_no=1;} + +$ll=($page_no-1)*20; +$ul=($page_no*20); + +$available_columns=array( +"Date" => "call_date", +"Caller" => "phone_number", +"Campaign/ingroup" => "campaign_id", +"IVR" => "ivr", +"Wait" => "wait", +"Duration" => "length_in_sec", +"Pos." => "queue_position", +"Disconnection" => "term_reason", +"Transferred to" => "transferred_to", +"Handled by" => "user", +"Attempts" => "attempts", +"Code" => "status", +"Stints" => "stints", +"Srv" => "srv", +"Asterisk UID" => "caller_code", +"MOH events" => "moh_events", +"MOH duration" => "moh_duration", +"IVR duration" => "ivr_duration", +"IVR path" => "ivr_path", +"DID" => "did", +"CRM" => "", +"Tag" => "tag", +"Feat" => "feat", +"Vars" => "vars", +"Feature Codes" => "feature_codes", +"Variables" => "variables" +); + +$selected_columns=array( +_QXZ("Date") => "call_date", +_QXZ("Agent") => "user", +_QXZ("Caller") => "phone_number", +_QXZ("Campaign/ingroup") => "campaign_id", +_QXZ("Disconnection") => "term_reason", +_QXZ("Position") => "queue_position", +_QXZ("IVR") => "ivr_duration", +_QXZ("Wait") => "wait", +_QXZ("Attempts") => "attempts", +_QXZ("Code") => "status", +_QXZ("Key") => "key", +"uniqueid" => "detail_id" +); +# "Transferred to" => "transferred_to", + + +$sort_char=""; +$sort_index=""; +/* +switch($sort_unanswered_details) + { + case "phone_number": + case "campaign_id": + case "queue_position": + case "wait": + case "duration": + case "term_reason": + case "attempts": + case "phone_number desc": + case "campaign_id desc": + case "queue_position desc": + case "wait desc": + case "duration desc": + case "term_reason desc": + case "attempts desc": + $sort_clause=" order by $sort_unanswered_details, call_date"; + break; + + case "call_date": + case "user": + case "status": + case "ivr_duration": + case "call_date desc": + case "user desc": + case "status desc": + case "ivr_duration desc": + $sort_index=preg_replace('/ desc/', '', $sort_unanswered_details); + break; + + default: + $sort_clause=" order by call_date"; + break; + } +*/ +$sort_clause=" order by call_date"; +$sort_index=preg_replace('/ desc/', '', $sort_unanswered_details); +if (preg_match('/ desc$/', $sort_unanswered_details)) + { + $sort_char="↓"; + $reverse_link=preg_replace('/ desc$/', '', $sort_unanswered_details); + } +else + { + $sort_char="↑"; + $reverse_link=$sort_unanswered_details." desc"; + } +$sort_unanswered_details_preg=preg_replace('/ desc$/', '', $sort_unanswered_details); + +# $stmt="select call_date, phone_number, campaign_id, 0 as ivr, '0:00' as wait, sec_to_time(round(length_in_sec)) as duration, '1' as queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, uniqueid as detail_id, 'O' as direction from vicidial_log where call_date>='$start_date $start_time' and call_date<='$end_date $end_time' and user in ('VDAD') UNION select call_date, phone_number, campaign_id, 0 as ivr, sec_to_time(round(queue_seconds)) as wait, sec_to_time(round(length_in_sec-queue_seconds)) as duration, queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, CONCAT(uniqueid, '|', closecallid) as detail_id, 'I' as direction from vicidial_closer_log where call_date>='$start_date $start_time' and call_date<='$end_date $end_time' and user in ('VDCL') $and_NANQUE_clause $sort_clause"; + +$stmt="select call_date, phone_number, campaign_id, 0 as ivr, '0:00' as wait, sec_to_time(round(length_in_sec)) as duration, '1' as queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, uniqueid as detail_id, 'O' as direction from vicidial_log $vicidial_log_SQL $exc_addtl_statuses and user in ('VDAD') UNION select call_date, phone_number, campaign_id, 0 as ivr, sec_to_time(round(queue_seconds)) as wait, sec_to_time(round(length_in_sec-queue_seconds)) as duration, queue_position, CAST(term_reason AS CHAR) as term_reason, user, '1' as attempts, status, uniqueid, 0 as moh_events, '00:00:00' as moh_duration, '' as ivr_duration, '' as ivr_path, '' as did, '' as url, '' as tag, '0' as feat, '0' as vars, '' as feature_codes, '' as variables, CONCAT(uniqueid, '|', closecallid) as detail_id, 'I' as direction from vicidial_closer_log $vicidial_closer_log_SQL $exc_addtl_statuses and user in ('VDCL') $and_NANQUE_clause $sort_clause"; + +if ($DB) {$HTML_output.="$stmt";} + +$rslt=mysql_to_mysqli($stmt, $link); +$total_pages=ceil(mysqli_num_rows($rslt)/20); + +$HTML_output.="

"._QXZ("Unanswered Call Details").": $NWB#VERM_UNANSWERED_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=""; +foreach ($selected_columns as $display_name => $column_name) + { + if ($display_name!="uniqueid") + { + $CSV_output.="\"$display_name\","; + # $HTML_output.=""; + + $HTML_output.="\n"; + } + } +$CSV_output.="\n"; +$HTML_output.=""; +$HTML_output.=""; + +$output_array=array(); +$i=0; +while ($row=mysqli_fetch_array($rslt)) + { + $row["caller_code"]=""; + $row["ivr"]="00:00"; + $row["ivr_duration"]="00:00"; + $row["ivr_path"]=""; + $row["did"]=""; + + $uniqueid=$row["uniqueid"]; + $row["campaign_id"]=$queue_names["$row[campaign_id]"]; + $row["status"]=($status_names["$row[status]"] ? $status_names["$row[status]"] : $row["status"]); + $row["user"]=$fullname_info["$row[user]"]; + + $row["key"]=GetKeyPress($row["uniqueid"]); + + $row["caller_code"]=GetCallerCode($row["uniqueid"]); + if ($row["direction"]=="I") + { + $ivr_info_array=GetIVRInfo($row["uniqueid"], $row["call_date"]); + $row["ivr"]=$ivr_info_array[0]; + $row["ivr_duration"]=$ivr_info_array[1]; + $row["ivr_path"]=$ivr_info_array[2]; + $row["call_date"]=$ivr_info_array[3]; + $row["did"]=GetDID($row["uniqueid"]); + } + + if ($i>=$ll && $i<$ul || $download_rpt) + { + $current_row=array(); + foreach ($selected_columns as $display_name => $column_name) + { + $current_row["$column_name"]=$row["$column_name"]; + } + + array_push($output_array, $current_row); + } + $i++; + } + +if ($sort_index) + { + #$sort_index=8; + # 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"]; + } + if (preg_match('/ desc$/', $sort_unanswered_details)) + { + array_multisort($sort_array_holder,SORT_DESC, SORT_STRING,$output_array); + } + else + { + array_multisort($sort_array_holder,SORT_ASC, SORT_STRING,$output_array); + } + + #usort($output_array, function($a, $b){ + # return strcmp($a[$sort_index], $b[$sort_index]); + #}); + } + +foreach ($output_array as $data_row) + { + $HTML_output.=""; + foreach ($data_row as $key => $value) + { + if ($key=="call_date") + { + $myDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $value); + $value = $myDateTime->format('m/d - H:i:s'); + } + if ($key!="detail_id") + { + $HTML_output.=""; + $CSV_output.="\"".$value."\","; + } + else + { + $HTML_output.=""; + # $HTML_output.=""; + } + } + $CSV_output.="\n"; + + $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.="
".$display_name.($column_name==$sort_unanswered_details_preg ? " $sort_char" : "")." 
".$value."\"HELP\"
|<    <<"; +$HTML_output.="    "; +$HTML_output.=""; +$HTML_output.=""._QXZ("Export as")."...     CSV    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) + { + $data_to_download=$CSV_output; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "UNANSWERS_DT_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + +echo $HTML_output; +?> + +=3600 ? floor($ivr_duration/3600).":" : "").gmdate("i:s", $ivr_duration); + $ivr_length_fmt=($ivr_length>=3600 ? floor($ivr_length/3600).":" : "").gmdate("i:s", $ivr_length); + + return array("$ivr_length_fmt", "$ivr_duration_fmt", "$ivr_path", "$actual_start_time"); + } + +function GetDID($uniqueid) + { + global $link, $DB, $did_id_info, $did_pattern_info; + + $did_str=""; + + $did_stmt="select extension, did_id from vicidial_did_log where uniqueid in ('$uniqueid')"; + $did_rslt=mysqli_query($link, $did_stmt); + $did_row=mysqli_fetch_array($did_rslt); + $did_str=$did_row["extension"]." - ".$did_id_info["$did_row[extension]"]; + + return $did_str; + } +?> diff --git a/agc_2-X/trunk/www/VERM/VERM_UNANSWERED_rpt.inc b/agc_2-X/trunk/www/VERM/VERM_UNANSWERED_rpt.inc new file mode 100644 index 00000000..1ed0b555 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_UNANSWERED_rpt.inc @@ -0,0 +1,2262 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1614 - First build +# + +if (isset($_GET["sort_agents_on_queue"])) {$sort_agents_on_queue=$_GET["sort_agents_on_queue"];} + elseif (isset($_POST["sort_agents_on_queue"])) {$sort_agents_on_queue=$_POST["sort_agents_on_queue"];} + +if ($non_latin < 1) + { + $sort_agents_on_queue = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$sort_agents_on_queue); + } +else + { + $sort_agents_on_queue = preg_replace('/[^\s\-_0-9\p{L}]/u','',$sort_agents_on_queue); + } + +## NOTE TO SELF - DESPITE THIS BEING UNANSWERED CALLS, THE BELOW STATEMENT INCLUDES NON-VDAD/VDCL CALLS BECAUSE WE NEED THEM IN THE SLA REPORT +$calls_stmt="select call_date, call_date+INTERVAL (length_in_sec) SECOND as end_date, if(call_date+INTERVAL (length_in_sec) SECOND<='$end_date $end_time', '1', '0') as within_interval, campaign_id, user, length_in_sec, '0' as queue_seconds, 'O' as direction, '1' as queue_position, term_reason, comments, status, uniqueid From vicidial_log $vicidial_log_SQL $exc_addtl_statuses UNION select call_date, call_date+INTERVAL (length_in_sec) SECOND as end_date, if(call_date+INTERVAL (length_in_sec) SECOND<='$end_date $end_time', '1', '0') as within_interval, campaign_id, user, if(comments='EMAIL', length_in_sec, length_in_sec-queue_seconds) as length_in_sec, if(comments='EMAIL', '0', queue_seconds) as queue_seconds, 'I' as direction, queue_position, term_reason, comments, status, uniqueid From vicidial_closer_log $vicidial_closer_log_SQL $exc_addtl_statuses"; # and (user!='VDCL' $or_NANQUE_clause) + +if ($DB) {$HTML_output.="$calls_stmt";} + +$calls_rslt=mysqli_query($link, $calls_stmt); + +### VARIABLES ### +$total_calls=0; +$total_queue_stats=array(); + +$total_answered_calls=0; +$max_call_length=0; +$min_call_length=1000000; +$total_call_length=0; +$max_wait_time=0; +$min_wait_time=1000000; +$total_wait_time=0; +$total_position=0; +$max_position=0; +$min_position=1000000; +$agent_call_counts=array(); +$transferred_counts=array(); +$agent_call_lengths=array(); +$queue_stats=array(); # campaign id breakdown BY ANSWERED CALLS +$term_reasons=array(); # ANSWERED CALLS ONLY +$call_directions=array(); # ANSWERED CALLS +$call_stints=array(); # ANSWERED CALLS +$agent_events=array(); # ANSWERED CALLS +$queue_positions=array("Untracked" => 0); # ANSWERED CALLS + +$total_unanswered_calls=0; +$max_unanswered_call_length=0; +$min_unanswered_call_length=1000000; +$max_unanswered_wait_time=0; +$min_unanswered_wait_time=1000000; +$total_unanswered_wait_time=0; +$total_unanswered_position=0; +$max_unanswered_position=0; +$min_unanswered_position=1000000; +$unanswered_queue_stats=array(); # campaign id breakdown BY UNANSWERED CALLS +$unanswered_term_reasons=array(); # UNANSWERED CALLS ONLY +$unanswered_call_directions=array(); # UNANSWERED CALLS +$unanswered_call_stints=array(); # UNANSWERED CALLS +$unanswered_agent_events=array(); # UNANSWERED CALLS +$unanswered_queue_positions=array("Untracked" => 0); # UNANSWERED CALLS +$coverage="100%"; +$coverage_wi="100%"; +################# + +### WITHIN-INTERVAL VARS ### +$total_calls_wi=0; + +$total_answered_calls_wi=0; +$max_call_length_wi=0; +$min_call_length_wi=1000000; +$total_call_length_wi=0; +$max_wait_time_wi=0; +$min_wait_time_wi=1000000; +$total_wait_time_wi=0; +$total_position_wi=0; +$max_position_wi=0; +$min_position_wi=1000000; + +$total_unanswered_calls_wi=0; +$max_unanswered_call_length_wi=0; +$min_unanswered_call_length_wi=1000000; +$max_unanswered_wait_time_wi=0; +$min_unanswered_wait_time_wi=1000000; +$total_unanswered_wait_time_wi=0; +$total_unanswered_position_wi=0; +$max_unanswered_position_wi=0; +$min_unanswered_position_wi=1000000; +$agent_stats_wi=array(); +############################ + +$uniqueid_array=array(); +$unanswered_uniqueid_array=array(); + +while ($calls_row=mysqli_fetch_array($calls_rslt)) + { + $total_calls++; + if ($calls_row["direction"]=="O") + { + $total_outbound_calls++; + } + else + { + $total_inbound_calls++; + } + # print "$total_call_length + $calls_row[length_in_sec] = "; + $total_call_length+=$calls_row["length_in_sec"]; + # print "$total_call_length
\n"; + $total_wait_time+=$calls_row["queue_seconds"]; + $stint=1; + $campaign_name=$queue_names["$calls_row[campaign_id]"]; + + if (preg_match('/VDAD|VDCL/', $calls_row["user"])) + { +# if (preg_match('/^DROP$|TIMEOT|WAITTO|NANQUE/', $calls_row["status"])) +# { + $total_unanswered_calls++; + $total_unanswered_call_length+=$calls_row["length_in_sec"]; + array_push($unanswered_uniqueid_array, $calls_row["uniqueid"]); + $total_unanswered_wait_time+=$calls_row["queue_seconds"]; + if (preg_match('/^DROP$/', $calls_row["status"])) {$unanswered_coverage_calls++;} + if ($calls_row["direction"]=="O") + { + $unanswered_outbound_calls++; + } + else + { + $unanswered_inbound_calls++; + } + unset($call_was_answered); + + $unanswered_term_reasons["$calls_row[term_reason]"]++; + + $unanswered_queue_stats["$calls_row[campaign_id]"]++; + + # Have to do this because numeric IDs get fucked up when sorted further down. + $total_queue_stats["$campaign_name"]["calls"]++; + $total_queue_stats["$campaign_name"]["answered"]+=0; + $total_queue_stats["$campaign_name"]["unanswered"]++; + $total_queue_stats["$campaign_name"]["call_time"]+=$calls_row["length_in_sec"]; + $total_queue_stats["$campaign_name"]["wait_time"]+=$calls_row["queue_seconds"]; + + $unanswered_calls_by_agent["$calls_row[user]"]++; + + if ($calls_row["direction"]=="O") {$unanswered_call_directions["Outbound calls"]++;} else {$unanswered_call_directions["Inbound calls"]++;} + + $total_unanswered_position+=$calls_row["queue_position"]; + $unanswered_queue_positions["$calls_row[queue_position]"]++; +# } +# else +# { +# # DO NOTHING FOR NANQUE - dunno why but phone 4698254386 shows only under one rep despite call length +# } + } + else + { + array_push($uniqueid_array, $calls_row["uniqueid"]); + $total_answered_calls++; + $answered_coverage_calls++; + $total_answered_wait_time+=$calls_row["queue_seconds"]; + if ($calls_row["direction"]=="O") + { + $answered_outbound_calls++; + } + else + { + $answered_inbound_calls++; + } + $call_was_answered=1; + + $transferred_counts["$transfer_status"]++; + + # Use full name here so we can sort in the 'Agents on queue' section painlessly. + $agent_full_name=$fullname_info["$calls_row[user]"]; + $agent_call_counts["$agent_full_name"]++; + $agent_call_lengths["$agent_full_name"]+=$calls_row["length_in_sec"]; + + # Events? + $agent_events["$calls_row[user]"][0]=0; + $agent_events["$calls_row[user]"][1]=0; + + $term_reasons["$calls_row[term_reason]"]++; + + $queue_stats["$calls_row[campaign_id]"]++; + + $total_queue_stats["$campaign_name"]["calls"]++; + $total_queue_stats["$campaign_name"]["answered"]++; + $total_queue_stats["$campaign_name"]["unanswered"]+=0; + $total_queue_stats["$campaign_name"]["call_time"]+=$calls_row["length_in_sec"]; + $total_queue_stats["$campaign_name"]["wait_time"]+=$calls_row["queue_seconds"]; + + if ($calls_row["direction"]=="O") {$call_directions["Outbound calls"]++;} else {$call_directions["Inbound calls"]++;} + + $call_stints["$stint"]++; + + $total_answered_position+=$calls_row["queue_position"]; + $queue_positions["$calls_row[queue_position]"]++; + } + + if ($calls_row["length_in_sec"]>$max_call_length && $call_was_answered) {$max_call_length=$calls_row["length_in_sec"];} + if ($calls_row["length_in_sec"]<$min_call_length && $call_was_answered) {$min_call_length=$calls_row["length_in_sec"];} + + if ($calls_row["queue_seconds"]>$max_wait_time && $call_was_answered) {$max_wait_time=$calls_row["queue_seconds"];} + if ($calls_row["queue_seconds"]<$min_wait_time && $call_was_answered) {$min_wait_time=$calls_row["queue_seconds"];} + + if ($calls_row["queue_position"]>$max_position && $call_was_answered) {$max_position=$calls_row["queue_position"];} + if ($calls_row["queue_position"]<$min_position && $call_was_answered) {$min_position=$calls_row["queue_position"];} + + # Unanswered - don't need call length + # if ($calls_row["length_in_sec"]>$max_unanswered_call_length && !$call_was_answered) {$max_unanswered_call_length=$calls_row["length_in_sec"];} + # if ($calls_row["length_in_sec"]<$min_unanswered_call_length && !$call_was_answered) {$min_unanswered_call_length=$calls_row["length_in_sec"];} + + if ($calls_row["queue_seconds"]>$max_unanswered_wait_time && !$call_was_answered) {$max_unanswered_wait_time=$calls_row["queue_seconds"];} + if ($calls_row["queue_seconds"]<$min_unanswered_wait_time && !$call_was_answered) {$min_unanswered_wait_time=$calls_row["queue_seconds"];} + + if ($calls_row["queue_position"]>$max_unanswered_position && !$call_was_answered) {$max_unanswered_position=$calls_row["queue_position"];} + if ($calls_row["queue_position"]<$min_unanswered_position && !$call_was_answered) {$min_unanswered_position=$calls_row["queue_position"];} + + ### FILTER FOR FULLY WITHIN-INTERVAL CALLS, SHOULD BE EXACTLY THE SAME (FOR NOW) + if ($calls_row["within_interval"]) + { + $total_calls_wi++; + $total_call_length_wi+=$calls_row["length_in_sec"]; + $total_wait_time_wi+=$calls_row["queue_seconds"]; + $total_position_wi+=$calls_row["queue_position"]; + + if (preg_match('/VDAD|VDCL/', $calls_row["user"])) # && preg_match('/^DROP$|TIMEOT|WAITTO/', $calls_row["status"]) + { + $total_unanswered_calls_wi++; + $total_unanswered_position_wi+=$calls_row["queue_position"]; + $total_unanswered_wait_time_wi+=$calls_row["queue_seconds"]; + # if (preg_match('/^DROP$/', $calls_row["status"])) {$unanswered_coverage_calls_wi++;} + } + else + { + $total_answered_calls_wi++; + $total_answered_position_wi+=$calls_row["queue_position"]; + $total_answered_wait_time_wi+=$calls_row["queue_seconds"]; + $answered_coverage_calls_wi++; + } + + if ($calls_row["length_in_sec"]>$max_call_length_wi && $call_was_answered) {$max_call_length_wi=$calls_row["length_in_sec"];} + if ($calls_row["length_in_sec"]<$min_call_length_wi && $call_was_answered) {$min_call_length_wi=$calls_row["length_in_sec"];} + + if ($calls_row["queue_seconds"]>$max_wait_time_wi && $call_was_answered) {$max_wait_time_wi=$calls_row["queue_seconds"];} + if ($calls_row["queue_seconds"]<$min_wait_time_wi && $call_was_answered) {$min_wait_time_wi=$calls_row["queue_seconds"];} + + if ($calls_row["queue_position"]>$max_position_wi) {$max_position_wi=$calls_row["queue_position"];} + if ($calls_row["queue_position"]<$min_position_wi) {$min_position_wi=$calls_row["queue_position"];} + + # Unanswered + # if ($calls_row["length_in_sec"]>$max_unanswered_call_length_wi && !$call_was_answered) {$max_unanswered_call_length_wi=$calls_row["length_in_sec"];} + # if ($calls_row["length_in_sec"]<$min_unanswered_call_length_wi && !$call_was_answered) {$min_unanswered_call_length_wi=$calls_row["length_in_sec"];} + + if ($calls_row["queue_seconds"]>$max_unanswered_wait_time_wi && !$call_was_answered) {$max_unanswered_wait_time_wi=$calls_row["queue_seconds"];} + if ($calls_row["queue_seconds"]<$min_unanswered_wait_time_wi && !$call_was_answered) {$min_unanswered_wait_time_wi=$calls_row["queue_seconds"];} + + if ($calls_row["queue_position"]>$max_unanswered_position_wi && !$call_was_answered) {$max_unanswered_position_wi=$calls_row["queue_position"];} + if ($calls_row["queue_position"]<$min_unanswered_position_wi && !$call_was_answered) {$min_unanswered_position_wi=$calls_row["queue_position"];} + } + } + +$average_call_length=sprintf("%.1f", MathZDC($total_call_length, $total_answered_calls)); # Total calls instead? +$average_wait_time=sprintf("%.1f", MathZDC($total_wait_time, $total_answered_calls)); # Total calls instead? +$average_position=sprintf("%.1f", MathZDC($total_answered_position, $total_answered_calls)); +$total_call_length_fmt=sprintf("%.1f", ($total_call_length/3600)); +$total_wait_time_fmt=sprintf("%.1f", ($total_wait_time/3600)); +$answered_coverage=sprintf("%.1f", MathZDC((100*$answered_coverage_calls), $total_answered_calls)); + +$average_call_length_wi=sprintf("%.1f", MathZDC($total_call_length_wi, $total_answered_calls_wi)); # Total calls instead? +$average_wait_time_wi=sprintf("%.1f", MathZDC($total_wait_time_wi, $total_answered_calls_wi)); # Total calls instead? +$average_position_wi=sprintf("%.1f", MathZDC($total_answered_position_wi, $total_answered_calls_wi)); +$total_call_length_fmt_wi=sprintf("%.1f", ($total_call_length_wi/3600)); +$total_wait_time_fmt_wi=sprintf("%.1f", ($total_wait_time_wi/3600)); +$answered_coverage_wi=sprintf("%.1f", MathZDC((100*$answered_coverage_calls_wi), $total_answered_calls_wi)); + +# Unanswered +$average_unanswered_call_length=sprintf("%.1f", MathZDC($total_unanswered_call_length, $total_unanswered_calls)); # Total calls instead? +$average_unanswered_wait_time=sprintf("%.1f", MathZDC($total_unanswered_wait_time, $total_unanswered_calls)); # Total calls instead? +$average_unanswered_position=sprintf("%.1f", MathZDC($total_unanswered_position, $total_unanswered_calls)); +$total_unanswered_call_length_fmt=sprintf("%.1f", ($total_unanswered_call_length/3600)); +$total_unanswered_wait_time_fmt=sprintf("%.1f", ($total_unanswered_wait_time/3600)); +$unanswered_coverage=sprintf("%.1f", MathZDC((100*$unanswered_coverage_calls), $total_unanswered_calls)); + +$average_unanswered_call_length_wi=sprintf("%.1f", MathZDC($total_unanswered_call_length_wi, $total_unanswered_calls_wi)); # Total calls instead? +$average_unanswered_wait_time_wi=sprintf("%.1f", MathZDC($total_unanswered_wait_time_wi, $total_unanswered_calls_wi)); # Total calls instead? +$average_unanswered_position_wi=sprintf("%.1f", MathZDC($total_unanswered_position_wi, $total_unanswered_calls_wi)); +$total_unanswered_call_length_fmt_wi=sprintf("%.1f", ($total_unanswered_call_length_wi/3600)); +$total_unanswered_wait_time_fmt_wi=sprintf("%.1f", ($total_unanswered_wait_time_wi/3600)); +$unanswered_coverage_wi=sprintf("%.1f", MathZDC((100*$unanswered_coverage_calls_wi), $total_unanswered_calls_wi)); + +# Wipe unadjusted variables (i.e. no records) +$min_call_length=($min_call_length==1000000 ? "0" : $min_call_length); +$min_wait_time=($min_wait_time==1000000 ? "0" : $min_wait_time); +$min_position=($min_position==1000000 ? "0" : $min_position); +$min_unanswered_call_length=($min_unanswered_call_length==1000000 ? "0" : $min_unanswered_call_length); +$min_unanswered_wait_time=($min_unanswered_wait_time==1000000 ? "0" : $min_unanswered_wait_time); +$min_unanswered_position=($min_unanswered_position==1000000 ? "0" : $min_unanswered_position); + +$min_call_length_wi=($min_call_length_wi==1000000 ? "0" : $min_call_length_wi); +$min_wait_time_wi=($min_wait_time_wi==1000000 ? "0" : $min_wait_time_wi); +$min_position_wi=($min_position_wi==1000000 ? "0" : $min_position_wi); +$min_unanswered_call_length_wi=($min_unanswered_call_length_wi==1000000 ? "0" : $min_unanswered_call_length_wi); +$min_unanswered_wait_time_wi=($min_unanswered_wait_time_wi==1000000 ? "0" : $min_unanswered_wait_time_wi); +$min_unanswered_position_wi=($min_unanswered_position_wi==1000000 ? "0" : $min_unanswered_position_wi); + + +$HTML_output.="

"._QXZ("All calls")." $NWB#VERM_UNANSWERED-all_calls$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.=""; +$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.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +### Commented out 5/19/22 - not needed +### $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.=""; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("All calls").": 
"._QXZ("N. calls unanswered").":".$total_unanswered_calls."
"._QXZ("Average call waiting time before disconnection").": $NWB#VERM_UNANSWERED-all_calls_waiting_time$NWE".$average_unanswered_wait_time." s
"._QXZ("Min waiting time before disconnection").":".($min_unanswered_wait_time>=3600 ? floor($min_unanswered_wait_time/3600).":" : "").gmdate("i:s", $min_unanswered_wait_time)."
"._QXZ("Max waiting time before disconnection").":".($max_unanswered_wait_time>=3600 ? floor($max_unanswered_wait_time/3600).":" : "").gmdate("i:s", $max_unanswered_wait_time)."
"._QXZ("Total waiting time before disconnection").":".$total_unanswered_wait_time_fmt." H
"._QXZ("Average initial position").": $NWB#VERM_UNANSWERED-all_calls_position$NWE".$average_unanswered_position."
"._QXZ("Min initial position").":".$min_unanswered_position."
"._QXZ("Max initial position").":".$max_unanswered_position."
Coverage: $NWB#VERM_UNANSWERED-coverage$NWE".$unanswered_coverage." %
Average queue position at disconnection: $NWB#VERM_UNANSWERED-position$NWE".$average_unanswered_position."
Min queue position at disconnection:".$min_unanswered_position."
Max queue position at disconnection:".$max_unanswered_position."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +$CSV_output["all_calls"]="\""._QXZ("All calls")."\",\"\"\n"; +$CSV_output["all_calls"].="\""._QXZ("N. calls answered by operators").":\",\"$total_unanswered_calls\"\n"; +# $CSV_output["all_calls"].="\""._QXZ("Average call length").":\",\"$average_unanswered_call_length s.\"\n"; +# $CSV_output["all_calls"].="\""._QXZ("Min call length").":\",\"".($min_unanswered_call_length>=3600 ? floor($min_unanswered_call_length/3600).":" : "").gmdate("i:s", $min_unanswered_call_length)."\"\n"; +# $CSV_output["all_calls"].="\""._QXZ("Max call length").":\",\"".($max_unanswered_call_length>=3600 ? floor($max_unanswered_call_length/3600).":" : "").gmdate("i:s", $max_unanswered_call_length)."\"\n"; +# $CSV_output["all_calls"].="\""._QXZ("Total call length").":\",\"".$total_unanswered_call_length_fmt." H\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Average call waiting time").":\",\"".$average_unanswered_wait_time." s\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Min waiting time").":\",\"".($min_unanswered_wait_time>=3600 ? floor($min_unanswered_wait_time/3600).":" : "").gmdate("i:s", $min_unanswered_wait_time)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Max waiting time").":\",\"".($max_unanswered_wait_time>=3600 ? floor($max_unanswered_wait_time/3600).":" : "").gmdate("i:s", $max_unanswered_wait_time)."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Total waiting time").":\",\"".$total_unanswered_wait_time_fmt." H\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Average initial position").":\",\"".$average_unanswered_position."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Min initial position").":\",\"".$min_unanswered_position."\"\n"; +$CSV_output["all_calls"].="\""._QXZ("Max initial position").":\",\"".$max_unanswered_position."\"\n"; + +### Commented out 5/19/22 - not needed +### $CSV_output["all_calls"].="\""._QXZ("Coverage").":\",\"".$coverage." H\"\n"; +###################### + +$HTML_output.="

"._QXZ("Calls fully within the given time interval")."

"; +$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.=""; +$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.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +### Commented out 5/19/22 - not needed +### $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.=""; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("All calls").": $NWB#VERM_UNANSWERED-all_calls_wi$NWE 
"._QXZ("N. calls unanswered").":".$total_unanswered_calls_wi."
"._QXZ("Average call waiting time before disconnection").": $NWB#VERM_UNANSWERED-all_calls_waiting_time_wi$NWE".$average_unanswered_wait_time_wi." s
"._QXZ("Min waiting time before disconnection").":".($min_unanswered_wait_time_wi>=3600 ? floor($min_unanswered_wait_time_wi/3600).":" : "").gmdate("i:s", $min_unanswered_wait_time_wi)."
"._QXZ("Max waiting time before disconnection").":".($max_unanswered_wait_time_wi>=3600 ? floor($max_unanswered_wait_time_wi/3600).":" : "").gmdate("i:s", $max_unanswered_wait_time_wi)."
"._QXZ("Total waiting time before disconnection").":".$total_unanswered_wait_time_fmt_wi." H
"._QXZ("Average initial position").": $NWB#VERM_UNANSWERED-all_calls_position_wi$NWE".$average_unanswered_position_wi."
"._QXZ("Min initial position").":".$min_unanswered_position_wi."
"._QXZ("Max initial position").":".$max_unanswered_position."
Coverage: $NWB#VERM_UNANSWERED-coverage_wi$NWE".$unanswered_coverage_wi." %
Average queue position at disconnection: $NWB#VERM_UNANSWERED-position_wi$NWE".$average_unanswered_position_wi."
Min queue position at disconnection:".$min_unanswered_position_wi."
Max queue position at disconnection:".$max_unanswered_position_wi."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +$CSV_output["all_calls_wi"]="\""._QXZ("All unanswered calls fully within the given time interval")."\",\"\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("N. calls unanswered by operators").":\",\"$total_unanswered_calls_wi\"\n"; +# $CSV_output["all_calls_wi"].="\""._QXZ("Average call length").":\",\"$average_unanswered_call_length_wi s.\"\n"; +# $CSV_output["all_calls_wi"].="\""._QXZ("Min call length").":\",\"".($min_unanswered_call_length_wi>=3600 ? floor($min_unanswered_call_length_wi/3600).":" : "").gmdate("i:s", $min_unanswered_call_length_wi)."\"\n"; +# $CSV_output["all_calls_wi"].="\""._QXZ("Max call length").":\",\"".($max_unanswered_call_length_wi>=3600 ? floor($max_unanswered_call_length_wi/3600).":" : "").gmdate("i:s", $max_unanswered_call_length_wi)."\"\n"; +# $CSV_output["all_calls_wi"].="\""._QXZ("Total call length").":\",\"".$total_unanswered_call_length_fmt_wi." H\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Average call waiting time").":\",\"".$average_unanswered_wait_time_wi." s\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Min waiting time").":\",\"".($min_unanswered_wait_time_wi>=3600 ? floor($min_unanswered_wait_time_wi/3600).":" : "").gmdate("i:s", $min_unanswered_wait_time_wi)."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Max waiting time").":\",\"".($max_unanswered_wait_time_wi>=3600 ? floor($max_unanswered_wait_time_wi/3600).":" : "").gmdate("i:s", $max_unanswered_wait_time_wi)."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Total waiting time").":\",\"".$total_unanswered_wait_time_fmt_wi." H\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Average initial position").":\",\"".$average_unanswered_position_wi."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Min initial position").":\",\"".$min_unanswered_position_wi."\"\n"; +$CSV_output["all_calls_wi"].="\""._QXZ("Max initial position").":\",\"".$max_unanswered_position_wi."\"\n"; + +### Commented out 5/19/22 - not needed +### $CSV_output["all_calls_wi"].="\""._QXZ("Coverage").":\",\"".$coverage_wi." H\"\n"; +###################### + +/* +#### AGENTS ON QUEUE #### +switch ($sort_agents_on_queue) + { + case "ncalls": + $ncalls_sort_value="ncalls_desc"; + $agent_sort_value="agent"; + $ncalls_char="↑"; + $agent_char=""; + asort($agent_call_counts); + break; + case "ncalls_desc": + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent"; + $ncalls_char="↓"; + $agent_char=""; + arsort($agent_call_counts); + break; + case "agent": + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent_desc"; + $ncalls_char=""; + $agent_char="↑"; + ksort($agent_call_counts, SORT_NATURAL | SORT_FLAG_CASE); + break; + case "agent_desc": + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent"; + $ncalls_char=""; + $agent_char="↓"; + krsort($agent_call_counts, SORT_NATURAL | SORT_FLAG_CASE); + break; + default: + $ncalls_sort_value="ncalls"; + $agent_sort_value="agent"; + $ncalls_char=""; + $agent_char=""; + ksort($agent_call_counts, SORT_NATURAL | SORT_FLAG_CASE); + break; + } + +$HTML_output.="

Agents on queue: $NWB#VERM_UNANSWERED-calls_by_queue$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.=""; + +$CSV_output["agents_on_queue"]="\"Agents on queue\"\n"; +$CSV_output["agents_on_queue"].="\"Agent\",\"N. Calls\",\"\",\"...\",\"Total call time\",\"Average call time\"\n"; + +$highest_agent_call_count=max($agent_call_counts); + +$agents_on_queue_graph_labels="["; +$agents_on_queue_graph_data="["; +$agents_on_queue_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$agents_on_queue_graph_hovborder="["; +$x=0; +foreach ($agent_call_counts as $agentName => $value) + { + $call_count_percent=sprintf("%.1f", (100*$value)/$total_answered_calls); + $agent_total_call_length=$agent_call_lengths["$agentName"]; + $agent_total_call_length_fmt=($agent_total_call_length>=3600 ? floor($agent_total_call_length/3600).":" : "").gmdate("i:s", $agent_total_call_length); + $agent_avg_call_length=round($agent_total_call_length/$value); + $agent_avg_call_length_fmt=($agent_avg_call_length>=3600 ? floor($agent_avg_call_length/3600).":" : "").gmdate("i:s", $agent_avg_call_length); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["agents_on_queue"].="\"".$agentName."\",\"".$value."\",\"".$call_count_percent." %\",\"\",\"".$agent_total_call_length_fmt."\",\"".$agent_avg_call_length_fmt."\"\n"; + + $agents_on_queue_graph_labels.="\"$agentName\","; + $agents_on_queue_graph_data.="\"$value\","; + $agents_on_queue_graph_bgcolor.="\"".$background_colors[$x]."\","; + $agents_on_queue_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$agents_on_queue_graph_labels=preg_replace('/,$/', '', $agents_on_queue_graph_labels)."]"; +$agents_on_queue_graph_data=preg_replace('/,$/', '', $agents_on_queue_graph_data)."]"; +$agents_on_queue_graph_bgcolor=preg_replace('/,$/', '', $agents_on_queue_graph_bgcolor)."]"; +$agents_on_queue_graph_hovborder=preg_replace('/,$/', '', $agents_on_queue_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
Agent ".$agent_char."N. Calls ".$ncalls_char." ...Total call timeAverage call time
".$agentName."".$value."".$call_count_percent." %".$agent_total_call_length_fmt."".$agent_avg_call_length_fmt."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +#### SERVICE LEVEL #### +$HTML_output.="

Service Level Agreement (inbound calls only): $NWB#VERM_UNANSWERED-inclusive_SLA$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.=""; + +$CSV_output["service_level_agreement"]="\"Service Level Agreement (inbound calls only)\"\n"; +$CSV_output["service_level_agreement"].="\"Answer\",\"N. Calls\",\"Delta\",\"Percent\",\"Of Offered\",\"...\"\n"; + +# $SLA_query is in VERM_global_vars.inc +$svc_lvl_stmt="select $SLA_query from vicidial_closer_log $vicidial_closer_log_SQL and (user!='VDCL' $or_NANQUE_clause)"; # and campaign_id in ($ingroup_str) and user in ('VDCL', $user_str) +if ($DB) {$HTML_output.="$svc_lvl_stmt";} +$svc_lvl_rslt=mysqli_query($link, $svc_lvl_stmt); +$svc_lvl_row=mysqli_fetch_assoc($svc_lvl_rslt); + +$service_level_agreement_graph_labels="["; +$service_level_agreement_graph_delta_data="["; +$service_level_agreement_graph_delta_bgcolor="["; # SAME FOR hoverBackgroundColor +$service_level_agreement_graph_delta_hovborder="["; +$service_level_agreement_graph_percent_data="["; +$service_level_agreement_graph_percent_bgcolor="["; # SAME FOR hoverBackgroundColor +$service_level_agreement_graph_percent_hovborder="["; + +$x=0; +foreach($svc_lvl_row as $interval => $sum) + { + $int_name=ucwords(preg_replace("/_/", " ", $interval)); + if ($prev_int) {$delta="+ ".($sum-$prev_int);} else {$delta=" ";} + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["service_level_agreement"].="\"$int_name seconds:\",\"$sum\",\"$delta\",\"".sprintf("%.1f", ((100*$sum)/$answered_inbound_calls))." %\",\"".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))." %\"\n"; + + $service_level_agreement_graph_labels.="\"$int_name\","; + $service_level_agreement_graph_delta_data.="\"".($prev_int ? ($sum-$prev_int) : "0")."\","; + $service_level_agreement_graph_delta_bgcolor.="\"#33CCCC\","; + $service_level_agreement_graph_delta_hovborder.="\"#66FFFF\","; + $service_level_agreement_graph_percent_data.="\"".sprintf("%.1f", ((100*$sum)/$answered_inbound_calls))."\","; + $service_level_agreement_graph_percent_bgcolor.="\"#FFCC66\","; + $service_level_agreement_graph_percent_hovborder.="\"#FFFF99\","; + + $prev_int=$sum; + $x++; + } + +$service_level_agreement_graph_labels=preg_replace('/,$/', '', $service_level_agreement_graph_labels)."]"; +$service_level_agreement_graph_delta_data=preg_replace('/,$/', '', $service_level_agreement_graph_delta_data)."]"; +$service_level_agreement_graph_delta_bgcolor=preg_replace('/,$/', '', $service_level_agreement_graph_delta_bgcolor)."]"; +$service_level_agreement_graph_delta_hovborder=preg_replace('/,$/', '', $service_level_agreement_graph_delta_hovborder)."]"; +$service_level_agreement_graph_percent_data=preg_replace('/,$/', '', $service_level_agreement_graph_percent_data)."]"; +$service_level_agreement_graph_percent_bgcolor=preg_replace('/,$/', '', $service_level_agreement_graph_percent_bgcolor)."]"; +$service_level_agreement_graph_percent_hovborder=preg_replace('/,$/', '', $service_level_agreement_graph_percent_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
AnswerN. CallsDeltaPercentOf Offered...
$int_name seconds:".$sum."$delta  ".sprintf("%.1f", ((100*$sum)/$answered_inbound_calls))." %".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### +*/ + +#### DISCONNECTIONS ### +$HTML_output.="

"._QXZ("Disconnection causes").": $NWB#VERM_UNANSWERED-disconnections$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["disconnection_causes"]="\""._QXZ("Disconnection causes").":\"\n"; +$CSV_output["disconnection_causes"].="\""._QXZ("Cause")."\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$disconnection_causes_graph_labels="["; +$disconnection_causes_graph_data="["; +$disconnection_causes_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$disconnection_causes_graph_hovborder="["; + +$max_term_reason=max($unanswered_term_reasons); +$x=0; +foreach ($unanswered_term_reasons as $reason => $value) + { + $term_reason_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["disconnection_causes"].="\"".$reason."\",\"".$value."\",\"".$term_reason_pct." %\"\n"; + + $disconnection_causes_graph_labels.="\"$reason\","; + $disconnection_causes_graph_data.="\"$value\","; + $disconnection_causes_graph_bgcolor.="\"".$background_colors[$x]."\","; + $disconnection_causes_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$disconnection_causes_graph_labels=preg_replace('/,$/', '', $disconnection_causes_graph_labels)."]"; +$disconnection_causes_graph_data=preg_replace('/,$/', '', $disconnection_causes_graph_data)."]"; +$disconnection_causes_graph_bgcolor=preg_replace('/,$/', '', $disconnection_causes_graph_bgcolor)."]"; +$disconnection_causes_graph_hovborder=preg_replace('/,$/', '', $disconnection_causes_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Cause").""._QXZ("N. Calls")." ...
".$reason."".$value."".$term_reason_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +/* +#### TRANSFERS ### +$HTML_output.="

Transfers:

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["transfers"]="\"Transfers:\"\n"; +$CSV_output["transfers"].="\"Transfer to:\",\"N. Calls\",\"\",\"...\"\n"; + +$max_xfer_count=max($transferred_counts); +$x=0; +foreach ($transferred_counts as $reason => $value) + { + $xfer_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["transfers"].="\"".$reason."\",\"".$value."\",\"".$xfer_pct." %\",\"...\"\n"; + + $x++; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
Transfer to:N. Calls ...
".$reason."".$value."".$xfer_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +###################### +*/ + +#### UNANSWERED CALLS BY CAMPAIGN/INGROUP ### +$HTML_output.="

"._QXZ("Unanswered calls, by campaign/ingroup").": $NWB#VERM_UNANSWERED-calls_by_queue$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["unanswered_calls_by_queue"]="\""._QXZ("Unanswered calls, by queue").":\"\n"; +$CSV_output["unanswered_calls_by_queue"].="\"\",\""._QXZ("Campaign/ingroup")."\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$unanswered_calls_by_queue_graph_labels="["; +$unanswered_calls_by_queue_graph_data="["; +$unanswered_calls_by_queue_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$unanswered_calls_by_queue_graph_hovborder="["; + +$max_queue_count=max($unanswered_queue_stats); +ksort($unanswered_queue_stats); +$x=0; +foreach ($unanswered_queue_stats as $queue => $value) + { + $queue_pct=sprintf("%.1f", (100*$value)/$total_unanswered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $CSV_output["unanswered_calls_by_queue"].="\"\",\"".$queue_names["$queue"]."\",\"".$value."\",\"".$queue_pct." %\",\"\"\n"; + + $unanswered_calls_by_queue_graph_labels.="\"".$queue_names["$queue"]."\","; + $unanswered_calls_by_queue_graph_data.="\"$value\","; + $unanswered_calls_by_queue_graph_bgcolor.="\"".$background_colors[$x]."\","; + $unanswered_calls_by_queue_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$unanswered_calls_by_queue_graph_labels=preg_replace('/,$/', '', $unanswered_calls_by_queue_graph_labels)."]"; +$unanswered_calls_by_queue_graph_data=preg_replace('/,$/', '', $unanswered_calls_by_queue_graph_data)."]"; +$unanswered_calls_by_queue_graph_bgcolor=preg_replace('/,$/', '', $unanswered_calls_by_queue_graph_bgcolor)."]"; +$unanswered_calls_by_queue_graph_hovborder=preg_replace('/,$/', '', $unanswered_calls_by_queue_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
 "._QXZ("Campaign/ingroup").""._QXZ("N. Calls")." ...
".($SOME_IMAGE_GOES_HERE)."".$queue_names["$queue"]."".$value."".$queue_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +#### UNANSWERED CALLS BY AGENT ### +$HTML_output.="

"._QXZ("Unanswered calls, by agent").": $NWB#VERM_UNANSWERED-calls_by_agent$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["unanswered_calls_by_agent"]="\""._QXZ("Unanswered calls, by agent").":\"\n"; +$CSV_output["unanswered_calls_by_agent"].="\"\",\""._QXZ("Campaign/ingroup")."\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$max_queue_count=max($unanswered_calls_by_agent); +ksort($unanswered_calls_by_agent); +$x=0; +foreach ($unanswered_calls_by_agent as $user => $value) + { + $queue_pct=sprintf("%.1f", (100*$value)/$total_unanswered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $CSV_output["unanswered_calls_by_agent"].="\"\",\"".$fullname_info["$queue"]."\",\"".$value."\",\"".$queue_pct." %\",\"\"\n"; + + $x++; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
 "._QXZ("Campaign/ingroup").""._QXZ("N. Calls")." ...
".($SOME_IMAGE_GOES_HERE)."".$fullname_info["$user"]."".$value."".$queue_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +##################### + +#### UNANSWERED CALLS - DISTRIBUTION BY LENGTH ### +$HTML_output.="

"._QXZ("Unanswered calls - distribution by length (inbound calls only)").": $NWB#VERM_UNANSWERED-calls_by_length$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.=""; + +$CSV_output["unanswered_calls_by_distribution"]="\""._QXZ("Unanswered calls - distribution by length")."\"\n"; +$CSV_output["unanswered_calls_by_distribution"].="\""._QXZ("Hangup")."\",\""._QXZ("N. Calls")."\",\""._QXZ("Delta")."\",\""._QXZ("Percent")."\",\""._QXZ("Of Offered")."\",\"...\"\n"; + +# $SLA_query is in VERM_global_vars.inc +$svc_lvl_stmt="select $SLA_query from vicidial_closer_log $vicidial_closer_log_SQL and (user='VDCL' $and_NANQUE_clause) $exc_addtl_statuses"; # and campaign_id in ($ingroup_str) and user in ('VDCL', $user_str) +if ($DB) {$HTML_output.="$svc_lvl_stmt";} +$svc_lvl_rslt=mysqli_query($link, $svc_lvl_stmt); +#print ($svc_lvl_stmt)."\n"; +$svc_lvl_row=mysqli_fetch_assoc($svc_lvl_rslt); +#print_r($svc_lvl_row); +# { +# print "$interval - $sum\n"; +# } + +$unanswered_calls_by_distribution_graph_labels="["; +$unanswered_calls_by_distribution_graph_delta_data="["; +$unanswered_calls_by_distribution_graph_delta_bgcolor="["; # SAME FOR hoverBackgroundColor +$unanswered_calls_by_distribution_graph_delta_hovborder="["; +$unanswered_calls_by_distribution_graph_percent_data="["; +$unanswered_calls_by_distribution_graph_percent_bgcolor="["; # SAME FOR hoverBackgroundColor +$unanswered_calls_by_distribution_graph_percent_hovborder="["; + +$x=0; +foreach($svc_lvl_row as $interval => $sum) + { + $int_name=ucwords(preg_replace("/_/", " ", $interval)); + if ($prev_int || $x>0) {$delta="+ ".($sum-$prev_int);} else {$delta=" ";} + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["unanswered_calls_by_distribution"].="\"$int_name seconds:\",\"$sum\",\"$delta\",\"".sprintf("%.1f", ((100*$sum)/$unanswered_inbound_calls))." %\",\"".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))." %\"\n"; + + $unanswered_calls_by_distribution_graph_labels.="\"$int_name\","; + $unanswered_calls_by_distribution_graph_delta_data.="\"".($prev_int || $x>0 ? ($sum-$prev_int) : "0")."\","; + $unanswered_calls_by_distribution_graph_delta_bgcolor.="\"#33CCCC\","; + $unanswered_calls_by_distribution_graph_delta_hovborder.="\"#66FFFF\","; + $unanswered_calls_by_distribution_graph_percent_data.="\"".sprintf("%.1f", ((100*$sum)/$unanswered_inbound_calls))."\","; + $unanswered_calls_by_distribution_graph_percent_bgcolor.="\"#FFCC66\","; + $unanswered_calls_by_distribution_graph_percent_hovborder.="\"#FFFF99\","; + + $prev_int=$sum; + $x++; + } + +$unanswered_calls_by_distribution_graph_labels=preg_replace('/,$/', '', $unanswered_calls_by_distribution_graph_labels)."]"; +$unanswered_calls_by_distribution_graph_delta_data=preg_replace('/,$/', '', $unanswered_calls_by_distribution_graph_delta_data)."]"; +$unanswered_calls_by_distribution_graph_delta_bgcolor=preg_replace('/,$/', '', $unanswered_calls_by_distribution_graph_delta_bgcolor)."]"; +$unanswered_calls_by_distribution_graph_delta_hovborder=preg_replace('/,$/', '', $unanswered_calls_by_distribution_graph_delta_hovborder)."]"; +$unanswered_calls_by_distribution_graph_percent_data=preg_replace('/,$/', '', $unanswered_calls_by_distribution_graph_percent_data)."]"; +$unanswered_calls_by_distribution_graph_percent_bgcolor=preg_replace('/,$/', '', $unanswered_calls_by_distribution_graph_percent_bgcolor)."]"; +$unanswered_calls_by_distribution_graph_percent_hovborder=preg_replace('/,$/', '', $unanswered_calls_by_distribution_graph_percent_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Hangup").""._QXZ("N. Calls").""._QXZ("Delta").""._QXZ("Percent").""._QXZ("Of Offered")."...
$int_name "._QXZ("seconds").":".$sum."$delta  ".sprintf("%.1f", ((100*$sum)/$unanswered_inbound_calls))." %".sprintf("%.1f", ((100*$sum)/$total_unanswered_calls))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +############################### + +#### SERVICE LEVEL #### +$HTML_output.="

"._QXZ("Inclusive SLA (computed on both answered and unanswered calls, inbound only)").": $NWB#VERM_UNANSWERED-inclusive_SLA$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["service_level_agreement"]="\""._QXZ("Inclusive SLA (computed on both answered and unanswered calls, inbound only)")."\"\n"; +$CSV_output["service_level_agreement"].="\""._QXZ("Answer")."\",\""._QXZ("N. Calls")."\",\""._QXZ("Delta")."\",\""._QXZ("Percent")."\",\""._QXZ("Of Offered")."\",\"...\"\n"; + +# $SLA_query is in VERM_global_vars.inc +$svc_lvl_stmt="select $SLA_query from vicidial_closer_log $vicidial_closer_log_SQL $and_NANQUE_clause $exc_addtl_statuses"; # and campaign_id in ($ingroup_str) and user in ('VDCL', $user_str) +if ($DB) {$HTML_output.="$svc_lvl_stmt";} +$svc_lvl_rslt=mysqli_query($link, $svc_lvl_stmt); +$svc_lvl_row=mysqli_fetch_assoc($svc_lvl_rslt); + +$service_level_agreement_graph_labels="["; +$service_level_agreement_graph_delta_data="["; +$service_level_agreement_graph_delta_bgcolor="["; # SAME FOR hoverBackgroundColor +$service_level_agreement_graph_delta_hovborder="["; +$service_level_agreement_graph_percent_data="["; +$service_level_agreement_graph_percent_bgcolor="["; # SAME FOR hoverBackgroundColor +$service_level_agreement_graph_percent_hovborder="["; + +$x=0; +$sum=0; $prev_int=""; +foreach($svc_lvl_row as $interval => $sum) + { + $int_name=ucwords(preg_replace("/_/", " ", $interval)); + if ($prev_int) {$delta="+ ".($sum-$prev_int);} else {$delta=" ";} + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["service_level_agreement"].="\"$int_name seconds:\",\"$sum\",\"$delta\",\"".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))." %\"\n"; + + $service_level_agreement_graph_labels.="\"$int_name\","; + $service_level_agreement_graph_delta_data.="\"".($prev_int ? ($sum-$prev_int) : "0")."\","; + $service_level_agreement_graph_delta_bgcolor.="\"#33CCCC\","; + $service_level_agreement_graph_delta_hovborder.="\"#66FFFF\","; + $service_level_agreement_graph_percent_data.="\"".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))."\","; + $service_level_agreement_graph_percent_bgcolor.="\"#FFCC66\","; + $service_level_agreement_graph_percent_hovborder.="\"#FFFF99\","; + + $prev_int=$sum; + $x++; + } + +$service_level_agreement_graph_labels=preg_replace('/,$/', '', $service_level_agreement_graph_labels)."]"; +$service_level_agreement_graph_delta_data=preg_replace('/,$/', '', $service_level_agreement_graph_delta_data)."]"; +$service_level_agreement_graph_delta_bgcolor=preg_replace('/,$/', '', $service_level_agreement_graph_delta_bgcolor)."]"; +$service_level_agreement_graph_delta_hovborder=preg_replace('/,$/', '', $service_level_agreement_graph_delta_hovborder)."]"; +$service_level_agreement_graph_percent_data=preg_replace('/,$/', '', $service_level_agreement_graph_percent_data)."]"; +$service_level_agreement_graph_percent_bgcolor=preg_replace('/,$/', '', $service_level_agreement_graph_percent_bgcolor)."]"; +$service_level_agreement_graph_percent_hovborder=preg_replace('/,$/', '', $service_level_agreement_graph_percent_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Answer").""._QXZ("N. Calls").""._QXZ("Delta").""._QXZ("Percent")."...
$int_name "._QXZ("seconds").":".$sum."$delta  ".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +#### UNANSWERED CALLS BY KEYPRESS ### +$HTML_output.="

"._QXZ("Unanswered calls by keypress/option").": $NWB#VERM_UNANSWERED-calls_by_keypress$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["unanswered_calls_by_keypress"].="\""._QXZ("Key")."\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$keypress_stmt="select extension, count(*) as ct From live_inbound_log where uniqueid in ('".implode("', '", $unanswered_uniqueid_array)."') and extension not in ('s', 'i', 't') and comment_a='CALLMENU' group by extension order by extension"; +if ($DB) {$HTML_output.="$keypress_stmt";} +$keypress_rslt=mysql_to_mysqli($keypress_stmt, $link); +while ($kp_row=mysqli_fetch_array($keypress_rslt)) + { + $kp_array["$kp_row[extension]"]+=$kp_row["ct"]; + } +$total_kps=array_sum($kp_array); + +ksort($kp_array); +$x=0; +foreach ($kp_array as $kps => $value) + { + $kp_pct=sprintf("%.1f", (100*$value)/$total_kps); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $CSV_output["unanswered_calls_by_keypress"].="\"".$kps."\",\"".$value."\",\"".$kp_pct." %\",\"\"\n"; + + $x++; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Key").":"._QXZ("N. Calls")." ...
".$kps."".$value."".$kp_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="** does not include start/invalid/timeout options
"; +##################################### + +/* +#### ANSWERED CALLS BY DIRECTION ### +$HTML_output.="

Answered calls, by direction:

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["answered_calls_by_direction"]="\"Answered calls, by direction:\"\n"; +$CSV_output["answered_calls_by_direction"].="\"\",\"Direction\",\"N. Calls\",\"\",\"...\"\n"; + +$answered_calls_by_direction_graph_labels="["; +$answered_calls_by_direction_graph_data="["; +$answered_calls_by_direction_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$answered_calls_by_direction_graph_hovborder="["; + +$max_call_direction=max($call_directions); +ksort($call_directions); +$call_directions["Any calls"]=0; +$x=0; +foreach ($call_directions as $direction => $value) + { + $direction_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["answered_calls_by_direction"].="\"\",\"".$direction."\",\"".$value."\",\"".$direction_pct." %\",\"\"\n"; + + $answered_calls_by_direction_graph_labels.="\"".$direction."\","; + $answered_calls_by_direction_graph_data.="\"$value\","; + $answered_calls_by_direction_graph_bgcolor.="\"".$background_colors[$x]."\","; + $answered_calls_by_direction_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$answered_calls_by_direction_graph_labels=preg_replace('/,$/', '', $answered_calls_by_direction_graph_labels)."]"; +$answered_calls_by_direction_graph_data=preg_replace('/,$/', '', $answered_calls_by_direction_graph_data)."]"; +$answered_calls_by_direction_graph_bgcolor=preg_replace('/,$/', '', $answered_calls_by_direction_graph_bgcolor)."]"; +$answered_calls_by_direction_graph_hovborder=preg_replace('/,$/', '', $answered_calls_by_direction_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
 DirectionN. Calls ...
".($SOME_IMAGE_GOES_HERE)."".$direction."".$value."".$direction_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +#### ANSWERED CALLS BY STINTS ### +$HTML_output.="

Answered calls, by stints:

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["answered_calls_by_stints"]="\"Answered calls, by stints:\"\n"; +$CSV_output["answered_calls_by_stints"].="\"Number of stints\",\"N. Calls\",\"\",\"...\"\n"; + +$max_call_stint=max($call_stints); +$x=0; +foreach ($call_stints as $stint => $value) + { + $stint_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["answered_calls_by_stints"].="\"".$stint."\",\"".$value."\",\"".$stint_pct." %\",\"\"\n"; + + $x++; + } +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
Number of stintsN. Calls ...
".$stint."".$value."".$stint_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +##################### +*/ + +#### UNANSWERED CALLS BY POSITION ### +$HTML_output.="

"._QXZ("Enter queue position").": $NWB#VERM_UNANSWERED-queue_position$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["queue_position"]="\""._QXZ("Enter queue position").":\"\n"; +$CSV_output["queue_position"].="\""._QXZ("Position at enter").":\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$queue_position_graph_labels="["; +$queue_position_graph_data="["; +$queue_position_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$queue_position_graph_hovborder="["; + +$max_queue_count=max($unanswered_queue_positions); +$x=0; +foreach ($unanswered_queue_positions as $position => $value) + { + $position_pct=sprintf("%.1f", (100*$value)/$total_unanswered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["queue_position"].="\"".$position."\",\"".$value."\",\"".$position_pct." %\",\"\"\n"; + + $queue_position_graph_labels.="\"".$position."\","; + $queue_position_graph_data.="\"$value\","; + $queue_position_graph_bgcolor.="\"".$background_colors[$x]."\","; + $queue_position_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + + # For next table/graph... + $queue_positions["$position"]+=$value; + } +$queue_position_graph_labels=preg_replace('/,$/', '', $queue_position_graph_labels)."]"; +$queue_position_graph_data=preg_replace('/,$/', '', $queue_position_graph_data)."]"; +$queue_position_graph_bgcolor=preg_replace('/,$/', '', $queue_position_graph_bgcolor)."]"; +$queue_position_graph_hovborder=preg_replace('/,$/', '', $queue_position_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Position at enter").":"._QXZ("N. Calls")." ...
".$position."".$value."".$position_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +#### UNANSWERED CALLS BY POSITION ### +$HTML_output.="

"._QXZ("Queue position, all calls").": $NWB#VERM_UNANSWERED-queue_position_all_calls$NWE

"; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.="
"; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["queue_position_all_calls"]="\""._QXZ("Queue position, all calls").":\"\n"; +$CSV_output["queue_position_all_calls"].="\""._QXZ("Position at enter").":\",\""._QXZ("N. Calls")."\",\"\",\"...\"\n"; + +$queue_position_all_calls_graph_labels="["; +$queue_position_all_calls_graph_data="["; +$queue_position_all_calls_graph_bgcolor="["; # SAME FOR hoverBackgroundColor +$queue_position_all_calls_graph_hovborder="["; + +ksort($queue_positions); +$max_queue_count=max($queue_positions); +$x=0; +foreach ($queue_positions as $position => $value) + { + $position_pct=sprintf("%.1f", (100*$value)/$total_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["queue_position_all_calls_all_calls"].="\"".$position."\",\"".$value."\",\"".$position_pct." %\",\"\"\n"; + + $queue_position_all_calls_graph_labels.="\"".$position."\","; + $queue_position_all_calls_graph_data.="\"$value\","; + $queue_position_all_calls_graph_bgcolor.="\"".$background_colors[$x]."\","; + $queue_position_all_calls_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$queue_position_all_calls_graph_labels=preg_replace('/,$/', '', $queue_position_all_calls_graph_labels)."]"; +$queue_position_all_calls_graph_data=preg_replace('/,$/', '', $queue_position_all_calls_graph_data)."]"; +$queue_position_all_calls_graph_bgcolor=preg_replace('/,$/', '', $queue_position_all_calls_graph_bgcolor)."]"; +$queue_position_all_calls_graph_hovborder=preg_replace('/,$/', '', $queue_position_all_calls_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Position at enter").":"._QXZ("N. Calls")." ...
".$position."".$value."".$position_pct." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +##### UN ANSWERED IVR STATS ##### +$ivr_stmt="select uniqueid,extension,start_time,comment_a,comment_b,comment_d,UNIX_TIMESTAMP(start_time),phone_ext from live_inbound_log $live_inbound_log_SQL and comment_a IN('CALLMENU') order by uniqueid,start_time"; +if ($DB) {$HTML_output.="$ivr_stmt";} +$ivr_rslt=mysqli_query($link, $ivr_stmt); +$ivr_paths=array(); # 0 - total calls, 1 - total time, 2 - min time, 3 - max time +$ivr_counts=array(); +$untracked_calls=$total_unanswered_calls; +while ($ivr_row=mysqli_fetch_array($ivr_rslt)) + { + $uniqueid=$ivr_row[0]; + + if (in_array($uniqueid, $unanswered_uniqueid_array)) + { + if (!$prev_id) + { + $prev_id=$uniqueid; + $ivr_start_time=$ivr_row[6]; + } + + if ($uniqueid!=$prev_id) + { + $ivr_call_time=$ivr_end_time-$ivr_start_time; + $untracked_calls--; + # print "$prev_id --> $ivr_path: $ivr_end_time - $ivr_start_time = $ivr_call_time\n"; + + if (!array_key_exists("$ivr_path", $ivr_paths)) + { + $ivr_paths["$ivr_path"][0]=0; + $ivr_paths["$ivr_path"][1]=0; + $ivr_paths["$ivr_path"][2]=10000000; + $ivr_paths["$ivr_path"][3]=0; + } + + # if ($tracked>0) + # { + $ivr_counts["$ivr_path"]++; + $ivr_paths["$ivr_path"][0]++; + $ivr_paths["$ivr_path"][1]+=$ivr_call_time; + if ($ivr_paths["$ivr_path"][2]>$ivr_call_time) {$ivr_paths["$ivr_path"][2]=$ivr_call_time;} + if ($ivr_paths["$ivr_path"][3]<$ivr_call_time) {$ivr_paths["$ivr_path"][3]=$ivr_call_time;} + # } + # else + # { + # $ivr_paths["Untracked"][0]++; + # } + $tracked=0; + $ivr_path=""; + $ivr_start_time=$ivr_row[6]; + } + else + { + $tracked++; + } + + $ivr_path.=$ivr_row[4]; + $ivr_end_time=$ivr_row[6]; + $prev_id=$uniqueid; + } + + } + +if ($ivr_path!="") + { + $untracked_calls--; + $ivr_counts["$ivr_path"]++; + $ivr_paths["$ivr_path"][0]++; + $ivr_call_time=$ivr_end_time-$ivr_start_time; + $ivr_paths["$ivr_path"][1]+=$ivr_call_time; + $ivr_paths["$ivr_path"][2]+=0; + $ivr_paths["$ivr_path"][3]+=0; + if ($ivr_paths["$ivr_path"][2]>$ivr_call_time || $ivr_call_time=0) {$ivr_paths["$ivr_path"][2]=$ivr_call_time;} + if ($ivr_paths["$ivr_path"][3]<$ivr_call_time) {$ivr_paths["$ivr_path"][3]=$ivr_call_time;} + } + +$max_ivr_count=max($ivr_counts); +if ($max_ivr_count<$untracked_calls) {$max_ivr_count=$untracked_calls;} +$untracked_ivr_pct=sprintf("%.1f", (100*$untracked_calls)/$total_unanswered_calls); + +$HTML_output.="

"._QXZ("IVR selection").": $NWB#VERM_UNANSWERED-ivr_selection$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.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$unanswered_ivr_selection_graph_labels="[\""._QXZ("Untracked")."\","; +$unanswered_ivr_selection_graph_data="[\"$untracked_calls\","; +$unanswered_ivr_selection_graph_bgcolor="[\"".$background_colors[0]."\","; # SAME FOR hoverBackgroundColor +$unanswered_ivr_selection_graph_hovborder="[\"".$border_colors[0]."\","; + + +$CSV_output["unanswered_ivr_selection"]="\""._QXZ("IVR selection").":\"\n"; +$CSV_output["unanswered_ivr_selection"].="\""._QXZ("IVR")."\",\""._QXZ("N. Calls")."\",\"\",\"\",\""._QXZ("Total Duration")."\",\""._QXZ("Average Duration")."\",\""._QXZ("Min Duration")."\",\""._QXZ("Max Duration")."\"\n"; +$CSV_output["unanswered_ivr_selection"].="\""._QXZ("Untracked")."\",\"$untracked_calls\",\"".$untracked_ivr_pct." %\",\"\",\"\",\"\",\"\",\"\"\n"; + +ksort($ivr_paths); +$x=1; +foreach ($ivr_paths as $pathname => $value) + { + $ivr_pct=sprintf("%.1f", (100*$value[0])/$total_unanswered_calls); + $total_duration=($value[1]>=3600 ? floor($value[1]/3600).":" : "").gmdate("i:s", $value[1]); + $avg_call_length=round($value[1]/$value[0]); + $average_duration=($avg_call_length>=3600 ? floor($avg_call_length/3600).":" : "").gmdate("i:s", $avg_call_length); + $min_duration=($value[2]>=3600 ? floor($value[2]/3600).":" : "").gmdate("i:s", $value[2]); + $max_duration=($value[3]>=3600 ? floor($value[3]/3600).":" : "").gmdate("i:s", $value[3]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["unanswered_ivr_selection"].="\"".$pathname."\",\"".$value[0]."\",\"".$ivr_pct." %\",\"\",\"".$total_duration."\",\"".$average_duration."\",\"".$min_duration."\",\"".$max_duration."\"\n"; + + $unanswered_ivr_selection_graph_labels.="\"".$pathname."\","; + $unanswered_ivr_selection_graph_data.="\"$value[0]\","; + $unanswered_ivr_selection_graph_bgcolor.="\"".$background_colors[$x]."\","; + $unanswered_ivr_selection_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$unanswered_ivr_selection_graph_labels=preg_replace('/,$/', '', $unanswered_ivr_selection_graph_labels)."]"; +$unanswered_ivr_selection_graph_data=preg_replace('/,$/', '', $unanswered_ivr_selection_graph_data)."]"; +$unanswered_ivr_selection_graph_bgcolor=preg_replace('/,$/', '', $unanswered_ivr_selection_graph_bgcolor)."]"; +$unanswered_ivr_selection_graph_hovborder=preg_replace('/,$/', '', $unanswered_ivr_selection_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("IVR").""._QXZ("N. Calls")." ..."._QXZ("Total Duration").""._QXZ("Average Duration").""._QXZ("Min Duration").""._QXZ("Max Duration")."
"._QXZ("Untracked")."$untracked_calls".$untracked_ivr_pct." %    
".$pathname."".$value[0]."".$ivr_pct." %".$total_duration."".$average_duration."".$min_duration."".$max_duration."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +##### IVR STATS ##### +$ivr_stmt="select uniqueid,extension,start_time,comment_a,comment_b,comment_d,UNIX_TIMESTAMP(start_time),phone_ext from live_inbound_log $live_inbound_log_SQL and comment_a IN('CALLMENU') order by uniqueid,start_time"; +if ($DB) {$HTML_output.="$ivr_stmt";} +$ivr_rslt=mysqli_query($link, $ivr_stmt); +$ivr_paths=array(); # 0 - total calls, 1 - total time, 2 - min time, 3 - max time +$ivr_counts=array(); +$untracked_calls=$total_calls; +$prev_id=""; $ivr_path=""; +while ($ivr_row=mysqli_fetch_array($ivr_rslt)) + { + $uniqueid=$ivr_row[0]; + + if (in_array($uniqueid, $unanswered_uniqueid_array) || in_array($uniqueid, $uniqueid_array)) + { + if (!$prev_id) + { + $prev_id=$uniqueid; + $ivr_start_time=$ivr_row[6]; + } + + if ($uniqueid!=$prev_id) + { + $ivr_call_time=$ivr_end_time-$ivr_start_time; + $untracked_calls--; + # print "$prev_id --> $ivr_path: $ivr_end_time - $ivr_start_time = $ivr_call_time\n"; + + if (!array_key_exists("$ivr_path", $ivr_paths)) + { + $ivr_paths["$ivr_path"][0]=0; + $ivr_paths["$ivr_path"][1]=0; + $ivr_paths["$ivr_path"][2]=10000000; + $ivr_paths["$ivr_path"][3]=0; + } + + # if ($tracked>0) + # { + $ivr_counts["$ivr_path"]++; + $ivr_paths["$ivr_path"][0]++; + $ivr_paths["$ivr_path"][1]+=$ivr_call_time; + if ($ivr_paths["$ivr_path"][2]>$ivr_call_time) {$ivr_paths["$ivr_path"][2]=$ivr_call_time;} + if ($ivr_paths["$ivr_path"][3]<$ivr_call_time) {$ivr_paths["$ivr_path"][3]=$ivr_call_time;} + # } + # else + # { + # $ivr_paths["Untracked"][0]++; + # } + $tracked=0; + $ivr_path=""; + $ivr_start_time=$ivr_row[6]; + } + else + { + $tracked++; + } + + $ivr_path.=$ivr_row[4]; + $ivr_end_time=$ivr_row[6]; + $prev_id=$uniqueid; + } + + } + +if ($ivr_path!="") + { + $untracked_calls--; + $ivr_counts["$ivr_path"]++; + $ivr_paths["$ivr_path"][0]++; + $ivr_call_time=$ivr_end_time-$ivr_start_time; + $ivr_paths["$ivr_path"][1]+=$ivr_call_time; + $ivr_paths["$ivr_path"][2]+=0; + $ivr_paths["$ivr_path"][3]+=0; + if ($ivr_paths["$ivr_path"][2]>$ivr_call_time || $ivr_call_time=0) {$ivr_paths["$ivr_path"][2]=$ivr_call_time;} + if ($ivr_paths["$ivr_path"][3]<$ivr_call_time) {$ivr_paths["$ivr_path"][3]=$ivr_call_time;} + } + +$max_ivr_count=max($ivr_counts); +if ($max_ivr_count<$untracked_calls) {$max_ivr_count=$untracked_calls;} +$untracked_ivr_pct=sprintf("%.1f", (100*$untracked_calls)/$total_calls); + +$HTML_output.="

"._QXZ("IVR selection, all calls").": $NWB#VERM_UNANSWERED-IVR_selection_all_calls$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.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; + +$CSV_output["unanswered_ivr_selection"]="\""._QXZ("IVR selection, all calls").":\"\n"; +$CSV_output["unanswered_ivr_selection"].="\""._QXZ("IVR")."\",\""._QXZ("N. Calls")."\",\"\",\"\",\""._QXZ("Total Duration")."\",\""._QXZ("Average Duration")."\",\""._QXZ("Min Duration")."\",\""._QXZ("Max Duration")."\"\n"; +$CSV_output["ivr_selection"].="\""._QXZ("Untracked")."\",\"$untracked_calls\",\"".$untracked_ivr_pct." %\",\"\",\"\",\"\",\"\",\"\"\n"; + +$ivr_selection_graph_labels="[\""._QXZ("Untracked")."\","; +$ivr_selection_graph_data="[\"$untracked_calls\","; +$ivr_selection_graph_bgcolor="[\"".$background_colors[0]."\","; # SAME FOR hoverBackgroundColor +$ivr_selection_graph_hovborder="[\"".$border_colors[0]."\","; + +ksort($ivr_paths); +$x=1; +foreach ($ivr_paths as $pathname => $value) + { + $ivr_pct=sprintf("%.1f", (100*$value[0])/$total_calls); + $total_duration=($value[1]>=3600 ? floor($value[1]/3600).":" : "").gmdate("i:s", $value[1]); + $avg_call_length=round($value[1]/$value[0]); + $average_duration=($avg_call_length>=3600 ? floor($avg_call_length/3600).":" : "").gmdate("i:s", $avg_call_length); + $min_duration=($value[2]>=3600 ? floor($value[2]/3600).":" : "").gmdate("i:s", $value[2]); + $max_duration=($value[3]>=3600 ? floor($value[3]/3600).":" : "").gmdate("i:s", $value[3]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["ivr_selection"].="\"".$pathname."\",\"".$value[0]."\",\"".$ivr_pct." %\",\"\",\"".$total_duration."\",\"".$average_duration."\",\"".$min_duration."\",\"".$max_duration."\"\n"; + + $ivr_selection_graph_labels.="\"".$pathname."\","; + $ivr_selection_graph_data.="\"$value[0]\","; + $ivr_selection_graph_bgcolor.="\"".$background_colors[$x]."\","; + $ivr_selection_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$ivr_selection_graph_labels=preg_replace('/,$/', '', $ivr_selection_graph_labels)."]"; +$ivr_selection_graph_data=preg_replace('/,$/', '', $ivr_selection_graph_data)."]"; +$ivr_selection_graph_bgcolor=preg_replace('/,$/', '', $ivr_selection_graph_bgcolor)."]"; +$ivr_selection_graph_hovborder=preg_replace('/,$/', '', $ivr_selection_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("IVR").""._QXZ("N. Calls")." ..."._QXZ("Total Duration").""._QXZ("Average Duration").""._QXZ("Min Duration").""._QXZ("Max Duration")."
"._QXZ("Untracked")."$untracked_calls".$untracked_ivr_pct." %    
".$pathname."".$value[0]."".$ivr_pct." %".$total_duration."".$average_duration."".$min_duration."".$max_duration."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +##################### + +###### UNANSWERED inbound DID used ##### +$did_stmt="select extension,uniqueid from vicidial_did_log $vicidial_did_log_SQL order by extension"; +if ($DB) {$HTML_output.="$did_stmt";} +$did_rslt=mysql_to_mysqli($did_stmt, $link); +$did_counts=array(); # 0 - total calls, 1 - total time, 2 - min time, 3 - max time +# $did_counts["Untracked"]=$untracked_calls2 +$untracked_did_calls=$total_unanswered_calls; +while ($did_row=mysqli_fetch_array($did_rslt)) + { + if(in_array($did_row["uniqueid"], $unanswered_uniqueid_array)) + { + $did_counts["$did_row[extension]"]++; + $untracked_did_calls--; + } + } +$max_did=max($did_counts); +if ($max_did<$untracked_did_calls) {$max_did=$untracked_did_calls;} + +$untracked_did_pct=sprintf("%.1f", ((100*$untracked_did_calls)/$total_unanswered_calls)); +$HTML_output.="

"._QXZ("Inbound DID used").": $NWB#VERM_UNANSWERED-did_used$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.=""; + +$CSV_output["unanswered_did_used"]="\""._QXZ("Inbound DID used").":\"\n"; +$CSV_output["unanswered_did_used"].="\""._QXZ("DID").":\",\""._QXZ("N. Calls")."\",\"\",\"\"\n"; +$CSV_output["unanswered_did_used"].="\""._QXZ("Untracked")."\",\"$untracked_did_calls\",\"".$untracked_did_pct." %\",\"\",\"\"\n"; + +$unanswered_did_used_graph_labels="[\""._QXZ("Untracked")."\","; +$unanswered_did_used_graph_data="[\"$untracked_did_calls\","; +$unanswered_did_used_graph_bgcolor="[\"".$background_colors[0]."\","; # SAME FOR hoverBackgroundColor +$unanswered_did_used_graph_hovborder="[\"".$border_colors[0]."\","; + + +ksort($did_counts); +$x=1; +foreach ($did_counts as $did => $value) + { + $did_pct=sprintf("%.1f", (100*$value)/$total_unanswered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["unanswered_did_used"].="\"".$did." - ".$did_pattern_info["$did"]."\",\"$value\",\"".$did_pct." %\",\"\"\n"; + + $unanswered_did_used_graph_labels.="\"".$did." - ".$did_pattern_info["$did"]."\","; + $unanswered_did_used_graph_data.="\"$value\","; + $unanswered_did_used_graph_bgcolor.="\"".$background_colors[$x]."\","; + $unanswered_did_used_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$unanswered_did_used_graph_labels=preg_replace('/,$/', '', $unanswered_did_used_graph_labels)."]"; +$unanswered_did_used_graph_data=preg_replace('/,$/', '', $unanswered_did_used_graph_data)."]"; +$unanswered_did_used_graph_bgcolor=preg_replace('/,$/', '', $unanswered_did_used_graph_bgcolor)."]"; +$unanswered_did_used_graph_hovborder=preg_replace('/,$/', '', $unanswered_did_used_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("DID").":"._QXZ("N. Calls")." ...
"._QXZ("Untracked")."$untracked_did_calls$untracked_did_pct %
".$did." - ".$did_pattern_info["$did"]."$value$did_pct %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +###### Inbound DID used ##### +$did_stmt="select extension,uniqueid from vicidial_did_log $vicidial_did_log_SQL order by extension"; +if ($DB) {$HTML_output.="$did_stmt";} +$did_rslt=mysql_to_mysqli($did_stmt, $link); +$did_counts=array(); # 0 - total calls, 1 - total time, 2 - min time, 3 - max time +# $did_counts["Untracked"]=$untracked_calls2 +$untracked_did_calls=$total_calls; +while ($did_row=mysqli_fetch_array($did_rslt)) + { + if(in_array($did_row["uniqueid"], $unanswered_uniqueid_array) || in_array($did_row["uniqueid"], $uniqueid_array)) + { + $did_counts["$did_row[extension]"]++; + $untracked_did_calls--; + } + } +$max_did=max($did_counts); +if ($max_did<$untracked_did_calls) {$max_did=$untracked_did_calls;} + +$untracked_did_pct=sprintf("%.1f", ((100*$untracked_did_calls)/$total_calls)); +$HTML_output.="

"._QXZ("Inbound DID used, for all calls").": $NWB#VERM_UNANSWERED-did_used_all_calls$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.=""; + +$CSV_output["did_used"]="\""._QXZ("Inbound DID used, for all calls").":\"\n"; +$CSV_output["did_used"].="\""._QXZ("DID").":\",\""._QXZ("N. Calls")."\",\"\",\"\"\n"; +$CSV_output["did_used"].="\""._QXZ("Untracked")."\",\"$untracked_did_calls\",\"".$untracked_did_pct." %\",\"\",\"\"\n"; + +$did_used_graph_labels="[\""._QXZ("Untracked")."\","; +$did_used_graph_data="[\"$untracked_did_calls\","; +$did_used_graph_bgcolor="[\"".$background_colors[0]."\","; # SAME FOR hoverBackgroundColor +$did_used_graph_hovborder="[\"".$border_colors[0]."\","; + + +ksort($did_counts); +$x=1; +foreach ($did_counts as $did => $value) + { + $did_pct=sprintf("%.1f", (100*$value)/$total_answered_calls); + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["did_used"].="\"".$did." - ".$did_pattern_info["$did"]."\",\"$value\",\"".$did_pct." %\",\"\"\n"; + + $did_used_graph_labels.="\"".$did." - ".$did_pattern_info["$did"]."\","; + $did_used_graph_data.="\"$value\","; + $did_used_graph_bgcolor.="\"".$background_colors[$x]."\","; + $did_used_graph_hovborder.="\"".$border_colors[$x]."\","; + + $x++; + } +$did_used_graph_labels=preg_replace('/,$/', '', $did_used_graph_labels)."]"; +$did_used_graph_data=preg_replace('/,$/', '', $did_used_graph_data)."]"; +$did_used_graph_bgcolor=preg_replace('/,$/', '', $did_used_graph_bgcolor)."]"; +$did_used_graph_hovborder=preg_replace('/,$/', '', $did_used_graph_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("DID").":"._QXZ("N. Calls")." ...
"._QXZ("Untracked")."$untracked_did_calls$untracked_did_pct %
".$did." - ".$did_pattern_info["$did"]."$value$did_pct %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +#### CALL OVERVIEW #### +$HTML_output.="

"._QXZ("Call overview").": $NWB#VERM_UNANSWERED-call_overview$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.=""; + +$CSV_output["call_overview"]="\""._QXZ("Call overview")."\"\n"; +$CSV_output["call_overview"].="\""._QXZ("Queue")."\",\""._QXZ("Calls offered")."\",\""._QXZ("Calls answered")."\",\""._QXZ("Calls lost")."\",\""._QXZ("Average call length").":\",\""._QXZ("Total call length").":\",\""._QXZ("Average call waiting time").":\",\""._QXZ("Total waiting time").":\"\n"; + +/* +foreach ($total_queue_stats as $campaign => $data) { + print ($campaign)."
\n"; + $campaign_array_holder[] = $campaign; + $sort_array_holder[] = $data["calls"]; +} +print_r($sort_array_holder); +array_multisort($sort_array_holder,SORT_ASC, SORT_NUMERIC,$total_queue_stats); +*/ + +$col = array_column( $total_queue_stats, "calls" ); +array_multisort( $col, SORT_ASC, $total_queue_stats ); + +$total_queue_calls=0; +$total_answered=0; +$total_unanswered=0; +$total_call_time=0; +$total_wait_time=0; +foreach($total_queue_stats as $campaign_name => $data) + { + $data["calls"]+=0; + $data["answered"]+=0; + $data["unanswered"]+=0; + $data["call_time"]+=0; + $data["wait_time"]+=0; + + $total_queue_calls+=$data["calls"]; + $total_queue_answered+=$data["answered"]; + $total_queue_unanswered+=$data["unanswered"]; + $total_queue_call_time+=$data["call_time"]; + $total_queue_wait_time+=$data["wait_time"]; + + $avg_call_time=round($data["call_time"]/$data["answered"]); + $avg_wait_time=round($data["wait_time"]/$data["calls"]); + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["call_overview"].="\"".$campaign_name."\",\"".$data["calls"]."\",\"".$data["answered"]."\",\"".$data["unanswered"]."\",\"".($avg_call_time>=3600 ? floor($avg_call_time/3600).":" : "").gmdate("i:s", $avg_call_time)."\",\"".($data["call_time"]>=3600 ? floor($data["call_time"]/3600).":" : "").gmdate("i:s", $data["call_time"])."\",\"".($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", $avg_wait_time)."\",\"".($data["wait_time"]>=3600 ? floor($data["wait_time"]/3600).":" : "").gmdate("i:s", $data["wait_time"])."\"\n"; + } + +$avg_call_time=round($total_queue_call_time/$total_queue_answered); +$avg_wait_time=round($total_queue_wait_time/$total_queue_calls); + +$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.="
"._QXZ("Queue").""._QXZ("Calls offered").""._QXZ("Calls answered").""._QXZ("Calls lost").""._QXZ("Average call length").":"._QXZ("Total call length").":"._QXZ("Average call waiting time").":"._QXZ("Total waiting time").":
".$campaign_name."".$data["calls"]."".$data["answered"]."".$data["unanswered"]."".($avg_call_time>=3600 ? floor($avg_call_time/3600).":" : "").gmdate("i:s", $avg_call_time)."".($data["call_time"]>=3600 ? floor($data["call_time"]/3600).":" : "").gmdate("i:s", $data["call_time"])."".($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", $avg_wait_time)."".($data["wait_time"]>=3600 ? floor($data["wait_time"]/3600).":" : "").gmdate("i:s", $data["wait_time"])."
"._QXZ("TOTAL")."".$total_queue_calls."".$total_queue_answered."".$total_queue_unanswered."".($avg_call_time>=3600 ? floor($avg_call_time/3600).":" : "").gmdate("i:s", $avg_call_time)."".($total_queue_call_time>=3600 ? floor($total_queue_call_time/3600).":" : "").gmdate("i:s", $total_queue_call_time)."".($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", $avg_wait_time)."".($total_queue_wait_time>=3600 ? floor($total_queue_wait_time/3600).":" : "").gmdate("i:s", $total_queue_wait_time)."
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; + +$CSV_output["call_overview"].="\"TOTAL\",\"".$total_queue_calls."\",\"".$total_queue_answered."\",\"".$total_queue_unanswered."\",\"".($avg_call_time>=3600 ? floor($avg_call_time/3600).":" : "").gmdate("i:s", $avg_call_time)."\",\"".($total_queue_call_time>=3600 ? floor($total_queue_call_time/3600).":" : "").gmdate("i:s", $total_queue_call_time)."\",\"".($avg_wait_time>=3600 ? floor($avg_wait_time/3600).":" : "").gmdate("i:s", $avg_wait_time)."\",\"".($total_queue_wait_time>=3600 ? floor($total_queue_wait_time/3600).":" : "").gmdate("i:s", $total_queue_wait_time)."\"\n"; + +####################### + +#### SERVICE LEVEL #### +$HTML_output.="

"._QXZ("Inclusive answered SLA (inbound answered calls only)").": $NWB#VERM_UNANSWERED-inclusive_answered_SLA$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.=""; + +$CSV_output["answered_service_level_agreement"]="\""._QXZ("Inclusive answered SLA (inbound answered calls only)")."\"\n"; +$CSV_output["answered_service_level_agreement"].="\""._QXZ("Answer")."\",\""._QXZ("N. Calls")."\",\""._QXZ("Delta")."\",\""._QXZ("Percent")."\",\""._QXZ("Of Offered")."\",\"...\"\n"; + +# $SLA_query is in VERM_global_vars.inc +$svc_lvl_stmt="select $SLA_query from vicidial_closer_log $vicidial_closer_log_SQL and (user!='VDCL')"; # and campaign_id in ($ingroup_str) and user in ('VDCL', $user_str) +if ($DB) {$HTML_output.="$svc_lvl_stmt";} +$svc_lvl_rslt=mysqli_query($link, $svc_lvl_stmt); +$svc_lvl_row=mysqli_fetch_assoc($svc_lvl_rslt); + +$answered_service_level_agreement_graph_labels="["; +$answered_service_level_agreement_graph_delta_data="["; +$answered_service_level_agreement_graph_delta_bgcolor="["; # SAME FOR hoverBackgroundColor +$answered_service_level_agreement_graph_delta_hovborder="["; +$answered_service_level_agreement_graph_percent_data="["; +$answered_service_level_agreement_graph_percent_bgcolor="["; # SAME FOR hoverBackgroundColor +$answered_service_level_agreement_graph_percent_hovborder="["; + +$x=0; $prev_int=""; +foreach($svc_lvl_row as $interval => $sum) + { + $int_name=ucwords(preg_replace("/_/", " ", $interval)); + if ($prev_int) {$delta="+ ".($sum-$prev_int);} else {$delta=" ";} + + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + $HTML_output.=""; + + $CSV_output["answered_service_level_agreement"].="\"$int_name "._QXZ("seconds").":\",\"$sum\",\"$delta\",\"".sprintf("%.1f", ((100*$sum)/$answered_inbound_calls))." %\",\"".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))." %\"\n"; + + $answered_service_level_agreement_graph_labels.="\"$int_name\","; + $answered_service_level_agreement_graph_delta_data.="\"".($prev_int ? ($sum-$prev_int) : "0")."\","; + $answered_service_level_agreement_graph_delta_bgcolor.="\"#33CCCC\","; + $answered_service_level_agreement_graph_delta_hovborder.="\"#66FFFF\","; + $answered_service_level_agreement_graph_percent_data.="\"".sprintf("%.1f", ((100*$sum)/$answered_inbound_calls))."\","; + $answered_service_level_agreement_graph_percent_bgcolor.="\"#FFCC66\","; + $answered_service_level_agreement_graph_percent_hovborder.="\"#FFFF99\","; + + $prev_int=$sum; + $x++; + } + +$answered_service_level_agreement_graph_labels=preg_replace('/,$/', '', $answered_service_level_agreement_graph_labels)."]"; +$answered_service_level_agreement_graph_delta_data=preg_replace('/,$/', '', $answered_service_level_agreement_graph_delta_data)."]"; +$answered_service_level_agreement_graph_delta_bgcolor=preg_replace('/,$/', '', $answered_service_level_agreement_graph_delta_bgcolor)."]"; +$answered_service_level_agreement_graph_delta_hovborder=preg_replace('/,$/', '', $answered_service_level_agreement_graph_delta_hovborder)."]"; +$answered_service_level_agreement_graph_percent_data=preg_replace('/,$/', '', $answered_service_level_agreement_graph_percent_data)."]"; +$answered_service_level_agreement_graph_percent_bgcolor=preg_replace('/,$/', '', $answered_service_level_agreement_graph_percent_bgcolor)."]"; +$answered_service_level_agreement_graph_percent_hovborder=preg_replace('/,$/', '', $answered_service_level_agreement_graph_percent_hovborder)."]"; + +$HTML_output.=""; +# $HTML_output.=""; +$HTML_output.=""; +$HTML_output.=""; +$HTML_output.="
"._QXZ("Answer").""._QXZ("N. Calls").""._QXZ("Delta").""._QXZ("Percent").""._QXZ("Of Offered")."...
$int_name "._QXZ("seconds").":".$sum."$delta  ".sprintf("%.1f", ((100*$sum)/$answered_inbound_calls))." %".sprintf("%.1f", ((100*$sum)/$total_inbound_calls))." %
"._QXZ("Export as")."...CSV"._QXZ("Export as")."...
"; +$HTML_output.="
"; +$HTML_output.="
"; +$HTML_output.="
"; +###################### + +if ($download_rpt) + { + $data_to_download=$CSV_output["$download_rpt"]; + + $FILE_TIME = date("Ymd-His"); + $CSVfilename = "UNANSWERED_RPT_".$download_rpt."_".$FILE_TIME.".csv"; + header('Content-type: application/octet-stream'); + + header("Content-Disposition: attachment; filename=\"$CSVfilename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + ob_clean(); + flush(); + + echo "$data_to_download"; + + if ($db_source == 'S') + { + mysqli_close($link); + $use_slave_server=0; + $db_source = 'M'; + require("dbconnect_mysqli.php"); + } + + $endMS = microtime(); + $startMSary = explode(" ",$startMS); + $endMSary = explode(" ",$endMS); + $runS = ($endMSary[0] - $startMSary[0]); + $runM = ($endMSary[1] - $startMSary[1]); + $TOTALrun = ($runS + $runM); + + # $stmt="UPDATE vicidial_report_log set run_time='$TOTALrun' where report_log_id='$report_log_id';"; + # if ($DB) {echo "|$stmt|\n";} + # $rslt=mysql_to_mysqli($stmt, $link); + + exit; + + } + +echo $HTML_output; +?> + + diff --git a/agc_2-X/trunk/www/VERM/VERM_admin.php b/agc_2-X/trunk/www/VERM/VERM_admin.php new file mode 100644 index 00000000..3cefed81 --- /dev/null +++ b/agc_2-X/trunk/www/VERM/VERM_admin.php @@ -0,0 +1,894 @@ +, Joe Johnson LICENSE: AGPLv2 +# +# CHANGELOG: +# 220825-1609 - First build +# + + +$startMS = microtime(); + +$version = '2.14-1'; +$build = '220825-1609'; + +$report_name = 'VERM Reports'; + +header ("Content-type: text/html; charset=utf-8"); + +require("dbconnect_mysqli.php"); +require("functions.php"); +require("VERM_options.php"); # Added cuz I'm sick of keeping track. + +#### CUSTOM REPORT VARIABLES #### +if (isset($_GET["vicidial_queue_groups"])) {$vicidial_queue_groups=$_GET["vicidial_queue_groups"];} + elseif (isset($_POST["vicidial_queue_groups"])) {$vicidial_queue_groups=$_POST["vicidial_queue_groups"];} +if (isset($_GET["report_types_to_display"])) {$report_types_to_display=$_GET["report_types_to_display"];} + elseif (isset($_POST["report_types_to_display"])) {$report_types_to_display=$_POST["report_types_to_display"];} +if (isset($_GET["start_date"])) {$start_date=$_GET["start_date"];} + elseif (isset($_POST["start_date"])) {$start_date=$_POST["start_date"];} +if (isset($_GET["end_date"])) {$end_date=$_GET["end_date"];} + elseif (isset($_POST["end_date"])) {$end_date=$_POST["end_date"];} +if (isset($_GET["DB"])) {$DB=$_GET["DB"];} + elseif (isset($_POST["DB"])) {$DB=$_POST["DB"];} + +############################################# +##### START SYSTEM_SETTINGS LOOKUP ##### +$stmt = "SELECT use_non_latin,outbound_autodial_active,slave_db_server,reports_use_slave_db,enable_languages,language_method,agent_whisper_enabled,report_default_format,enable_pause_code_limits,allow_web_debug,admin_screen_colors,admin_web_directory FROM system_settings;"; +$rslt=mysql_to_mysqli($stmt, $link); +if ($DB) {echo "$stmt\n";} +$qm_conf_ct = mysqli_num_rows($rslt); +if ($qm_conf_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $non_latin = $row[0]; + $outbound_autodial_active = $row[1]; + $slave_db_server = $row[2]; + $reports_use_slave_db = $row[3]; + $SSenable_languages = $row[4]; + $SSlanguage_method = $row[5]; + $agent_whisper_enabled = $row[6]; + $SSreport_default_format = $row[7]; + $SSenable_pause_code_limits = $row[8]; + $SSallow_web_debug = $row[9]; + $SSadmin_screen_colors = $row[10]; + $SSadmin_web_directory = $row[11]; + } +if ($SSallow_web_debug < 1) {$DB=0;} +##### END SETTINGS LOOKUP ##### +########################################### + +$PHP_AUTH_USER=$_SERVER['PHP_AUTH_USER']; +$PHP_AUTH_PW=$_SERVER['PHP_AUTH_PW']; +$PHP_SELF=$_SERVER['PHP_SELF']; +$PHP_SELF = preg_replace('/\.php.*/i','.php',$PHP_SELF); + +$db_source = 'M'; + +if (file_exists('options.php')) + { + require('options.php'); + } + +### Force hard-coded variables +# $report_display_type='LIMITED'; +# $ingroup_filter=array('_STAY','TEST_IN2','TEST_IN3'); + +if ( (strlen($group)>1) and (strlen($groups[0])<1) ) {$groups[0] = $group;} +else {$group = $groups[0];} +if (!isset($user_group_filter)) {$user_group_filter=array();} +if (!isset($ingroup_filter)) {$ingroup_filter=array();} + +$NOW_TIME = date("Y-m-d H:i:s"); +$NOW_DAY = date("Y-m-d"); +$NOW_HOUR = date("H:i:s"); +$STARTtime = date("U"); +$epoch_YESTERDAY = ($STARTtime - 86400); +$YESTERDAY = date("Y-m-d",$epoch_YESTERDAY); +$epoch_DAY_BEFORE_YESTERDAY = ($STARTtime - 86400*2); +$DAY_BEFORE_YESTERDAY = date("Y-m-d",$epoch_DAY_BEFORE_YESTERDAY); +$epoch_SEVEN_DAYS = ($STARTtime - 86400*7); +$SEVEN_DAYS = date("Y-m-d",$epoch_SEVEN_DAYS); +$epoch_THIRTY_DAYS = ($STARTtime - 86400*30); +$THIRTY_DAYS = date("Y-m-d",$epoch_THIRTY_DAYS); +$epoch_NINETY_DAYS = ($STARTtime - 86400*90); +$NINETY_DAYS = date("Y-m-d",$epoch_NINETY_DAYS); +$webphone_content=''; + +$start_date=preg_replace('/[^-0-9]/', '', $start_date); +$end_date=preg_replace('/[^-0-9]/', '', $end_date); + +if ($non_latin < 1) + { + $DB=preg_replace("/[^0-9a-zA-Z]/","",$DB); + $PHP_AUTH_USER = preg_replace('/[^-_0-9a-zA-Z]/', '', $PHP_AUTH_USER); + $PHP_AUTH_PW = preg_replace('/[^-_0-9a-zA-Z]/', '', $PHP_AUTH_PW); + $group = preg_replace('/[^-_0-9a-zA-Z]/','',$group); + $vicidial_queue_groups = preg_replace('/[^-_0-9a-zA-Z]/','',$vicidial_queue_groups); + $user_group_filter = preg_replace('/[^-_0-9a-zA-Z]/','',$user_group_filter); + $ingroup_filter = preg_replace('/[^-_0-9a-zA-Z]/','',$ingroup_filter); + $report_types_to_display = preg_replace('/[^\s\-_0-9a-zA-Z]/','',$report_types_to_display); + } +else + { + $DB=preg_replace("/[^0-9\p{L}]/u","",$DB); + $PHP_AUTH_USER = preg_replace('/[^-_0-9\p{L}]/u', '', $PHP_AUTH_USER); + $PHP_AUTH_PW = preg_replace('/[^-_0-9\p{L}]/u', '', $PHP_AUTH_PW); + $group = preg_replace('/[^-_0-9\p{L}]/u','',$group); + $vicidial_queue_groups = preg_replace('/[^-_0-9\p{L}]/u','',$vicidial_queue_groups); + $user_group_filter = preg_replace('/[^-_0-9\p{L}]/u','',$user_group_filter); + $ingroup_filter = preg_replace('/[^-_0-9\p{L}]/u','',$ingroup_filter); + $report_types_to_display = preg_replace('/[^\s\-_0-9\p{L}]/u','',$report_types_to_display); + } + +$stmt="SELECT selected_language from vicidial_users where user='$PHP_AUTH_USER';"; +if ($DB) {echo "|$stmt|\n";} +$rslt=mysql_to_mysqli($stmt, $link); +$sl_ct = mysqli_num_rows($rslt); +if ($sl_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $VUselected_language = $row[0]; + } + +$auth=0; +$reports_auth=0; +$admin_auth=0; +$auth_message = user_authorization($PHP_AUTH_USER,$PHP_AUTH_PW,'REPORTS',1,0); +if ( ($auth_message == 'GOOD') or ($auth_message == '2FA') ) + { + $auth=1; + if ($auth_message == '2FA') + { + header ("Content-type: text/html; charset=utf-8"); + echo _QXZ("Your session is expired").".
"._QXZ("Click here to log in").".\n"; + exit; + } + } + +if ($auth > 0) + { + $stmt="SELECT count(*) from vicidial_users where user='$PHP_AUTH_USER' and user_level > 7 and view_reports='1';"; + if ($DB) {echo "|$stmt|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $admin_auth=$row[0]; + + $stmt="SELECT count(*) from vicidial_users where user='$PHP_AUTH_USER' and user_level > 6 and view_reports='1';"; + if ($DB) {echo "|$stmt|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $reports_auth=$row[0]; + + if ($reports_auth < 1) + { + $VDdisplayMESSAGE = _QXZ("You are not allowed to view reports"); + Header ("Content-type: text/html; charset=utf-8"); + echo "$VDdisplayMESSAGE: |$PHP_AUTH_USER|$auth_message|\n"; + exit; + } + if ( ($reports_auth > 0) and ($admin_auth < 1) ) + { + $ADD=999999; + $reports_only_user=1; + } + } +else + { + $VDdisplayMESSAGE = _QXZ("Login incorrect, please try again"); + if ($auth_message == 'LOCK') + { + $VDdisplayMESSAGE = _QXZ("Too many login attempts, try again in 15 minutes"); + Header ("Content-type: text/html; charset=utf-8"); + echo "$VDdisplayMESSAGE: |$PHP_AUTH_USER|$auth_message|\n"; + exit; + } + if ($auth_message == 'IPBLOCK') + { + $VDdisplayMESSAGE = _QXZ("Your IP Address is not allowed") . ": $ip"; + Header ("Content-type: text/html; charset=utf-8"); + echo "$VDdisplayMESSAGE: |$PHP_AUTH_USER|$auth_message|\n"; + exit; + } + Header("WWW-Authenticate: Basic realm=\"CONTACT-CENTER-ADMIN\""); + Header("HTTP/1.0 401 Unauthorized"); + echo "$VDdisplayMESSAGE: |$PHP_AUTH_USER|$PHP_AUTH_PW|$auth_message|\n"; + exit; + } + +##### BEGIN log visit to the vicidial_report_log table ##### +$LOGip = getenv("REMOTE_ADDR"); +$LOGbrowser = getenv("HTTP_USER_AGENT"); +$LOGscript_name = getenv("SCRIPT_NAME"); +$LOGserver_name = getenv("SERVER_NAME"); +$LOGserver_port = getenv("SERVER_PORT"); +$LOGrequest_uri = getenv("REQUEST_URI"); +$LOGhttp_referer = getenv("HTTP_REFERER"); +$LOGbrowser=preg_replace("/\'|\"|\\\\/","",$LOGbrowser); +$LOGrequest_uri=preg_replace("/\'|\"|\\\\/","",$LOGrequest_uri); +$LOGhttp_referer=preg_replace("/\'|\"|\\\\/","",$LOGhttp_referer); +if (preg_match("/443/i",$LOGserver_port)) {$HTTPprotocol = 'https://';} + else {$HTTPprotocol = 'http://';} +if (($LOGserver_port == '80') or ($LOGserver_port == '443') ) {$LOGserver_port='';} +else {$LOGserver_port = ":$LOGserver_port";} +$LOGfull_url = "$HTTPprotocol$LOGserver_name$LOGserver_port$LOGrequest_uri"; + +$LOGhostname = php_uname('n'); +if (strlen($LOGhostname)<1) {$LOGhostname='X';} +if (strlen($LOGserver_name)<1) {$LOGserver_name='X';} + +$stmt="SELECT webserver_id FROM vicidial_webservers where webserver='$LOGserver_name' and hostname='$LOGhostname' LIMIT 1;"; +$rslt=mysql_to_mysqli($stmt, $link); +if ($DB) {echo "$stmt\n";} +$webserver_id_ct = mysqli_num_rows($rslt); +if ($webserver_id_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $webserver_id = $row[0]; + } +else + { + ##### insert webserver entry + $stmt="INSERT INTO vicidial_webservers (webserver,hostname) values('$LOGserver_name','$LOGhostname');"; + if ($DB) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $affected_rows = mysqli_affected_rows($link); + $webserver_id = mysqli_insert_id($link); + } + +##### END log visit to the vicidial_report_log table ##### + +if ( (strlen($slave_db_server)>5) and (preg_match("/$report_name/",$reports_use_slave_db)) ) + { + mysqli_close($link); + $use_slave_server=1; + $db_source = 'S'; + require("dbconnect_mysqli.php"); + echo "\n"; + } + +if ($auth) + { + $stmt="SELECT user_id,user,pass,full_name,user_level,user_group,phone_login,phone_pass,delete_users,delete_user_groups,delete_lists,delete_campaigns,delete_ingroups,delete_remote_agents,load_leads,campaign_detail,ast_admin_access,ast_delete_phones,delete_scripts,modify_leads,hotkeys_active,change_agent_campaign,agent_choose_ingroups,closer_campaigns,scheduled_callbacks,agentonly_callbacks,agentcall_manual,vicidial_recording,vicidial_transfers,delete_filters,alter_agent_interface_options,closer_default_blended,delete_call_times,modify_call_times,modify_users,modify_campaigns,modify_lists,modify_scripts,modify_filters,modify_ingroups,modify_usergroups,modify_remoteagents,modify_servers,view_reports,vicidial_recording_override,alter_custdata_override,qc_enabled,qc_user_level,qc_pass,qc_finish,qc_commit,add_timeclock_log,modify_timeclock_log,delete_timeclock_log,alter_custphone_override,vdc_agent_api_access,modify_inbound_dids,delete_inbound_dids,active,alert_enabled,download_lists,agent_shift_enforcement_override,manager_shift_enforcement_override,shift_override_flag,export_reports,delete_from_dnc,email,user_code,territory,allow_alerts,callcard_admin,force_change_password,modify_shifts,modify_phones,modify_carriers,modify_labels,modify_statuses,modify_voicemail,modify_audiostore,modify_moh,modify_tts,modify_contacts,modify_same_user_level, user_location from vicidial_users where user='$PHP_AUTH_USER';"; + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $LOGfull_name =$row[3]; + $LOGuser_level =$row[4]; + $LOGuser_group =$row[5]; + $LOGdelete_users =$row[8]; + $LOGdelete_user_groups =$row[9]; + $LOGdelete_lists =$row[10]; + $LOGdelete_campaigns =$row[11]; + $LOGdelete_ingroups =$row[12]; + $LOGdelete_remote_agents =$row[13]; + $LOGload_leads =$row[14]; + $LOGcampaign_detail =$row[15]; + $LOGast_admin_access =$row[16]; + $LOGast_delete_phones =$row[17]; + $LOGdelete_scripts =$row[18]; + $LOGdelete_filters =$row[29]; + $LOGalter_agent_interface =$row[30]; + $LOGdelete_call_times =$row[32]; + $LOGmodify_call_times =$row[33]; + $LOGmodify_users =$row[34]; + $LOGmodify_campaigns =$row[35]; + $LOGmodify_lists =$row[36]; + $LOGmodify_scripts =$row[37]; + $LOGmodify_filters =$row[38]; + $LOGmodify_ingroups =$row[39]; + $LOGmodify_usergroups =$row[40]; + $LOGmodify_remoteagents =$row[41]; + $LOGmodify_servers =$row[42]; + $LOGview_reports =$row[43]; + $LOGmodify_dids =$row[56]; + $LOGdelete_dids =$row[57]; + $LOGmanager_shift_enforcement_override=$row[61]; + $LOGexport_reports =$row[64]; + $LOGdelete_from_dnc =$row[65]; + $LOGcallcard_admin =$row[70]; + $LOGforce_change_password =$row[71]; + $LOGmodify_shifts =$row[72]; + $LOGmodify_phones =$row[73]; + $LOGmodify_carriers =$row[74]; + $LOGmodify_labels =$row[75]; + $LOGmodify_statuses =$row[76]; + $LOGmodify_voicemail =$row[77]; + $LOGmodify_audiostore =$row[78]; + $LOGmodify_moh =$row[79]; + $LOGmodify_tts =$row[80]; + $LOGmodify_contacts =$row[81]; + $LOGmodify_same_user_level =$row[82]; + $LOGuser_location =$row[83]; + + $stmt="SELECT allowed_campaigns,allowed_reports,admin_viewable_groups,admin_viewable_call_times,allowed_queue_groups,reports_header_override,admin_home_url from vicidial_user_groups where user_group='$LOGuser_group';"; + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $LOGallowed_campaigns = $row[0]; + $LOGallowed_reports = $row[1]; + $LOGadmin_viewable_groups = $row[2]; + $LOGadmin_viewable_call_times = $row[3]; + $LOGallowed_queue_groups = $row[4]; + $LOGreports_header_override = $row[5]; + $LOGadmin_home_url = $row[6]; + if (strlen($LOGadmin_home_url) > 5) {$SSadmin_home_url = $LOGadmin_home_url;} + + + $LOGadmin_viewable_groupsSQL=''; + $valLOGadmin_viewable_groupsSQL=''; + $vmLOGadmin_viewable_groupsSQL=''; + if ( (!preg_match('/\-\-ALL\-\-/i',$LOGadmin_viewable_groups)) and (strlen($LOGadmin_viewable_groups) > 3) ) + { + $rawLOGadmin_viewable_groupsSQL = preg_replace("/ \-/",'',$LOGadmin_viewable_groups); + $rawLOGadmin_viewable_groupsSQL = preg_replace("/ /","','",$rawLOGadmin_viewable_groupsSQL); + $LOGadmin_viewable_groupsSQL = "and user_group IN('---ALL---','$rawLOGadmin_viewable_groupsSQL')"; + $whereLOGadmin_viewable_groupsSQL = "where user_group IN('---ALL---','$rawLOGadmin_viewable_groupsSQL')"; + $valLOGadmin_viewable_groupsSQL = "and val.user_group IN('---ALL---','$rawLOGadmin_viewable_groupsSQL')"; + $vmLOGadmin_viewable_groupsSQL = "and vm.user_group IN('---ALL---','$rawLOGadmin_viewable_groupsSQL')"; + } + else + {$admin_viewable_groupsALL=1;} + + $LOGallowed_queue_groupsSQL=''; + if ( (!preg_match('/\-ALL\-GROUPS\-/i',$LOGallowed_queue_groups)) and (strlen($LOGallowed_queue_groups) > 3) ) + { + $rawLOGallowed_queue_groupsSQL = preg_replace("/ \-/",'',$LOGallowed_queue_groups); + $rawLOGallowed_queue_groupsSQL = preg_replace("/ /","','",$rawLOGallowed_queue_groupsSQL); + $LOGallowed_queue_groupsSQL = "and queue_group IN('---ALL---','$rawLOGallowed_queue_groupsSQL')"; + $whereLOGallowed_queue_groupsSQL = "where queue_group IN('---ALL---','$rawLOGallowed_queue_groupsSQL')"; + } + else + {$admin_viewable_groupsALL=1;} + + } + +$stmt="SELECT allowed_campaigns,allowed_reports,webphone_url_override,webphone_dialpad_override,webphone_systemkey_override,allowed_custom_reports from vicidial_user_groups where user_group='$LOGuser_group';"; +if ($DB) {echo "|$stmt|\n";} +$rslt=mysql_to_mysqli($stmt, $link); +$row=mysqli_fetch_row($rslt); +$LOGallowed_campaigns = $row[0]; +$LOGallowed_reports = "$row[1]$row[5]"; +$webphone_url = $row[2]; +$webphone_dialpad_override = $row[3]; +$system_key = $row[4]; + +$LOGallowed_campaignsSQL=''; +$whereLOGallowed_campaignsSQL=''; +if ( (!preg_match("/ALL-/",$LOGallowed_campaigns)) ) + { + $rawLOGallowed_campaignsSQL = preg_replace("/ -/",'',$LOGallowed_campaigns); + $rawLOGallowed_campaignsSQL = preg_replace("/ /","','",$rawLOGallowed_campaignsSQL); + $LOGallowed_campaignsSQL = "and campaign_id IN('$rawLOGallowed_campaignsSQL')"; + $whereLOGallowed_campaignsSQL = "where campaign_id IN('$rawLOGallowed_campaignsSQL')"; + } +$regexLOGallowed_campaigns = " $LOGallowed_campaigns "; + + +if ( (!preg_match("/$report_name/",$LOGallowed_reports)) and (!preg_match("/ALL REPORTS/",$LOGallowed_reports)) ) + { + Header("WWW-Authenticate: Basic realm=\"CONTACT-CENTER-ADMIN\""); + Header("HTTP/1.0 401 Unauthorized"); + echo _QXZ("You are not allowed to view this report").": |$PHP_AUTH_USER|$report_name|"._QXZ("$report_name")."|\n"; + exit; + } + + +$allactivecampaigns=''; +$stmt="select campaign_id,campaign_name from vicidial_campaigns where active='Y' $LOGallowed_campaignsSQL order by campaign_id;"; +$rslt=mysql_to_mysqli($stmt, $link); +if ($DB) {echo "$stmt\n";} +$groups_to_print = mysqli_num_rows($rslt); +$LISTgroups=array(); +$LISTnames=array(); +$i=0; +$LISTgroups[$i]='ALL-ACTIVE'; +$i++; +$groups_to_print++; +while ($i < $groups_to_print) + { + $row=mysqli_fetch_row($rslt); + $LISTgroups[$i] =$row[0]; + $LISTnames[$i] =$row[1]; + $allactivecampaigns .= "'$LISTgroups[$i]',"; + $i++; + } +$allactivecampaigns .= "''"; + +$i=0; +$group_string='|'; +if (!$groups) {$groups=array();} +$group_ct = count($groups); +while($i < $group_ct) + { + $groups[$i] = preg_replace('/[^-_0-9a-zA-Z]/', '', $groups[$i]); + if ( (preg_match("/ $groups[$i] /",$regexLOGallowed_campaigns)) or (preg_match("/ALL-/",$LOGallowed_campaigns)) ) + { + $group_string .= "$groups[$i]|"; + $group_SQL .= "'$groups[$i]',"; + $groupQS .= "&groups[]=$groups[$i]"; + } + + $i++; + } +$group_SQL = preg_replace('/,$/i', '',$group_SQL); + +$i=0; +$user_group_string='|'; +$user_group_ct = count($user_group_filter); +while($i < $user_group_ct) + { + $user_group_filter[$i] = preg_replace('/[^-_0-9a-zA-Z]/', '', $user_group_filter[$i]); +# if ( (preg_match("/ $user_group_filter[$i] /",$regexLOGallowed_campaigns)) or (preg_match("/ALL-/",$LOGallowed_campaigns)) ) +# { + $user_group_string .= "$user_group_filter[$i]|"; + $user_group_SQL .= "'$user_group_filter[$i]',"; + $usergroupQS .= "&user_group_filter[]=$user_group_filter[$i]"; +# } + + $i++; + } +$user_group_SQL = preg_replace('/,$/i', '',$user_group_SQL); + +$i=0; +$ingroup_string='|'; +$ingroup_ct = count($ingroup_filter); +while($i < $ingroup_ct) + { + $ingroup_filter[$i] = preg_replace('/[^-_0-9a-zA-Z]/', '', $ingroup_filter[$i]); + $ingroup_string .= "$ingroup_filter[$i]|"; + $ingroup_SQL .= "'$ingroup_filter[$i]',"; + $usergroupQS .= "&ingroup_filter[]=$ingroup_filter[$i]"; + + $i++; + } +$ingroup_SQL = preg_replace('/,$/i', '',$ingroup_SQL); + +### if no campaigns selected, display all +if ( ($group_ct < 1) or (strlen($group_string) < 2) ) + { + $groups[0] = 'ALL-ACTIVE'; + $group_string = '|ALL-ACTIVE|'; + $group = 'ALL-ACTIVE'; + $groupQS .= "&groups[]=ALL-ACTIVE"; + } +### if no user groups selected, display all +$user_group_none=0; +if ( ($user_group_ct < 1) or (strlen($user_group_string) < 2) ) + { + $user_group_filter[0] = 'ALL-GROUPS'; + $user_group_string = '|ALL-GROUPS|'; + $usergroupQS .= "&user_group_filter[]=ALL-GROUPS"; + $user_group_none=1; + } +### if no ingroups selected, display all +$ingroup_none=0; +if ( ($ingroup_ct < 1) or (strlen($ingroup_string) < 2) ) + { + $ingroup_filter[0] = 'ALL-INGROUPS'; + $ingroup_string = '|ALL-INGROUPS|'; + $ingroupQS .= "&ingroup_filter[]=ALL-INGROUPS"; + $ingroup_none=1; + } + +if ( (preg_match('/\s\-\-NONE\-\-\s/',$group_string) ) or ($group_ct < 1) ) + { + $all_active = 0; + $group_SQL = "''"; + $group_SQLand = "and FALSE"; + $group_SQLwhere = "where FALSE"; + } +elseif ( preg_match('/ALL\-ACTIVE/i',$group_string) ) + { + $all_active = 1; + $group_SQL = $allactivecampaigns; + $group_SQLand = "and campaign_id IN($allactivecampaigns)"; + $group_SQLwhere = "where campaign_id IN($allactivecampaigns)"; + } +else + { + $all_active = 0; + $group_SQLand = "and campaign_id IN($group_SQL)"; + $group_SQLwhere = "where campaign_id IN($group_SQL)"; + } + +if ( (preg_match('/\s\-\-NONE\-\-\s/',$user_group_string) ) or ($user_group_ct < 1) ) + { + $all_active_groups = 0; + $user_group_SQL = "''"; +# $user_group_SQLand = "and FALSE"; +# $user_group_SQLwhere = "where FALSE"; + } +elseif ( preg_match('/ALL\-GROUPS/i',$user_group_string) ) + { + $all_active_groups = 1; +# $user_group_SQL = ''; + $user_group_SQL = "'$rawLOGadmin_viewable_groupsSQL'"; +# $group_SQLand = "and campaign_id IN($allactivecampaigns)"; +# $group_SQLwhere = "where campaign_id IN($allactivecampaigns)"; + } +else + { + $all_active_groups = 0; +# $user_group_SQLand = "and user_group IN($user_group_SQL)"; +# $user_group_SQLwhere = "where user_group IN($user_group_SQL)"; + } + + +if ( (preg_match('/\s\-\-NONE\-\-\s/',$ingroup_string) ) or ($ingroup_ct < 1) ) + { + $all_active_ingroups = 0; + $ingroup_SQL = "''"; + } +elseif ( preg_match('/ALL\-INGROUPS/i',$ingroup_string) ) + { + $all_active_ingroups = 1; + $ingroup_SQL = "'$rawLOGadmin_viewable_groupsSQL'"; + } +else + { + $all_active_ingroups = 0; + } + + +$stmt="select user_group, group_name from vicidial_user_groups $whereLOGadmin_viewable_groupsSQL order by user_group;"; +$rslt=mysql_to_mysqli($stmt, $link); +if (!isset($DB)) {$DB=0;} +if ($DB) {echo "$stmt\n";} +$usergroups_to_print = mysqli_num_rows($rslt); +$i=0; +$usergroups=array(); +$usergroupnames=array(); +$usergroups[$i]='ALL-GROUPS'; +$usergroupnames[$i] = "All user groups"; +$i++; +$usergroups_to_print++; +while ($i < $usergroups_to_print) + { + $row=mysqli_fetch_row($rslt); + $usergroups[$i] =$row[0]; + $usergroupnames[$i] =$row[1]; + $i++; + } + +$stmt="select group_id,group_name from vicidial_inbound_groups $whereLOGadmin_viewable_groupsSQL order by group_id;"; +$rslt=mysql_to_mysqli($stmt, $link); +if ($DB) {$MAIN.="$stmt\n";} +$ingroups_to_print = mysqli_num_rows($rslt); +$i=0; +$LISTingroups=array(); +$LISTingroup_names=array(); +$LISTingroups[$i]='ALL-INGROUPS'; +$i++; +$ingroups_to_print++; +$ingroups_string='|'; +while ($i < $ingroups_to_print) + { + $row=mysqli_fetch_row($rslt); + $LISTingroups[$i] = $row[0]; + $LISTingroup_names[$i] = $row[1]; + $ingroups_string .= "$LISTingroups[$i]|"; + $i++; + } + + +$stmt="select * from vicidial_queue_groups where active='Y' $LOGallowed_queue_groupsSQL order by queue_group, queue_group_name;"; +$rslt=mysql_to_mysqli($stmt, $link); +# echo $stmt; +if ($DB) {$MAIN.="$stmt\n";} +$queue_groups_to_print = mysqli_num_rows($rslt); +$i=0; +$LISTqueue_groups=array(); +$LISTqueue_group_names=array(); +$LISTqueue_groups[$i]='ALL-INGROUPS'; +$i++; +$queue_groups_to_print++; +$queue_groups_string='|'; +$queue_groups_dropdown=""; +while ($i < $queue_groups_to_print) + { + $row=mysqli_fetch_array($rslt); + $LISTqueue_groups[$i] = $row["queue_group"]; + $LISTqueue_group_names[$i] = $row["queue_group_name"]; + $queue_groups_string .= "$LISTqueue_groups[$i]|"; + $queue_groups_dropdown .= "\t