Browse Source

Ajustes e perfil da aplicacao

1.8.1-monitor
root 2 years ago
parent
commit
d94cdbb7ca
  1. 87
      admin/cadQgrupos.php
  2. 2
      admin/queues.php
  3. 63
      admin/usuarios.php
  4. 468
      agente/agenteAnota.php
  5. 12
      agente/agentert.php
  6. 2
      asterisk/var_lib_asterisk/scripts/abandonadas/retornoAbandonada.php
  7. 78
      asterisk/var_lib_asterisk/scripts/integracao/abdAgi.php
  8. 2
      cadastros/pesquisa/pesquisaFuncoes.php
  9. 153
      cadastros/pesquisa/pesquisaRel.php
  10. 58
      configGeral.php
  11. 13
      discador/campanha/processaLista.php
  12. 4
      include/configs/config.php
  13. 2
      include/util/util.php
  14. 8
      login.php
  15. 30
      master.css
  16. 58
      templates/callcenter/agente/agenteAnota.tpl
  17. 2
      templates/callcenter/agente/agentert.tpl
  18. 6
      templates/configSys.tpl

87
admin/cadQgrupos.php

@ -231,7 +231,6 @@
$exige_classificacao = $_POST["exige_classificacao"];
$justificativa_pausa = $_POST["justificativa_pausa"];
$retornar_abandonadas = isset($_POST["retornar_abandonadas"]) ? $_POST["retornar_abandonadas"] : 0;
$libera_pausa = isset($_POST['libera_pausa']) ? $_POST['libera_pausa'] : 0;
if ($acao == "inseri") {
if (strtoupper($nome) != 'TODOS') {// VERIFICA NOME DA FILA <> TODOS
@ -251,13 +250,13 @@
if (!$row[0] && !$row[1]) {
$query = "INSERT INTO pbx_queues_grupos(nome, musicclass, strategy, servicelevel, timeout, retry,
maxlen, joinempty, eventwhencalled, eventmemberstatus, ringinuse,
periodic_announce_frequency,wrapuptime,autofill,autopause,\"announce-frequency\",\"announce-holdtime\",\"announce-round-seconds\",\"monitor-format\",\"monitor-type\",reportholdtime,timeoutrestart,
numero,timeout2,m_espera,opcao,acao,setinterfacevar,anuncio, id_transbordo, max_agente_pausa, tempo_ring, exige_classificacao, justificativa_pausa, context, retornar_abandonadas,status $dataClass,
modo_atendimento,id_pesquisa_liberacao, disponivelfila, libera_pausa)
VALUES ('$nome', '$musicclass', '$strategy', $servicelevel, $timeout, $retry, $maxlen, '$joinempty', '$eventwhencalled', '$eventmemberstatus', '$ringinuse', $periodic_announce_frequency,'$wrapuptime',"
. "'$autofill','$autopause','$announce_frequency','$announce_holdtime','$announce_round_seconds','$monitor_format','$monitor_type','$reportholdtime','$timeoutrestart','$numero','$timeout2','$m_espera',"
. "'$opcao','$acao_opcao','$setinterfacevar','$som_ura', $idTransbordo, $max_agente_pausa, $tempoRing, $exige_classificacao, $justificativa_pausa, '$context', $retornar_abandonadas,'$ativaFila' $dateClass,"
. "'$modoAtendimento',$pesquisaLiberacao, '$disponivelfila', '$libera_pausa')";
periodic_announce_frequency,wrapuptime,autofill,autopause,\"announce-frequency\",\"announce-holdtime\",\"announce-round-seconds\",\"monitor-format\",\"monitor-type\",reportholdtime,timeoutrestart
,numero,timeout2,m_espera,opcao,acao,setinterfacevar,anuncio, id_transbordo, max_agente_pausa, tempo_ring, exige_classificacao, justificativa_pausa, context, retornar_abandonadas,status $dataClass,modo_atendimento,id_pesquisa_liberacao, disponivelfila)
VALUES ('$nome', '$musicclass', '$strategy', $servicelevel, $timeout, $retry,
$maxlen, '$joinempty', '$eventwhencalled', '$eventmemberstatus', '$ringinuse',
$periodic_announce_frequency,
'$wrapuptime','$autofill','$autopause','$announce_frequency','$announce_holdtime','$announce_round_seconds','$monitor_format',
'$monitor_type','$reportholdtime','$timeoutrestart','$numero','$timeout2','$m_espera','$opcao','$acao_opcao','$setinterfacevar','$som_ura', $idTransbordo, $max_agente_pausa, $tempoRing, $exige_classificacao, $justificativa_pausa, '$context', $retornar_abandonadas,'$ativaFila' $dateClass,'$modoAtendimento',$pesquisaLiberacao, '$disponivelfila')";
pg_query($dbcon, $query);
$query2 = "select id from pbx_queues_grupos order by id desc limit 1";
@ -298,7 +297,7 @@
maxlen='$maxlen', joinempty='$joinempty', eventwhencalled='$eventwhencalled', eventmemberstatus='$eventmemberstatus', ringinuse='$ringinuse',
periodic_announce_frequency='$periodic_announce_frequency',wrapuptime='$wrapuptime',autofill='$autofill',autopause='$autopause',\"announce-frequency\"='$announce_frequency',\"announce-holdtime\"='$announce_holdtime',\"announce-round-seconds\"='$announce_round_seconds',\"monitor-format\"='$monitor_format',
\"monitor-type\" ='$monitor_type',reportholdtime='$reportholdtime',timeoutrestart='$timeoutrestart',numero='$numero',timeout2='$timeout2',m_espera='$m_espera',opcao='$opcao',acao='$acao_opcao',setinterfacevar='$setinterfacevar', anuncio='$som_ura', id_transbordo = '$idTransbordo', max_agente_pausa = '$max_agente_pausa',
tempo_ring = '$tempoRing', exige_classificacao = '$exige_classificacao', justificativa_pausa = '$justificativa_pausa', context = '$context', retornar_abandonadas = '$retornar_abandonadas', modo_atendimento = '$modoAtendimento',id_pesquisa_liberacao = $pesquisaLiberacao,disponivelfila = '$disponivelfila',libera_pausa = '$libera_pausa',status = '$ativaFila' $dataClass
tempo_ring = '$tempoRing', exige_classificacao = '$exige_classificacao', justificativa_pausa = '$justificativa_pausa', context = '$context', retornar_abandonadas = '$retornar_abandonadas', modo_atendimento = '$modoAtendimento',id_pesquisa_liberacao = $pesquisaLiberacao,disponivelfila = '$disponivelfila',status = '$ativaFila' $dataClass
WHERE id=$id";
pg_query($dbcon, $query);
@ -425,7 +424,6 @@
$justificativa_pausa = $dados["justificativa_pausa"];
$exige_classificacao = $dados["exige_classificacao"];
$retornar_abandonadas = $dados["retornar_abandonadas"];
$libera_pausa = $dados['libera_pausa'];
}
if (!isset($monitor_format)) {
@ -436,58 +434,34 @@
<form action="index.php?idProg=11002&pbxRequest=1&acao=<?php echo $acao; ?>&acao2=salva<?php echo $param ?>" onsubmit="return Verify();" method="post" name="form1" target="_self" id="form1">
<table width="750" height="335" border="1" align="center" cellpadding="0" cellspacing="0" class="tabela" style="min-width: 760px; width: 860px;">
<tr bordercolor="#EAEAEA" class="cabecalho" background="img/button03.gif">
<td height="18" colspan="4" class="cabecalho">
<div align="center">CADASTRO DE FILAS
<td height="18" colspan="4" class="cabecalho"><div align="center">CADASTRO DE FILAS
<input name="id" type="hidden" id="id2" value="<?php
if ($acao == 'edita') {
echo $id;
}
?>" />
</div>
</td>
</div></td>
</tr>
<tr bordercolor="#EAEAEA" bgcolor="#EAEAEA">
<td height="21" colspan="4" class="labels">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<td height="21" colspan="4" class="labels"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<fieldset>
<td><fieldset>
<legend class="labels">Nome:</legend>
<input name="nome" type="text" class="validate[required,length[0,100]] caixas" id="nome2" value="<?php
if ($acao == 'edita') {
echo $nome . '"'. 'disabled="disabled' ;
}
?>" />
</fieldset>
</td>
<td>
<fieldset>
</fieldset></td>
<td><fieldset>
<legend class="labels">N&uacute;mero:</legend>
<input name="numero" type="text" class="validate[required,custom[onlyNumber],length[0,100]] caixas" id="numero6" value="<?php
if ($acao == 'edita') {
echo $numero;
}
?>" />
</fieldset>
</td>
<td>
<fieldset>
<legend class="labels">Liberar Pausa <span title="PAUSA QUE O AGENTE NÃO PODERA REMOVER"><b>(?)</b></span></legend>
<?php
$query = "SELECT CASE WHEN (produtiva = 1) THEN motivo || '(PRODUTIVA)' ELSE motivo END AS motivo FROM pbx_motivos_pausas WHERE flag = 1";
$result = pg_query($dbcon, $query);
$motivos_pausa = pg_fetch_all($result);
?>
<select name="libera_pausa" class="caixas">
<option value="0">-----------</option>
<?php foreach($motivos_pausa as $v) { ?>
<option value="<?= str_replace('(PRODUTIVA)', '', $v['motivo']) ?>"><?= $v['motivo'] ?></option>
<?php } ?>
</select>
</fieldset>
</td>
<td>
<fieldset>
</fieldset></td>
<td><fieldset>
<legend class="labels">M&uacute;sica de Espera:</legend>
<input name="m_espera" id="m_espera" onclick="HablitaMusica();" type="radio" value="V" <?php
if ($acao == 'edita') {
@ -507,10 +481,8 @@
}
?> />
N&atilde;o
</fieldset>
</td>
<td>
<fieldset>
</fieldset></td>
<td><fieldset>
<legend class="labels">Classe de M&uacute;sica:</legend>
<select name="musicclass" id="musicclass" class="caixas" >
<option value="" selected>------------</option>
@ -529,21 +501,15 @@
?>><?php echo $dados2['nome']; ?></option>
<?php } ?>
</select>
</fieldset>
</td>
</fieldset></td>
</tr>
</table>
</td>
</table></td>
</tr>
<tr bordercolor="#EAEAEA" bgcolor="#EAEAEA">
<td height="21" colspan="4" class="labels">
<div align="right"></div>
<div align="right">
<td height="21" colspan="4" class="labels"><div align="right"></div> <div align="right">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<fieldset>
<td><fieldset>
<legend class="labels">Estrat&eacute;gia:</legend>
<div align="left">
<select name="strategy" class="validate[optional] caixas" id="strategy">
@ -619,15 +585,12 @@
</td>
</tr>
</table>
</div>
</td>
</div></td>
</tr>
<tr bordercolor="#EAEAEA" bgcolor="#EAEAEA">
<td height="16" colspan="4" bordercolor="#EAEAEA" bgcolor="#EAEAEA" class="labels">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<td height="16" colspan="4" bordercolor="#EAEAEA" bgcolor="#EAEAEA" class="labels"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="25%">
<fieldset>
<td width="25%"><fieldset>
<legend class="labels">Ligações sem Agentes?:</legend>
<input name="joinempty" type="radio" value="yes" <?php
if ($acao == 'edita') {

2
admin/queues.php

@ -68,7 +68,7 @@ if ($acao == "deleta") {
</table>
</td>
<td align="right" nowrap="nowrap">
<a href="#" onclick="NovaJanela('index.php?idProg=11002&pbxRequest=1&acao=inseri<?= $filtroNovo; ?>&status=<?= $status?>', 'CadFila', '880', '560.', 'resizable=YES,scrollbars=YES');"><img src="admin/images/novo.gif" width="20" height="20" border="0" align="absmiddle">NOVA FILA </a>
<a href="#" onclick="NovaJanela('index.php?idProg=11002&pbxRequest=1&acao=inseri<?= $filtroNovo; ?>&status=<?= $status?>', 'CadFila', '780', '560.', 'resizable=YES,scrollbars=YES');"><img src="admin/images/novo.gif" width="20" height="20" border="0" align="absmiddle">NOVA FILA </a>
</td>
</tr>

63
admin/usuarios.php

@ -1,12 +1,10 @@
<?php
<?
$acao = isset($_GET['acao']) ? trim($_GET['acao']) : 'select';
$id = isset($_GET['id']) ? trim($_GET['id']) : 0;
$filtro = isset($_GET["numRamal"]) ? trim($_GET["numRamal"]) : '';
$filtroNovo = !isset($_GET["pgn"]) ? '' : sprintf("&numRamal%s&pgn=%s&bloco=%s&pg=%s", $_GET["numRamal"], $_GET["pgn"], $_GET["bloco"], $_GET["pg"]);
$recontaPag = ($acao == 'inseri') || ($acao == "deleta") || isset($_GET['pesquisa']);
$statusAtivo = $_REQUEST["status"] ? trim($_REQUEST["status"]) : 'T';
if ($acao == "deleta") {
$query = "update pbx_cs_usuarios set status = 'D' where matricula='$id'";
$queryRpl = 'insert into pbx_replica(rpl_command, rpl_user, rpl_origem) values(%s, %s, %s)';
@ -44,38 +42,21 @@
$msg = $ex->getMessage();
$jsStartup[] = "alert('$msg');";
}
?>
}
?>
<? } ?>
<table width="99%" align="center" border="0" cellpadding="2" cellspacing="0" class="filtro">
<tr>
<td>
<table class="filtro" border="0" cellpadding="2" cellspacing="0">
<tr>
<td>Palavra Chave</td>
<td colspan="3">Filtro Status</td>
<td colspan="2">Palavra Chave</td>
</tr>
<tr>
<td>
<input name="numRamal" type="text" id="numRamal" value="<?= $_GET["numRamal"]; ?>" onkeyup="ConsultaRamal('index.php?idProg=10028&pbxRequest=1', event);" size="20">
<td align="left" nowrap="nowrap" >
<input name="numRamal" type="text" id="numRamal" value="<? echo $_GET["numRamal"]; ?>" onkeyup="ConsultaRamal('index.php?idProg=10028&pbxRequest=1', event);" size="20">
<input name="locaRamal" type="button" id="locaRamal" value="Localizar" onClick="ConsultaRamal('index.php?idProg=10028&pbxRequest=1&pesquisa=1', 0);">
</td>
<td align="left" nowrap="nowrap">
<div class="geral" nowrap="nowrap">
<input name="status" class="clean" type="radio" value="T" <?= $statusAtivo == "T" ? 'checked' : '' ?>> Todos
<input name="status" class="clean" type="radio" value="A" <?= $statusAtivo == "A" ? 'checked' : '' ?>> Ativa
<input name="status" class="clean" type="radio" value="D" <?= $statusAtivo == "D" ? 'checked' : '' ?>> Desativada
</div>
</td>
<td>
<input name="locaRamal" type="submit" id="locaRamal" value="Localizar" >
</td>
<td align="right" width="80%" nowrap="nowrap">
<a href="#" onclick="abre_janela('700', '520', 'index.php?idProg=11028&pbxReqREQUESTuest=1&acao=inseri&acao2=novo<?php echo $filtroNovo; ?>');"><img src="admin/images/novo.gif" width="20" height="20" border="0" align="absmiddle">NOVA CONTA </a>
</td>
</tr>
</table>
<td align="right" nowrap="nowrap">
<a href="#" onclick="abre_janela('700', '520', 'index.php?idProg=11028&pbxRequest=1&acao=inseri&acao2=novo<?php echo $filtroNovo; ?>');"><img src="admin/images/novo.gif" width="20" height="20" border="0" align="absmiddle">NOVA CONTA </a>
</td>
</tr>
<tr>
@ -91,7 +72,7 @@
<th>Status</th>
<th align="center">Ações</th>
</tr>
<?php
<?
$janW = '500';
$janH = '400';
@ -101,10 +82,6 @@
$compl = sprintf("and (a.nome ilike %s or a.apelido ilike %s or a.matricula::text ilike %s)", $compl, $compl, $compl);
}
if($statusAtivo == "A" || $statusAtivo == "D"){
$compl .= " AND a.status = '$statusAtivo' ";
}
$query = "select a.id, a.nome, a.apelido, a.matricula, b.nome as empresa, c.nome_depto as departamento, a.status
from pbx_cs_usuarios a, pbx_empresa b, pbx_departamentos c
where b.id = a.empresa
@ -120,15 +97,15 @@
while ($dados = pg_fetch_array($result)) {
?>
<tr>
<td width="50" align="center"><?= $dados['id']; ?></td>
<td width="50" align="center"><? echo $dados['id']; ?></td>
<td><a href="#" style="color: #000;" onclick="abre_janela('700', '520', 'index.php?idProg=11028&pbxRequest=1&acao=edita&id=<? echo $dados['id']; ?><? echo $params; ?>');"><? echo $dados['nome']; ?></a></td>
<td><?= $dados['apelido']; ?></td>
<td><?= $dados['matricula']; ?></td>
<td><?= $dados['empresa']; ?></td>
<td><?= $dados['departamento']; ?></td>
<td><? echo $dados['apelido']; ?></td>
<td><? echo $dados['matricula']; ?></td>
<td><? echo $dados['empresa']; ?></td>
<td><? echo $dados['departamento']; ?></td>
<td align="center" width="20">
<div align="center">
<?= GetStatusModulo($dados['status']); ?>
<? echo GetStatusModulo($dados['status']); ?>
</div>
</td>
<td width="40">
@ -136,21 +113,21 @@
<tr>
<td style="border:0"><div align="center"><a href="#" onclick="abre_janela('700', '520', 'index.php?idProg=11028&pbxRequest=1&acao=edita&id=<? echo $dados['id']; ?><? echo $params; ?>');"><img src="images/edit.gif" title="EDITAR O USUÁRIO:<? echo $dados['nome']; ?>" width="16" height="16" border="0"></a></div></td>
<?php if ($dados['status'] == "A") { ?>
<? if ($dados['status'] == "A") { ?>
<td style="border:0"><div align="center"><a href="#" onclick="excluir('<? echo $dados['id']; ?>', '<? echo $dados['nome']; ?>', 'DESEJA REALMENTE DESABILITAR O USUÁRIO:<? echo $dados['nome']; ?>', 'index.php?idProg=10028&pbxRequest=1&acao=deleta&id=<? echo $dados['matricula']; ?><? echo $params; ?>', 'USUARIOS');"><img src="images/delete.gif" title="DESABILITAR O USUÁRIO:<? echo $dados['nome']; ?>" width="16" height="16" border="0"></a></div></td>
<?php } ?>
<? } ?>
</tr>
</table>
</td>
</tr>
<?php
<?
$z++;
} if ($z == 0) {
?>
<tr align="center" valign="middle" bordercolor="#999999" class="labels">
<td colspan="8"><div align="center" class="info"><img src="images/shutdown.gif" width="24" height="24" border="0" align="absmiddle" /> Não foram encontrados registros </div></td>
</tr>
<?php
<?
}
?>
<tr>

468
agente/agenteAnota.php

@ -1,324 +1,119 @@
<?php
$tpLayout = 1;
include_once 'util/relatoriosBase.php';
class AgenteAnota extends Relatorios {
private $___consultar;
private $___validar;
private $___agenteAnota;
private $___agenteFone;
private $___listaAgente;
private $___matricula;
public function __construct($idProg, $dbcon, $incDac) {
parent::__construct($idProg, $dbcon, $incDac);
$this->___consultar = isset($_POST["btPesquisa"]);
$this->___validar = isset($_POST["btAnota"]) && (trim($_POST["AnotaTexto"]) != "");
$this->___agenteAnota = isset($_POST["AnotaTexto"]) ? $_POST["AnotaTexto"] : "";
$this->___agenteFone = isset($_POST["AnotaFone"]) ? soNumero($_POST["AnotaFone"]) : (isset($_SESSION[RAMAL_DESTINO]) ? soNumero($_SESSION[RAMAL_DESTINO]) : '');
$this->___listaAgente = isset($_POST["listaAgente"]) ? $_POST["listaAgente"] : GetMatricula();
$this->___dataIni = IsPostBack() ? $_POST['dataIni'] : date('d/m/Y');
$this->___dataFim = IsPostBack() ? $_POST['dataFim'] : date('d/m/Y');
$this->___matricula = GetMatricula();
}
function ___ValidaForm() {
if (!is_date($this->___dataIni) && empty($this->___agenteFone)) {
GeraExcept('A "Data Inicial" informada é inválida!');
}
if (!is_date($this->___dataFim) && empty($this->___agenteFone)) {
GeraExcept('A "Data Final" informada é inválida!');
}
if (!$this->___consultar && $this->___validar && empty($this->___agenteFone)) {
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
$tpLayout = 1;
$matricula = GetMatricula();
$consultar = isset($_POST["btPesquisa"]);
$valida = isset($_POST["btAnota"]) && (trim($_POST["AnotaTexto"]) != "");
$agtAnota = isset($_POST["AnotaTexto"]) ? $_POST["AnotaTexto"] : "";
$agtFone = isset($_POST["AnotaFone"]) ? soNumero($_POST["AnotaFone"]) : (isset($_SESSION[RAMAL_DESTINO]) ? soNumero($_SESSION[RAMAL_DESTINO]) : '');
$btAnota = isset($_POST["btAnota"]) ? $_POST["btAnota"] : "";
$listaAgente = isset($_POST["listaAgente"]) ? $_POST["listaAgente"] : GetMatricula();
$dataIni = !isset($_POST["dataIni"]) ? date('d/m/Y') : $_POST["dataIni"];
$dataFim = !isset($_POST["dataFim"]) ? date('d/m/Y') : $_POST["dataFim"];
$msg = "";
$pesquisa = "";
if (isset($_GET["formAction"])) {
$idDel = $_GET["id"];
$query = "delete from pbx_anotacoes where id_text = '$idDel'";
@pg_query($dbcon, $query);
}
if (!is_date($dataIni)) {
$jsStartup[] = "alert('Data inicial inválida!');";
$msg = "Data inicial inválida!";
$isValid = 0;
} else if (!is_date($dataFim)) {
$jsStartup[] = "alert('Data final inválida!');";
$msg = "Data final inválida!";
$isValid = 0;
} else if (!$consultar && $valida && empty($agtFone)) {
$msg = GetAnotacoesKey() ? "Informe o número do telefone!" : "Informe o número do protocolo!";
GeraExcept($msg);
}
if($this->___validar && !$this->___consultar){
$this->___InserirAnotacao();
}
}
function ___FiltrosRelatorio() {
if ($this->___media != MEDIA_PRINT_GRID) {
/*
* Recupera os filtros da sess�o do usu�rio.
*/
list($this->___dataIni, $this->___dataFim, $this->___agenteFone) = $_SESSION["SSstorageFiltros"];
if ($this->___media == MEDIA_PRINT_HTML) {
return sprintf("Data Inicial: %s Data Final: %s ", $this->___dataIni, $this->___dataFim);
}
$fltCsv = array();
$fltCsv[] = "Data Inicial: " . $this->___dataIni;
$fltCsv[] = "Data Final: " . $this->___dataFim;
$fltCsv[] = "Data Hora Emissao: " . date('d/m/Y H i s)');
$fltCsv[] = "Emitido Por: " . GetLogin();
return $fltCsv;
}
$lkPrint = "";
if ($this->___dataCount) {
$prt = '<a href="index.php?idProg=%s&media=%s"><img src="imgSite/%s" alt="Clique aqui para imprimir!" width="24" height="24" border="0"></a>';
$prtHtml = "<a href=\"javaScript:NovaJanela('index.php?idProg=%s&media=%s', '%s', '720', '700', 'scrollbars=YES');\"><img src=\"imgSite/%s\" alt=\"Clique aqui para imprimir!\" width=\"24\" height=\"24\" border=\"0\"></a>";
//$lkPrint .= sprintf($prtHtml, $this->GetidProg(), MEDIA_PRINT_HTML, substr(LimpaString(GetDispProgSel($this->GetIdProg())), 0, 20), 'print.gif');
$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_EXCEL, 'prt-xls.png');
//$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_PDF, 'prt-pdf.png');
//$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_CSV, 'prt-csv.png');
}
$filtro .= '<table border="0" align="center" cellpadding="8" cellspacing="0" style="border-top:0;font-size:12px;" >
<tr>
<td align="center">
<span style="font-face:Arial, Helvetica, sans-serif; font-size:16px; font-weight:bold;">
<img src="imgSite/anotacoes.png" alt="Bloco de Anota&ccedil;&otilde;es" align="absmiddle" width="32" height="32" border="0" title="Bloco de Anota&ccedil;&otilde;es">
Bloco de Anotações
</span>
</td>
</tr>
</table>';
/*
* Personalise esta função se necessitar de outras opções de filtro.
*/
$filtro .= '<table class="filtro" align="center" border="0" cellspacing="1" cellpadding="1">';
/*
* Rotulos.
*/
$filtro .= '<tr>';
$filtro .= IsSuper() ? '<td>Agentes</td>' : '';
$filtro .= '<td>Agentes</td>';
$filtro .= '<td>Data Inicial </td>';
$filtro .= '<td>Data Final </td>';
$filtro .= sprintf('<td>%s</td>', GetAnotacoesKey() ? 'Fone' : $_SESSION['prm_label_protoco_pesquisa']);
/*
* Valores.
*/
$filtro .= '<tr>';
$filtro .= IsSuper() ? sprintf("<td><select name='listaAgente'>%s</select></td>", $this->GetAgentesAnotacoes($this->___listaAgente)) : '';
$filtro .= sprintf("<td><select name='listaAgente'>%s</select></td>", $this->GetAgentesAnotacoes($this->___listaAgente));
$filtro .= '<td><input name="dataIni" id="dataIni" type="text" size="15" maxlength="16" value="%s" onkeyup="formataDataHora(this)" title="dd/mm/aaaa"></td>';
$filtro .= '<td><input name="dataFim" id="dataFim" type="text" size="15" maxlength="16" value="%s" onkeyup="formataDataHora(this)" title="dd/mm/aaaa"></td>';
$filtro .= '<td><div> ';
$filtro .= sprintf('<input name="AnotaFone" size="20" type="text" id="AnotaFone" value="%s">'
. '<input name="btPesquisa" type="submit" id="btPesquisa" value="Pesquisar">'
. '<input name="btAnota" type="submit" id="btAnota" value="Salvar">', $this->___agenteFone);
$filtro .= '</div></td>';
$filtro .= '<td>%s</td>';
$filtro .= '</tr>';
$filtro .= '</table>';
$filtro .= "<br>";
$filtro .= '<table class="grid" align="center" border="0" cellspacing="1" cellpadding="1">';
$filtro .= "<tr><td class='destaque'>{$_SESSION['prm_label_protoco_texto']}</td></tr>";
$filtro .= "<tr>";
$filtro .= "<td><textarea name='AnotaTexto' cols='114' rows='8' id='AnotaTexto'></textarea></td>";
$filtro .= "</tr>";
$filtro .= "</table>";
/*
* Guarda os filtros passados para recuperar na emiss�o dos relat?ios para impress�o.
*/
$_SESSION["SSstorageFiltros"] = array($this->___dataIni, $this->___dataFim, $this->___agenteFone);
return sprintf($filtro, $this->___dataIni, $this->___dataFim, $lkPrint);
}
protected function ___GetDadosDb() {
$dataIni = FormatDtMssql($this->___dataIni);
$dataFim = FormatDtMssql($this->___dataFim);
$query = sprintf("SELECT a.id_text, a.conteudo, a.matricula_agente, a.fone_cliente, a.data, b.apelido
FROM pbx_anotacoes a
INNER JOIN pbx_usuarios b ON b.matricula = a.matricula_agente::text
WHERE data::DATE >= '$dataIni' AND data::DATE <= '$dataFim'");
if(empty($this->___agenteFone)){
$query .= $this->___listaAgente ? " AND a.matricula_agente::text = '$this->___listaAgente' " : "";
}
$query .= " AND fone_cliente LIKE '%$this->___agenteFone%'";
$query .= " ORDER BY b.apelido, a.data DESC";
$result = $this->___GetQuery($query);
$row = pg_fetch_all($result);
$this->SetData($row ? $row : array());
}
protected function ___PreparaCsv() {
}
protected function ___PreparaExcel() {
$dataRel = array();
$dataAgrup = array();
$filtro = $this->___FiltrosRelatorio();
/*
* Inicia o relatório.
*/
/*
* Cria os filtros
*/
$linha = array('LABEL');
foreach ($filtro as $values) {
list($label, $value) = explode(":", $values);
$linha[] = $label;
}
$dataRel[] = $linha;
$linha = array('DADOS');
foreach ($filtro as $values) {
list($label, $value) = explode(":", $values);
$linha[] = $value;
}
$dataRel[] = $linha;
$dadosCabecalio = array('ID','Data', RemoveAcentos($_SESSION['prm_label_protoco_pesquisa']), 'Mensagem','Autor');
$dadosField = array('id_text', 'data', 'fone_cliente', 'conteudo', 'apelido');
/*
* Monta a linha de cabecalio.
*/
$linha = array('LABEL');
foreach ($dadosCabecalio as $value) {
$linha[] = $value;
}
$dataRel[] = $linha;
$somaTempo = 0;
$somaQuantidade = 0;
/*
* Linhas de dados.
*/
foreach ($this->GetData()[0] as $row) {
$row["data"] = date('d/m/Y', strtotime($row["data"]));
$row["conteudo"] = RemoveAcentos($row['conteudo']);
// Formata linha de dados.
$linha = array('DADOS');
foreach ($dadosField as $key) {
$linha[] = $row["$key"];
}
$dataRel[] = $linha;
}
$dataRel[] = $linha;
$this->___dataRel[] = $dataRel;
}
protected function ___PreparaGrid() {
$dadosCabecalio = array(
'ID' => 'align="center"',
'Data' => 'align="center"',
$_SESSION['prm_label_protoco_pesquisa'] => 'align="center"',
'Mensagem' => 'align="left"',
'Autor' => 'align="center"',
);
$dadosField = array(
'id_text' => 'align="center"',
'data' => 'align="center"',
'fone_cliente' => 'align="center"',
'conteudo' => 'align="left"',
'apelido' => 'align="center"',
);
/*
* Inicia o relat�rio.
*/
$dataRel[] = '<table width="99%" cellpadding="2" class="grid">';
/*
* Monta a linha de cabecalio.
*/
$linha = '<tr>';
foreach ($dadosCabecalio as $key => $value) {
$linha .= sprintf("<th %s>%s</th>", $value, $key);
}
$linha .= "</tr>";
$dataRel[] = $linha;
/*
* Verifica se retornou dados
*/
if (!IsPostBack() || !count($this->GetData()[0])) {
$dataRel[] = sprintf("<tr><td align=\"center\" colspan=\"%s\">%s</td></tr></table>", count($dadosCabecalio), (!IsPostBack() ? 'Informe os parametros e clique em consultar!' : 'Nenhum registro encontado!'));
$this->___dataRel[] = $dataRel;
return;
}
$somaQuantidade = 0;
/*
* Linhas de dados.
*/
foreach ($this->GetData()[0] as $row) {
$row["data"] = date('d/m/Y', strtotime($row["data"]));
// Formata linha de dados.
$linha = "<tr>";
foreach ($dadosField as $key => $value) {
$linha .= sprintf("<td %s>%s</td>", $value, $row["$key"]);
}
$linha .= "</tr>";
$dataRel[] = $linha;
}
/*
* Linha de totalizacao.
*/
//$linha = '<tr><th colspan="2" align="left">Total</th><th align="left" colspan="2">Registros: %s</th><th align="left" colspan="6">Duração: %s</th></tr>';
//$dataRel[] = sprintf($linha, $somaQuantidade, SecondToStrTime($somaTempo));
/*
* Fecha relatorio.
*/
$dataRel[] = '</table>';
$this->___dataRel[] = $dataRel;
}
protected function ___PreparaHtml() {
}
protected function ___PreparaPdf() {
}
private function ___InserirAnotacao(){
if ($this->___validar && empty($this->___agenteAnota)) {
GeraExcept("Insira uma anotação!");
}
$query = "SELECT * FROM pbx_anotacoes WHERE conteudo = '{$this->___agenteAnota}' AND fone_cliente = '{$this->___agenteFone}';";
$res = $this->___GetQuery($query);
if(pg_fetch_assoc($res)){
GeraExcept('Essas informações já foram registradas!');
}
$query = "INSERT INTO pbx_anotacoes (conteudo,matricula_agente,fone_cliente) VALUES('$this->___agenteAnota', '$this->___matricula', '$this->___agenteFone');";
$result = $this->___GetQuery($query);
if(!$result){
GeraExcept('Não foi possível inserir o registro');
}
}
private function GetAgentesAnotacoes($matricula) {
$query = "SELECT id, apelido, nome, matricula FROM pbx_usuarios WHERE delete_ = 0 AND apelido NOT IN('sinccontasenha') ORDER BY apelido"; //'admin',
$result = $this->___GetQuery($query);
} else if ($valida && empty($agtAnota)) {
$msg = "Insira uma anotação!";
} else if (!$consultar && $valida) {
$query = "insert into pbx_anotacoes(conteudo, matricula_agente, fone_cliente)
values('$agtAnota', '$matricula', '$agtFone')";
$result = pg_query($dbcon, $query);
if ($result) {
$agtAnota = "";
$msg = "Operação realizada com sucesso!";
}
}
$pesquisa = PesquisaFone($dbcon, $agtFone);
if (empty($pesquisa))
$pesquisa = "<tr><td colspan=4>Nenhum registro encontrado!</td></tr>";
$cor = !$msg || stripos($msg, 'sucesso') ? '#0000FF' : '#FF0000';
$smarty->assign("AnotaFone", $agtFone);
$smarty->assign("AnotaTexto", $agtAnota);
$smarty->assign("corErro", $cor);
$smarty->assign("msg", $msg);
$smarty->assign("linhas", $pesquisa);
$smarty->assign("isFone", GetAnotacoesKey());
$smarty->assign("isSuper", IsSuper());
$smarty->assign("dataIni", $dataIni);
$smarty->assign("dataFim", $dataFim);
$smarty->assign("prm_label_protoco_pesquisa", $_SESSION['prm_label_protoco_pesquisa']);
$smarty->assign("prm_label_protoco_texto", $_SESSION['prm_label_protoco_texto']);
$smarty->assign("prm_label_protoco_grid", $_SESSION['prm_label_protoco_grid']);
if (IsSuper()) {
$agentes = GetAgentesAnotacoes($listaAgente);
$smarty->assign("listaAgente", $agentes);
}
DispLogin($smarty);
function PesquisaFone($db, $num) {
global $listaAgente, $dataIni, $dataFim;
$mat = IsSuper() ? $listaAgente : GetMatricula();
$query = "select a.id_text, a.conteudo, a.matricula_agente, a.fone_cliente, a.data, b.apelido from pbx_anotacoes a, pbx_usuarios b where b.matricula = a.matricula_agente::text ";
$query .= $mat ? " and a.matricula_agente::text = '$mat' " : "";
$query .= sprintf(" and data::date >= %s and data::date <= %s ", FormatDtMssql($dataIni, true), FormatDtMssql($dataFim, true));
$query .= " and fone_cliente like '%" . $num . "%'";
$query .= " order by b.apelido, a.data desc";
$result = @pg_query($db, $query);
//if(IsAdmin()) echo $query;
while (($result) && ($row = pg_fetch_array($result))) {
$fone = GetAnotacoesKey() ? FormataFone($row["fone_cliente"]) : $row["fone_cliente"];
$content = $row["conteudo"];
$matAgt = $row["matricula_agente"] . '-' . $row["apelido"];
$data = date('d/m/Y', strtotime($row["data"]));
$imgDel = GetLinkFormDelete($row["id_text"], 'DeletaAnotacao');
$linha .= "<tr>
<td align=left>$data</td>";
if (IsSuper()) {
$linha .= " <td align=left>$matAgt</td>";
}
$linha .= " <td align=left>$fone</td>
<td align=left>$content</td>
<td align=center>$imgDel</td>
</tr>";
}
$colspan = IsSuper() ? 4 : 3;
if (empty($linha))
$linha = "<tr><td colspan=\"$colspan\">Nenhum registro encontrado!</td></tr>";
return $linha;
}
function DispLogin($smarty) {
$smarty->display('callcenter/agente/agenteAnota.tpl');
}
function GetAgentesAnotacoes($matricula) {
$query = "select id, apelido, nome, matricula from pbx_usuarios where delete_ = 0 and apelido not in('sinccontasenha' )"; //'admin',
$result = pg_query($query);
$sel = $matricula == "0" ? ' Selected="selected" ' : '';
$item = "<option value=\"0\"$sel>Todos</option>\n";
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$mat = $dados['matricula'];
$apelido = $dados['apelido'];
@ -326,45 +121,6 @@
$item .= "<option value=\"$mat\"$sel>$apelido-[$mat]</option>\n";
}
return $item;
}
public function ExecutaRelatorio() {
global $jsStartup, $jsJQuery, $smarty;
try {
/*
* Use esta fun��o para validar dados do formul�rio.
*/
$this->___ValidaForm();
/*
* Recupera os dados do banco.
*/
$this->___ConteudoRelatorio();
/*
* Imprime relat�rio de acordo com a media passada.
*/
$conteudoRelatorio = $this->___ImprimeRelatorio();
} catch (Exception $exc) {
$this->SetMsg($exc->getMessage());
$jsStartup[] = sprintf("alert('%s');", $this->GetMsg());
$this->___GravaLog();
}
/*
* Inclua os scripts necessários aqui.
*/
$jsJQuery[] = "\$('#dataIni').keypress(function(){formataDataHora(this);}) ";
$jsJQuery[] = "\$('#dataFim').keypress(function(){formataDataHora(this);}) ";
$smarty->assign('filtros', $this->___FiltrosRelatorio());
$smarty->assign('conteudo', $conteudoRelatorio);
$smarty->assign('msg', $this->GetMsg());
GetTemplate($smarty, 'relatoriosGrid.tpl');
}
}
}
$agenteAnota = new AgenteAnota($idProg, $dbcon, 0);
$agenteAnota->ExecutaRelatorio();
?>

12
agente/agentert.php

@ -1333,18 +1333,6 @@ function SairPausa($db) {
}
}
$query = "SELECT a.status, a.motivo_pausa, libera_pausa
FROM pbx_supervisor_agentes a
INNER JOIN pbx_queues_grupos b ON a.dac = b.nome
WHERE matricula = '$matricula'";
$result = pg_query($db, $query);
$resp = pg_fetch_assoc($result);
if($resp['status'] == 'PAUSA' && strtolower($resp['motivo_pausa']) == strtolower($resp['libera_pausa'])){
GeraExcept("Esta pausa é restrita para ser removida, por favor comunique seu supervisor!");
}
/*
* Remove da pausa do asterisk somente se a opçao disponivel atendimento nao
* estiver marcada,

2
asterisk/var_lib_asterisk/scripts/abandonadas/retornoAbandonada.php

@ -310,7 +310,7 @@ function __GetQueryRad($agentesLivres, $diasAbandon) {
and strtoint(c.espera) = 0
and d.retornar_abandonadas = 1
and a.abdsr_data >= (now()::date - $diasAbandon)
order by a.abdsr_data desc, a.abdsr_data_hora_inicio asc limit $agentesLivres";
order by a.abdsr_data_hora_inicio desc limit $agentesLivres";
GravaLog("cmd:", $pathLog);

78
asterisk/var_lib_asterisk/scripts/integracao/abdAgi.php

@ -455,6 +455,84 @@ $inTran = false;
include_once '/var/lib/asterisk/scripts/integracao/constServerIntegra.php';
include_once '/var/lib/asterisk/scripts/integracao/localDataBase.php';
$scrpt = $argv[0];
$UNIQUEID = $arg1;
$userfield = $agi->get_variable('MONITOR_FILENAME', true);
$userfield = trim($userfield) ? $userfield : 'AUDIO.WAV';
$path = '/var/log/asterisk/encerra_chamada_satelitenorte.log';
$query = sprintf("select a.chdr_id from pbx_chamada_ramal a where a.uniqueid = '%s' and a.chdr_fim is null", $UNIQUEID);
$result = pg_query($conn, $query);
if (pg_num_rows($result)) {
GravaLog($query . "\n AUDIO: " . $userfield . "\n", $path);
$dados = pg_fetch_array($result, null, PGSQL_ASSOC);
$chdr_id = $dados['chdr_id'];
$audio = str_ireplace('.WAV', '.MP3', $userfield);
$token = '026d3a4b331078aa09d096d11e495215';
$parametros = array('method' => 'terminachamada', 'audio' => $audio, 'id_chamada' => $UNIQUEID, 'token' => $token, 'login' => 'admin', 'senha' => 'SiP1029384756', 'tipoRetorno' => 'JSON');
//$parametros = array('audio' => $audio, 'id_chamada' => $UNIQUEID, 'token' => $token);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://satelitenorte.xpro.me/gestaodeleads/terminachamada");
//curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1/aplicativo/integracao/index.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POSTFIELDS, $parametros);
$content = trim(curl_exec($ch));
curl_close($ch);
$retorno = json_decode($content, true);
$log = sprintf("Status: %s Msg: %s", $retorno["status"], $retorno["mensagem"]);
$query = sprintf("update pbx_chamada_ramal set chdr_fim = now(), chdr_log = %s where chdr_id = '%s'", QuotedStr($log), $chdr_id);
GravaLog($query . "\n", $path);
$result = pg_query($conn, $query);
if (!$result) {
GravaLog($query . "\n", $path);
}
}
$integra = $agi->get_variable('INTEGRA-SAIDA', true);
if ($integra == 'SAIDA') {
$intMetodo = $agi->get_variable('INTEGRA-METODO', true);
$intUniqueid = $agi->get_variable('UNIQUEID', true);
$intTelefone = $agi->get_variable('INTEGRA-FONE', true);
$intFone = str_replace('@', '|', $intTelefone);
$intRegIni = $agi->get_variable('INTEGRA-REGINI', true);
$intRegFim = $agi->get_variable('INTEGRA-REGFIM', true);
$intRetCliente = $agi->get_variable('INTEGRA-RETCLI', true);
$intRetCli = str_replace('@', '|', $intRetCliente);
$intRamal = $agi->get_variable('INTEGRA-RAMAL', true);
$intUra = $agi->get_variable('INTEGRA-URA', true);
$sql = "INSERT INTO pbx_integracao_reg("
. "reg_id_metodo,"
. "reg_uniqueid,"
. "reg_uniqueid_old,"
. "reg_fone,"
. "reg_retorno,"
. "reg_inicio,"
. "reg_fim,"
. "reg_msg,"
. "reg_status_exec,"
. "reg_status,"
. "retorno_cliente,"
. "reg_ramal,"
. "reg_ura) "
. "VALUES($intMetodo,'$intUniqueid','$intUniqueid','$intFone','$intFone','$intRegIni','$intRegFim','INTEGRACAO-ATIVO-SAIDA',"
. "1,0,'$intRetCli','$intRamal','$intUra');";
@pg_query($conn, $sql);
$pgError = pg_last_error();
if ($pgError) {
GravaLog($sql, '/var/log/asterisk/integracao_ativa_sainte.log');
GravaLog($pgError, '/var/log/asterisk/integracao_ativa_sainte.log');
}
}
$ligueme = $agi->get_variable('LIGUE-ME', true);
if ($ligueme) {
$ligueUniq = $agi->get_variable('UNIQUEID', true);

2
cadastros/pesquisa/pesquisaFuncoes.php

@ -19,7 +19,7 @@ function GetPesquisaRel($db, $plId, $matricula = null) {
$result = pg_query($db, $query);
if (!$plId) {
$ret = '<option value="0" selected="selected">Todos</option>';
$ret = '<option value="0" selected="selected">---------------------</option>';
}
while ($linhaBd = pg_fetch_array($result)) {

153
cadastros/pesquisa/pesquisaRel.php

@ -10,12 +10,10 @@
private $___plDescricao = '';
private $___ppId = 0;
private $___ppNome = '';
private $___tipoRelatorio;
private $___datas = array();
public function __construct($idProg, $dbcon, $incDac) {
parent::__construct($idProg, $dbcon, $incDac);
$this->___tipoRelatorio = isset($_REQUEST['tipoRelatorio']) ? $_REQUEST['tipoRelatorio'] : 0;
$this->___dac = isset($_POST["listaDacs"]) ? $_POST["listaDacs"] : 0;
$this->___lstPesquisa = isset($_POST["lstPesquisa"]) ? $_POST["lstPesquisa"] : '0| | | |0| ';
}
@ -23,7 +21,7 @@
function ___FiltrosRelatorio() {
global $dbcon;
if ($this->___lstPesquisa) {
if($this->___lstPesquisa){
$this->___plId = explode('|', $this->___lstPesquisa)[0];
}
@ -57,16 +55,14 @@
$lkPrint = "";
if ($this->___dataCount) {
$prt = '<a href="index.php?idProg=%s&media=%s&tipoRelatorio=%s"><img src="imgSite/%s" alt="Clique aqui para imprimir!" width="24" height="24" border="0"></a>';
if (!$this->___tipoRelatorio) {
$prtHtml = "<a href=\"javaScript:NovaJanela('index.php?idProg=%s&media=%s&tipoRelatorio=%s', '%s', '720', '700', 'scrollbars=YES');\"><img src=\"imgSite/%s\" alt=\"Clique aqui para imprimir!\" width=\"24\" height=\"24\" border=\"0\"></a>";
$lkPrint .= sprintf($prtHtml, $this->GetidProg(), MEDIA_PRINT_HTML, $this->___tipoRelatorio, substr(LimpaString(GetDispProgSel($this->GetIdProg())), 0, 20), 'print.gif');
$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_EXCEL, $this->___tipoRelatorio, 'prt-xls.png');
$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_PDF, $this->___tipoRelatorio, 'prt-pdf.png');
$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_CSV, $this->___tipoRelatorio, 'prt-csv.png');
}
$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_EXCEL, $this->___tipoRelatorio, 'prt-xls.png');
}
$tipoRel = !$this->___tipoRelatorio ? '' : 'checked="checked"';
//$tipoRel = !$this->___tipoRelatorio ? '' : 'checked="checked"';
/*
* Personalise esta funcao se necessitar de outras opnioes de filtro.
*/
@ -80,7 +76,6 @@
$filtro .= '<td>Fila</td>';
$filtro .= '<td>Data Inicial</td>';
$filtro .= '<td>Data Final </td>';
$filtro .= '<td><input name="tipoRelatorio" type="checkbox" id="tipoRelatorio" value="1" %s/>Analitico</td>';
$filtro .= '<td align="center" valign="middle">&nbsp;</td>';
$filtro .= '</tr>';
@ -101,9 +96,9 @@
/*
* Guarda os filtros passados para recuperar na emissao dos relatoios para impressao.
*/
$_SESSION["SSstorageFiltros"] = array($this->___dac, $this->___dataIni, $this->___dataFim, $this->___tipoRelatorio);
$_SESSION["SSstorageFiltros"] = array($this->___dac, $this->___dataIni, $this->___dataFim);
return sprintf($filtro, $tipoRel, $this->___dataIni, $this->___dataFim, $lkPrint);
return sprintf($filtro, $this->___dataIni, $this->___dataFim, $lkPrint);
}
protected function ___GetDadosDb($pqId = null) {
@ -120,41 +115,6 @@
GetDadosPesq($dbcon, $this->___lstPesquisa, $plId, $plDescricao, $ppId, $ppNome, $datas);
if ($this->___tipoRelatorio) {
$query = "select a.uniqueid::numeric, a.pl_id, a.pp_id, a.pm_data
,e.pp_nome as campanha
,getddd(f.src, '00') as ddd
,case when(length(f.src) >= 10)then substring(f.src,2) else f.src end as telefone
,'ATENDIDA' as condicao
,'1' as digito
,'NAO' as transferido
,'1' as tentativa
,f.calldate as datahora
,(min(f.duration) * interval '1 second' ) as duracao
,f.channel as canal
,'-' as campo_1
,case when((select count(*) from pbx_pesquisa_questoes where pp_id = a.pp_id) = count(b.pq_id))then 'RESPONDEU TODAS AS PERGUNDAS' else 'RESPONDEU ATE A PERGUNTA ' || max(b.pq_display) end as finalizacao
,(select STRING_AGG(remove_acentos(pq_questao), ';') from pbx_pesquisa_questoes where pp_id = a.pp_id) as perguntas
,STRING_AGG( remove_acentos(c.po_opcao), ';') as respostas
,split_part(e.pp_nome, '-', 1) as campo15
,split_part(e.pp_nome, '-', 2) as campo16
from pbx_pesquisa_movimento a
inner join pbx_pesquisa_questoes b on b.pp_id = a.pp_id and b.pq_id = a.pq_id
inner join pbx_pesquisa_opcoes c on c.pp_id = b.pp_id and c.pq_id = b.pq_id and c.po_id = a.po_id
inner join (select uniqueid, umv_ura_nome from pbx_ura_movimento where umv_ura_opcao is not null) d on d.uniqueid = a.uniqueid
inner join pbx_pesquisa e on e.pp_id = a.pp_id
inner join pbx_bilhetes f on f.uniqueid = a.uniqueid
where a.pm_data >= '$dataIni'
and a.pm_data <= '$dataFim'
and a.pp_id = $ppId
and a.pl_id = $plId
group by a.uniqueid, a.pl_id, a.pp_id, a.pm_data, e.pp_nome,getddd(f.src, '0'),f.src,case when(length(f.src) >= 10)then substring(f.src,2) else f.src end,f.calldate,f.duration,f.channel
order by a.uniqueid, calldate;";
$result = $this->___GetQuery($query);
$row = pg_fetch_all($result);
$this->SetData($row ? $row : array());
} else {
$query = "SELECT pq_display, pq_questao,
(select count(*)
from pbx_pesquisa_movimento
@ -189,7 +149,25 @@
$rows = pg_fetch_all($res);
$this->SetData($rows ? $rows : array());
}
}
$query = "SELECT fila, d.matricula, apelido,
SUM(CASE WHEN (c.data_reg IS NOT NULL)THEN 1 ELSE 0 END) AS envio_pesquisa,
SUM(CASE WHEN (c.data_fim IS NOT NULL)THEN 1 ELSE 0 END) AS completou_pesquisa,
COUNT(*) AS chamadas_realizadas
FROM pbx_bilhetes a
INNER JOIN pbx_eventos_dacs b ON a.uniqueid = b.uid2
LEFT JOIN pbx_pesquisa_regitra c ON a.uniqueid = c.uniqueid
LEFT JOIN pbx_usuarios d ON d.matricula = SUBSTRING(b.agente, 7, 4)
WHERE calldate::DATE >= '$dataIni'
AND calldate::DATE <= '$dataFim'
AND b.evento IN('COMPLETEAGENT','COMPLETECALLER', 'TRANSFER','COMPLETEAGENTRAMAL','COMPLETECALLERRAMAL', 'COMPLETACALLER', 'COMPLETAAGENT')
AND fila = 'SUPORTE_NIVEL1_ARAXA'
GROUP BY fila, d.matricula, apelido";
$result = $this->___GetQuery($query);
$row = pg_fetch_all($result);
$this->SetData($row ? $row : array());
}
protected function ___PreparaCsv() {
@ -243,7 +221,7 @@
$dataRel[] = GenerateCsvFromArray($linha);
unset($linha);
}
$dataRel[] = GenerateCsvFromArray(array('Total', '', 'Resp.: ' . $somaResp, number_format(($somaResp / $somaResp) * 100.0, 2, ',', '.') . '%'));
$dataRel[] = GenerateCsvFromArray(array('Total', '', 'Resp.: '.$somaResp,number_format(($somaResp / $somaResp) * 100.0, 2, ',', '.') . '%'));
$x++;
}
@ -255,6 +233,10 @@
$dataRel = array();
$filtro = $this->___FiltrosRelatorio();
/*
* Inicia o relatório.
*/
/*
* Cria os filtros
*/
@ -273,68 +255,6 @@
$dataRel[] = $linha;
/*
* Inicia o relatório.
*/
if ($this->___tipoRelatorio) {
$dadosCabecalio = array('CAMPANHA', 'DDD', 'TELEFONE', 'CONDICAO', 'DIGITO', 'TRANSFERIDO', 'TENTATIVA', 'DATA HORA', 'DURACAO', 'CANAL', 'CAMPO1', 'FINALIZACAO');
$dadosField = array('campanha', 'ddd', 'telefone', 'condicao', 'digito', 'transferido', 'tentativa', 'datahora', 'duracao', 'canal', 'campo_1', 'finalizacao');
$perCnt = 0;
foreach ($this->GetData()[0] as $k => $row) {
if ($k == 'perguntas') {
$resp = explode(';', $row['perguntas']);
foreach ($resp as $v) {
$dadosCabecalio[] = $v;
}
$perCnt = count($resp);
}
if ($perCnt) {
for ($x = 0; $x < $perCnt; $x++) {
$dadosField[] = "resposta_" . $x;
}
}
break;
}
$dadosCabecalio[] = 'Campo 15';
$dadosCabecalio[] = 'campo 16';
$dadosField[] = 'campo15';
$dadosField[] = 'campo16';
/*
* Monta a linha de cabecalio.
*/
$linha = array('LABEL');
foreach ($dadosCabecalio as $value) {
$linha[] = $value;
}
$dataRel[] = $linha;
$x = 1;
$somaResp = 0;
/*
* Linhas de dados.
*/
foreach ($this->GetData()[0] as $row) {
$row['datahora'] = date('d/m/Y H:i:s', strtotime($row['datahora']));
$rps = explode(";", $row['respostas']);
for ($x = 0; $x < $perCnt; $x++) {
$row["resposta_" . $x] = $rps[$x] ? str_replace("º","o",$rps[$x]) : " - ";
}
$linha = array('DADOS');
foreach ($dadosField as $key) {
$linha[] = $row["$key"];
}
$dataRel[] = $linha;
}
} else {
$dadosCabecalio = array('Opcao', 'Resposta', 'Quantidade', 'Porcentagem');
$dadosField = array('po_tecla', 'po_opcao', 'num_resp', 'por_resp');
@ -378,11 +298,11 @@
$dataRel[] = $linha;
unset($linha);
}
$dataRel[] = array('LABEL', 'Total', '', 'Resp.: ' . $somaResp, number_format(($somaResp / $somaResp) * 100.0, 2, ',', '.') . '%');
$dataRel[] = array('LABEL', 'Total', '', 'Resp.: '.$somaResp,number_format(($somaResp / $somaResp) * 100.0, 2, ',', '.') . '%');
$x++;
}
}
$this->___dataRel[] = $dataRel;
}
@ -417,13 +337,6 @@
/*
* Verifica se retornou dados
*/
if ($this->___tipoRelatorio) {
$dataRel[] = sprintf("<tr><td align=\"center\" colspan=\"%s\"><b>%s</b></td></tr></table>", count($dadosCabecalio), (!IsPostBack() ? 'Informe os parametros e clique em consultar!' : 'O ARQUIVO FOI GERADO EM EXCEL CLICK NO ICONE PARA PODER REALIZAR O DOWNLOAD! Foram encontados ' . count($this->GetData()[0]) . ' registros para essa pesquisa!'));
$this->___dataRel[] = $dataRel;
return;
}
if (!IsPostBack() || !count($this->GetData()[0])) {
$dataRel[] = sprintf("<tr><td align=\"center\" colspan=\"%s\">%s</td></tr></table>", count($dadosCabecalio), (!IsPostBack() ? 'Informe os parametros e clique em consultar!' : 'Nenhum registro encontado!'));
$this->___dataRel[] = $dataRel;
@ -461,7 +374,7 @@
}
$linhas .= "</tr>";
}
$linhas .= sprintf("<tr><td colspan='2' align='center'><b>Total</b></td><td align='center'><b>$somaResp</b></td><td align='center'><b>%s</b></td></tr>", number_format(($somaResp / $somaResp) * 100.0, 2, ',', '.') . '%');
$linhas .= sprintf("<tr><td colspan='2' align='center'><b>Total</b></td><td align='center'><b>$somaResp</b></td><td align='center'><b>%s</b></td></tr>", number_format(($somaResp / $somaResp) * 100.0, 2, ',', '.').'%');
$x++;
$dataRel[] = $linhas;
unset($linhas);
@ -547,7 +460,7 @@
$dataQst[$z]['por_resp'] = number_format(($data["num_resp"] / $somaTotalQtd) * 100.0, 2, ',', '.') . '%';
$z++;
}
$totalizador = array('Total: ', $row['pq_questao'], 'Resp.: ' . $somaTotalQtd, number_format(($somaTotalQtd / $somaTotalQtd) * 100.0, 2, ',', '.') . '%');
$totalizador = array('Total: ', $row['pq_questao'], 'Resp.: '.$somaTotalQtd , number_format(($somaTotalQtd / $somaTotalQtd) * 100.0, 2, ',', '.') . '%');
$tables[] = array($dadosCabecalio, $dadosField, $dataQst, $widthHeader, $totalizador, 0);
$x++;
unset($dataQst);

58
configGeral.php

@ -6,7 +6,6 @@ define("CONFIG_SUPERVISOR", 3);
define("CONFIG_AGENTE", 2);
define("CONFIG_MANAGER", 4);
define("CONFIG_CHAT", 5);
define("CONFIG_LICENCA", 6);
$query = "";
//VerificaPerfilAcesso(SEG_CONFIGURACOES);
@ -522,63 +521,6 @@ if ($idSubProg == CONFIG_BASE_DADOS) {
$tpl = "configChatAgente.tpl";
DispRel($smarty, $tpl);
//template configGeral
$tpl = "configSys.tpl";
$smarty->assign("idSubProg", $idSubProg);
DispRel($smarty, $tpl);
} else if ($idSubProg == CONFIG_LICENCA) {
include "util/funcoesLicenca.php";
$fields = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);
$query = sprintf("SELECT perm_licenca FROM pbx_usuarios WHERE matricula = '%s';", GetMatricula());
$result = pg_query($query);
$infoUser = pg_fetch_assoc($result);
$mensagem = null;
if($fields['document'] && $fields['lcnca_perfil'] && $fields['btGerar']){
$contacts = [];
foreach ($fields as $k => $p){
if(strpos($k, 'lcnca_contato') !== false){
$contacts[] = $p;
}
}
$licenca = __dadosLicenca($fields['document'], $contacts);
GerarArquivo($licenca, $fields['lcnca_perfil']);
}
if(isset($fields['btValidar'])){
try{
$json = validarArquivo($_FILES);
if(!$json){
throw new Exception('Não foi possível ler o arquivo informado!');
}
if(!__validLicenca($dbcon, $json)){
$mensagem = ['type' => 'error', "msg" => "Não foi possível validar a licença!"];
}
$mensagem = ['type' => 'success', "msg" => "A licença foi registrada com sucesso!"];
} catch (Exception $ex) {
$mensagem = ['type' => 'error', "msg" => $ex->getMessage()];
}
}
$perfils = GetPerfilApl();
$slcOpt = "";
foreach($perfils as $k => $v){
$slcOpt .= "<option value='{$v['pfa_id']}'>{$v['prf_nome']} - [{$v['pfa_descricao']}]</option>";
}
$smarty->assign('select_perfil', $slcOpt);
foreach ($fields as $k => $v){
$smarty->assign($k, $v);
}
$smarty->assign('mensagem', $mensagem);
$smarty->assign('perm', $infoUser['perm_licenca']);
$smarty->assign('isAdmin', IsAdmin());
$tpl = "configLicenca.tpl";
DispRel($smarty, $tpl);
//template configGeral
$tpl = "configSys.tpl";
$smarty->assign("idSubProg", $idSubProg);

13
discador/campanha/processaLista.php

@ -17,7 +17,6 @@ try {
$tipo = $_FILES['list_file']['type'];
$nomeArquivo = $_FILES['list_file']['name'];
if (empty($nomeArquivo)) {
GeraExcept("Para realizar esta operação é necessario enviar um arquivo!");
}
@ -33,12 +32,13 @@ try {
GeraExcept("Não foi possível ler o arquivo!");
}
$fileProc = processaLista($listaClietne, $nomeArquivo);
processaLista($listaClietne, $nomeArquivo);
if ($fileProc) {
DownloadArquivo($fileProc);
$jsStartup[] = "alert('Arquivo gerado com sucesso!');";
}
// if ($fileProc = processaLista($listaClietne, $nomeArquivo)) {
// DownloadArquivo($fileProc);
// }
}
} catch (Exception $ex) {
$msg = $ex->getMessage();
@ -124,7 +124,7 @@ function processaLista($arquivo, $nomeArquivo) {
$idNtp = RegistroInc($dbcon, "select id from pbx_listanegra where UPPER(nome) = 'NAO PERTURBE' and id_pai is null");
$sql = "delete from tb_lista_discador a where exists(select '' from pbx_listanegra where numero = a.numero and (id_pai = '{$idNtp}' or flag = 'NAO PERTUBE'));";
if (!pg_query($dbcon, $sql)) {
throw new Exception("Năo foi possível verificar a tabela de lista negra!" . pg_last_error());
throw new Exception("Năo foi possível verificar a tabela de lista negra!");
}
$sql = "select numero from tb_lista_discador";
@ -140,6 +140,7 @@ function processaLista($arquivo, $nomeArquivo) {
fclose($handReproc);
if (!file_exists($arqReproc)) {
throw new Exception("Não foi possível criar o arquivo no diretório!");
}

4
include/configs/config.php

@ -14,7 +14,7 @@ define("PRM_DEF_SLOGAN", "Simples IP");
// #################################
define('ENDERECO_SITE', 'Av. Isaac Póvoas, Nº 901, Ed. Mirante do Coxim - Sala 102 - Centro - Cuiabá - MT - Cep: 78032-015');
define('POWERED_BY', 'Desenvolvido por '.NOME_SITE.' - Copyright © ' . date('Y') . ' simplesip.net.br');
define('POWERED_BY', 'Desenvolvido por Simples IP - Copyright © ' . date('Y') . ' simplesip.net.br');
define('EMAIL_SITE1', 'meajuda@simplesip.com.br');
define('EMAIL_SITE2', 'comercial@simplesip.com.br');
define('TELEFONE_SITE1', '+55(65)3616-8280');
@ -47,7 +47,7 @@ define('CONF_PARCEIRO_WORKFLOW','logoParceiro');
// ### CONFIGURAÇÃO DAS JANELAS POPUP ###
// ######################################
$myHeader = '<title>'.TITLE_SITE.'</title><link rel="shortcut icon" href='.FAVICON_SITE.'>';
$myHeader = '<title>Simples IP</title><link rel="shortcut icon" href='.FAVICON_SITE.'>';
define('TITLE_JANELA_SITE', $myHeader);
// #######################################################

2
include/util/util.php

@ -380,7 +380,7 @@ function LimpaString($str, $toUpeer = true, $removeSpace = true) {
$array2 = array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'U', 'P', 'B', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y');
$string = str_replace($array1, $array2, $string);
$newstring = preg_replace(($removeSpace ? "/[^a-zA-Z0-9_.]/" : "/[^a-zA-Z0-9\s_.]/"), "", $string);
return $toUpeer ? $newstring : $newstring;
return $toUpeer ? strtoupper($newstring) : $newstring;
}
function GetFileExt($nomeArq) {

8
login.php

@ -20,8 +20,6 @@ $smarty->assign("recuperaSenha", ValidaRecuperaSenha($dbcon));
* usuario nao autenticado
*/
include "util/funcoesLicenca.php";
if (!isset($_POST["loginUser"])) {
$jsStartup[] = $setFocus;
DispLogin($smarty); // or $siteError->GetPhpError("Autentica Usuario", "", "Erro ao chamar funcao smarty!");
@ -31,12 +29,6 @@ if (!isset($_POST["loginUser"])) {
$senha = substr($_POST["loginPass"], 0, 14);
$validaTentativa = countTentativas($dbcon, $login, $tentativaErro);
if(!validarLicenca($dbcon) && ($_POST["loginUser"] != 'admin')){
$jsStartup[] = "alert('Sua licença é inválida por favor entre em contato com o suporte da Simples IP para ativar sua central!');";
DispLogin($smarty);
return;
}
if(!$validaTentativa && ($_POST["loginUser"] != 'admin')){
$jsStartup[] = "alert('Seu acesso foi bloqueado por inúmeras tentativas de acesso inválidos! Para o desbloqueio, realize a alteração de senha ou consulte seu Administrador.');";
$jsStartup[] = $setFocus;

30
master.css

@ -330,8 +330,9 @@ form input[type=submit], input[type=text]
border-collapse: collapse;
background-color:#F7F7F7;
font:Arial, Helvetica, sans-serif;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
overflow: hidden;
}
@ -992,6 +993,7 @@ table.gridClean td {
}
#agrupamentoTable th !important {
font-weight: bold;
padding: 0;
margin: 0;
@ -999,27 +1001,3 @@ table.gridClean td {
padding-right: 6px;
background-color: #4F71C0;
}
.alert {
padding: 15px;
border-radius: 5px;
color: white;
font-size: 12px;
font-weight: bold;
}
.alert-error {
background-color: #f44336;
}
.alert-success {
background-color: #04AA6D;
}
.alert-info {
background-color: #2196F3;
}
.alert-warning {
background-color: #ff9800;
}

58
templates/callcenter/agente/agenteAnota.tpl

@ -1,21 +1,18 @@
{capture name="display"}
<table width="100%" border="0" class="grid" cellpadding="1" cellspacing="0" style="border-top:0;font-size:12px;" >
<tr>
<td align="center">
<span style="font-face:Arial, Helvetica, sans-serif; font-size:16px; font-weight:bold;">
<img src="imgSite/anotacoes.png" alt="Bloco de Anota&ccedil;&otilde;es" align="absmiddle" width="32" height="32" border="0" title="Bloco de Anota&ccedil;&otilde;es">
Bloco de Anotações
</span>
</td>
<td align="center"><span style="font-face:Arial, Helvetica, sans-serif; font-size:16px; font-weight:bold;"><img src="imgSite/anotacoes.png" alt="Bloco de Anota&ccedil;&otilde;es" align="absmiddle" width="32" height="32" border="0" title="Bloco de Anota&ccedil;&otilde;es"> Bloco de Anotações</span></td>
</tr>
<tr>
<td valign="top" >
<table width="100%" border="0" cellspacing="0" cellpadding="2">
<tr>
{if $isSuper}<th align="center" valign="top" >Agente</th>{/if}
{if $isSuper}
<th align="center" valign="top" >Agente</th>
{/if}
<th align="center" valign="top" >Data Inicial</th>
<th align="center" valign="top" >Data Final</th>
<th colspan="3" align="left" valign="top" >{if $isFone}Fone{else}{$prm_label_protoco_pesquisa}{/if}</th>
</tr>
<tr>
@ -30,35 +27,27 @@
<input name="btPesquisa" type="submit" id="btPesquisa" value="Pesquisar" title="Para pesquisar deixe o texto em branco!" />
<input name="btAnota" type="submit" id="btAnota" value="Gravar" title="Para pesquisar deixe o texto em branco!">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td valign="top"align="center">
<font face="Arial, Helvetica, sans-serif" color="{$corErro}" size="3">
<strong>{$msg}</strong>
</font>
</td>
</tr>
<tr>
<th align="left" valign="top" >{$prm_label_protoco_texto}</th>
</tr>
<tr>
</table>
</td>
</tr>
<tr>
<td valign="top"align="center"><font face="Arial, Helvetica, sans-serif" color="{$corErro}" size="3"><strong>{$msg}</strong></font></td>
</tr>
<tr>
<th align="left" valign="top" >{$prm_label_protoco_texto}</th>
</tr>
<tr>
<td valign="top" >
<textarea name="AnotaTexto" cols="59" rows="8" style="width: 100%" id="AnotaTexto">{$AnotaTexto}</textarea>
<span class="style1"></span>
</td>
</tr>
<tr>
<span class="style1"> </span></td>
</tr>
<tr>
<th align="left" valign="top" >Registros</th>
</tr>
<tr>
</tr>
<tr>
<td valign="top" >
<div style="width:99%; height: 320px; overflow:scroll; padding: 3px;">
<table width="100%" class="grid" border="0" cellspacing="0" cellpadding="2">
@ -71,9 +60,8 @@
</tr>
{$linhas}
</table>
</div>
</td>
</tr>
</table>
</div> </td>
</tr>
</table>
{/capture}

2
templates/callcenter/agente/agentert.tpl

@ -307,7 +307,7 @@
<td style="border:0;"><a href="#" onclick="ComplementoCampanha();"><img src="imgSite/anexo16.png" alt="Infromações Detalhadas do Contato" width="25" height="25" border="0" title="Infromações Detalhadas do Contato" /></a></td>
{/if}
<td style="border:0;"><img class="copyjs" data-clipboard-target="#linkaudio" src="imgSite/link-closed-solid-25.png" alt="Link para Áudio" width="25" height="25" border="0" title="Copia link de áudio para área de transferência!" /></td>
<td style="border:0;"><a href="javaScript:NovaJanela('index.php?idProg=17', 'agenteAnota', '920', '600', 'resizable=NO,scrollbars=NO');"><img src="imgSite/anotacoes.png" alt="Bloco de Anota&ccedil;&otilde;es" width="25" height="25" border="0" title="Bloco de Anota&ccedil;&otilde;es" /></a></td>
<td style="border:0;"><a href="javaScript:NovaJanela('index.php?idProg=17', 'agenteAnota', '700', '600', 'resizable=NO,scrollbars=NO');"><img src="imgSite/anotacoes.png" alt="Bloco de Anota&ccedil;&otilde;es" width="25" height="25" border="0" title="Bloco de Anota&ccedil;&otilde;es" /></a></td>
<td style="border:0;"><a href="javaScript:NovaJanela('index.php?idProg=19&ramal={$ramal_monitor}', 'agenteHistorico', '850', '320', 'resizable=NO,scrollbars=NO');"><img src="imgSite/history.png" alt="Hist&oacute;rico das Chamadas" width="25" height="25" border="0" title="Hist&oacute;rico das Chamadas" /></a></td>
<td style="border:0;"><a href="javaScript:NovaJanela('index.php?idProg=18', 'agenteAgenda', '600', '400', 'resizable=NO,scrollbars=NO');"><img src="imgSite/agenda.png" alt="Agenda" width="25" height="25" border="0" title="Agenda" /></a></td>
<td style="border:0;"><a href="javaScript:NovaJanela('index.php?idProg=16&tpLayout=1', 'trocaSenha', '500', '207', 'resizable=NO,scrollbars=NO');"><img src="imgSite/security.png" alt="Trocar Senha" width="25" height="25" border="0" title="Trocar Senha" /></a></td>

6
templates/configSys.tpl

@ -1,21 +1,19 @@
{capture name="display"}
<input type="hidden" name="idSubProg" value="{$idSubProg}">
<table width="850" cellpadding="2" cellspacing="0" bgcolor="#F7F7F7" style="border: 1px solid #E1E1E1">
<table width="650" border="0" cellpadding="2" cellspacing="0" bgcolor="#FFFFFF">
<tr>
<td>
<table class="grid" width="100%" border="0" cellspacing="0" cellpadding="2">
<tr align="center">
<th colspan="19">Configura&ccedil;&atilde;o Geral do Sistema </th>
<th colspan="7">Configura&ccedil;&atilde;o Geral do Sistema </th>
</tr>
<tr align="center" >
<th>&nbsp;</th>
<th><a style="color:#d9d9d9" href="index.php?idProg=20&idSubProg=0">Banco de Dados</a></th>
<th><a style="color:#d9d9d9" href="index.php?idProg=20&idSubProg=1">Sistema</a></th>
<th><a style="color:#d9d9d9" href="index.php?idProg=20&idSubProg=2">Agente</a></th>
<th><a style="color:#d9d9d9" href="index.php?idProg=20&idSubProg=3">Supervisor</a></th>
<th><a style="color:#d9d9d9" href="index.php?idProg=20&idSubProg=4">Socket Server</a></th>
<th><a style="color:#d9d9d9" href="index.php?idProg=20&idSubProg=5">Simples Chat</a></th>
<th><a style="color:#d9d9d9" href="index.php?idProg=20&idSubProg=6">Licença</a></th>
<th>&nbsp;</th>
</tr>
</table>

Loading…
Cancel
Save