basic_stats.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:12k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. // +-------------------------------------------------------------+
  3. // | DeskPRO v [2.0.1 Production]
  4. // | Copyright (C) 2001 - 2004 Headstart Solutions Limited
  5. // | Supplied by WTN-WDYL
  6. // | Nullified by WTN-WDYL
  7. // | Distribution via WebForum, ForumRU and associated file dumps
  8. // +-------------------------------------------------------------+
  9. // | DESKPRO IS NOT FREE SOFTWARE
  10. // +-------------------------------------------------------------+
  11. // | License ID : Full Enterprise License =) ...
  12. // | License Owner : WTN-WDYL Team
  13. // +-------------------------------------------------------------+
  14. // | $RCSfile: basic_stats.php,v $
  15. // | $Date: 2004/02/10 01:34:24 $
  16. // | $Revision: 1.21 $
  17. // +-------------------------------------------------------------+
  18. // | File Details:
  19. // | - Basic statistical summary of DeskPRO operations
  20. // |   (administration interface)
  21. // +-------------------------------------------------------------+
  22. error_reporting(E_ALL & ~E_NOTICE);
  23. require_once('./global.php');
  24. //Nullify WTN-WDYL Team
  25. define('NO_GRAPHIC_HANDLER', 'true');
  26. include_once("./../includes/graph/jpgraph.php");
  27. include_once ("./../includes/graph/jpgraph_bar.php");
  28. error_reporting(0);
  29. admin_header('Basic Statistics', 'Tickets and Techs');
  30. if ((int)$_REQUEST['duration']) {
  31. $duration = (int)$_REQUEST['duration'];
  32. switch ($_REQUEST['units']) {
  33. case 'minutes':
  34. case 'hours':
  35. case 'days':
  36. case 'weeks':
  37. case 'months':
  38. case 'years':
  39. break;
  40. default:
  41. $_REQUEST['units'] = 'days';
  42. $duration = 1;
  43. break;
  44. }
  45. } else {
  46. $_REQUEST['units'] = 'days';
  47. $duration = 1;
  48. }
  49. $text = "in the past $duration $_REQUEST[units]";
  50. $when = strtotime(date('r') . " -$duration $_REQUEST[units]");
  51. $start_text = "<P>Showing statistics from " . our_date($when, 'full') . " to " . our_date(mktime()) . " (events occuring $text):</P>n";
  52. $now = mktime();
  53. ////// Gathering stats //////
  54. //// Tickets opened and closed
  55. $open_close[0] = 0;
  56. $open_close[1] = 0;
  57. $db->query("SELECT COUNT(id) AS total, is_open FROM ticket WHERE date_opened >= $when OR date_closed >= $when GROUP BY is_open ORDER BY is_open");
  58. while ($res = $db->row_array()) {
  59. $open_close[$res['is_open']] = $res['total'];
  60. }
  61. $open_close_total[0] = 0;
  62. $open_close_total[1] = 0;
  63. $db->query("SELECT COUNT(id) AS total, is_open FROM ticket GROUP BY is_open ORDER BY is_open");
  64. while ($res = $db->row_array()) {
  65. $open_close_total[$res['is_open']] = $res['total'];
  66. }
  67. $oc_table_cols = array('<B>Opened</B>', '<B>Closed</B>');
  68. $oc_table[] = array("$open_close[1] $text", "$open_close[0] $text");
  69. $oc_table[] = array("$open_close_total[1] total", "$open_close_total[0] total");
  70. //// Tickets awaiting reply from techs and users
  71. $await_reply[0] = 0;
  72. $await_reply[1] = 0;
  73. $db->query("SELECT COUNT(id) AS total, awaiting_tech FROM ticket WHERE date_opened >= $when OR date_closed >= $when GROUP BY awaiting_tech ORDER BY awaiting_tech");
  74. while ($res = $db->row_array()) {
  75. $await_reply[$res['awaiting_tech']] = $res['total'];
  76. }
  77. $await_reply_total[0] = 0;
  78. $await_reply_total[1] = 0;
  79. $db->query("SELECT COUNT(id) AS total, awaiting_tech FROM ticket GROUP BY awaiting_tech ORDER BY awaiting_tech");
  80. while ($res = $db->row_array()) {
  81. $await_reply_total[$res['awaiting_tech']] = $res['total'];
  82. }
  83. $ar_table_cols = array('<B>Awaiting Tech Reply</B>', '<B>Awaiting User Reply</B>');
  84. $ar_table[] = array("$await_reply[1] $text", "$await_reply[0] $text");
  85. $ar_table[] = array("$await_reply_total[1] total", "$await_reply_total[0] total");
  86. //// Tickets closed in duration, by technician
  87. $db->query("SELECT username AS name FROM tech");
  88. while ($res = $db->row_array()) {
  89. $techs[$res['name']] = 0;
  90. }
  91. $db->query("SELECT COUNT(ticket.id) AS total, tech.username AS name 
  92. FROM ticket, tech 
  93. WHERE !is_open 
  94. AND ticket.tech = tech.id 
  95. AND date_closed >= $when
  96. GROUP BY name 
  97. ORDER BY name");
  98. if ($db->num_rows()) {
  99. while ($res = $db->row_array()) {
  100. $techs[$res['name']] = $res['total'];
  101. }
  102. }
  103. $closed_techs_head[] = "<B>Technician</B>";
  104. $closed_techs_data[] = "<B>Tickets</B>";
  105. foreach($techs AS $key => $val) {
  106. $closed_techs_head[] = $key;
  107. $closed_techs_data[] = $val;
  108. }
  109. $closed_techs_table[] = $closed_techs_head;
  110. $closed_techs_table[] = $closed_techs_data;
  111. unset ($techs);
  112. //// Tickets awaiting tech reply, by priority
  113. $db->query("SELECT name FROM ticket_pri");
  114. while ($res = $db->row_array()) {
  115. $pris[$res['name']] = 0;
  116. }
  117. $db->query("SELECT COUNT(ticket.id) AS total, ticket_pri.name AS name 
  118. FROM ticket, ticket_pri 
  119. WHERE is_open 
  120. AND awaiting_tech 
  121. AND ticket.priority = ticket_pri.id 
  122. GROUP BY name 
  123. ORDER BY name");
  124. if ($db->num_rows()) {
  125. while ($res = $db->row_array()) {
  126. $pris[$res['name']] = $res['total'];
  127. }
  128. }
  129. $pris_head[] = "<B>Priorities</B>";
  130. $pris_data[] = "<B>Tickets</B>";
  131. if (is_array($pris)) {
  132. foreach($pris AS $key => $val) {
  133. $pris_head[] = $key;
  134. $pris_data[] = $val;
  135. }
  136. }
  137. $pris_table[] = $pris_head;
  138. $pris_table[] = $pris_data;
  139. //// Tickets awaiting tech reply, by category
  140. $db->query("SELECT name FROM ticket_cat");
  141. while ($res = $db->row_array()) {
  142. $cats[$res['name']] = 0;
  143. }
  144. $db->query("SELECT COUNT(ticket.id) AS total, ticket_cat.name AS name 
  145. FROM ticket, ticket_cat 
  146. WHERE is_open 
  147. AND awaiting_tech 
  148. AND ticket.category = ticket_cat.id 
  149. GROUP BY name 
  150. ORDER BY name");
  151. if ($db->num_rows()) {
  152. while ($res = $db->row_array()) {
  153. $cats[$res['name']] = $res['total'];
  154. }
  155. }
  156. $cats_head[] = "<B>Category</B>";
  157. $cats_data[] = "<B>Tickets</B>";
  158. if (is_array($cats)) {
  159. foreach($cats AS $key => $val) {
  160. $cats_head[] = $key;
  161. $cats_data[] = $val;
  162. }
  163. }
  164. $cats_table[] = $cats_head;
  165. $cats_table[] = $cats_data;
  166. //// Tickets awaiting tech reply, by technician
  167. $db->query("SELECT COUNT(ticket.id) AS total FROM ticket WHERE is_open AND awaiting_tech AND !tech GROUP BY tech");
  168. $res = $db->row_array();
  169. $techs['Unassigned'] = $res['total'];
  170. $db->query("SELECT username AS name FROM tech");
  171. while ($res = $db->row_array()) {
  172. $techs[$res['name']] = 0;
  173. }
  174. $db->query("SELECT COUNT(ticket.id) AS total, tech.username AS name 
  175. FROM ticket, tech 
  176. WHERE is_open 
  177. AND awaiting_tech 
  178. AND ticket.tech = tech.id 
  179. GROUP BY name 
  180. ORDER BY name");
  181. if ($db->num_rows()) {
  182. while ($res = $db->row_array()) {
  183. $techs[$res['name']] = $res['total'];
  184. }
  185. }
  186. $techs_head[] = "<B>Technician</B>";
  187. $techs_data[] = "<B>Tickets</B>";
  188. foreach($techs AS $key => $val) {
  189. $techs_head[] = $key;
  190. $techs_data[] = $val;
  191. }
  192. $techs_table[] = $techs_head;
  193. $techs_table[] = $techs_data;
  194. //// Response times (answered within N minutes)
  195. unset ($techs);
  196. $db->query("SELECT username AS name FROM tech");
  197. while ($res = $db->row_array()) {
  198. $techs[$res['name']] = array(0,0,0,0,0,0);
  199. }
  200. $db->query("SELECT (min(ticket_message.date) - ticket.date_opened) AS life, username AS name 
  201. FROM ticket, ticket_message 
  202. LEFT JOIN tech ON ticket_message.techid = tech.id 
  203. WHERE ticket_message.techid 
  204. AND ticket_message.ticketid = ticket.id 
  205. GROUP BY ticket_message.ticketid;");
  206. while ($res = $db->row_array()) {
  207. if ($res['life'] <= (60 * 5)) { // Answered in under 5 minutes
  208. $techs[$res['name']][0]++;
  209. } elseif ($res['life'] <= (60 * 10)) { // Answered within 10 minutes
  210. $techs[$res['name']][1]++;
  211. } elseif ($res['life'] <= (60 * 15)) { // Answered within 15 minutes
  212. $techs[$res['name']][2]++;
  213. } elseif ($res['life'] <= (60 * 30)) { // Answered within 30 minutes
  214. $techs[$res['name']][3]++;
  215. } elseif ($res['life'] <= (60 * 60)) { // Answered within 60 minutes
  216. $techs[$res['name']][4]++;
  217. } else { // Answered after an hour
  218. $techs[$res['name']][5]++;
  219. }
  220. }
  221. $resp_table_cols = array(
  222. 'Technician',
  223. '&lt; 5 mins',
  224. '5-10 mins',
  225. '10-15 mins',
  226. '15-30 mins',
  227. '30-60 mins',
  228. '&gt; 60 mins'
  229. );
  230. foreach($techs AS $key => $val) {
  231. if ($key) {
  232. $resp_cols = array("<B>$key</B>");
  233. foreach($val AS $key2 => $val2) {
  234. $resp_cols[] = $val2;
  235. }
  236. $resp_table[] = $resp_cols;
  237. }
  238. }
  239. //// Ticket and reply counts
  240. $db->query("SELECT username, id FROM tech");
  241. $techs = array();
  242. while ($result = $db->row_array()) {
  243. $techs[$result['id']] = $result['username'];
  244. }
  245. if ($db->num_rows()) {
  246. $data = $db->query_return_array("SELECT techid, ticketid FROM ticket_message WHERE techid");
  247. if ($db->num_rows()) {
  248. foreach ($data AS $val) {
  249. $tech_count[$techs[$val['techid']]]['tickets'][$val['ticketid']] = $val['ticketid'];
  250. $tech_count[$techs[$val['techid']]]['count']++;
  251. }
  252. }
  253. if (is_array($tech_count)) {
  254. $per_tech_cols = array('Technician', 'Total Messages', 'Total Tickets');
  255. foreach ($tech_count AS $techname => $val) {
  256. $per_tech_totals[] = array($techname, $val['count'], count(array_keys($val['tickets'])));
  257. $per_tech_name[] = $techname;
  258. $per_tech_messages[] = $val['count'];
  259. $per_tech_tickets[] = count(array_keys($val['tickets']));
  260. }
  261. }
  262. }
  263. //// Print it all out
  264. $form[] = $start_text;
  265. $form[] = array('<FORM METHOD="post" ACTION="basic_stats.php"><B>Show Statistics from the Last ...</B>&nbsp;&nbsp;&nbsp;' .
  266. form_input('duration', $duration, 5) . '&nbsp;&nbsp;&nbsp;' .
  267. form_select('units', array('minutes', 'hours', 'days', 'weeks', 'months', 'years'), '', $_REQUEST['units'], 1) . '&nbsp;&nbsp;&nbsp' .form_submit('Update Statistics'));
  268. table_header('History Options');
  269. table_content('', $form);
  270. table_footer();
  271. table_header('Opened/Closed');
  272. table_content($oc_table_cols, $oc_table);
  273. table_footer();
  274. $closed_techs_table[] = simple_bargraph($closed_techs_data, $closed_techs_head);
  275. table_header("Tickets Closed $text");
  276. table_content('', $closed_techs_table);
  277. table_footer();
  278. table_header('Awaiting Reply Status');
  279. table_content($ar_table_cols, $ar_table);
  280. table_footer();
  281. $cats_table[] = simple_bargraph($cats_data, $cats_head);
  282. table_header('Open Tickets (Awaiting Tech Reply, by Category)');
  283. table_content('', $cats_table);
  284. table_footer();
  285. $pris_table[] = simple_bargraph($pris_data, $pris_head);
  286. table_header('Open Tickets (Awaiting Tech Reply, by Priority)');
  287. table_content('', $pris_table);
  288. table_footer();
  289. $techs_table[] = simple_bargraph($techs_data, $techs_head);
  290. table_header('Open Tickets (Awaiting Tech Reply, by Technician)');
  291. table_content('', $techs_table);
  292. table_footer();
  293. table_header('Response Times (time to first response, by Technician, per Ticket)');
  294. table_content($resp_table_cols, $resp_table);
  295. table_footer();
  296. @array_unshift($per_tech_name, "empty"); 
  297. @array_unshift($per_tech_tickets, "empty"); 
  298. $per_tech_totals[] = simple_bargraph($per_tech_tickets, $per_tech_name, $per_tech_messages);
  299. table_header('Total Responses Written and Total Tickets Responded To');
  300. table_content($per_tech_cols, $per_tech_totals);
  301. table_footer();
  302. function simple_bargraph($datay, $datax, $datay2='') {
  303. @array_shift($datay);
  304. @array_shift($datax);
  305. // Create the graph. These two calls are always required
  306. $graph = new Graph(600,200);    
  307. $graph->SetScale("textlin");
  308. // Create a bar pot
  309. $bplot = new BarPlot($datay);
  310. // Adjust fill color
  311. $bplot->SetFillColor('orange');
  312. $bplot->value->Show();
  313. // No decimal places
  314. $bplot->value->SetFormat('%.0f T');
  315. if (is_array($datay2)) {
  316. // Create a bar pot
  317. $bplot2 = new BarPlot($datay2);
  318. // Adjust fill color
  319. $bplot2->SetFillColor('green');
  320. $bplot2->value->Show();
  321. // No decimal places
  322. $bplot2->value->SetFormat('%.0f M');
  323. $gbplot = new GroupBarPlot(array($bplot,$bplot2));
  324. // ...and add it to the graPH
  325. $graph->Add($gbplot);
  326. } else {
  327. $graph->Add($bplot);
  328. }
  329. $graph->img->SetMargin(40,30,20,40);
  330. // Setup X-axis
  331. $graph->xaxis->SetTickLabels($datax);
  332. $graph->xaxis->SetFont(FF_VERDANA,FS_NORMAL, 7);
  333. // Display the graph
  334. $x = rand(1, 1000000);
  335. $graph->Stroke("graphs/$x.png");
  336. return "<img src="graphs/$x.png">n";
  337. }