|
|
<?php |
|
|
|
|
|
require("jpgraph/jpgraph.php"); |
|
|
require("jpgraph/jpgraph_bar.php"); |
|
|
require("jpgraph/jpgraph_line.php"); |
|
|
|
|
|
|
|
|
|
|
|
//variaveis para manter o estado |
|
|
$listaDacs = isset($_REQUEST["listaDacs"]) ? $_REQUEST["listaDacs"] : GetIdDacPadrao($dbcon, GetIdUser()); |
|
|
$dataIni = isset($_REQUEST["dataIni"]) ? $_REQUEST["dataIni"] : date('d/m/Y'); |
|
|
$dataFim = isset($_REQUEST["dataFim"]) ? $_REQUEST["dataFim"] : date('d/m/Y'); |
|
|
$listaServico = isset($_REQUEST["listaServico"]) ? $_REQUEST["listaServico"] : 0; |
|
|
|
|
|
$cssBlock = "<style> |
|
|
@media print { |
|
|
.headSite, #rodapeSite, .filtro { |
|
|
display: none; |
|
|
} |
|
|
} |
|
|
</style>"; |
|
|
|
|
|
|
|
|
|
|
|
$linkGraph = ''; |
|
|
$printGraph = isset($_REQUEST['printGraph']) ? 1 : 0; |
|
|
|
|
|
if ($printGraph) { |
|
|
ob_clean(); |
|
|
$query = GetQuery($listaDacs, $dataIni, $dataFim, $listaServico); |
|
|
$result = pg_query($query); |
|
|
|
|
|
$arOferecidas = array(0, 0); |
|
|
$arIab = array(0, 0); |
|
|
$arNS = array(0, 0); |
|
|
$arIa = array(0, 0); |
|
|
$serv = array(); |
|
|
|
|
|
|
|
|
$somaTotal = 0; |
|
|
$somaTotalAtd = 0; |
|
|
$somaTotalAbd = 0; |
|
|
$somaTotalTrb = 0; |
|
|
$start = 0; |
|
|
// oferecidas originadas abandonadas nao_atendidas nao_atendidas atendidas efetuadas transbordadas |
|
|
// total_oferecidas total_originadas total_abandonadas total_nao_atendidas total_atendidas total_efetuadas total_transbordadas |
|
|
while ($row = pg_fetch_array($result, null, PGSQL_ASSOC)) { |
|
|
if (!$start++) { |
|
|
$arOferecidas = array(); |
|
|
$arIab = array(); |
|
|
$arNS = array(); |
|
|
$arIa = array(); |
|
|
} |
|
|
$serv[$row['serv_id']] = 0; |
|
|
$arOferecidas[] = $row['total_oferecidas']; |
|
|
$arAtendidas[] = $row['total_atendidas']; |
|
|
$arAbandonadas[] = $row['total_abandonadas']; |
|
|
$arTransbordadas[] = $row['total_transbordadas']; |
|
|
|
|
|
$oferTotal = $totalMedia ? round($row['avg_oferecidas']) : $row['total_oferecidas']; |
|
|
/* |
|
|
* Abandonadas total por oferecidas na fila. |
|
|
*/ |
|
|
$abd = $totalMedia ? round($row['avg_abandonadas']) : $row['total_abandonadas']; |
|
|
$atd30 = $totalMedia ? round($row['avg_atd_30']) : $row['total_atd_30']; |
|
|
$esp = $totalMedia ? round($row['avg_esp']) : $row['total_esp']; |
|
|
$atendida = $totalMedia ? round($row['avg_atendidas']) : $row['total_atendidas']; |
|
|
|
|
|
$arIab[] = $oferTotal ? round(($abd / $oferTotal) * 100.0) : 0; |
|
|
|
|
|
/* |
|
|
* N<EFBFBD>vel de servi<EFBFBD>o: |
|
|
* <EFBFBD> calculado pela rela<EFBFBD><EFBFBD>o entre chamadas atendidas at<EFBFBD> 30s pela soma total das |
|
|
* chamadas atendidas no pa + o total de abandonadas. |
|
|
* Atendidas-30 / (atendidas-pa + abandonadas) * 100.0; |
|
|
*/ |
|
|
$atdPaAbd = $abd + $atendida; |
|
|
$ns = $oferTotal > 0 ? round(($atd30 / $atdPaAbd) * 100.0) : 0; |
|
|
|
|
|
$arNS[] = $ns; |
|
|
|
|
|
/* |
|
|
* Indice de Atendimento: |
|
|
* <EFBFBD> o percentual de chamadas que foram atendidas sem ficar em espera em reala<EFBFBD><EFBFBD>o |
|
|
* ao total de chamdas oferecidas na fila. |
|
|
*/ |
|
|
$abdEspera = $esp + $abd; |
|
|
$arIa[] = !$oferTotal ? 0 : (($oferTotal - $abdEspera) * 100.0) / $oferTotal; |
|
|
//$arTrf[] = $totalMedia ? round($row['avg_trf']) : $row['total_trf']; |
|
|
|
|
|
|
|
|
/* |
|
|
* Totais do per<EFBFBD>odo. |
|
|
*/ |
|
|
$somaTotal += $row['total_oferecidas']; |
|
|
$somaTotalAtd += $row['total_atendidas']; |
|
|
$somaTotalAbd += $row['total_abandonadas']; |
|
|
$somaTotalTrb += $row['total_transbordadas']; |
|
|
} |
|
|
|
|
|
$arLabel = array_keys($serv); |
|
|
$graph = new Graph(1080, 650); |
|
|
$graph->SetScale("intint"); |
|
|
|
|
|
$graph->SetShadow(); |
|
|
$graph->SetMargin(80, 20, 60, 40); |
|
|
$graph->title->Set(sprintf("<EFBFBD>ndices de Atendimento no Per<EFBFBD>odo De: %s At<EFBFBD>: %s \nDac: %s Serv.: %s Emitido: %s Usu<EFBFBD>rio: %s", $dataIni, $dataFim, GetNomeDac($listaDacs), $listaServico ? $listaServico : 'Todos', date("d/m/Y H:i:s"), GetLogin())); |
|
|
$graph->xaxis->SetTickLabels($arLabel); |
|
|
$graph->legend->Pos(0.30, 0.85); |
|
|
$graph->legend->SetColumns(4); |
|
|
$graph->legend->SetFrameWeight(1); |
|
|
|
|
|
|
|
|
$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 Per<EFBFBD>odo: [%s] ATD[%s] ABD[%s] TRB[%s] M<EFBFBD>dias / %%: ATD[%s / %s%%] ABD[%s / %s%%] TRB[%s / %s%% ] ', FormataValor($somaTotal, 0), FormataValor($somaTotalAtd, 0), FormataValor($somaTotalAbd, 0), FormataValor($somaTotalTrb, 0), round($somaTotalAtd / $dias), round(($somaTotalAtd / $somaTotal) * 100.0), round($somaTotalAbd / $dias), round(($somaTotalAbd / $somaTotal) * 100.0), round($somaTotalTrb / $dias), round(($somaTotalTrb / $somaTotal) * 100.0) |
|
|
); |
|
|
|
|
|
$graph->xaxis->title->Set($labelX); |
|
|
$graph->yaxis->title->Set('Percentual de Atendimento'); |
|
|
|
|
|
$nsPlot = new BarPlot($arNS); |
|
|
$nsPlot->SetLegend("N<EFBFBD>vel de Servi<EFBFBD>o (%)"); |
|
|
|
|
|
$iabPlot = new BarPlot($arIab); |
|
|
$iabPlot->SetLegend("<EFBFBD>ndice de Abandono (%)"); |
|
|
|
|
|
$iaPlot = new BarPlot($arIa); |
|
|
$iaPlot->SetLegend("<EFBFBD>ndice de Atendimento (%)"); |
|
|
|
|
|
$gpBarPlot = new GroupBarPlot(array($nsPlot, $iaPlot, $iabPlot)); |
|
|
$gpBarPlot->SetWidth(0.5); |
|
|
|
|
|
$graph->Add($gpBarPlot); |
|
|
$graph->img->SetAntiAliasing(false); |
|
|
|
|
|
$nsPlot->value->Show(); |
|
|
$nsPlot->value->SetFormat("%d%%"); |
|
|
$nsPlot->value->SetAngle(45); |
|
|
|
|
|
$iabPlot->SetFillColor('red'); |
|
|
$iabPlot->value->Show(); |
|
|
$iabPlot->value->SetFormat("%d%%"); |
|
|
$iabPlot->value->SetAngle(45); |
|
|
|
|
|
$iaPlot->value->Show(); |
|
|
$iaPlot->value->SetFormat("%d%%"); |
|
|
$iaPlot->value->SetAngle(45); |
|
|
|
|
|
$graph->Stroke(); |
|
|
exit; |
|
|
} else if (IsPostBack()) { |
|
|
|
|
|
if (!is_date($dataIni)) { |
|
|
$jsStartup[] = "alert('Data inicial inv<EFBFBD>lida!');"; |
|
|
} else if (!is_date($dataFim)) { |
|
|
$jsStartup[] = "alert('Data final inv<EFBFBD>lida!');"; |
|
|
} else { |
|
|
$linkGraph = sprintf('<img id="relGrafico" src="index.php?idProg=292&dataIni=%s&dataFim=%s&listaDacs=%s&listaServico=%s&totalMedia=%s&printGraph=1" border="0">', $dataIni, $dataFim, $listaDacs, $listaServico, $totalMedia); |
|
|
} |
|
|
|
|
|
//echo GetQuery($listaDacs, $dataIni, $dataFim, $listaServico); |
|
|
} |
|
|
|
|
|
|
|
|
$listaServico = GetIdentRota($dbcon, $listaServico); |
|
|
//carrega dacs |
|
|
$dacs = GetDac($dbcon, $listaDacs, '', 1); |
|
|
$smarty->assign('imp', $i); |
|
|
$smarty->assign('dacs', $dacs); |
|
|
$smarty->assign('listaServico', $listaServico); |
|
|
$smarty->assign('dataIni', $dataIni); |
|
|
$smarty->assign('dataFim', $dataFim); |
|
|
$smarty->assign('erro', $erro); |
|
|
$smarty->assign('totalMedia', $totalMedia); |
|
|
$smarty->assign('linkGraph', $linkGraph); |
|
|
GetTemplate($smarty, 'analise/resumoOperacaoServico.tpl'); |
|
|
|
|
|
function GetQuery($dac, $dataIni, $dataFim, $serv) { |
|
|
$dataIni = FormatDtMssql($dataIni); |
|
|
$dataFim = FormatDtMssql($dataFim); |
|
|
|
|
|
$query = "drop table if exists anl_operacao; |
|
|
create temporary table anl_operacao as |
|
|
select a.data_bilhete |
|
|
,date_part('month', a.calldate) as mes |
|
|
,c.serv_id |
|
|
,sum( case when(b.evento in('ENTERQUEUE', 'CHAMANDO'))then 1 else 0 end) as OFERECIDAS |
|
|
,sum( case when(b.evento in('ABANDON', 'BUSYS', 'NOANSWERS'))then 1 else 0 end) as ABANDONADAS |
|
|
,sum( case when(b.evento in('COMPLETEAGENT','COMPLETECALLER', 'TRANSFER', 'TRANSORIG', 'ATENDIDA') )then 1 else 0 end) as ATENDIDAS |
|
|
,sum( case when(b.evento in('EXITWITHTIMEOUT', 'TRANSBORDANDO') )then 1 else 0 end) as TRANSBORDADAS |
|
|
,sum( case when(b.evento in('COMPLETEAGENT','COMPLETECALLER','TRANSFER') and strtoint(param1) <= '30')then 1 else 0 end) AS ATD_30 |
|
|
,sum( case when(b.evento = 'TRANSFER')then 1 else 0 end) AS TRF |
|
|
,sum( case when(b.evento = 'CONNECT' and strtoint(b.param1) > '3')then 1 else 0 end) AS ESP |
|
|
from pbx_bilhetes a, pbx_eventos_dacs b, pbx_servicos_registra c, pbx_dacs d |
|
|
where b.uid2 = a.uniqueid |
|
|
and c.uniqueid = b.uid2 |
|
|
and d.nome = b.fila |
|
|
and a.data_bilhete >= %s |
|
|
and a.data_bilhete <= %s %s %s |
|
|
and b.evento in ('CONNECT','CHAMANDO','ATENDIDA','BUSYS', 'NOANSWERS', 'ABANDON','COMPLETEAGENT','COMPLETECALLER', 'ENTERQUEUE', 'TRANSFER', 'EXITWITHTIMEOUT', 'TRANSBORDANDO') |
|
|
and a.lastapp <> 'Transferred Call' |
|
|
group by 1,2,3; |
|
|
|
|
|
select serv_id, |
|
|
sum(oferecidas) as total_oferecidas, round( avg(oferecidas), 2) as avg_oferecidas, |
|
|
sum(abandonadas) as total_abandonadas, round( avg(abandonadas), 2) as avg_abandonadas, |
|
|
sum(atendidas) as total_atendidas, round( avg(atendidas), 2) as avg_atendidas, |
|
|
sum(transbordadas) as total_transbordadas, round( avg(transbordadas), 2) as avg_transbordadas, |
|
|
sum(atd_30) AS total_atd_30, round( avg(atd_30), 2) as avg_atd_30, |
|
|
sum(trf) AS total_trf, round( avg(trf), 2) as avg_trf, |
|
|
sum(esp) AS total_esp, round( avg(esp), 2) as avg_esp |
|
|
from anl_operacao group by serv_id order by 1; "; |
|
|
|
|
|
|
|
|
return sprintf( |
|
|
$query, QuotedStr($dataIni), QuotedStr($dataFim), ($dac ? sprintf(' and d.id = %s', QuotedStr($dac)) : ''), ($serv ? sprintf(' and c.serv_id = %s', QuotedStr($serv)) : '') |
|
|
); |
|
|
} |
|
|
|
|
|
function __GetAr__($label = false) { |
|
|
$ar = array(); |
|
|
$result = pg_query('select serv_id from pbx_servicos order by 1'); |
|
|
while ($row = pg_fetch_row($result)) { |
|
|
|
|
|
if (!$label) |
|
|
$ar[$row[0]] = 0; |
|
|
else |
|
|
$ar[] = $row[0]; |
|
|
} |
|
|
return $ar; |
|
|
}
|
|
|
|