forked from SimplesIP/pabx-app
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
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()); |
|
} |
|
|
|
?>
|
|
|