function reportReportedeTroncalesusadasporHoraeneldia($smarty, $module_name, $local_templates_dir, &$pDB, $arrConf, &$pDB_asterisk) { $pReportedeTroncalesusadasporHoraeneldia = new paloSantoReportedeTroncalesusadasporHoraeneldia($pDB); // PS se obtiene el arreglo con las trunks para mostrarlas en el filtro //$arrTrunk1 = getTrunk($pDB, $pDB_asterisk);//Trunks //diana //llamamos funcion nueva $arrTrunk = obtener_nuevas_trunks($pDB, $pDB_asterisk); // valores del filtro $filter_field = getParameter("filter_field"); $filter_value = getParameter("filter_value"); $date_from = getParameter("date_from"); $date_to = getParameter("date_to"); // si la fecha no está seteada en el filtro $_POST["date_from"] = isset($date_from) ? $date_from : date("d M Y"); $_POST["date_to"] = isset($date_to) ? $date_to : date("d M Y"); $date_from = isset($date_from) ? date('Y-m-d', strtotime($date_from)) : date("Y-m-d"); $date_to = isset($date_to) ? date('Y-m-d', strtotime($date_to)) : date("Y-m-d"); // para setear la trunk la primera vez $filter_value = getParameter("filter_value"); if (!isset($filter_value)) { $trunk = array_shift(array_keys($arrTrunk)); //Trunks $_POST["filter_value"] = $trunk; $filter_value = $trunk; } //validacion para que los filtros se queden seteados con el valor correcto, correccion de bug que se estaba dando en caso de pagineo $_POST["filter_value"] = $filter_value; $bElastixNuevo = method_exists('paloSantoGrid', 'setURL'); // begin grid parameters $oGrid = new paloSantoGrid($smarty); $oGrid->enableExport(); $bExportando = $bElastixNuevo ? $oGrid->isExportAction() : isset($_GET['exportcsv']) && $_GET['exportcsv'] == 'yes'; $limit = 50; $offset = 0; // se obtienen los datos que se van a mostrar $arrData = null; $filter_value = trim($filter_value); $recordset = $pReportedeTroncalesusadasporHoraeneldia->listarTraficoLlamadasHora($date_from, $date_to, empty($filter_value) ? NULL : $filter_value); if (!is_array($recordset)) { $smarty->assign(array('mb_title' => _tr('Query Error'), 'mb_message' => $oCalls->errMsg)); $recordset = array(); } $total = count($recordset); $oGrid->setLimit($limit); $oGrid->setTotal($total); if ($bElastixNuevo) { $offset = $oGrid->calculateOffset(); } else { $action = getParameter("nav"); $start = getParameter("start"); $oGrid->calculatePagination($action, $start); $end = $oGrid->getEnd(); } $url = array("menu" => $module_name, "filter_field" => $filter_field, "filter_value" => $filter_value, "date_from" => $date_from, "date_to" => $date_to); // se guarda la data en un arreglo que luego es enviado como parámetro para crear el reporte if (is_array($recordset)) { $arrData = array(); $total = array('entered' => 0, 'terminada' => 0, 'abandonada' => 0, 'en-cola' => 0, 'fin-monitoreo' => 0); foreach ($recordset as $iHora => $tupla) { $arrData[] = array(sprintf('%02d:00:00 - %02d:00:00', $iHora, $iHora + 1), $tupla['entered'], $tupla['terminada'], $tupla['abandonada'], $tupla['en-cola'], $tupla['fin-monitoreo']); foreach (array_keys($total) as $k) { $total[$k] += $tupla[$k]; } } $sTagInicio = !$bExportando ? '<b>' : ''; $sTagFinal = $sTagInicio != '' ? '</b>' : ''; $arrData[] = array($sTagInicio . _tr('TOTAL') . $sTagFinal, $sTagInicio . $total['entered'] . $sTagFinal, $sTagInicio . $total['terminada'] . $sTagFinal, $sTagInicio . $total['abandonada'] . $sTagFinal, $sTagInicio . $total['en-cola'] . $sTagFinal, $sTagInicio . $total['fin-monitoreo'] . $sTagFinal); } //begin section filter $arrFormFilterReportedeTroncalesusadasporHoraeneldia = createFieldFilter($arrTrunk); $smarty->assign("SHOW", _tr("Show")); $oFilterForm = new paloForm($smarty, $arrFormFilterReportedeTroncalesusadasporHoraeneldia); $htmlFilter = $oFilterForm->fetchForm("{$local_templates_dir}/filter.tpl", "", $_POST, $_GET); //end section filter $oGrid->showFilter($htmlFilter); if ($bElastixNuevo) { $oGrid->setURL($url); $oGrid->setData($arrData); $arrColumnas = array(_tr("Time Period "), _tr("Entered"), _tr("Answered"), _tr("Abandoned"), _tr("In queue"), _tr("Without monitoring ")); $oGrid->setColumns($arrColumnas); $oGrid->setTitle(_tr("Reporte de Troncales usadas por Hora en el dia")); $oGrid->pagingShow(true); $oGrid->setNameFile_Export(_tr("Reporte de Troncales usadas por Hora en el dia")); return $oGrid->fetchGrid(); } else { global $arrLang; $url = construirURL($url, array('nav', 'start')); $offset = 0; $limit = $total + 1; // se crea el grid $arrGrid = array("title" => _tr("Reporte de Troncales usadas por Hora en el dia"), "url" => $url, "icon" => "images/list.png", "width" => "99%", "start" => $total == 0 ? 0 : $offset + 1, "end" => $end, "total" => $total, "columns" => array(0 => array("name" => _tr("Time Period "), "property1" => ""), 1 => array("name" => _tr("Entered"), "property1" => ""), 2 => array("name" => _tr("Answered"), "property1" => ""), 3 => array("name" => _tr("Abandoned"), "property1" => ""), 4 => array("name" => _tr("In queue"), "property1" => ""), 5 => array("name" => _tr("Without monitoring "), "property1" => ""))); if ($bExportando) { $fechaActual = date("d M Y"); header("Cache-Control: private"); header("Pragma: cache"); header('Content-Type: application/octec-stream'); $title = "\"" . $fechaActual . ".csv\""; header("Content-disposition: inline; filename={$title}"); header('Content-Type: application/force-download'); } if ($bExportando) { return $oGrid->fetchGridCSV($arrGrid, $arrData); } $sContenido = $oGrid->fetchGrid($arrGrid, $arrData, $arrLang); if (strpos($sContenido, '<form') === FALSE) { $sContenido = "<form method=\"POST\" style=\"margin-bottom:0;\" action=\"{$url}\">{$sContenido}</form>"; } return $sContenido; } }
function listHistogram($pDB, $smarty, $module_name, $local_templates_dir) { global $arrLang; // Tipo de llamada $comboTipos = array("E" => _tr("Ingoing"), "S" => _tr("Outgoing")); $sTipoLlamada = 'E'; if (isset($_GET['tipo'])) { $sTipoLlamada = $_GET['tipo']; } if (isset($_POST['tipo'])) { $sTipoLlamada = $_POST['tipo']; } if (!in_array($sTipoLlamada, array_keys($comboTipos))) { $sTipoLlamada = 'E'; } $_POST['tipo'] = $sTipoLlamada; // Para llenar el formulario $smarty->assign('TIPO', $_POST['tipo']); // Estado de la llamada $comboEstados = array('T' => _tr('All'), 'E' => _tr('Completed'), 'A' => _tr('Abandoned')); if ($sTipoLlamada == 'S') { $comboEstados['N'] = _tr('No answer/Short call'); } $sEstadoLlamada = 'T'; if (isset($_GET['estado'])) { $sEstadoLlamada = $_GET['estado']; } if (isset($_POST['estado'])) { $sEstadoLlamada = $_POST['estado']; } if (!in_array($sEstadoLlamada, array_keys($comboEstados))) { $sEstadoLlamada = 'E'; } $_POST['estado'] = $sEstadoLlamada; // Para llenar el formulario $smarty->assign('ESTADO', $_POST['estado']); // Rango de fechas $sFechaInicial = $sFechaFinal = date('Y-m-d'); if (isset($_GET['fecha_ini'])) { $sFechaInicial = date('Y-m-d', strtotime($_GET['fecha_ini'])); } if (isset($_POST['fecha_ini'])) { $sFechaInicial = date('Y-m-d', strtotime($_POST['fecha_ini'])); } if (isset($_GET['fecha_fin'])) { $sFechaFinal = date('Y-m-d', strtotime($_GET['fecha_fin'])); } if (isset($_POST['fecha_fin'])) { $sFechaFinal = date('Y-m-d', strtotime($_POST['fecha_fin'])); } $_POST['fecha_ini'] = date('d M Y', strtotime($sFechaInicial)); $_POST['fecha_fin'] = date('d M Y', strtotime($sFechaFinal)); $smarty->assign('FECHA_INI', $sFechaInicial); $smarty->assign('FECHA_FIN', $sFechaFinal); // Recuperar la lista de llamadas $oCalls = new paloSantoCallsHour($pDB); $arrCalls = $oCalls->getCalls($sTipoLlamada, $sEstadoLlamada, $sFechaInicial, $sFechaFinal); // TODO: manejar error al obtener llamadas if (!is_array($arrCalls)) { $smarty->assign("mb_title", _tr("Validation Error")); $smarty->assign("mb_message", $oCalls->errMsg); $arrCalls = array(); } // Lista de colas a elegir para gráfico. Sólo se elige de las colas devueltas // por la lista de datos. $listaColas = array_keys($arrCalls); $comboColas = array('' => _tr('All')); if (count($listaColas) > 0) { $comboColas += array_combine($listaColas, $listaColas); } $sColaElegida = NULL; if (isset($_GET['queue'])) { $sColaElegida = $_GET['queue']; } if (isset($_POST['queue'])) { $sColaElegida = $_POST['queue']; } if (!in_array($sColaElegida, $listaColas)) { $sColaElegida = ''; } $_POST['queue'] = $sColaElegida; // Para llenar el formulario $smarty->assign('QUEUE', $_POST['queue']); $url = construirURL(array('menu' => $module_name, 'tipo' => $sTipoLlamada, 'estado' => $sEstadoLlamada, 'queue' => $sColaElegida, 'fecha_ini' => $sFechaInicial, 'fecha_fin' => $sFechaFinal), array('nav', 'start')); $smarty->assign('url', $url); // Construir el arreglo como debe mostrarse en la tabla desglose $arrData = array(); for ($i = 0; $i < 24; $i++) { $arrData[$i] = array(sprintf('%02d:00', $i)); } $arrData[24] = array(_tr('Total Calls')); $arrCols = array(0 => array('name' => _tr('Hour'))); $arrTodos = array_fill(0, 24, 0); foreach ($arrCalls as $sQueue => $hist) { if (empty($sColaElegida) || $sColaElegida == $sQueue) { $arrCols[] = array('name' => $sQueue); $iTotalCola = 0; foreach ($hist as $i => $iNumCalls) { $arrData[$i][] = $iNumCalls; $arrTodos[$i] += $iNumCalls; $iTotalCola += $iNumCalls; } $arrData[24][] = $iTotalCola; } } $arrCols[] = array('name' => _tr('All')); $iTotalCola = 0; foreach ($arrTodos as $i => $iNumCalls) { $arrData[$i][] = $iNumCalls; $iTotalCola += $iNumCalls; } $arrData[24][] = $iTotalCola; $smarty->assign('MODULE_NAME', $module_name); $smarty->assign('LABEL_FIND', _tr('Find')); $formFilter = getFormFilter($comboTipos, $comboEstados, $comboColas); $oForm = new paloForm($smarty, $formFilter); //Llenamos las cabeceras $arrGrid = array("title" => _tr("Graphic Calls per hour"), "url" => $url, "icon" => "images/list.png", "width" => "99%", "start" => 0, "end" => 0, "total" => 0, "columns" => $arrCols); $oGrid = new paloSantoGrid($smarty); $oGrid->showFilter($oForm->fetchForm("{$local_templates_dir}/filter-graphic-calls.tpl", NULL, $_POST)); $oGrid->enableExport(); if (isset($_GET['exportcsv']) && $_GET['exportcsv'] == 'yes') { $fechaActual = date("Y-m-d"); header("Cache-Control: private"); header("Pragma: cache"); header('Content-Type: text/csv; charset=UTF-8; header=present'); $title = "\"calls-per-hour-" . $fechaActual . ".csv\""; header("Content-disposition: attachment; filename={$title}"); return $oGrid->fetchGridCSV($arrGrid, $arrData); } else { $bExportando = isset($_GET['exportcsv']) && $_GET['exportcsv'] == 'yes' || isset($_GET['exportspreadsheet']) && $_GET['exportspreadsheet'] == 'yes' || isset($_GET['exportpdf']) && $_GET['exportpdf'] == 'yes'; $sContenido = $oGrid->fetchGrid($arrGrid, $arrData, $arrLang); if (!$bExportando) { if (strpos($sContenido, '<form') === FALSE) { $sContenido = "<form method=\"POST\" style=\"margin-bottom:0;\" action=\"{$url}\">{$sContenido}</form>"; } } return $sContenido; } }
function _moduleContent(&$smarty, $module_name) { global $arrConf; global $arrConfModule; //include module files include_once "modules/{$module_name}/configs/default.conf.php"; include_once "modules/{$module_name}/libs/paloSantoTiempoConexiondeAgentes.class.php"; include_once "libs/paloSantoConfig.class.php"; $arrConf = array_merge($arrConf, $arrConfModule); // Obtengo la ruta del template a utilizar para generar el filtro. $base_dir = dirname($_SERVER['SCRIPT_FILENAME']); $templates_dir = isset($arrConf['templates_dir']) ? $arrConf['templates_dir'] : 'themes'; $local_templates_dir = "{$base_dir}/modules/{$module_name}/" . $templates_dir . '/' . $arrConf['theme']; load_language_module($module_name); //conexion resource $pConfig = new paloConfig("/etc", "amportal.conf", "=", "[[:space:]]*=[[:space:]]*"); $arrConfig = $pConfig->leer_configuracion(false); $dsnAsteriskCdr = $arrConfig['AMPDBENGINE']['valor'] . "://" . $arrConfig['AMPDBUSER']['valor'] . ":" . $arrConfig['AMPDBPASS']['valor'] . "@" . $arrConfig['AMPDBHOST']['valor'] . "/asterisk"; $pDB = new paloDB($arrConf['dsn_conn_database']); $pDB_asterisk = new paloDB($dsnAsteriskCdr); $oCallsAgent = new paloSantoTiempoConexiondeAgentes($pDB); // Variables estáticas asignadas vía Smarty $smarty->assign(array("Filter" => _tr('Show'))); $bElastixNuevo = method_exists('paloSantoGrid', 'setURL'); $oGrid = new paloSantoGrid($smarty); $bExportando = $bElastixNuevo ? $oGrid->isExportAction() : isset($_GET['exportcsv']) && $_GET['exportcsv'] == 'yes'; // Estas son las colas entrantes disponibles en el sistema $arrQueue = leerColasEntrantes($pDB, $pDB_asterisk); $t = array_keys($arrQueue); if (count($t) <= 0) { // TODO: internacionalizar y poner en plantilla return <<<NO_QUEUE_END <p><b>No queues have been defined for incoming calls.</b></p> <p>For proper operation and reporting, it is necessary to configure at least one queue. You can add queues <a href="?menu=pbxconfig&display=queues">here</a>. In addition, the queue must be registered for use by incoming calls by clicking <a href="?menu=queues">here</a>.</p> NO_QUEUE_END; } $sColaOmision = $t[0]; //Esto es para validar cuando recien se entra al modulo, para q aparezca seteado un numero de agente en el textbox // TODO: reemplazar con lista desplegable de agentes en cola elegida $sAgenteOmision = $oCallsAgent->obtener_agente(); $arrFormElements = createFieldFilter($arrQueue); $oFilterForm = new paloForm($smarty, $arrFormElements); // Valores iniciales de las variables $paramConsulta = array('date_start' => date('d M Y'), 'date_end' => date('d M Y'), 'queue' => $sColaOmision, 'agent' => $sAgenteOmision); foreach (array_keys($paramConsulta) as $k) { if (isset($_GET[$k])) { $paramConsulta[$k] = $_GET[$k]; } if (isset($_POST[$k])) { $paramConsulta[$k] = $_POST[$k]; } } if ($oFilterForm->validateForm($paramConsulta)) { // Exito, puedo procesar los datos ahora. } else { // Error $smarty->assign("mb_title", _tr("Validation Error")); $arrErrores = $oFilterForm->arrErroresValidacion; $strErrorMsg = "<b>" . _tr('Required field') . ":</b><br/>"; foreach ($arrErrores as $k => $v) { $strErrorMsg .= "{$k}, "; } $strErrorMsg .= ""; $smarty->assign("mb_message", $strErrorMsg); $paramConsulta = array('date_start' => date('d M Y'), 'date_end' => date('d M Y'), 'queue' => $sColaOmision, 'agent' => $sAgenteOmision); } // Se genera el filtro con las variables ya validadas $htmlFilter = $oFilterForm->fetchForm("{$local_templates_dir}/filter.tpl", "", $paramConsulta); // Consultar los datos y generar la matriz del reporte $sFechaInicial = translateDate($paramConsulta['date_start']); $sFechaFinal = translateDate($paramConsulta['date_end']); $r = $oCallsAgent->reportarBreaksAgente($paramConsulta['agent'], $paramConsulta['queue'], $sFechaInicial, $sFechaFinal); $b = $bExportando ? array('', '') : array('<b>', '</b>'); $ub = $bExportando ? array('', '') : array('<u><b>', '</b></u>'); $arrData = array(); if (is_array($r) && count($r) > 0) { $tempTiempos = array('monitoreadas' => 0, 'llamadas_por_hora' => 0, 'duracion_llamadas' => 0, 'promedio_duracion' => 0, 'total_llamadas' => 0); foreach ($r['tiempos_llamadas'] as $tupla) { $tempTiempos['llamadas_por_hora'] = $tempTiempos['total_llamadas'] += $tupla['N']; $tempTiempos['duracion_llamadas'] += $tupla['tiempo_llamadas_entrantes']; if ($tupla['status'] == 'terminada') { $tempTiempos['monitoreadas'] = $tupla['N']; $tempTiempos['promedio_duracion'] = $tupla['promedio_sobre_monitoreadas']; } } if ($r['tiempo_conexion'] > 0) { $tempTiempos['llamadas_por_hora'] /= $r['tiempo_conexion'] / 3600; } $sFormatoMonitoreadas = sprintf('%d %s(s) (%d %s, %d %s)', $tempTiempos['total_llamadas'], _tr('Call'), $tempTiempos['monitoreadas'], _tr('Monitored'), $tempTiempos['total_llamadas'] - $tempTiempos['monitoreadas'], _tr('Unmonitored')); $arrData = array(array($b[0] . strtoupper(_tr('Agent name')) . $b[1], $r['name'], "", ""), array($b[0] . strtoupper(_tr('Conecction Data')) . $b[1], "", "", ""), array(_tr('First Conecction'), $r['primera_conexion'], "", ""), array(_tr('Last Conecction'), $r['ultima_conexion'], "", ""), array(_tr('Time Conecction'), formatoSegundos($r['tiempo_conexion']), "", ""), array(_tr('Count Conecction'), $r['conteo_conexion'], "", ""), array($b[0] . strtoupper(_tr('Calls Entry')) . $b[1], "", "", ""), array(_tr('Count Calls Entry'), $sFormatoMonitoreadas, "", ""), array(_tr('Calls/h'), number_format($tempTiempos['llamadas_por_hora'], 2), "", ""), array(_tr('Time Call Entry'), formatoSegundos($tempTiempos['duracion_llamadas']), "", ""), array(_tr('Average Calls Entry'), $tempTiempos['promedio_duracion'] . " (" . _tr('Monitored only') . ')', "", ""), array($b[0] . strtoupper(_tr('Reason No Ready')) . $b[1], "", "", ""), array($ub[0] . _tr('Break') . $ub[1], $ub[0] . _tr('Count') . $ub[1], $ub[0] . _tr('Hour') . $ub[1], $ub[0] . _tr('Porcent compare whit time not ready') . $ub[1])); $tempBreaks = array(); $iTotalSeg = 0; foreach ($r['tiempos_breaks'] as $tupla) { $tempBreaks[] = array($tupla['name'], $tupla['N'], formatoSegundos($tupla['total_break']), $tupla['total_break']); $iTotalSeg += $tupla['total_break']; } for ($i = 0; $i < count($tempBreaks); $i++) { $tempBreaks[$i][3] = number_format(100.0 * ($tempBreaks[$i][3] / $iTotalSeg), 2) . ' %'; $arrData[] = $tempBreaks[$i]; } } else { if (!is_array($r)) { $smarty->assign("mb_title", _tr("Database Error")); $smarty->assign("mb_message", $oCallsAgent->errMsg); } $arrData[] = array($b[0] . _tr("There aren't records to show") . $b[1], '', '', ''); } // Creo objeto de grid $oGrid->enableExport(); $oGrid->showFilter($htmlFilter); // La definición del grid $paramConsulta['menu'] = $module_name; if ($bElastixNuevo) { $oGrid->setURL(construirURL($paramConsulta)); $oGrid->setData($arrData); $arrColumnas = array("", "", "", ""); $oGrid->setColumns($arrColumnas); $oGrid->setTitle(_tr("Agent Information")); $oGrid->pagingShow(false); $oGrid->setNameFile_Export(_tr("Agent Information")); $smarty->assign("SHOW", _tr("Show")); return $oGrid->fetchGrid(); } else { global $arrLang; $total = $end = count($arrData); $offset = 0; $url = construirUrl($paramConsulta); $arrGrid = array("title" => _tr("Time conecction of agents"), "icon" => "images/list.png", "width" => "99%", "start" => $total == 0 ? 0 : $offset + 1, "end" => $end, "total" => $total, "url" => $url, "columns" => array(0 => array("name" => "", "property" => ""), 1 => array("name" => "", "property" => ""), 2 => array("name" => "", "property" => ""), 3 => array("name" => "", "property" => ""))); if ($bExportando) { $fechaActual = date("d M Y"); header("Cache-Control: private"); header("Pragma: cache"); $title = $fechaActual; header('Content-Type: text/csv; charset=utf-8; header=present'); header("Content-disposition: attachment; filename=\"" . $title . ".csv\""); } if ($bExportando) { return $oGrid->fetchGridCSV($arrGrid, $arrData); } $sContenido = $oGrid->fetchGrid($arrGrid, $arrData, $arrLang); if (strpos($sContenido, '<form') === FALSE) { $sContenido = "<form method=\"POST\" style=\"margin-bottom:0;\" action=\"{$url}\">{$sContenido}</form>"; } return $sContenido; } }