You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

331 lines
16 KiB

<?php
function GetDataEnvioMensal($dataEnvio, $tp) {
/*
* Mês anterior
*/
$mes = substr($dataEnvio, 0, 2);
$ano = substr($dataEnvio, 2, 4);
/*
* $tp == 1 -> Data Inicial
*/
$dia = $tp == 1 ? '01' : GetLastDayofMonth($ano, $mes);
return sprintf("%s-%s-%s", $ano, $mes, $dia);
}
function GetDacsWkf($conn, $restDac, $emailId, $dataEnvio, $tpEnvio) {
global $debug;
$dataInicial = $tpEnvio == ENVIO_DIARIO ? $dataEnvio : GetDataEnvioMensal($dataEnvio, 1);
$dataFinal = $tpEnvio == ENVIO_DIARIO ? $dataEnvio : GetDataEnvioMensal($dataEnvio, 2);
$query = " select distinct x.id, x.nome
from pbx_dacs x
where exists(
select ''
from pbx_bilhetes a
inner join pbx_eventos_dacs b on b.uid2 = a.uniqueid
where a.calldate::date >= '$dataInicial'
and a.calldate::date <= '$dataFinal'
and b.fila = x.nome
and b.evento in ('ABANDON','COMPLETEAGENT','COMPLETECALLER','COMPLETAAGENT','COMPLETACALLER','ENTERQUEUE','TRANSFER')
)";
$query .= $restDac ? "and exists(select * from pbx_workflow_emails_dacs where nome_dac = x.nome and wkf_email_id = '$emailId') order by 1" : "order by 1";
if ($debug == 9) {
PreparaLog('GetDacsWkf', $query, false);
}
$result = pg_query($conn, $query);
if (!pg_num_rows($result))
return false;
$dacs = array();
while ($dados = pg_fetch_array($result)) {
$dacs[] = $dados;
}
return $dacs;
}
function GetGrafico($conn, $dacInfo, $dataEnvio, $diario) {
$Img = &$GLOBALS["embedImg"];
$templeteContent = file_get_contents("/var/lib/asterisk/scripts/workflow/workflowConteudoDados.html");
$dac = $dacInfo["id"];
$diario = ($diario == ENVIO_DIARIO);
$dataInicial = $diario ? $dataEnvio : GetDataEnvioMensal($dataEnvio, 1);
$dataFinal = $diario ? $dataEnvio : GetDataEnvioMensal($dataEnvio, 2);
$dacGraph = sprintf('%s_%s.jpg', $dacInfo["nome"], soNumero($dataEnvio));
$dacGraphCid = sprintf('%s_%s', $dacInfo["nome"], soNumero($dataEnvio));
$Img[$dacGraphCid] = $dacGraph;
if (file_exists($dacGraph)) {
$content = str_replace("{GRAFICO}", $dacGraphCid, $templeteContent);
return $content;
}
$mediaAlt = $diario ? "" : ",(select count(distinct a.calldate::date) from pbx_bilhetes a, pbx_eventos_dacs b, pbx_dacs c where b.uid2 = a.uniqueid and c.nome = b.fila and a.calldate::date >= '$dataInicial' and a.calldate::date <= '$dataFinal' and c.id = '$dac' ) as media_alt";
$query = " select c.id, b.fila, date_part('hour', a.calldate) as hora,
SUM (CASE WHEN EVENTO = 'ENTERQUEUE' THEN 1 ELSE 0 END) AS OFERECIDAS,
SUM (CASE WHEN EVENTO = 'ABANDON' THEN 1 ELSE 0 END) AS ABANDONADAS,
SUM (CASE WHEN (abdsr_data_retorno IS NOT NULL AND evento IN ('ABANDON')) THEN 1 ELSE 0 END) AS ABD_RET,
SUM (CASE WHEN EVENTO IN ('COMPLETEAGENT','COMPLETECALLER','TRANSFER') THEN 1 ELSE 0 END) AS ATENDIDAS,
SUM (CASE WHEN EVENTO IN ('COMPLETAAGENT','COMPLETACALLER', 'TRANSFERORIG') THEN 1 ELSE 0 END) AS ORIGINADAS,
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) > '1' THEN strtoint(param1) ELSE 0 END) AS TEMPO_ESPERA,
SUM (CASE WHEN EVENTO IN ('COMPLETEAGENT','COMPLETECALLER','TRANSFER') AND strtoint(param2,0) > 1 THEN strtoint(param2,0) ELSE 0 END) AS TEMPO_ATENDIMENTO,
SUM (CASE WHEN EVENTO IN ('COMPLETAAGENT','COMPLETACALLER', 'TRANSFERORIG') AND strtoint(param2,0) > 1 THEN strtoint(param2,0) ELSE 0 END) AS TEMPO_ORIGINADA,
SUM (CASE WHEN( (EVENTO = 'ABANDON') ) THEN strtoint(param3,0) ELSE 0 END) AS TEMPO_ABANDONO,
SUM (CASE WHEN EVENTO IN ('TRANSFER') THEN 1 ELSE 0 END) AS TRANSFERIDAS,
(select count(distinct login::date) from pbx_eventos_agentes where id_dac = '$dac' and login::date >= '$dataInicial' and login::date <= '$dataFinal' ) as dias_media
$mediaAlt
from pbx_bilhetes a
inner join pbx_eventos_dacs b on b.uid2 = a.uniqueid
inner join pbx_dacs c on c.nome = b.fila
left join pbx_abandonadas_semretorno d on d.abdsr_uniqueid = a.uniqueid
where a.calldate::date >= '$dataInicial'
and a.calldate::date <= '$dataFinal'
and c.id = '$dac'
and a.lastapp <> 'Transferred Call'
and b.evento in ('ABANDON','COMPLETAAGENT','COMPLETACALLER','COMPLETEAGENT','COMPLETECALLER','ENTERQUEUE','CONNECT','TRANSFER')
and 1 = CASE WHEN(b.evento = 'ABANDON')then (case when(not exists(select '' from ast_eventos_dacs where uid2 = b.uid2 and evento = 'TRANSBORDANDO' and fila = b.fila)) then 1 else 0 end) else 1 end
group by c.id, b.fila, date_part('hour', a.calldate)
order by 3";
$arOferecida = GetArHour();
$arOriginada = GetArHour();
$arAtendida = GetArHour();
$arAbandonadas = GetArHour();
$arEstera = GetArHour();
$arTransfer = GetArHour();
$arLabel = GetArHour(true);
$somaEspera = 0;
$somaEsperaTempo = 0;
$somaAtendida = 0;
$somaAtendidaTempo = 0;
$somaAbandonada = 0;
$somaAbandonadaTempo = 0;
$somaTransferidas = 0;
$somaOriginada = 0;
$somaOriginadaTempo = 0;
$arAbandonadasRet = 0;
$dac = "";
$result = pg_query($conn, $query);
while ($dados = pg_fetch_array($result)) {
// dias_atendidas dias_abandon dias_transfer dias_oferecidas
$media = $diario ? 0 : ($dados["dias_media"] ? $dados["dias_media"] : $dados["media_alt"]);
$hour = $dados["hora"];
$arOferecida[$hour] = ($diario || !$media) ? $dados["oferecidas"] : round($dados["oferecidas"] / $media);
$arOriginada[$hour] = ($diario || !$media) ? $dados["originadas"] : round($dados["originadas"] / $media);
$arAtendida[$hour] = ($diario || !$media) ? $dados["atendidas"] : round($dados["atendidas"] / $media);
$arAbandonadas[$hour] = ($diario || !$media) ? $dados["abandonadas"] : round($dados["abandonadas"] / $media);
$arAbandonadasRet[$hour] = ($diario || !$media) ? $dados["abd_ret"] : round($dados["abd_ret"] / $media);
$arEstera[$hour] = ($diario || !$media) ? $dados["espera"] : round($dados["espera"] / $media);
$arTransfer[$hour] = ($diario || !$media) ? $dados["transferidas"] : round($dados["transferidas"] / $media);
$dac = $dados["fila"];
$somaTransferidas += $dados["transferidas"];
$somaEspera += $dados["espera"];
$somaEsperaTempo += $dados["tempo_espera"];
$somaAtendida += $dados["atendidas"];
$somaAtendidaTempo += $dados["tempo_atendimento"];
$somaAbandonada += $dados["abandonadas"];
$somaAbandonadaRet += $dados["abd_ret"];
$somaAbandonadaTempo += $dados["tempo_abandono"];
$somaOriginada += $dados["originadas"];
$somaOriginadaTempo += $dados["tempo_originada"];
}
$graph = new Graph(960, 600);
$graph->SetScale("textint");
$graph->SetShadow();
$graph->SetMargin(40, 20, 40, 40);
$graph->title->Set($dac . ($diario ? " - Data: $dataInicial" : " - De: $dataInicial Até: $dataFinal"));
$graph->xaxis->SetTickLabels($arLabel);
$graph->legend->Pos(0.2, 0.90);
$graph->legend->SetColumns(5);
$mediaAtendimento = SecondToStrTime(!$somaAtendida ? 0 : round($somaAtendidaTempo / $somaAtendida));
$mediaOriginada = SecondToStrTime(!$somaOriginada ? 0 : round($somaOriginadaTempo / $somaOriginada));
$mediaEspera = SecondToStrTime(!$somaEspera ? 0 : round($somaEsperaTempo / $somaEspera));
$mediaAbandono = SecondToStrTime(!$somaAbandonada ? 0 : round($somaAbandonadaTempo / $somaAbandonada));
$labelX = sprintf('Totais: ORG[%s] ATD[%s] ESP[%s] TRF[%s] ABD[%s] AB.RET[%s] Médias: TMO[%s] TMA[%s] TME[%s] TMB[%s] ', $somaOriginada, $somaAtendida, $somaEspera, $somaTransferidas, $somaAbandonada, $somaAbandonadaRet, $mediaOriginada, $mediaAtendimento, $mediaEspera, $mediaAbandono);
$graph->xaxis->title->Set($labelX);
$graph->yaxis->title->Set('Chamadas/h');
$barPlot1 = new BarPlot($arOriginada);
$barPlot2 = new BarPlot($arAtendida);
$barPlot3 = new BarPlot($arAbandonadas);
$barPlot4 = new BarPlot($arEstera);
$barPlot5 = new BarPlot($arTransfer);
$gpBarPlot = new GroupBarPlot(array($barPlot1, $barPlot2, $barPlot4, $barPlot5, $barPlot3));
$gpBarPlot->SetWidth(0.9);
$graph->Add($gpBarPlot);
$barPlot1->SetLegend("Originadas(ORG/TMO)");
$barPlot2->SetLegend("Atendidas(ATD/TMA)");
$barPlot3->SetLegend("Abandonadas(ABD/TMB)");
$barPlot4->SetLegend("Espera(ESP/TME)");
$barPlot5->SetLegend("Transfer.(TRF)");
$barPlot1->SetFillColor("springgreen3");
$barPlot2->SetFillColor("dodgerblue");
$barPlot3->SetFillColor("red");
$barPlot4->SetFillColor("yellow1");
$barPlot5->SetFillColor("orange");
$barPlot1->value->Show();
$barPlot1->value->SetFormat("%d");
$barPlot1->value->SetColor("springgreen3");
$barPlot2->value->Show();
$barPlot2->value->SetFormat("%d");
$barPlot2->value->SetColor("dodgerblue");
$barPlot3->value->Show();
$barPlot3->value->SetFormat("%d");
$barPlot3->value->SetColor("red");
$barPlot4->value->Show();
$barPlot4->value->SetFormat("%d");
$barPlot4->value->SetColor("yellow1");
$barPlot5->value->Show();
$barPlot5->value->SetFormat("%d");
$barPlot5->value->SetColor("orange");
$graph->Stroke($dacGraph);
$content = str_replace("{GRAFICO}", $dacGraphCid, $templeteContent);
return $content;
}
function GetMsg($conn, $dataEnvio, $dataDisplay, $restDac, $emailId, $tpEnvio) {
$templeteEmail = file_get_contents("/var/lib/asterisk/scripts/workflow/workflowConteudo.html");
$content = "";
$dacs = GetDacsWkf($conn, $restDac, $emailId, $dataEnvio, $tpEnvio);
$content = str_replace("{CONF_PRINCIPAL_WORKFLOW}", CONF_PRINCIPAL_WORKFLOW, $templeteEmail);
$content = str_replace("{CONF_PARCEIRO_WORKFLOW}", CONF_PARCEIRO_WORKFLOW, $content);
if ($dacs === false) {
$display = $tpEnvio == ENVIO_DIARIO ? sprintf("DIARIO %s", FormataDBDataHora($dataEnvio)) : sprintf("MENSAL %s/%s", substr($dataEnvio, 0, 2), substr($dataEnvio, 2, 4));
$conteudo = 'Nenhum dado encontrado para a operação nesta data!';
$content = str_replace("{CONTEUDO}", $conteudo, $content);
$content = str_replace("{DISPLAY}", $display, $content);
return $content;
}
foreach ($dacs as $dac) {
$idDac = $dac["id"];
$nomeDac = $dac["nome"];
$retGraf = GetGrafico($conn, $dac, $dataEnvio, $tpEnvio);
$retClas = GetClassificacaoWkf($conn, $dac, $dataEnvio, $tpEnvio);
$classifica .= str_replace("{CLASSIFICACAO}", $retClas, $retGraf);
}
$display = $tpEnvio == ENVIO_DIARIO ? sprintf("DIARIO %s", FormataDBDataHora($dataEnvio)) : sprintf("MENSAL %s/%s", substr($dataEnvio, 0, 2), substr($dataEnvio, 2, 4));
$content = str_replace("{CONTEUDO}", $classifica ,$content);
$content = str_replace("{DISPLAY}", $display, $content);
return $content;
//if(GetDebug()){PreparaLog('GetMsg', $query, false);}
}
function GetClassificacaoWkf($dbcon, $dacInfo, $data, $tpEnvio) {
$Html = &$GLOBALS["relHtml"];
$dac = $dacInfo["id"];
$dacNome = $dacInfo["nome"];
$arq = sprintf("%s_%s.htm", $dacNome, soNumero($data));
$relClas = "";
if (file_exists($arq)) {
return file_get_contents($arq);
}
$table = file_get_contents("/var/lib/asterisk/scripts/workflow/workflowClassificacao.html");
$somaQtde = 0;
$query = GetQueryClassificaWkf($data, $dac, $tpEnvio);
$result = pg_query($dbcon, $query);
$dadosBuff = array();
/*
* Verifica se existe dados para o dac, caso a consulta não retorne dados
* retorna mensagem padrão.
*/
if (!pg_num_rows($result)) {
return "Não existe classificação de atentimento para a Fila: $dacNome!";
}
while ($dados = pg_fetch_array($result)) {
$dadosBuff[] = $dados;
$somaQtde += (($dados["media"] <= 1) ? $dados["qtde"] : round($dados["qtde"] / $dados["media"]));
}
$dados = array();
$linhas = "";
foreach ($dadosBuff as $dados) {
$clas = $dados["clas_descricao"];
$item = $dados["clit_descricao"];
$qtde = $dados["media"] <= 1 ? $dados["qtde"] : round($dados["qtde"] / $dados["media"]);
$perc = round(!$somaQtde ? 0 : ($qtde * 100.0) / $somaQtde, 0);
$linhas .= "<tr style=\"border: 1px solid #CCCCCC;\">
<td align=\"left\" nowrap>$clas</td>
<td align=\"left\">$item</td>
<td align=\"center\">$perc%</td>
<td align=\"right\">$qtde</td>
</tr>";
}
$linhas .= "<tr><th align=\"center\" colspan=\"3\" style=\"background-color:#FFA700;border: 1px solid #CCCCCC;color:#FFFFFF;\">Total</th><th align=\"right\" style=\"background-color:#FFA700;border: 1px solid #CCCCCC;color:#FFFFFF;\">$somaQtde</th></tr>";
$relClas .= str_replace("{DADOS_CLASSIFICA}", $linhas, $table);
/*
* Grava o arquivo para não necessitar
* refazer o processo para o próximo usuário
*/
$file = fopen($arq, 'w');
if ($file) {
fwrite($file, $relClas);
fclose($file);
}
/*
* Arquivos a serem apagados no final da operação
*/
$Html[] = $arq;
return $relClas;
}
function GetQueryClassificaWkf($dataEnvio, $dac, $tpEnvio) {
$dataInicial = $tpEnvio == ENVIO_DIARIO ? $dataEnvio : GetDataEnvioMensal($dataEnvio, 1);
$dataFinal = $tpEnvio == ENVIO_DIARIO ? $dataEnvio : GetDataEnvioMensal($dataEnvio, 2);
$query = "select a.id_dac, e.nome, clas_descricao, clit_descricao, count(*) as qtde,
(select count(distinct data_reg::date) from pbx_classifica_reg where id_dac = '$dac' and data_reg::date >= '$dataInicial' and data_reg::date <= '$dataFinal') as media
from pbx_classifica_reg a, pbx_classifica_atendimento b, pbx_classifica_item c, pbx_bilhetes d, pbx_dacs e, pbx_eventos_dacs f
where b.clas_id = a.clas_id
and c.clit_id = a.clit_id
and d.uniqueid = a.id_bilhetes
and e.id = a.id_dac
and d.lastapp <> 'Transferred Call'
and a.id_dac = '$dac'
and d.calldate::date >= '$dataInicial'
and d.calldate::date <= '$dataFinal'
and f.evento IN('COMPLETEAGENT','COMPLETECALLER', 'TRANSFER','COMPLETEAGENTRAMAL','COMPLETECALLERRAMAL','COMPLETAAGENT','COMPLETACALLER', 'TRANSFERORIG','BUSYS','NOANSWERS')
group by a.id_dac, e.nome, clas_descricao, clit_descricao
order by 5 desc";
return $query;
}
function GetPhpVerision() {
return soNumero(phpversion());
}
?>