<?php
/**
- * $Horde: incubator/operator/config/prefs.php.dist,v 1.1 2008/04/19 01:26:06 bklang Exp $
+ * $Horde: incubator/operator/config/prefs.php.dist,v 1.2 2008/07/03 14:29:15 bklang Exp $
*
* See horde/config/prefs.php for documentation on the structure of this file.
*/
'column' => _("Options"),
'label' => _("Display Preferences"),
'desc' => _("Set default display parameters."),
- 'members' => array('rowsperpage', 'columns')
+ 'members' => array('rowsperpage', 'resultlimit', 'columns')
);
$_prefs['rowsperpage'] = array(
'desc' => _("The columns to be displayed on the Call Detail Review screen")
);
+$_prefs['resultlimit'] = array(
+ 'value' => 100,
+ 'locked' => false,
+ 'shared' => false,
+ 'type' => 'number',
+ 'desc' => _("Limit the number of CDR results when searching to this number")
+);
$_prefs['columns'] = array(
'value' => 'a:18:{i:0;s:11:"accountcode";i:1;s:3:"src";i:2;s:3:"dst";i:3;s:8:"dcontext";i:4;s:4:"clid";i:5;s:7:"channel";i:6;s:10:"dstchannel";i:7;s:7:"lastapp";i:8;s:8:"lastdata";i:9;s:5:"start";i:10;s:6:"answer";i:11;s:3:"end";i:12;s:8:"duration";i:13;s:7:"billsec";i:14;s:11:"disposition";i:15;s:8:"amaflags";i:16;s:9:"userfield";i:17;s:8:"uniqueid";}',
<?php
/**
- * $Horde: incubator/operator/index.php,v 1.1 2008/04/19 01:26:06 bklang Exp $
+ * $Horde: incubator/operator/index.php,v 1.2 2008/07/03 14:29:15 bklang Exp $
*
* Copyright 2008 Alkaloid Networks LLC <http://projects.alkaloid.net>
*
array('conf.php'));
}
-require OPERATOR_BASE . '/search.php';
+require OPERATOR_BASE . '/viewgraph.php';
* The table structure can be created by the scripts/sql/operator_foo.sql
* script.
*
- * $Horde: incubator/operator/lib/Driver/asterisksql.php,v 1.7 2008/07/01 22:25:01 bklang Exp $
+ * $Horde: incubator/operator/lib/Driver/asterisksql.php,v 1.8 2008/07/03 14:29:17 bklang Exp $
*
* Copyright 2007-2008 The Horde Project (http://www.horde.org/)
*
*
* @return boolean|PEAR_Error True on success, PEAR_Error on failure.
*/
- function getData($start, $end, $accountcode = null, $dcontext = null)
+ function getData($start, $end, $accountcode = null, $dcontext = null,
+ $rowstart = 0, $rowlimit = 100)
{
// Use the query to make the MySQL driver look like the CDR-CSV driver
$filter = array();
$values = array();
+ if (!is_numeric($rowstart)) {
+ Horde::logMessage('Invalid start row requested.', __FILE__, __LINE__, PEAR_LOG_ERR);
+ return PEAR::raiseError(_("Internal error. Details have been logged for the administrator."));
+ }
+ if (!is_numeric($rowlimit)) {
+ Horde::logMessage('Invalid row limit requested.', __FILE__, __LINE__, PEAR_LOG_ERR);
+ return PEAR::raiseError(_("Internal error. Details have been logged for the administrator."));
+ }
+
+
// Start Date
if (!is_a($start, 'Horde_Date')) {
$start = new Horde_Date($start);
$filterstring = implode(' AND ', $filter);
$sql = sprintf($sql, $filterstring);
/* Log the query at a DEBUG log level. */
- Horde::logMessage(sprintf('Operator_Driver_asterisksql::getData(): %s', $sql),
- __FILE__, __LINE__, PEAR_LOG_DEBUG);
+ Horde::logMessage(sprintf('Operator_Driver_asterisksql::getData(): %s', $sql), __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ /* Execute the query. */
+ $res = $this->_db->limitQuery($sql, $rowstart, $rowlimit, $values);
+ if (is_a($res, 'PEAR_Error')) {
+ Horde::logMessage($res, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return PEAR::raiseError(_("Internal error. Details have been logged for the administrator."));
+ }
+
+ $data = array();
+ while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
+ $data[] = $row;
+ }
+
+ // Get summary statistics on the requested criteria
+ $sql = 'SELECT COUNT(*) AS numcalls, SUM(duration)/60 AS minutes, ' .
+ 'SUM(CASE disposition WHEN "FAILED" THEN 1 ELSE 0 END) AS ' .
+ 'failed FROM ' . $this->_params['table'] . ' WHERE %s';
+ $sql = sprintf($sql, $filterstring);
+ Horde::logMessage(sprintf('Operator_Driver_asterisksql::getData(): %s', $sql), __FILE__, __LINE__, PEAR_LOG_DEBUG);
/* Execute the query. */
- return $this->_db->getAll($sql, $values, DB_FETCHMODE_ASSOC);
+ $res = $this->_db->getRow($sql, $values, DB_FETCHMODE_ASSOC);
+ if (is_a($res, 'PEAR_Error')) {
+ Horde::logMessage($res, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return PEAR::raiseError(_("Internal error. Details have been logged for the administrator."));
+ }
+
+ return array_merge($data, $res);
}
/**
/**
* SearchCDRForm Class
*
- * $Horde: incubator/operator/lib/Form/SearchCDR.php,v 1.3 2008/07/01 22:25:01 bklang Exp $
+ * $Horde: incubator/operator/lib/Form/SearchCDR.php,v 1.4 2008/07/03 14:29:18 bklang Exp $
*
* Copyright 2008 Alkaloid Networks LLC <http://projects.alkaloid.net>
*
class SearchCDRForm extends Horde_Form {
- function SearchCDRForm(&$vars)
+ function SearchCDRForm($title, &$vars)
{
global $operator_driver;
- parent::Horde_Form($vars, _("Search CDR Data"));
+ parent::Horde_Form($vars, $title);
// FIXME: Generate a list of clients from Turba?
//$clients =
/**
* Operator Base Class.
*
- * $Horde: incubator/operator/lib/Operator.php,v 1.3 2008/07/01 22:25:00 bklang Exp $
+ * $Horde: incubator/operator/lib/Operator.php,v 1.4 2008/07/03 14:29:16 bklang Exp $
*
* Copyright 2008 Alkaloid Networks LLC <http://projects.alkaloid.net>
*
require_once 'Horde/Menu.php';
$menu = new Menu(HORDE_MENU_MASK_ALL);
- $menu->add(Horde::applicationUrl('search.php'), _("Search"), 'user.png', $registry->getImageDir('horde'));
- $menu->add(Horde::applicationUrl('viewgraph.php'), _("View Graphs"), 'user.png', $registry->getImageDir('horde'));
+ $menu->add(Horde::applicationUrl('viewgraph.php'), _("View Graphs"), 'graphs.png');
+ $menu->add(Horde::applicationUrl('search.php'), _("Search"), 'search.png', $registry->getImageDir('horde'));
if ($returnType == 'object') {
return $menu;
<?php
/**
- * $Horde: incubator/operator/search.php,v 1.3 2008/07/01 22:25:00 bklang Exp $
+ * $Horde: incubator/operator/search.php,v 1.4 2008/07/03 14:29:15 bklang Exp $
*
* Copyright 2008 Alkaloid Networks LLC <http://projects.alkaloid.net>
*
$renderer = new Horde_Form_Renderer();
$vars = Variables::getDefaultVariables();
-$form = new SearchCDRForm($vars);
+if (!$vars->exists('rowstart')) {
+ $rowstart = 0;
+} elseif (!is_numeric($rowstart = $vars->get('rowstart'))) {
+ $notification->push(_("Invalid number for row start. Using 0."));
+ $rowstart = 0;
+}
+
+$numrows = $prefs->getValue('resultlimit');
+if (!is_numeric($numrows)) {
+ $notification->push(_("Invalid number for rows for search limit. Using 100."));
+ $numrows = 100;
+}
+
+$form = new SearchCDRForm(_("Search CDR Data"), $vars);
if ($form->isSubmitted() && $form->validate($vars, true)) {
$accountcode = $vars->get('accountcode');
$dcontext = $vars->get('dcontext');
$start = new Horde_Date($vars->get('startdate'));
$end = new Horde_Date($vars->get('enddate'));
- $data = $operator_driver->getData($start, $end, $accountcode, $dcontext);
+ $data = $operator_driver->getData($start, $end, $accountcode, $dcontext,
+ $rowstart, $numrows);
$_SESSION['operator']['lastsearch']['params'] = array(
'accountcode' => $vars->get('accountcode'),
'dcontext' => $vars->get('dcontext'),
'startdate' => $vars->get('startdate'),
'enddate' => $vars->get('enddate'));
- $_SESSION['operator']['lastsearch']['data'] = $data;
} else {
if (isset($_SESSION['operator']['lastsearch']['params'])) {
foreach($_SESSION['operator']['lastsearch']['params'] as $var => $val) {
$vars->set($var, $val);
}
}
- if (isset($_SESSION['operator']['lastsearch']['data'])) {
- $data = $_SESSION['operator']['lastsearch']['data'];
- }
}
$title = _("Search Call Detail Records");
$columns = unserialize($prefs->getValue('columns'));
if (!empty($data)) {
require OPERATOR_TEMPLATES . '/search/header.inc';
+ unset($data['count'], $data['minutes'], $data['failed']);
foreach ($data as $record) {
require OPERATOR_TEMPLATES . '/search/row.inc';
}
+Call Statistics Summary:<br />
+<ul>
+<li>Total Calls: <?php echo $data['numcalls']; ?></li>
+<li>Total Minutes: <?php echo round($data['minutes'], 1); ?></li>
+<li>Failed Calls: <?php echo $data['failed']; ?></li>
+</ul>
+<br />
<table class="striped">
<tr>
<?php
<?php
/**
- * $Horde: incubator/operator/viewgraph.php,v 1.4 2008/07/01 22:25:00 bklang Exp $
+ * $Horde: incubator/operator/viewgraph.php,v 1.5 2008/07/03 14:29:15 bklang Exp $
*
* Copyright 2008 Alkaloid Networks LLC <http://projects.alkaloid.net>
*
$renderer = new Horde_Form_Renderer();
$vars = Variables::getDefaultVariables();
-$form = new SearchCDRForm($vars);
+$form = new SearchCDRForm(_("Graph CDR Data"), $vars);
if ($form->isSubmitted() && $form->validate($vars, true)) {
$accountcode = $vars->get('accountcode');
$dcontext = $vars->get('dcontext');
if ($stats === false) {
$stats = $operator_driver->getMonthlyCallStats($start, $end,
$accountcode, $dcontext);
- $res = $cache->set($cachekey, serialize($stats), 600);
- if ($res === false) {
- Horde::logMessage('The cache system has experienced an error. Unable to continue.', __FILE__, __LINE__, PEAR_LOG_ERR);
- $notification->push(_("Internal error. Details have been logged for the administrator."));
- unset($stats);
+ if (is_a($stats, 'PEAR_Error')) {
+ $notification->push($stats);
+ $stats = array();
+ } else {
+ $res = $cache->set($cachekey, serialize($stats), 600);
+ if ($res === false) {
+ Horde::logMessage('The cache system has experienced an error. Unable to continue.', __FILE__, __LINE__, PEAR_LOG_ERR);
+ $notification->push(_("Internal error. Details have been logged for the administrator."));
+ unset($stats);
+ }
}
} else {
// Cached data is stored serialized
'graph' => 'failed', 'key' => $cachekey));
}
-
$title = _("Call Detail Records Graph");
require OPERATOR_TEMPLATES . '/common-header.inc';