function listAgent($pDB, $smarty, $module_name, $local_templates_dir) { global $arrLang; $oAgentes = new Agentes($pDB); // Operaciones de manipulación de agentes if (isset($_POST['reparar_db']) && ereg('^[[:digit:]]+$', $_POST['reparar_db'])) { // Hay que agregar el agente al archivo de configuración de Asterisk $infoAgente = $oAgentes->getAgents($_POST['reparar_db']); if (!is_array($infoAgente)) { $smarty->assign(array('mb_title' => 'DB Error', 'mb_message' => $oAgentes->errMsg)); } elseif (count($infoAgente) == 0) { // Agente no existe en DB, no se hace nada } elseif (!$oAgentes->addAgentFile(array($infoAgente['number'], $infoAgente['password'], $infoAgente['name']))) { $smarty->assign(array('mb_title' => _tr("Error saving agent in file"), 'mb_message' => $oAgentes->errMsg)); } } elseif (isset($_POST['reparar_file']) && ereg('^[[:digit:]]+$', $_POST['reparar_file'])) { // Hay que remover el agente del archivo de configuración de Asterisk if (!$oAgentes->deleteAgentFile($_POST['reparar_file'])) { $smarty->assign(array('mb_title' => _tr("Error when deleting agent in file"), 'mb_message' => $oAgentes->errMsg)); } } elseif (isset($_POST['delete']) && isset($_POST['agent_number']) && ereg('^[[:digit:]]+$', $_POST['agent_number'])) { // Borrar el agente indicado de la base de datos, y del archivo if (!$oAgentes->deleteAgent($_POST['agent_number'])) { $smarty->assign(array('mb_title' => _tr("Error Delete Agent"), 'mb_message' => $oAgentes->errMsg)); } } elseif (isset($_POST['disconnect']) && isset($_POST['agent_number']) && ereg('^[[:digit:]]+$', $_POST['agent_number'])) { // Desconectar agentes. El código en Agentes.class.php puede desconectar // varios agentes a la vez, pero aquí sólo se desconecta uno. $arrAgentes = array($_POST['agent_number']); if (!$oAgentes->desconectarAgentes($arrAgentes)) { $smarty->assign(array('mb_title' => 'Unable to disconnect agent', 'mb_message' => $oAgentes->errMsg)); } } // Estados posibles del agente $sEstadoAgente = 'All'; $listaEstados = array("All" => _tr("All"), "Online" => _tr("Online"), "Offline" => _tr("Offline"), "Repair" => _tr("Repair")); if (isset($_GET['cbo_estado'])) { $sEstadoAgente = $_GET['cbo_estado']; } if (isset($_POST['cbo_estado'])) { $sEstadoAgente = $_POST['cbo_estado']; } if (!in_array($sEstadoAgente, array_keys($listaEstados))) { $sEstadoAgente = 'All'; } // Leer los agentes activos y comparar contra la lista de Asterisk $listaAgentesCallCenter = $oAgentes->getAgents(); function get_agente_num($t) { return $t['number']; } $listaNumAgentesCallCenter = array_map('get_agente_num', $listaAgentesCallCenter); $listaNumAgentesAsterisk = $oAgentes->getAgentsFile(); $listaNumSobrantes = array_diff($listaNumAgentesAsterisk, $listaNumAgentesCallCenter); $listaNumFaltantes = array_diff($listaNumAgentesCallCenter, $listaNumAgentesAsterisk); /* La variable $listaNumSobrantes tiene ahora todos los IDs de agente que constan en Asterisk y no en la tabla call_center.agent como activos. La variable $listaNumFaltantes tiene los agentes que constan en call_center.agent y no en Asterisk. El código posterior asume que el archivo de agentes de Asterisk debería cambiarse para que refleje la tabla call_center.agent . */ // Campo sync debe ser OK, o ASTERISK si consta en Asterisk pero no en // CallCenter, o CC si consta en CallCenter pero no en Asterisk. foreach (array_keys($listaAgentesCallCenter) as $k) { $listaAgentesCallCenter[$k]['sync'] = in_array($listaAgentesCallCenter[$k]['number'], $listaNumFaltantes) ? 'CC' : 'OK'; } // Lista de todos los agentes conocidos, incluyendo los sobrantes. $listaAgentes = $listaAgentesCallCenter; foreach ($listaNumSobrantes as $idSobrante) { $listaAgentes[] = array('id' => NULL, 'number' => $oAgentes->arrAgents[$idSobrante][0], 'name' => $oAgentes->arrAgents[$idSobrante][2], 'password' => $oAgentes->arrAgents[$idSobrante][1], 'estatus' => NULL, 'sync' => 'ASTERISK'); } // Listar todos los agentes que están conectados $listaOnline = $oAgentes->getOnlineAgents(); if (is_array($listaOnline)) { foreach (array_keys($listaAgentes) as $k) { $listaAgentes[$k]['online'] = in_array($listaAgentes[$k]['number'], $listaOnline); } } else { $smarty->assign("mb_title", 'Unable to read agent'); $smarty->assign("mb_message", 'Cannot read agent - ' . $oAgentes->errMsg); foreach (array_keys($listaAgentes) as $k) { $listaAgentes[$k]['online'] = NULL; } } // Filtrar los agentes conocidos según el estado que se requiera function estado_Online($t) { return $t['sync'] == 'OK' && $t['online']; } function estado_Offline($t) { return $t['sync'] == 'OK' && !$t['online']; } function estado_Repair($t) { return $t['sync'] != 'OK'; } if ($sEstadoAgente != 'All') { $listaAgentes = array_filter($listaAgentes, "estado_{$sEstadoAgente}"); } $arrData = array(); $sImgVisto = "<img src='modules/{$module_name}/themes/images/visto.gif' border='0' />"; $sImgErrorCC = "<img src='modules/{$module_name}/themes/images/error_small.png' border='0' title=\"" . _tr("Agent doesn't exist in configuration file") . "\" />"; $sImgErrorAst = "<img src='modules/{$module_name}/themes/images/error_small.png' border='0' title=\"" . _tr("Agent doesn't exist in database") . "\" />"; $smarty->assign(array('PREGUNTA_BORRAR_AGENTE_CONF' => _tr("To rapair is necesary delete agent from configuration file. Do you want to continue?"), 'PREGUNTA_AGREGAR_AGENTE_CONF' => _tr("To rapair is necesary add an agent in configuration file. Do you want to continue?"))); foreach ($listaAgentes as $tuplaAgente) { $tuplaData = array("<input class=\"button\" type=\"radio\" name=\"agent_number\" value=\"{$tuplaAgente["number"]}\" />", NULL, htmlentities($tuplaAgente['number'], ENT_COMPAT, 'UTF-8'), htmlentities($tuplaAgente['name'], ENT_COMPAT, 'UTF-8'), $tuplaAgente['sync'] != 'CC' ? $tuplaAgente['online'] ? _tr("Online") : _tr("Offline") : ' ', "<a href='?menu=agents&action=edit_agent&id_agent=" . $tuplaAgente["number"] . "'>[" . _tr("Edit") . "]</a>"); switch ($tuplaAgente['sync']) { case 'OK': $tuplaData[1] = $sImgVisto; break; case 'ASTERISK': $tuplaData[1] = $sImgErrorAst . " <a href='javascript:preguntar_por_reparacion(\"" . $tuplaAgente['number'] . "\",\"reparar_file\", pregunta_borrar_agente_conf)'>" . _tr('Repair') . "</a>"; $tuplaData[5] = ' '; // No mostrar opción de editar agente que no está en DB break; case 'CC': $tuplaData[1] = $sImgErrorCC . " <a href='javascript:preguntar_por_reparacion(\"" . $tuplaAgente['number'] . "\",\"reparar_db\", pregunta_agregar_agente_conf)'>" . _tr('Repair') . "</a>"; break; } $arrData[] = $tuplaData; } $url = construirURL(array('menu' => $module_name, 'cbo_estado' => $sEstadoAgente), array('nav', 'start')); $oGrid = new paloSantoGrid($smarty); $oGrid->setLimit(50); if (is_array($arrData)) { $oGrid->setTotal(count($arrData)); $offset = $oGrid->calculateOffset(); $arrData = array_slice($arrData, $offset, $oGrid->getLimit()); } // Construir el reporte de los agentes activos $arrGrid = array("title" => "Số máy nhánh", "url" => $url, "icon" => "images/user.png", "width" => "99%", "columns" => array(0 => array("name" => ' ', "property1" => ""), 1 => array("name" => _tr("Configure"), "property1" => ""), 2 => array("name" => _tr("Number"), "property1" => ""), 3 => array("name" => _tr("Name"), "property1" => ""), 4 => array("name" => _tr("Status"), "property1" => ""), 5 => array("name" => _tr("Options"), "property1" => ""))); $smarty->assign(array('LABEL_STATE' => _tr('Status'), 'LABEL_CREATE_AGENT' => _tr("New agent"), 'estados' => $listaEstados, 'estado_sel' => $sEstadoAgente, 'MODULE_NAME' => $module_name, 'LABEL_WITH_SELECTION' => _tr('With selection'), 'LABEL_DISCONNECT' => _tr('Disconnect'), 'LABEL_DELETE' => _tr('Delete'), 'MESSAGE_CONTINUE_DELETE' => _tr("Are you sure you wish to continue?"))); $oGrid->showFilter($smarty->fetch("{$local_templates_dir}/filter-list-agents.tpl")); $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; }