Resumo Clientes %s%s '; $tbFone = '
Resumo Telefones
%s%s%s%s
'; $imPausaDac = "Pausa"; //"\"Monitor\""; $imMonitor = "\"Monitor\""; $imLiberaManal = "
\"Mostra
"; $tbHeadDac = array($imMonitor, 'Dac', 'Agentes', 'Originadas', 'Atendimento', 'Abandonadas', 'Espera', 'Tempo Espera', 'Nível de Serviço', "Campanha", $imPausaDac, "Clas"); //,'Tempo Nível de Serviço' $tbHeadAgente = array('Ramal', 'Matrícula', 'Nome', 'Login', 'Atendimento', 'Orig/Dest', 'Status', 'Duração', 'CO', 'CA', 'TMA', '', '', '', ''); if ($selTodos) array_unshift($tbHeadAgente, 'DAC'); /* * Captura os filtros enviados pelo supervisor. */ $cklivre = isset($_FORMS["cklivre"]) && $_FORMS["cklivre"] ? 'LIVRE' : ''; $ckocupado = isset($_FORMS["ckocupado"]) && $_FORMS["ckocupado"] ? 'OCUPADO' : ''; $ckpausa = isset($_FORMS["ckpausa"]) && $_FORMS["ckpausa"] ? 'PAUSA' : ''; /* * Monta as tebelas de dac e agente */ $tbHead = $tbHeadDac; $tbDac = GetTbDac($dbcon, $dac, $tbHead); $tbAgente = GetTbAgente($dbcon, $dac, $tbHeadAgente); $tbCall = ""; if (IsAjax() && isset($_GET["logoff"])) { $matrLogoff = $_GET["logoff"]; $dacLogoff = $_GET["dac"]; $GLOBALS["ramalOperacao"] = GetRamalLogado($dbcon, $matrLogoff, $org_id); //if(AgenteOcupado($dbcon, $matrLogoff)) //restrição removida. if (false) { echo "Esta operação não pode ser realizada quando o \"Agente Está Ocupado\"!"; } else { @GetUrl(AST_REM_FILA, $dacLogoff, $matrLogoff); /* * Desliga a chamada corrente * e desconecta o usuario do asterisk */ $query = "SELECT canal, canal_transfer, canal_agente, ramal, nome, dac, uniqueid, status FROM pbx_supervisor_agentes WHERE matricula = '$matrLogoff' AND org_id = $org_id"; $result = pg_query($dbcon, $query); if ($result) { $row = @pg_fetch_array($result); $_SESSION[SS_AGT_CHANNEL_AGENTE] = $row["canal_agente"]; @GetUrl(AST_DESLIGAR_LIGACAO); } @GetUrl(AST_LOGOFF_AGENTE, $dacLogoff, $matrLogoff); $result = pg_query($dbcon, "begin"); //atualiza dados do supervisor $query = "DELETE FROM pbx_supervisor_agentes WHERE matricula = '$matrLogoff' AND org_id = $org_id"; $result = pg_query($dbcon, $query); $result = @pg_affected_rows($result); //registra o login do usuario if ($result) { $query = "SELECT coalesce(max(id),0) AS id FROM pbx_eventos_agentes WHERE matricula = '$matrLogoff' AND org_id = $org_id AND cast(login as date) = cast(now() as date) AND flag <> 2"; $result = pg_query($dbcon, $query); $row = @pg_fetch_row($result); $idLogoff = $row[0]; if ($idLogoff) { $query = "UPDATE pbx_eventos_agentes SET logoff = now(), flag = 2 WHERE id = $idLogoff AND org_id = $org_id"; $result = pg_query($dbcon, $query); $result = @pg_affected_rows($result); } } if ($result) { pg_query($dbcon, "commit"); echo "O logoff do usuário executado com sucesso!"; } else { pg_query($dbcon, "rollback"); echo "O logoff do usuário não pode ser executado!" + pg_last_error($dbcon); } } } else if (IsAjax() && isset($_GET["pausaAgente"])) { $matricula = $_GET["pausaAgente"]; $dac = $_GET["dac"]; $ramal = $_GET["ramal"]; if (AgenteOcupado($dbcon, $matricula)) { echo "Esta operação não pode ser realizada quando o \"Agente Está Ocupado\"!"; } else { $ret = explode(";", PausaAgente($dbcon, $ramal, $dac, $matricula)); echo $ret[1]; } } else if (IsAjax() && isset($_GET["intercalarAgente"])) { $matricula = $_GET["intercalarAgente"]; $dac = $_GET["dac"]; $idSessao = "SSinter_" . $matricula; $intercalar = $_SESSION[$idSessao]; $_SESSION[SS_DESTINO_INTERCALAR] = $_GET["ramal"]; $intercalar = false; /* * Derruba todos so canais ativos que estiver marcados como intercar/momitorar para o ramal selecionados */ @GetUrl(AST_DESLIGAR_TODOS); $query = "UPDATE pbx_supervisor_agentes SET intercalar = '{Status}' WHERE matricula = '$matricula'"; if (!$intercalar) { $ramalIntercalar = soNumero(GetRamalMonitorar(RAMAL_MONITOR_SUPERVISOR)); if (!$ramalIntercalar) { echo "RAMAL_INVALIDO"; } else if (GetUrl(AST_INTERCALAR, $dac, $matricula)) { //atualiza dados do supervisor $query = str_replace("{Status}", "1", $query); $result = pg_query($dbcon, $query); if ($result) $result = pg_affected_rows($result); if ($result) $_SESSION[$idSessao] = 1; echo "Inicianado a intercalação!"; } else { echo "Não foi possível realizar a operação!"; } } else { echo "Operação em andamento!"; } } else if (IsAjax() && isset($_GET["monitorarAgente"])) { $matricula = $_GET["monitorarAgente"]; $dac = $_GET["dac"]; $idSessao = "SSmonitorar_" . $matricula; $monitorar = $_SESSION[$idSessao]; $_SESSION[SS_DESTINO_INTERCALAR] = $_GET["ramal"]; $monitorar = false; /* * Derruba todos so canais ativos que estiver marcados como intercar/momitorar para o ramal selecionados */ @GetUrl(AST_DESLIGAR_TODOS); if (!$monitorar) { try { if (!$ramalIntercalar = soNumero(GetRamalMonitorar(RAMAL_MONITOR_SUPERVISOR))) { throw new Exception("RAMAL_INVALIDO"); } $canalIntercalar = GetRamalMonitorar(CANAL_MONITOR_SUPERVISOR); if (GetAvisoLgpdMonitoria()) { $nvLgpdSupervisor = GetNivelLgpd(GetMatricula()); $nvLgpdMonitorado = GetNivelLgpd($matricula); } if (!GetUrl(AST_MONITORAR, GetParamMonitorar(GetAvisoLgpdMonitoria(), $ramalIntercalar, $canalIntercalar, $matricula, $nvLgpdSupervisor, $nvLgpdMonitorado))) { throw new Exception("Não foipossível realzar a operação!"); } echo "Iniciando monitoria!"; } catch (Exception $ex) { echo $ex->getMessage(); } } else { echo "Operação em andamento!"; } } else if (IsAjax() && isset($_GET["pausaDac"])) { /* * Coloca todos os atendentes em pausa */ $org_id = $_SESSION['SSEmpresaPadrao']; $pausaDac = $_GET["pausaDac"]; $query = "SELECT matricula, ramal, dac FROM pbx_supervisor_agentes WHERE dac = '$pausaDac' AND org_id = $org_id AND upper(status) NOT IN('PAUSA', 'OCUPADO') "; $result = pg_query($dbcon, $query); if ($result) { if (pg_num_rows($result)) { $numAgtPausa = 0; while ($row = pg_fetch_array($result)) { $matricula = $row["matricula"]; $dac = $row["dac"]; $ramal = $row["ramal"]; $ret = explode(";", PausaAgente($dbcon, $ramal, $dac, $matricula)); if (strtoupper($ret[0]) == 'OK') { $numAgtPausa++; } } if ($numAgtPausa) { echo $numAgtPausa > 1 ? ($numAgtPausa + " Agentes foram colocados em pausa!") : "Agente colocado em pausa!"; } else { echo "Nenhum agente foi colocado em pausa!"; } } else { echo "Nenhum agente esta em pausa no momento!"; } } else { echo "Não foi possível realizar a operação! Erro ao acessar base de dados!"; } } else if (IsAjax()) { echo $tbDac . "#" . $tbAgente . "#" . $tbCall; } else { $tempoSuperAtu = GetTempoSupervisor(); $jsStartup[] = "var idSet = window.setInterval(\"GetSupervisor('$dac','')\",$tempoSuperAtu);"; $smarty->assign('tbDac', $tbDac); $smarty->assign('tbAgente', $tbAgente); $smarty->assign('ramal_monitor', GetRamalMonitorar(RAMAL_MONITOR_SUPERVISOR)); $smarty->assign('cklivre', $cklivre); $smarty->assign('ckocupado', $ckocupado); $smarty->assign('ckpausa', $ckpausa); $smarty->assign('prm_super_alerta_atende', $_SESSION["prm_super_alerta_atende"]); $smarty->assign('prm_super_alerta_pausa', $_SESSION["prm_super_alerta_pausa"]); $smarty->assign('prm_super_alerta_livre', $_SESSION["prm_super_alerta_livre"]); $smarty->assign('isAdmin', IsAdmin()); $smarty->assign('prm_max_ramal', $_SESSION["prm_max_ramal"]); $smarty->assign('prm_max_licenca', $_SESSION["prm_max_licenca"]); $smarty->assign('prm_max_licenca_fixo', $_SESSION["prm_max_licenca_fixo"]); $smarty->assign('nomeRamalMonitor', (RAMAL_MONITOR_SUPERVISOR)); $smarty->assign('canalRamallMonitor', (CANAL_MONITOR_SUPERVISOR)); GetTemplate($smarty, 'supervisor.tpl'); } function GetDadosDac() { global $statusServer, $arRetornoAbandonadas, $dbcon; try { /* * Dacs disponiveis para o usuario conectado. */ $arControle = GetInfoControle(); /* * Verifica o tempo de atuzlização do servidor, * se for inferior a 10s usa o servidor do su- * pervisor para obter os dados, do contrário * utiliza o acesso direto ao banco de dados. */ $ultAtu = time() - $arControle['ultAtulizacao']; if ($ultAtu < 10) { /* * Dacs incluidos no perfil do usuario. */ $dacsAcesso = GetDacsAcesso(GetIdUser(), true); /* * Tenta obter os dados do supervisor atraves do acesso ao servico * do supervisor */ $dados = RetornaDadosDac($arControle, $dacsAcesso); /* * Se a função retornar dados retorna para aplicação, caso * contrario continua com o banco de dados; */ $statusServer = true; return $dados; } /* * Retorna dados diretamente do banco. */ $dadosDac = array(); $query = GetQueryDac(); $result = pg_query($dbcon, $query); /* * Lista chamadads sem retorno */ SetAbandonasFila(); while (($dados = @pg_fetch_array($result, null, PGSQL_ASSOC))) { $dados['abdsr'] = isset($arRetornoAbandonadas[$dados['dac']]) ? $arRetornoAbandonadas[$dados['dac']] : 0; $dadosDac[] = $dados; } return $dadosDac; } catch (Exception $ex) { return array(); } } function GetDadosAgt($dac) { global $statusServer, $dbcon; try { $dacAll = strtoupper($dac) == "TODOS"; $arControle = GetInfoControle(); /* * Verifica o tempo de atualização do servidor, * se for inferior a 10s usa o servidor do su- * pervisor para obter os dados, do contrário * utiliza o acesso direto ao banco de dados. */ $ultAtu = time() - $arControle['ultAtulizacao']; if ($ultAtu < TEMPO_MAX_SERVER_RESPONDE) { /* * Dacs incluidos no perfil do usuario. */ $dacsAcesso = GetDacsAcesso(GetIdUser(), true); /* * Tenta obter os dados do supervisor atraves do acesso ao servico * do supervisor */ $dados = RetornaDadosAgt($arControle); $arDadosDac = array(); foreach ($dados as $dadosDac) { $dacSel = $dadosDac['dac']; if (($dacSel == $dac) || ($dacAll && (array_search($dacSel, $dacsAcesso) !== false))) { $arDadosDac[] = $dadosDac; } } /* * Se a função retornar dados retorna para aplicação, caso * contrario continua com o banco de dados; */ if (count($arDadosDac)) { $statusServer = true; return $arDadosDac; } } } catch (Exception $ex) { $statusServer = false; } /* * Retorna dados diretamente do banco. */ $dadosAgt = array(); $qr = GetQueryAgt($dac); $result = pg_query($dbcon, $qr); $dadosDac = array(); while (($dados = @pg_fetch_array($result, null, PGSQL_ASSOC))) { $dadosDac[] = $dados; } return $dadosDac; } function GetQueryDac() { $idUser = GetIdUser(); $org_id = $_SESSION['SSEmpresaPadrao']; $dacsAcesso = GetDacsAcesso($idUser); $query = "SELECT DISTINCT coalesce(sel, 0) AS sel, e.dac, coalesce(originadas_pa,0) as originadas, coalesce(a.atendidas, 0) as atendidas, coalesce(a.abandonadas::int, 0) as abandonadas, coalesce(e.espera::int, 0) as espera, (coalesce(e.tempo_espera::int, 0) * INTERVAL '1 SECOND') as tempo_espera, coalesce(e.tempo_espera::int, 0) as tempo_espera_int, (round(coalesce(a.inb,0),0)::text || '%') as tempo_nivel_servico, 'D' as tipo, transbordando, transbordada, tme, tma, (select count(*) from pbx_nao_classificado where fila = a.dac and data_bilhete = a.data) as nao_classificado, id_dac, (select count(*) from pbx_supervisor_agentes where dac = e.dac) as num_agente, 1 as ord, org_id FROM pbx_supervisor_dacs e LEFT JOIN ( SELECT 0 as sel, DAC, ID_DAC, DATA, ABANDONADAS ,ATENDIDAS_PA AS ATENDIDAS ,ORIGINADAS_PA ,ESPERA ,round( CASE WHEN(ESPERA = 0)THEN 0 ELSE (TEMPO_ESPERA / ESPERA) END ) * INTERVAL '1 SECOND' AS TME ,round( CASE WHEN(ATENDIDAS_PA = 0)THEN 0 ELSE (TEMPO_ATENDIMENTO / (ATENDIDAS_PA + ORIGINADAS_PA))END) * INTERVAL '1 SECOND' AS TMA ,round(CASE WHEN(ABANDONADAS = 0)THEN 0 ELSE (TEMPO_ABANDONO / ABANDONADAS) END) * INTERVAL '1 SECOND' AS TMAB ,(CASE WHEN((ATENDIDAS_PA::FLOAT + ABANDONADAS::FLOAT) = 0)THEN 0 ELSE ATENDIDAS_30::FLOAT / (ATENDIDAS_PA::FLOAT + ABANDONADAS::FLOAT) END * 100)::numeric(5,2) as INB ,(CASE WHEN(OFERECIDAS::FLOAT = 0)THEN 0 ELSE (ABANDONADAS::FLOAT / OFERECIDAS::FLOAT) END * 100)::numeric(5,2) as IAB ,TEMPO_ESPERA ,TEMPO_ATENDIMENTO ,TEMPO_ABANDONO ,TRANSBORDANDO ,TRANSBORDADA FROM ( SELECT DATA, DAC, ID_DAC, org_id ,SUM (CASE WHEN EVENTO = 'ENTERQUEUE' THEN 1 ELSE 0 END) AS OFERECIDAS ,SUM (CASE WHEN EVENTO = 'ENTERQUEUE' THEN 1 ELSE 0 END) AS ATENDIDAS_URA ,SUM (CASE WHEN EVENTO = 'ABANDON' THEN 1 ELSE 0 END) AS ABANDONADAS ,SUM (CASE WHEN EVENTO IN ('COMPLETEAGENT','COMPLETECALLER', 'TRANSFER','COMPLETEAGENTRAMAL','COMPLETECALLERRAMAL') THEN 1 ELSE 0 END) AS ATENDIDAS_PA ,SUM (CASE WHEN EVENTO IN ('COMPLETAAGENT','COMPLETACALLER','TRANSFERORIG','BUSYS','NOANSWERS') THEN 1 ELSE 0 END) AS ORIGINADAS_PA ,SUM (CASE WHEN EVENTO IN ('COMPLETEAGENT','COMPLETECALLER', 'TRANSFER','COMPLETEAGENTRAMAL','COMPLETECALLERRAMAL') AND strtoint(param1) <= (SELECT a.tempo_nivel_servico FROM pbx_supervisor_dacs a WHERE a.dac = fila)::FLOAT THEN 1 ELSE 0 END) AS ATENDIDAS_30 ,SUM (CASE WHEN EVENTO IN ('TRANSFER') THEN 1 ELSE 0 END) AS TRANSFERIDAS ,SUM (CASE WHEN EVENTO IN ('CONNECT') AND strtoint(param1) > '3' THEN 1 ELSE 0 END) AS ESPERA ,SUM (CASE WHEN (EVENTO IN ('CONNECT') AND strtoint(param1) > '3') THEN strtoint(param1) ELSE 0 END) AS TEMPO_ESPERA ,SUM (CASE WHEN EVENTO IN ('COMPLETEAGENT','COMPLETECALLER','TRANSFER','COMPLETEAGENTRAMAL','COMPLETECALLERRAMAL') AND strtoint((case when(param2 = '')then '0' else param2 end)) > '1' THEN strtoint((case when(param2 = '')then '0' else param2 end)) ELSE 0 END) AS TEMPO_ATENDIMENTO ,SUM (CASE WHEN EVENTO IN ('ABANDON') THEN strtoint(param3) ELSE 0 END) AS TEMPO_ABANDONO ,SUM (CASE WHEN EVENTO IN('TRANSBORDANDO') THEN 1 ELSE 0 END) AS TRANSBORDANDO ,SUM (transbordada) AS TRANSBORDADA FROM ( SELECT D.NOME AS DAC, d.id as ID_DAC, a.calldate::date AS DATA, a.calldate,b.fila,b.evento,b.param1,b.param2,b.param3,b.param4, case when(evento = 'TRANSBORDADO')then 1 else 0 end as transbordada, d.org_id FROM ast_eventos_dacs b INNER JOIN ast_bilhetes a on a.uniqueid = b.uid2 and a.lastapp <> 'Transferred Call' INNER JOIN pbx_queues_grupos d on d.nome = b.fila and d.status = 'A' WHERE b.evento in ('ABANDON','COMPLETEAGENT','COMPLETECALLER', 'CONNECT','ENTERQUEUE','TRANSFER', 'COMPLETAAGENT','COMPLETACALLER', 'TRANSFERORIG', 'TRANSBORDANDO', 'TRANSBORDADO','COMPLETEAGENTRAMAL','COMPLETECALLERRAMAL','BUSYS','NOANSWERS') AND a.data_bilhete = now()::date ) AS DADOS GROUP BY DATA, DAC, ID_DAC, org_id ) AS DADOS ORDER BY 1 ) a ON e.dac = a.dac \n"; $query .= " WHERE 1=1 "; if (!IsAdmin() && !empty($dacsAcesso)) { $query .= " AND e.dac IN($dacsAcesso)\n"; } $query .= " AND org_id = $org_id "; $query .= " ORDER BY 2"; return $query; } function GetDacsAcesso($idUser, $array = false) { global $dbcon; $org_id = $_SESSION['SSEmpresaPadrao']; $query = "SELECT DISTINCT b.nome FROM pbx_queues_grupos b INNER JOIN pbx_fila_grupos c ON c.id = b.id and c.org_id = b.org_id INNER JOIN pbx_grupo_usuario d ON d.gp_id = c.gp_id and d.org_id = c.org_id AND d.user_id = %s and b.status = 'A' "; $query = sprintf($query, IsAdmin() ? 'd.user_id' : QuotedStr($idUser)); $query .= " AND b.org_id = {$org_id}"; $result = pg_query($dbcon, $query); if(!pg_num_rows($result)){ return array(); } $linha = $array ? array() : ''; if ($result) { while ($dados = @pg_fetch_array($result)) { $dac = $dados["nome"]; if ($array) { $linha[] = $dac; } else { $linha .= !$linha ? "'$dac'" : ",'$dac'"; } } } return $linha; } function GetQueryAgt($dac) { global $selTodos; $idUser = GetIdUser(); if ($selTodos) { $dacsAcesso = GetDacsAcesso($idUser); } $queryLocal = "SELECT a.dac, a.ramal AS ramal_monitor, a.matricula, a.nome, a.monitorar AS statusmonitorar, a.intercalar AS statusintercalar, ((EXTRACT(EPOCH FROM (NOW() - a.duracao)) / 60)) AS status_time, a.disponivel_atendimento, chamada_classificado, (LOCALTIMESTAMP(0) - a.tempo_login) AS tempo_logado, a.modo_atendimento, a.origem_destino as fone, CASE WHEN((a.status = 'PAUSA') AND (coalesce(a.motivo_pausa, '') <> ''))THEN a.status || '-' || upper(a.motivo_pausa) ELSE a.status END AS status, (LOCALTIMESTAMP(0) - a.duracao) AS duracao, protocolo AS num_protocolo, uniqueid2, extract(epoch FROM (NOW() - logado))::int AS tempo_atualiza, trim(motivo_pausa) AS pausa_motivo_rt, trim(uniqueid) AS uniqueid, disponivel_atendimento, chamada_classificado, coalesce(canal_transfer, '') AS canal_transfer, tipo_ligacao, cont_identificador, status_discador, media, (SELECT count(*) FROM ast_bilhetes x, ast_eventos_dacs y WHERE y.uid2 = x.uniqueid AND x.data_bilhete IN(a.tempo_login::date, now()::date) AND y.fila = a.dac AND substring(y.agente, 7, 4) = a.matricula AND y.evento IN('COMPLETAAGENT','COMPLETACALLER','TRANSFERORIG','BUSYS','NOANSWERS') AND x.lastapp <> 'Transferred Call' ) AS originadas_pa, (SELECT count(*) FROM ast_bilhetes x, ast_eventos_dacs y, pbx_bilhetes_complemento z WHERE y.uid2 = x.uniqueid AND x.uniqueid = z.uniqueid2 AND z.direcao = 'fila-ramal' AND x.data_bilhete IN(a.tempo_login::date, now()::date) AND y.fila = a.dac AND substring(y.agente, 7, 4) = a.matricula AND y.evento in('COMPLETEAGENT','COMPLETECALLER', 'TRANSFER','COMPLETEAGENTRAMAL','COMPLETECALLERRAMAL') AND x.lastapp <> 'Transferred Call' ) AS atendidas_pa, (SELECT sum(CASE WHEN ((y.evento = 'TRANSFER') OR (y.evento = 'TRANSFERORIG')) THEN CASE WHEN(y.param4 = '')THEN 0 ELSE y.param4::int END ELSE CASE WHEN(y.param2 = '')THEN 0 ELSE y.param2::int END END) FROM ast_bilhetes x, ast_eventos_dacs y WHERE y.uid2 = x.uniqueid AND x.data_bilhete in(a.tempo_login::date, NOW()::date) AND y.fila = a.dac AND substring(y.agente, 7, 4) = a.matricula AND y.evento IN('COMPLETEAGENT','COMPLETECALLER', 'TRANSFER','COMPLETEAGENTRAMAL','COMPLETECALLERRAMAL', 'COMPLETAAGENT','COMPLETACALLER','TRANSFERORIG') AND x.lastapp <> 'Transferred Call' ) AS tempo_atendimento, (SELECT coalesce(pa_fixo, 0) FROM pbx_usuarios WHERE matricula = a.matricula) AS pa_fixo FROM pbx_supervisor_agentes a WHERE a.dac = CASE WHEN(upper('$dac') = 'TODOS')THEN a.dac ELSE '$dac' END\n"; if ($selTodos && !IsAdmin() && $dacsAcesso) { $queryLocal .= " AND a.dac IN($dacsAcesso)\n"; } $queryLocal .= " ORDER BY a.dac, a.nome"; //echo $queryLocal; exit; return $queryLocal; } function GetHeadTable($items, $title = "", $filtro = array()) { global $smarty; $colspan = count($items); $tb = ""; foreach ($items as $item) { $tb .= "$item"; } $tb .= ""; if (!IsAjax()) $smarty->assign('colspan', $colspan); return $tb . "\n"; } function GetCloseTable() { return "\n"; } function GetLinhasDac($dac) { global $dbcon, $statusServer; $linha = ''; $imgSet = ""; $stl = ""; $align = "align=\"center\""; $somaTodos = array('dac' => 'TODOS', 'num_agente' => 0, 'originadas' => 0, 'atendidas' => 0, 'transbordando' => 0, 'transbordada' => 0, 'abandonadas' => 0, 'espera' => 0, 'tempo_espera_int' => 0, 'abdsr' => 0); $arDados = array(); $arDados = GetDadosDac(); foreach ($arDados as $dados) { foreach ($somaTodos as $key => $value) { if ($value !== 'TODOS') { $somaTodos[$key] += $dados[$key]; } } } if (is_array($arDados)) { array_unshift($arDados, $somaTodos); } //print_r($arDados); exit; foreach ($arDados as $dados) { $linha .= ""; $stl = ($dac == $dados["dac"]) || ($dac == -1) ? "class=\"gridSelect\"" : ""; $dacAtv = $dados["dac"]; $dacDisplay = explode('@',$dados['dac'])[0]; $dacAll = strtoupper($dacAtv) == 'TODOS'; if ($stl) { $_SESSION['SSsupervisorDacAtu'] = $dacAtv; } /* * Seleciona o dac ativo. */ $imOn = 'dacOn.png'; $imOn = "\"Dac"; $imOff = 'dacOff.png'; $imOff = "\"Clique"; $imgSet = $stl ? $imOn : $imOff; $linha .= "$imgSet"; /* * Chamada para o grafico. */ $dadoSel = ($dacAtv == 'Todos') ? $dadoSel = sprintf("%s", ($stl ? "$dacDisplay" : $dacDisplay)) : sprintf("%s", ($stl ? "$dacDisplay" : $dacDisplay)); $linha .= "$dadoSel"; /* * Agentes conectados. */ $linha .= sprintf("%s", $align, $stl, $dados['num_agente']); /* * Chamadas originadas. */ $lkOriginadas = (($dados['originadas'] == 0) || ($dacAtv == 'TODOS')) ? $dados['originadas'] : sprintf("%s", $dados['originadas']); $linha .= sprintf("%s", $align, $stl, $lkOriginadas); /* * Chamadas atendidas e transbordo */ $imgTrbdando = ""; $imgTrbdada = "\"\""; $atend = "
%s%s%s
"; $imgAtd = ($dados['atendidas'] ? $dados['atendidas'] : 0); $lkRecebidas = (($imgAtd == 0) || ($dacAtv == 'TODOS')) ? $imgAtd : sprintf("%s", $imgAtd); $imgTrbdando = ($dados['transbordando'] ? $dados['transbordando'] : 0) . $imgTrbdando; $imgTrbdada = ($dados['transbordada'] ? $dados['transbordada'] : 0) . $imgTrbdada; $atend = sprintf($atend, $lkRecebidas, $imgTrbdando, $imgTrbdada); $linha .= "$atend"; /* * Chamadas abandonadas. */ $abd = $dados['abandonadas']; $ramal = GetRamalMonitorar(RAMAL_MONITOR_SUPERVISOR); $abdsr = $dacAll ? $dados['abdsr'] : RetornaAbandon($dbcon, $dados['dac'], $ramal, "supervisor", "", $dados['abdsr']); $linha .= "$abd - $abdsr"; /* * Chamadas em espera. */ $linha .= sprintf(" %s", $align, $stl, $dados['espera']); /* * Tempo de médio de espera das chamadas.. */ $linha .= sprintf(" %s", $align, $stl, $dacAll ? SecondToStrTime($dados['tempo_espera_int']) : $dados['tempo_espera']); /* * Nível de serviço. */ $linha .= sprintf(" %s", $align, $stl, $dacAll ? '-' : $dados['tempo_nivel_servico']); /* * Informacoes da campanha; */ $cmpInfo = GetInfoCampanha($dacAtv); $linha .= sprintf("%s", $align, $stl, ($dacAll ? '-' : $cmpInfo)); /* * Pausa da operação. */ $imOn = "\"Coloca"; $imOff = "\"Remove"; $imgSet = $imOn; //($dac == $dados[1]) || ($dac == -1) ? $imOn : $imOff; $linha .= $dacAll ? sprintf("%s", $align, $stl, '-') : "$imgSet"; /* * Verifica arquivos rejeitados no modulo de vendas quando ativado. */ $imgVendas = ''; if (!$dacAll && UseModVendas()) { $rejeitados = GetRejeitadosVendas($dacAtv); $imOn = "\"Existem"; $imOff = "\"Não"; $imgVendas = "%s"; $imgVendas = sprintf($imgVendas, $dacAtv, ($rejeitados ? $imOn : $imOff)); } /* * classificação de chamadas. */ $naoClas = isset($dados['nao_classificado']) ? $dados['nao_classificado'] : false; $dacClas = $dados['dac']; $idDac = isset($dados['id_dac']) ? $dados['id_dac'] : null; $imOn = "\"Existem"; $imOff = "\"Não"; if (!$dacAll && $naoClas) { $linha .= "$imOn$imgVendas"; } else { if ($dacAll) { $linha .= ("" . ($statusServer ? "..." : "-") . "$imgVendas"); } else { $linha .= "$imOff$imgVendas"; } } $linha .= "\n"; } return $linha; } function FiltroAgt($status) { global $cklivre, $ckocupado, $ckpausa; if (!$cklivre && !$ckocupado && !$ckpausa) { return true; } return ($cklivre === $status) || ($ckocupado === $status) || ($ckpausa === $status); } function GetLinhasAgt($dac) { //ramal, matricula, nome,tempo_logado, modo_atendimento,fone, status, duracao, originadas_pa, atendidas_pa, tempo_atendimento statusmonitorar, statusintercalar, dac, status_time disponivel_atendimento, chamada_classificado global $selTodos; $imgSet = ""; $stl = ""; $align = "align=\"center\""; $arStatusMonitorar = array('PAUSA', 'OCUPADO', 'LIVRE'); $arAlerta = array("PAUSA" => "orangered", "OCUPADO" => "lightblue", "LIVRE" => "palegreen"); $arStatus = array("PAUSA" => "prm_super_alerta_pausa", "OCUPADO" => "prm_super_alerta_atende", "LIVRE" => "prm_super_alerta_livre"); $arMonitorar = 0; //$acessAudio = GetAcessoAudio($dac); $linhas = ''; // "tempo_logado" => "tempo_login"; "fone" => "origem_destino, "ramal_monitor" => "ramal"; $dadosAgt = GetDadosAgt($dac); //$response = json_decode(request('http://127.0.0.1/integracao/media/api/agente/listarAgentesDisponivel'), true); foreach ($dadosAgt as $dados) { $linha = ""; $stAr = isset($dados["status"]) ? explode("-", $dados["status"]) : array(); $stAtual = isset($stAr[0]) ? $stAr[0] : ''; $arMonitorar = (array_search($stAtual, $arStatusMonitorar) !== false); $acessAudio = GetAcessoAudio($dados["dac"]); $media = StrToIntDef($dados['media']) && (StrToIntDef($dados['media']) != 99); $dacDisplay = explode('@',$dados["dac"])[0]; if (FiltroAgt($stAtual)) { /* * Dac quando seledionado todos; */ if ($selTodos) { $linha .= sprintf("%s", $align, $dacDisplay); } /* * Ramal do agente; */ $linha .= sprintf("%s", $align, $dados["ramal_monitor"]); /* * Matricula e e chamada para grafico. */ $mat = isset($dados['matricula']) ? $dados['matricula'] : '-'; $strLicenca = "\"%s\""; $msgTpLicenca = ($dados['pa_fixo'] ? "Licença Fixa!" : "Licença Dinâmica!"); $tpLicenca = sprintf($strLicenca, ($dados['pa_fixo'] ? "pa_fixo.png" : "pa_dinamico.png"), $msgTpLicenca, $msgTpLicenca); $dacAtv = isset($dacDisplay) ? $dacDisplay : '-'; $strTmp = "$mat"; $linha .= sprintf("%s %s", $align, $strTmp, $tpLicenca); /* * Nome */ $linha .= sprintf("%s", $align, $dados["nome"]); /* * Login */ $linha .= sprintf("%s", $align, $dados["tempo_logado"]); /* * Modo de atendimetno selecionado. */ $linha .= sprintf("%s", $align, $dados["modo_atendimento"]); /* * Origem e destino(bina). */ $strTmp = isset($dados['fone']) ? $dados['fone'] : '-'; if ($media) { $strTmp = "$strTmp  "; $strTmp .= "\"Monitorar"; } else { $img1 = ($dados['tipo_ligacao'] == 'E') ? "direcaoE32.png" : "direcaoS32.png"; $title1 = ($dados['tipo_ligacao'] == 'E') ? "Chamada Entrante!" : "Chamada Sainte!"; if ($strTmp) $strTmp .= " \"$title1\""; $dacClass = $dados['dac']; if (SupervisorClass($dacClass)) { $img = GetExigeClassStatus($dados['chamada_classificado'], $dacClass, 1) ? "ledGreen.png" : "ledRed.png"; $title = GetExigeClassStatus($dados['chamada_classificado'], $dacClass, 1) ? "Chamada Classificada!" : "Chamada não Classificada!"; $strTmp .= " \"$title\""; } } $linha .= sprintf("%s", $align, $strTmp); /* * Status do agente. */ $strTmp = isset($dados['status']) ? $dados['status'] : ''; $img = isset($dados['disponivel_atendimento']) && $dados['disponivel_atendimento'] ? "ledGreen.png" : "ledRed.png"; $title = isset($dados['disponivel_atendimento']) && $dados['disponivel_atendimento'] ? "Agente Disponível para Fila!" : "Agente Indisponível para Fila!"; $strTmp .= " \"$title\""; $linha .= sprintf("%s", $align, $strTmp); /* * Duração do login */ $linha .= sprintf("%s", $align, $dados["duracao"]); /* * Chamadas oferecidas */ $linha .= sprintf("%s", $align, $dados["originadas_pa"]); /* * Chamadas Atendidas na fila. */ $atendidas_pa = 0; $statusAgentMedia = ''; $atendidas_pa = $dados["atendidas_pa"]; $linha .= sprintf("%s", $align, $atendidas_pa); /* * Tempo médio de atendimento */ $chamadaAgt = $dados["originadas_pa"] + $dados["atendidas_pa"]; $strTmp = $chamadaAgt ? round(($dados["tempo_atendimento"] / $chamadaAgt), 0) : 0; $strTmp = SecondToStrTime($strTmp); $linha .= sprintf("%s", $align, $strTmp); /* * Logoff de Agente */ if ($media) { $strTmp = "\"Logoff"; } else { $strTmp = "\"Logoff"; $strTmp = sprintf($strTmp, isset($dados['matricula']) ? $dados['matricula'] : '', strtoupper((isset($dados['modo_atendimento']) ? $dados['modo_atendimento'] : '')), isset($dados['dac']) ? $dados['dac'] : '', $stAtual); } $linha .= sprintf("%s", $align, $strTmp); /* * Controle de pausas do agente */ if ($media) { if ($statusAgentMedia == 'LIVRE') { $strTmp = "\"%s\""; $strTmp = sprintf($strTmp, $dados['matricula'], $dados['dac'], 'media', $statusAgentMedia, "user_on.gif", "Gerenciar Pausa!", "Gerenciar Pausa!"); } else { $strTmp = "\"%s\""; $strTmp = sprintf($strTmp, $dados['matricula'], "user_off.gif", "Gerenciar Pausa!", "Remover Pausa!"); } } else { if (substr(strtoupper($dados['status']), 0, 5) == 'PAUSA') { $strTmp = "\"%s\""; $strTmp = sprintf($strTmp, $dados['matricula'], strtoupper($dados['ramal_monitor']), $dados['dac'], '0', $media, "user_off.gif", "Tira o agente de Pausa!", "Tira o agente de Pausa!"); } else { $strTmp = "\"%s\""; $strTmp = sprintf($strTmp, isset($dados['matricula']) ? $dados['matricula'] : '', strtoupper(isset($dados['ramal_monitor']) ? $dados['ramal_monitor'] : ''), isset($dados['dac']) ? $dados['dac'] : '', '1', $media, "user_on.gif", "Coloca Agente em pausa!", "Coloca Agente em pausa!"); } } $linha .= sprintf("%s", $align, $strTmp); /* * Monitoramento do ramal do agente. */ if ($acessAudio && !$media) { $idSessao = "SSmonitorar_" . (isset($dados['matricula']) ? $dados['matricula'] : ''); if (isset($dados["statusmonitorar"]) && ($dados["statusmonitorar"] == 1)) { //$_SESSION[$idSessao] = 1; $strTmp = "\"%s\""; $strTmp = sprintf($strTmp, $dados['matricula'], strtoupper($dados['ramal_monitor']), $dados['dac'], "monitorar.gif", "Em operação!", "Em operação!"); } else { $_SESSION[$idSessao] = 0; $strTmp = "\"%s\""; $strTmp = sprintf($strTmp, isset($dados['matricula']) ? $dados['matricula'] : '', strtoupper(isset($dados['ramal_monitor']) ? $dados['ramal_monitor'] : ''), $dados['dac'], "monitorarOff.gif", "Monitorar!", "Monitorar!"); } $linha .= sprintf("%s", $align, $strTmp); $idSessao = "SSinter_" . (isset($dados['matricula']) ? $dados['matricula'] : ''); if (isset($dados["statusintercalar"]) && ($dados["statusintercalar"] == 1)) { //$_SESSION[$idSessao] = 1; $strTmp = "\"%s\""; $strTmp = sprintf($strTmp, $dados['matricula'], strtoupper($dados['ramal_monitor']), $dados['dac'], "intercalar.gif", "Em operação!", "Em operação!"); } else { $_SESSION[$idSessao] = 0; $strTmp = "\"%s\""; $strTmp = sprintf($strTmp, isset($dados['matricula']) ? $dados['matricula'] : '', strtoupper(isset($dados['ramal_monitor']) ? $dados['ramal_monitor'] : ''), isset($dados['dac']) ? $dados['dac'] : '', "intercalarOff.gif", "Intercalar!", "Intercalar!"); } $linha .= sprintf("%s", $align, $strTmp); } else { $title = 'Monitoramento de áudio não disponivel!'; $imgBloq = 'lockClose.gif'; $strTmp = sprintf("\"%s\"", $imgBloq, $title, $title); $linha .= sprintf("%s", $align, $strTmp); $strTmp = sprintf("\"%s\"", $imgBloq, $title, $title); $linha .= sprintf("%s", $align, $strTmp); } $linha .= "\n"; $statusTime = ""; if ($arMonitorar) { if ($stAtual == "PAUSA") { $tempoAlerta = GetTempoPausa($stAr[1]); if (SecondToStrTime($tempoAlerta['tempo_alerta']) <= $dados["duracao"]) { $statusTime = sprintf('style="background-color: %s" ', $arAlerta[$stAtual]); } } else if ($_SESSION[$arStatus[$stAtual]] <= $dados["status_time"]) { $statusTime = sprintf('style="background-color: %s" ', $arAlerta[$stAtual]); } } $linhas .= str_replace("{MONITOR}", $statusTime, $linha); } } return $linhas; } function GetTbDac($dbcon, $dac, $head) { //tabela de dacs $tb = ""; $tb .= GetHeadTable($head); $tb .= GetLinhasDac($dac); return $tb; } function GetTbAgente($dbcon, $dac, $head) { $tb = GetHeadTable($head, "Agentes em Operação"); $tb .= GetLinhasAgt($dac); //$tb .= GetCloseTable(); return $tb; } function GetTempoPausa($pausa) { global $dbcon; $query = "SELECT tempo_alerta FROM pbx_motivos_pausas WHERE motivo ILIKE '$pausa'"; $result = pg_query($dbcon, $query); return pg_fetch_assoc($result); } function GetCurrentCall($conn, $cmpId) { $table = ' {linha}
Fone Status Tempo
'; $query = "SELECT conf_fone, conf_status, round(extract(epoch from age(now(),conf_data))) * interval '1 second' as tempo from pbx_campanha_contato_fone where conf_status_lista = '1' and upper(conf_status) = upper('discando') and round(extract(epoch from age(now(),conf_data))) <= '30' and cmp_id = (select cmp_id from pbx_campanha where cmp_descricao = '$cmpId')"; $result = pg_query($conn, $query); //$erro = ($result ? '' : "Não foipossível realizar a opera�ao! Erro: " . pg_last_error($dbcon)); $linha = ''; if ($result) { while ($dados = @pg_fetch_array($result)) { $fone = $dados["conf_fone"]; $tempo = $dados["tempo"]; $status = $dados["conf_status"]; $linha .= " $fone$status$tempo "; } } if (!$result) { $linha = " Erro ao consultar servidor!"; } else if (empty($linha)) { $linha = " Aguardando...."; } $table = str_replace("{linha}", $linha, $table); return $table; } function PausaAgente($dbcon, $ramal, $dac, $matricula) { $idDac = GetDacCod($dbcon, $dac); $idSessao = "SSpausa_" . $matricula; $pausa = GetPausa($dbcon, $matricula); // $_SESSION[$idSessao]; $codMotivo = $_SESSION["SetListaMotivo"]; $org_id = $_SESSION['SSEmpresaPadrao']; $GLOBALS["ramalOperacao"] = $ramal; if (!$pausa) { $result = GetUrl(AST_ADD_PAUSA, $dac, $matricula); if ($result) { pg_query($dbcon, "begin"); //Descricao do Motivo de pausa $query = "SELECT motivo FROM pbx_motivos_pausas WHERE id = '$codMotivo' AND (org_id = $org_id OR org_id = 0)"; $result = pg_query($dbcon, $query); if ($result) { $rowMotivo = @pg_fetch_row($result); $descMotivo = $rowMotivo[0]; //atualiza dados do supervisor $query = "UPDATE pbx_supervisor_agentes SET status = 'PAUSA', duracao = now(), motivo_pausa = '$descMotivo', origem_destino = '' WHERE matricula = '$matricula'"; $result = pg_query($dbcon, $query); } if ($result) $result = @pg_affected_rows($result); //registra pausa if ($result) { $regProc = QuotedStr(sprintf("AddPausa: Login: %s Scrp: %s Func: %s ", GetLogin(), 'supervisor.php', 'PausaAgente')); $relEvt = GetRelacionaEventos($dbcon, $matricula); $query = "insert into pbx_eventos_agentes(matricula, ramal, id_dac, id_motivo_pausa, entrada_pausa, flag, relaciona_eventos, pausa_produtiva, reg_proc) values('$matricula', '$ramal', $idDac, $codMotivo, now(), 0, $relEvt, (select produtiva from pbx_motivos_pausas where id = '$codMotivo'), $regProc)"; $result = pg_query($dbcon, $query); if ($result) { $result = @pg_affected_rows($result); //pega o id corrente if ($result) { $query = "select currval('pbx_eventos_agentes_id_seq')"; $result = pg_query($dbcon, $query); $row = pg_fetch_row($result); $_SESSION[$matricula . "relEvt"] = $relEvt; $_SESSION[$matricula . "idPausa"] = $row[0]; } } } if ($result) { pg_query($dbcon, "commit"); $_SESSION[$idSessao] = 1; $_SESSION[AGT_ULT_EVENTO] = "PAUSA"; return "OK;O agente \"Matricula: $matricula \" foi colocado em pausa!"; } else { pg_query($dbcon, "rollback"); return "ERRO;A operação não pode ser realizada! Erro: " + pg_last_error($dbcon); } } } else { $result = GetUrl(AST_REM_PAUSA, $dac, $matricula); if ($result) { $regProc = QuotedStr(sprintf(",RemPausa: Login: %s Scrp: %s Func: %s", GetLogin(), 'supervisor.php', 'PausaAgente')); $result = pg_query($dbcon, "begin"); //atualiza dados do supervisor $query = "SELECT origem_destino FROM pbx_supervisor_agentes WHERE matricula = '$matricula' "; $result = pg_query($dbcon, $query); $row = pg_fetch_row($result); $statusAtual = empty($row[0]) ? 'LIVRE' : 'OCUPADO'; $query = "UPDATE pbx_supervisor_agentes SET status = '$statusAtual', duracao = now() WHERE matricula = '$matricula'"; $result = pg_query($dbcon, $query); if ($result) { $result = pg_affected_rows($result); } //registra o login do usuario if ($result) { $query = "UPDATE pbx_eventos_agentes SET saida_pausa = NOW(), flag = 2, reg_proc = coalesce(reg_proc, '') || $regProc WHERE matricula = '$matricula' AND id_dac = (SELECT id FROM pbx_dacs WHERE nome = '$dac') AND entrada_pausa = (SELECT max(entrada_pausa) FROM pbx_eventos_agentes WHERE matricula = '$matricula' AND id_dac = (SELECT id FROM pbx_dacs WHERE nome = '$dac'))"; $result = pg_query($dbcon, $query); if ($result) $result = @pg_affected_rows($result); } } if ($result) { pg_query($dbcon, "commit"); $_SESSION[$idSessao] = 0; $_SESSION[AGT_DESCONECTA_SUPER] = 1; return "OK;O agente \"Matricula: $matricula \" foi retirado de pausa!"; } else { pg_query($dbcon, "rollback"); return "ERRO;A operação não pode ser realizada! Erro: " + pg_last_error($dbcon); } } } function request($url, $post = []) { $ch = curl_init(); $isPost = $post ? 1 : 0; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, $isPost); if ($isPost) { curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post)); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $head = curl_exec($ch); curl_close($ch); return $head; }