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.
821 lines
41 KiB
821 lines
41 KiB
<?php |
|
|
|
include_once 'util/relatoriosBase.php'; |
|
|
|
class RelDesempenhoOperacao extends Relatorios { |
|
|
|
private $___ano; |
|
private $___mes; |
|
|
|
public function __construct($idProg, $dbcon, $incDac) { |
|
parent::__construct($idProg, $dbcon, $incDac); |
|
$this->___dac = isset($_POST['listaDacs']) ? $_POST['listaDacs'] : 0; |
|
$this->___mes = isset($_POST['listaMes']) ? $_POST['listaMes'] : date('m'); |
|
$this->___ano = isset($_POST['listaAno']) ? $_POST['listaAno'] : date('Y'); |
|
} |
|
|
|
public function ___ValidaForm() { |
|
if (!IsPostBack()) |
|
return; |
|
|
|
if ($this->GetIncDac() && !StrToIntDef($this->___dac)) { |
|
GeraExcept('Informe uma Fila!'); |
|
} |
|
} |
|
|
|
function ___FiltrosRelatorio() { |
|
if ($this->___media != MEDIA_PRINT_GRID) { |
|
/* |
|
* Recupera os filtros da sessão do usuário. |
|
*/ |
|
list($this->___dac, $this->___ano, $this->___mes, $this->___tipoRelatorio) = $_SESSION["SSstorageFiltros"]; |
|
|
|
if ($this->___media == MEDIA_PRINT_HTML) { |
|
$fila = $this->GetIncDac() ? 'Fila: ' . GetDacDesc($this->GetDbCon(), $this->GetIdProg() . ' ') : ''; |
|
return sprintf("%sData Inicial: %s Data Final: %s Tipo: %s", $fila, $this->___ano, $this->___mes, ($this->___tipoRelatorio ? 'Analítico' : 'Sintético')); |
|
} |
|
|
|
$fltCsv = array(); |
|
if ($this->GetIncDac()) { |
|
$fltCsv[] = 'Fila:' . GetDacDesc($this->GetDbCon(), $this->___dac); |
|
} |
|
// $fltCsv[] = "Ano:" . $this->___ano; |
|
//$fltCsv[] = "Mês:" . $this->___mes; |
|
$fltCsv[] = "Data Emissao:" . date('d/m/Y H:i:s'); |
|
$fltCsv[] = "Emitido Por:" . GetLogin(); |
|
return $fltCsv; |
|
} |
|
|
|
if ($this->GetIncDac()) { |
|
$dacs = GetDac($this->GetDbCon(), $this->___dac, "", 0, 1, 0, 0, 1); |
|
} |
|
|
|
$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>'; |
|
$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'); |
|
} |
|
|
|
$tipoRel = !$this->___tipoRelatorio ? '' : 'checked="checked"'; |
|
|
|
|
|
/* |
|
* Personalise esta função se necessitar de outras operações de filtro. |
|
*/ |
|
$filtro = '<table border="0" cellspacing="1" cellpadding="1">'; |
|
/* |
|
* Rotulos. |
|
*/ |
|
$filtro .= '<tr>'; |
|
$this->GetIncDac() ? $filtro .= '<td>Fila</td>' : ''; |
|
$filtro .= '<td>Mês</td>'; |
|
$filtro .= '<td>Ano</td>'; |
|
$filtro .= '<td align="center" valign="middle"> </td>'; |
|
$filtro .= '</tr>'; |
|
|
|
/* |
|
* Valores. |
|
*/ |
|
$filtro .= '<tr>'; |
|
$this->GetIncDac() ? $filtro .= sprintf('<td>%s</td>', $dacs) : ''; |
|
$filtro .= sprintf('<td>%s</td>', GetMes($this->___mes, '', 1)); |
|
$filtro .= sprintf('<td>%s</td>', GetAno($this->___ano, 1)); |
|
$filtro .= '<td><input type="submit" name="btConsulta" id="btConsulta" value="Consultar"></td>'; |
|
$filtro .= '<td>%s</td>'; |
|
$filtro .= '</tr>'; |
|
$filtro .= '</table>'; |
|
|
|
/* |
|
* Guarda os filtros passados para recuperar na emissão dos relatórios para impressão. |
|
*/ |
|
$_SESSION["SSstorageFiltros"] = array($this->___dac, $this->___ano, $this->___mes, $this->___tipoRelatorio); |
|
return sprintf($filtro, $lkPrint); |
|
} |
|
|
|
protected function ___GetDadosDb() { |
|
$ano = $this->___ano; |
|
$mes = $this->___mes; |
|
$iniMes = "$ano-$mes-01"; |
|
$fimMes = "$ano-$mes-" . GetLastDayofMonth($ano, $mes); |
|
$dac = $this->___dac; |
|
|
|
$query = "WITH DADOS_BRUTOS AS ( |
|
SELECT |
|
a.data_bilhete AS DATA, |
|
a.data_bilhete, |
|
b.fila, |
|
CASE |
|
WHEN ( |
|
EXISTS ( |
|
SELECT '' |
|
FROM pbx_bilhetes |
|
WHERE data_bilhete = a.data_bilhete |
|
AND accountcode = a.uniqueid |
|
AND evento IN ('COMPLETEAGENT', 'COMPLETECALLER', 'COMPLETAAGENT', 'COMPLETACALLER') |
|
) |
|
) THEN |
|
CASE |
|
WHEN (b.evento IN ('COMPLETEAGENT', 'COMPLETECALLER')) THEN 'TRANSFER' |
|
ELSE 'TRANSFERORIG' |
|
END |
|
ELSE b.evento |
|
END AS evento, |
|
CASE |
|
WHEN ( |
|
b.evento = 'TRANSBORDADO' |
|
OR ( |
|
(b.evento = 'ENTERQUEUE') |
|
AND EXISTS ( |
|
SELECT '' |
|
FROM ast_eventos_dacs |
|
WHERE uid2 = b.uid2 |
|
AND fila <> b.fila |
|
AND evento = 'EXITWITHTIMEOUT' |
|
AND b.id > id |
|
) |
|
) |
|
) THEN 1 |
|
ELSE 0 |
|
END AS transbordada, |
|
b.param1, |
|
b.param2, |
|
b.param3, |
|
b.param4, |
|
b.agente, |
|
( |
|
SELECT COUNT(*) |
|
FROM pbx_bilhetes_complemento |
|
WHERE uniqueid2 = a.uniqueid |
|
AND direcao = 'ura' |
|
) AS ura, |
|
a.uniqueid |
|
FROM pbx_eventos_dacs b |
|
INNER JOIN pbx_bilhetes a ON a.uniqueid = b.uid2 |
|
AND a.lastapp <> 'Transferred Call' |
|
INNER JOIN pbx_dacs d ON d.nome = b.fila |
|
WHERE b.evento IN ( |
|
'ABANDON', 'COMPLETEAGENT', 'COMPLETECALLER', 'COMPLETAAGENT', 'COMPLETACALLER', |
|
'CONNECT', 'ENTERQUEUE', 'TRANSFER', 'TRANSFERORIG', 'EXITWITHTIMEOUT', 'TRANSBORDANDO', |
|
'TRANSBORDADO', 'BUSYS', 'NOANSWERS' |
|
) |
|
AND a.data_bilhete >= '$iniMes' |
|
AND a.data_bilhete <= '$fimMes' |
|
AND d.id = '$dac' |
|
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 |
|
) |
|
), |
|
DADOS_INTERMEDIARIOS AS ( |
|
SELECT |
|
FILA, |
|
DATE_PART('day', DATA) AS DATA, |
|
SUM(CASE WHEN EVENTO IN ('ABANDON', 'COMPLETEAGENT', 'COMPLETECALLER', 'TRANSFER', 'TRANSBORDANDO') THEN 1 ELSE 0 END) AS OFERECIDAS, |
|
SUM(CASE WHEN (EVENTO = 'ENTERQUEUE') AND (URA > 0) 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') AND SUBSTRING(AGENTE, 1, 5) <> 'Agent' THEN 1 ELSE 0 END) AS ATENDIDAS_FILA, |
|
SUM(CASE WHEN EVENTO IN ('COMPLETEAGENT', 'COMPLETECALLER', 'TRANSFER') AND SUBSTRING(AGENTE, 1, 5) = 'Agent' 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') AND STRTOINT(PARAM1) <= '30' AND SUBSTRING(AGENTE, 1, 5) = 'Agent' THEN 1 ELSE 0 END) AS ATENDIDAS_30, |
|
SUM(CASE WHEN (EVENTO = 'TRANSFER') OR (EXISTS(SELECT '' FROM pbx_bilhetes WHERE data_bilhete = DADOS_BRUTOS.data_bilhete AND accountcode = DADOS_BRUTOS.uniqueid AND EVENTO IN ('COMPLETEAGENT', 'COMPLETECALLER'))) 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') AND STRTOINT((CASE WHEN (COALESCE(PARAM2, '') = '') THEN '0' ELSE PARAM2 END)) > '1' THEN STRTOINT(PARAM2) ELSE 0 END) AS TEMPO_ATENDIMENTO, |
|
SUM(CASE WHEN EVENTO IN ('COMPLETAAGENT', 'COMPLETACALLER') AND STRTOINT((CASE WHEN (COALESCE(PARAM2, '') = '') THEN '0' ELSE PARAM2 END)) > '1' THEN STRTOINT(PARAM2) ELSE 0 END) AS TEMPO_ORIGINADAS, |
|
SUM(CASE WHEN EVENTO = 'ABANDON' THEN (CASE WHEN (COALESCE(PARAM3, '') = '') THEN 0 ELSE PARAM3::INT END) ELSE 0 END) AS TEMPO_ABANDONO, |
|
SUM(CASE WHEN EVENTO IN ('EXITWITHTIMEOUT', 'TRANSBORDANDO') THEN 1 ELSE 0 END) AS TRANSBORDANDO, |
|
SUM(transbordada) AS TRANSBORDADA |
|
FROM DADOS_BRUTOS |
|
GROUP BY FILA, DATA |
|
), |
|
AGREGADOS AS ( |
|
SELECT |
|
FILA, |
|
DATA, |
|
SUM(OFERECIDAS) AS OFERECIDAS, |
|
SUM(ATENDIDAS_URA) AS ATENDIDAS_URA, |
|
SUM(ABANDONADAS) AS ABANDONADAS, |
|
SUM(ATENDIDAS_FILA) AS ATENDIDAS_FILA, |
|
SUM(ATENDIDAS_PA) AS ATENDIDAS_PA, |
|
SUM(ORIGINADAS_PA) AS ORIGINADAS_PA, |
|
SUM(ATENDIDAS_30) AS ATENDIDAS_30, |
|
SUM(TRANSFERIDAS) AS TRANSFERIDAS, |
|
SUM(ESPERA) AS ESPERA, |
|
SUM(TEMPO_ESPERA) AS TEMPO_ESPERA, |
|
SUM(TEMPO_ATENDIMENTO) AS TEMPO_ATENDIMENTO, |
|
SUM(TEMPO_ORIGINADAS) AS TEMPO_ORIGINADAS, |
|
SUM(TEMPO_ABANDONO) AS TEMPO_ABANDONO, |
|
SUM(TRANSBORDANDO) AS TRANSBORDANDO, |
|
SUM(TRANSBORDADA) AS TRANSBORDADA |
|
FROM DADOS_INTERMEDIARIOS |
|
GROUP BY FILA, DATA |
|
) |
|
SELECT |
|
FILA, |
|
DATA, |
|
OFERECIDAS, |
|
ATENDIDAS_URA, |
|
ABANDONADAS, |
|
ATENDIDAS_FILA, |
|
ATENDIDAS_PA, |
|
ORIGINADAS_PA, |
|
ATENDIDAS_30, |
|
TRANSFERIDAS, |
|
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) 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_ORIGINADAS, |
|
TEMPO_ABANDONO, |
|
TRANSBORDADA, |
|
TRANSBORDANDO |
|
FROM AGREGADOS |
|
ORDER BY DATA;"; |
|
|
|
$subQuery = "SELECT date_part('day', COALESCE(entrada_pausa, login)::DATE) AS data, |
|
COUNT(entrada_pausa) AS numPausa, |
|
MIN(a.login) AS login, |
|
SUM(CASE WHEN(b.motivo = 'acw')THEN EXTRACT(epoch FROM (saida_pausa - entrada_pausa)) ELSE 0 END) AS pos_atendimento, |
|
SUM(CASE WHEN(b.motivo <> 'acw')THEN EXTRACT(epoch FROM (saida_pausa - entrada_pausa)) ELSE 0 END) AS tempo_pausa, |
|
SUM(EXTRACT(epoch FROM (logoff - login))) AS tempo_login, |
|
SUM((a.logoff) - (a.\"login\")) AS agt_duracao, |
|
COUNT(DISTINCT a.matricula) AS conexoes |
|
FROM pbx_eventos_agentes a |
|
LEFT OUTER JOIN pbx_motivos_pausas b ON b.id = a.id_motivo_pausa |
|
WHERE COALESCE(entrada_pausa::DATE,login::DATE) >= '$iniMes' |
|
AND COALESCE(entrada_pausa::DATE,login::DATE) <= '$fimMes' |
|
AND id_dac = $dac |
|
GROUP BY COALESCE(entrada_pausa, login)::DATE ORDER BY 1"; |
|
|
|
//echo $query; |
|
|
|
$result = $this->___GetQuery($query); |
|
$row = pg_fetch_all($result); |
|
$this->SetData($row ? $row : array()); |
|
|
|
$subResult = $this->___GetQuery($subQuery); |
|
$subRow = pg_fetch_all($subResult); |
|
$this->SetData($subRow ? $subRow : array()); |
|
} |
|
|
|
protected function ___PreparaCsv() { |
|
|
|
$dataRel = array(); |
|
$filtro = $this->___FiltrosRelatorio(); |
|
|
|
/* |
|
* Inicia o relatório. |
|
*/ |
|
$dataRel[] = GenerateCsvFromArray($filtro); |
|
|
|
$dadosCabecalio = array( |
|
'Dia', 'Fila', 'Conexoes', 'Transbordo Entrada', 'Transbordo Saida', 'Abandonadas', 'Ramal Estático', 'Atendidas PA', 'Atendidas Ate 30', |
|
'Transferidas', 'Espera', 'Originadas PA', 'TME', 'PA', 'Abandono', 'NS', 'Atend.', 'Livre', 'Pausa' |
|
); |
|
$dadosField = array( |
|
'data', 'oferecidas','conexoes', 'transbordada', 'transbordando', 'abandonadas', 'atendidas_fila', 'atendidas_pa', 'atendidas_30', 'transferidas', |
|
'espera', 'originadas_pa', 'tme', 'tma', 'tmab', 'inb', 'agtAtend', 'agtLivre', 'agtPausa' |
|
); |
|
/* |
|
* Monta a linha de cabecalio. |
|
*/ |
|
$dataRel[] = GenerateCsvFromArray($dadosCabecalio); |
|
|
|
$somaReg = 0; |
|
$somaFila = 0; |
|
$somaTransbordada = 0; |
|
$somaTransbordando = 0; |
|
$somaAbandonadas = 0; |
|
$somaAtendRamal = 0; |
|
$somaAtendPA = 0; |
|
$somaAtend30 = 0; |
|
$somaTransferidas = 0; |
|
$somaEspera = 0; |
|
$somaOriginadasPA = 0; |
|
$x = 0; |
|
|
|
$data = []; |
|
foreach($this->GetData()[1] as $rel){ |
|
$data[$rel['data']] = $rel; |
|
} |
|
|
|
/* |
|
* Linhas de dados. |
|
*/ |
|
foreach ($this->GetData()[0] as $row) { |
|
$somaReg ++; |
|
$somaFila += $row['oferecidas']; |
|
$somaTransbordada += $row['transbordada']; |
|
$somaTransbordando += $row['transbordando']; |
|
$somaAbandonadas += $row['abandonadas']; |
|
$somaAtendRamal += $row['atendidas_fila']; |
|
$somaAtendPA += $row['atendidas_pa']; |
|
$somaAtend30 += $row['atendidas_30']; |
|
$somaTransferidas += $row['transferidas']; |
|
$somaEspera += $row['espera']; |
|
$somaOriginadasPA += $row['originadas_pa']; |
|
$somaConexoes += $data[$row['data']]['conexoes']; |
|
|
|
$tempo_calc = $row['tempo_atendimento'] + $row['tempo_originadas']; |
|
$agt_duracaoseg = $data[$row['data']]['tempo_login']; |
|
|
|
$agt_pausa = $data[$row['data']]['tempo_pausa']; |
|
$livre = $agt_duracaoseg - ($agt_pausa + $tempo_calc); |
|
$row['conexoes'] = ($data[$row['data']]['conexoes'] ? $data[$row['data']]['conexoes'] : 0); |
|
$row['agtAtend'] = $agt_duracaoseg ? round($tempo_calc / ($agt_duracaoseg / 100), 2) : 0; |
|
$row['agtLivre'] = $agt_duracaoseg ? round($livre / ($agt_duracaoseg / 100), 2) : 0; |
|
$row['agtPausa'] = $agt_duracaoseg ? round($agt_pausa / ($agt_duracaoseg / 100), 2) : 0; |
|
|
|
$residualPercentage = ($row['agtAtend'] + $row['agtLivre'] + $row['agtPausa']) - 100; |
|
$row['agtLivre'] = $this->adjustPercentageResidual($residualPercentage, $row['agtLivre']); |
|
|
|
$x++; |
|
$linha = array(); |
|
foreach ($dadosField as $key) { |
|
$linha[] = $row["$key"]; |
|
} |
|
$dataRel[] = GenerateCsvFromArray($linha); |
|
|
|
} |
|
|
|
$dataRel[] = GenerateCsvFromArray(array('')); |
|
$dataRel[] = GenerateCsvFromArray(array('Media', round($somaFila / $somaReg),round($somaConexoes / $somaReg) ,round($somaTransbordada / $somaReg), round($somaTransbordando / $somaReg), round($somaAbandonadas / $somaReg), round($somaAtendRamal / $somaReg), round($somaAtendPA / $somaReg), round($somaAtend30 / $somaReg), round($somaTransferidas / $somaReg), round($somaEspera / $somaReg), round($somaOriginadasPA / $somaReg), ' - ', ' - ', ' - ', ' - ', ' - ', ' - ', ' - ')); |
|
$dataRel[] = GenerateCsvFromArray(array('Total', $somaFila,$somaConexoes ,$somaTransbordada, $somaTransbordando, $somaAbandonadas, $somaAtendRamal, $somaAtendPA, $somaAtend30, $somaTransferidas, $somaEspera, $somaOriginadasPA, ' - ', ' - ', ' - ', ' - ', ' - ', ' - ', ' - ')); |
|
|
|
$this->___dataRel[] = $dataRel; |
|
} |
|
|
|
protected function ___PreparaExcel() { |
|
$dataRel = array(); |
|
$filtro = $this->___FiltrosRelatorio(); |
|
|
|
$linha = array('LABEL'); |
|
foreach ($filtro as $values) { |
|
$values = RemoveAcentos($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( |
|
'Dia', 'Fila', 'Conexoes','Transbordo Entrada', 'Transbordo Saida', 'Abandonadas', 'Ramal Estático', 'Atendidas PA', 'Atendidas Ate 30', |
|
'Transferidas', 'Espera', 'Originadas PA', 'TME', 'PA', 'Abandono', 'NS', 'Atend.', 'Livre', 'Pausa' |
|
); |
|
$dadosField = array( |
|
'data', 'oferecidas', 'conexoes','transbordada', 'transbordando', 'abandonadas', 'atendidas_fila', 'atendidas_pa', 'atendidas_30', 'transferidas', |
|
'espera', 'originadas_pa', 'tme', 'tma', 'tmab', 'inb', 'agtAtend', 'agtLivre', 'agtPausa' |
|
); |
|
|
|
$linha = array('LABEL'); |
|
foreach ($dadosCabecalio as $value) { |
|
$linha[] = $value; |
|
} |
|
$dataRel[] = $linha; |
|
|
|
$somaReg = 0; |
|
$somaFila = 0; |
|
$somaTransbordada = 0; |
|
$somaTransbordando = 0; |
|
$somaAbandonadas = 0; |
|
$somaAtendRamal = 0; |
|
$somaAtendPA = 0; |
|
$somaAtend30 = 0; |
|
$somaTransferidas = 0; |
|
$somaEspera = 0; |
|
$somaOriginadasPA = 0; |
|
$x = 0; |
|
|
|
$data = []; |
|
foreach($this->GetData()[1] as $rel){ |
|
$data[$rel['data']] = $rel; |
|
} |
|
|
|
/* |
|
* Linhas de dados. |
|
*/ |
|
foreach ($this->GetData()[0] as $row) { |
|
$somaReg ++; |
|
$somaFila += $row['oferecidas']; |
|
$somaTransbordada += $row['transbordada']; |
|
$somaTransbordando += $row['transbordando']; |
|
$somaAbandonadas += $row['abandonadas']; |
|
$somaAtendRamal += $row['atendidas_fila']; |
|
$somaAtendPA += $row['atendidas_pa']; |
|
$somaAtend30 += $row['atendidas_30']; |
|
$somaTransferidas += $row['transferidas']; |
|
$somaEspera += $row['espera']; |
|
$somaOriginadasPA += $row['originadas_pa']; |
|
$somaConexoes += $data[$row['data']]['conexoes']; |
|
|
|
$tempo_calc = $row['tempo_atendimento'] + $row['tempo_originadas']; |
|
$agt_duracaoseg = $data[$row['data']]['tempo_login']; |
|
|
|
$agt_pausa = $data[$row['data']]['tempo_pausa']; |
|
$livre = $agt_duracaoseg - ($agt_pausa + $tempo_calc); |
|
|
|
$row['conexoes'] = $data[$row['data']]['conexoes']; |
|
|
|
$row['agtAtend'] = $agt_duracaoseg ? round($tempo_calc / ($agt_duracaoseg / 100), 2) : 0; |
|
$row['agtLivre'] = $agt_duracaoseg ? round($livre / ($agt_duracaoseg / 100), 2) : 0; |
|
$row['agtPausa'] = $agt_duracaoseg ? round($agt_pausa / ($agt_duracaoseg / 100), 2) : 0; |
|
|
|
$residualPercentage = ($row['agtAtend'] + $row['agtLivre'] + $row['agtPausa']) - 100; |
|
$row['agtLivre'] = $this->adjustPercentageResidual($residualPercentage, $row['agtLivre']); |
|
|
|
// Formata linha de dados. |
|
$linha = array('DADOS'); |
|
foreach ($dadosField as $key) { |
|
$linha[] = $row["$key"]; |
|
} |
|
$dataRel[] = $linha; |
|
} |
|
/* |
|
* Linha de totalizacao. |
|
*/ |
|
$dataRel[] = array('LABEL', 'Media', round($somaFila / $somaReg), round($somaConexoes / $somaReg),round($somaTransbordada / $somaReg), round($somaTransbordando / $somaReg), round($somaAbandonadas / $somaReg), round($somaAtendRamal / $somaReg), round($somaAtendPA / $somaReg), round($somaAtend30 / $somaReg), round($somaTransferidas / $somaReg), round($somaEspera / $somaReg), round($somaOriginadasPA / $somaReg), ' - ', ' - ', ' - ', ' - ', ' - ', ' - ', ' - '); |
|
$dataRel[] = array('LABEL', 'Total', $somaFila, $somaConexoes ,$somaTransbordada, $somaTransbordando, $somaAbandonadas, $somaAtendRamal, $somaAtendPA, $somaAtend30, $somaTransferidas, $somaEspera, $somaOriginadasPA, ' - ', ' - ', ' - ', ' - ', ' - ', ' - ', ' - '); |
|
/* |
|
* Fecha relatorio. |
|
*/ |
|
$dataRel[] = '</table>'; |
|
$this->___dataRel[] = $dataRel; |
|
} |
|
|
|
protected function ___PreparaGrid() { |
|
$dataRel = array(); |
|
|
|
$dadosCabecalio = array( |
|
'Dia' => 'align="center"', |
|
'Fila' => 'align="center"', |
|
'Conexões' => 'align="center"', |
|
'Transbordo Entrada' => 'align="center"', |
|
'Transbordo Saída' => 'align="center"', |
|
'Abandonadas' => 'align="center"', |
|
'Ramal Estático' => 'align="center"', |
|
'Atendidas PA' => 'align="center"', |
|
'Atendidas Até 30' => 'align="center"', |
|
'Transferidas' => 'align="center"', |
|
'Espera' => 'align="center"', |
|
'Originadas PA' => 'align="center"', |
|
'TME' => 'align="center"', |
|
'PA' => 'align="center"', |
|
'Abandono' => 'align="center"', |
|
'NS' => 'align="center"', |
|
'Atend.' => 'align="center"', |
|
'Livre' => 'align="center"', |
|
'Pausa' => 'align="center"' |
|
); |
|
$dadosField = array( |
|
'data' => 'align="center"', |
|
'oferecidas' => 'align="center"', |
|
'conexoes' => 'align="center"', |
|
'transbordada' => 'align="center"', |
|
'transbordando' => 'align="center"', |
|
'abandonadas' => 'align="center"', |
|
'atendidas_fila' => 'align="center"', |
|
'atendidas_pa' => 'align="center"', |
|
'atendidas_30' => 'align="center"', |
|
'transferidas' => 'align="center"', |
|
'espera' => 'align="center"', |
|
'originadas_pa' => 'align="center"', |
|
'tme' => 'align="center"', |
|
'tma' => 'align="center"', |
|
'tmab' => 'align="center"', |
|
'inb' => 'align="center"', |
|
'agtAtend' => 'align="center"', |
|
'agtLivre' => 'align="center"', |
|
'agtPausa' => 'align="center"' |
|
); |
|
|
|
/* |
|
* Inicia o relatório. |
|
*/ |
|
$dataRel[] = '<table width="100%" cellpadding="2" class="grid">'; |
|
|
|
/* |
|
* Monta a linha de cabecalio. |
|
*/ |
|
|
|
$linha = '<tr>'; |
|
$linha .= sprintf( |
|
"<th align=\"center\">%s</th>" |
|
. "<th colspan=\"11\">Ligações</th>" |
|
. "<th colspan=\"4\">Performace</th>" |
|
. "<th colspan=\"3\">Produtividade</th>", $this->___ano); |
|
$linha .= "</tr>"; |
|
$dataRel[] = $linha; |
|
$linha2 .= "<tr>"; |
|
$linha2 .= sprintf( |
|
"<th align=\"center\">%s</th>" |
|
. "<th colspan=\"11\">Total de Chamadas</th>" |
|
. "<th colspan=\"4\">Tempo Médio(Segundos)</th>" |
|
. "<th colspan=\"3\">Tempo(%%)</th>", $this->___mes); |
|
$linha2 .= "</tr>"; |
|
$dataRel[] = $linha2; |
|
|
|
/* |
|
* Verifica se retornou dados |
|
*/ |
|
if (!IsPostBack() || !count($this->GetData()[0])) { |
|
$dataRel[] = sprintf("<tr><td align=\"center\" colspan=\"%s\">%s<td></tr></table>", count($dadosCabecalio) - 1, (!IsPostBack() ? 'Informe os parametros e clique em consultar!' : 'Nenhum registro encontado!')); |
|
$this->___dataRel[] = $dataRel; |
|
return; |
|
} |
|
|
|
$linhaC = "<tr>"; |
|
foreach ($dadosCabecalio as $key => $value) { |
|
$linhaC .= sprintf("<th %s>%s</th>", $value, $key); |
|
} |
|
$linhaC .= "</tr>"; |
|
$dataRel[] = $linhaC; |
|
|
|
$somaReg = 0; |
|
$somaFila = 0; |
|
$somaTransbordada = 0; |
|
$somaTransbordando = 0; |
|
$somaAbandonadas = 0; |
|
$somaAtendRamal = 0; |
|
$somaAtendPA = 0; |
|
$somaAtend30 = 0; |
|
$somaTransferidas = 0; |
|
$somaEspera = 0; |
|
$somaOriginadasPA = 0; |
|
$x = 0; |
|
|
|
$data = []; |
|
foreach($this->GetData()[1] as $rel){ |
|
$data[$rel['data']] = $rel; |
|
} |
|
|
|
/* |
|
* Linhas de dados. |
|
*/ |
|
foreach ($this->GetData()[0] as $row) { |
|
$somaReg ++; |
|
$somaFila += $row['oferecidas']; |
|
$somaTransbordada += $row['transbordada']; |
|
$somaTransbordando += $row['transbordando']; |
|
$somaAbandonadas += $row['abandonadas']; |
|
$somaAtendRamal += $row['atendidas_fila']; |
|
$somaAtendPA += $row['atendidas_pa']; |
|
$somaAtend30 += $row['atendidas_30']; |
|
$somaTransferidas += $row['transferidas']; |
|
$somaEspera += $row['espera']; |
|
$somaOriginadasPA += $row['originadas_pa']; |
|
$somaConexoes += $data[$row['data']]['conexoes']; |
|
|
|
$tempo_calc = $row['tempo_atendimento'] + $row['tempo_originadas']; |
|
$agt_duracaoseg = $data[$row['data']]['tempo_login']; |
|
|
|
$agt_pausa = $data[$row['data']]['tempo_pausa']; |
|
$livre = $agt_duracaoseg - ($agt_pausa + $tempo_calc); |
|
|
|
$row['conexoes'] = ($data[$row['data']]['conexoes'] ? $data[$row['data']]['conexoes'] : 0); |
|
|
|
$row['agtAtend'] = $agt_duracaoseg ? round($tempo_calc / ($agt_duracaoseg / 100), 2) : 0; |
|
$row['agtLivre'] = $agt_duracaoseg ? round($livre / ($agt_duracaoseg / 100), 2) : 0; |
|
$row['agtPausa'] = $agt_duracaoseg ? round($agt_pausa / ($agt_duracaoseg / 100), 2) : 0; |
|
|
|
$residualPercentage = ($row['agtAtend'] + $row['agtLivre'] + $row['agtPausa']) - 100; |
|
$row['agtLivre'] = $this->adjustPercentageResidual($residualPercentage, $row['agtLivre']); |
|
|
|
$linha = "<tr>"; |
|
foreach ($dadosField as $key => $value) { |
|
$linha .= sprintf("<td %s>%s</td>", $value, $row["$key"]); |
|
} |
|
$linha .= "</tr>"; |
|
$dataRel[] = $linha; |
|
$x++; |
|
} |
|
$linhaTotal = '<tr><th>Média</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th> - </th><th> - </th><th> - </th><th> - </th><th> - </th><th> - </th><th> - </th></tr>'; |
|
$dataRel[] = sprintf($linhaTotal, round($somaFila / $somaReg), round($somaConexoes / $somaReg),round($somaTransbordada / $somaReg), round($somaTransbordando / $somaReg), round($somaAbandonadas / $somaReg), round($somaAtendRamal / $somaReg), round($somaAtendPA / $somaReg), round($somaAtend30 / $somaReg), round($somaTransferidas / $somaReg), round($somaEspera / $somaReg), round($somaOriginadasPA / $somaReg)); |
|
|
|
$linhaGeral = '<tr><th>Total</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th> - </th><th> - </th><th> - </th><th> - </th><th> - </th><th> - </th><th> - </th></tr>'; |
|
$dataRel[] = sprintf($linhaGeral, $somaFila, $somaConexoes,$somaTransbordada, $somaTransbordando, $somaAbandonadas, $somaAtendRamal, $somaAtendPA, $somaAtend30, $somaTransferidas, $somaEspera, $somaOriginadasPA); |
|
/* |
|
* Fecha relatorio. |
|
*/ |
|
$dataRel[] = '</table>'; |
|
$this->___dataRel[] = $dataRel; |
|
} |
|
|
|
protected function ___PreparaHtml() { |
|
|
|
} |
|
|
|
protected function ___PreparaPdf() { |
|
list($this->___dac, $this->___dataIni, $this->___dataFim, $this->___tipoRelatorio) = $_SESSION["SSstorageFiltros"]; |
|
/** |
|
* TABELA DADOS PRINCIPAIS |
|
*/ |
|
$somaReg = 0; |
|
$somaFila = 0; |
|
$somaTransbordada = 0; |
|
$somaTransbordando = 0; |
|
$somaAbandonadas = 0; |
|
$somaAtendRamal = 0; |
|
$somaAtendPA = 0; |
|
$somaAtend30 = 0; |
|
$somaTransferidas = 0; |
|
$somaEspera = 0; |
|
$somaOriginadasPA = 0; |
|
$dados = array(); |
|
$x = 0; |
|
|
|
$data = []; |
|
foreach($this->GetData()[1] as $rel){ |
|
$data[$rel['data']] = $rel; |
|
} |
|
|
|
foreach ($this->GetData()[0] as $row) { |
|
$somaReg ++; |
|
$somaFila += $row['oferecidas']; |
|
$somaTransbordada += $row['transbordada']; |
|
$somaTransbordando += $row['transbordando']; |
|
$somaAbandonadas += $row['abandonadas']; |
|
$somaAtendRamal += $row['atendidas_fila']; |
|
$somaAtendPA += $row['atendidas_pa']; |
|
$somaAtend30 += $row['atendidas_30']; |
|
$somaTransferidas += $row['transferidas']; |
|
$somaEspera += $row['espera']; |
|
$somaOriginadasPA += $row['originadas_pa']; |
|
$somaConexao += $data[$row['data']]['conexoes']; |
|
|
|
$tempo_calc = $row['tempo_atendimento'] + $row['tempo_originadas']; |
|
$agt_duracaoseg = $data[$row['data']]['tempo_login']; |
|
|
|
$agt_pausa = $data[$row['data']]['tempo_pausa']; |
|
$livre = $agt_duracaoseg - ($agt_pausa + $tempo_calc); |
|
|
|
$row['conexoes'] = $data[$row['data']]['conexoes']; |
|
|
|
$dados[$x]['agtAtend'] = $agt_duracaoseg ? round($tempo_calc / ($agt_duracaoseg / 100), 2) : 0; |
|
$dados[$x]['agtLivre'] = $agt_duracaoseg ? round($livre / ($agt_duracaoseg / 100), 2) : 0; |
|
$dados[$x]['agtPausa'] = $agt_duracaoseg ? round($agt_pausa / ($agt_duracaoseg / 100), 2) : 0; |
|
|
|
$residualPercentage = ($dados[$x]['agtAtend'] + $dados[$x]['agtLivre'] + $dados[$x]['agtPausa']) - 100; |
|
$dados[$x]['agtLivre'] = $this->adjustPercentageResidual($residualPercentage, $dados[$x]['agtLivre']); |
|
|
|
$dados[$x]["data"] = $row["data"]; |
|
$dados[$x]["conexoes"] = $row["conexoes"]; |
|
$dados[$x]["oferecidas"] = $row["oferecidas"]; |
|
$dados[$x]["transbordada"] = $row["transbordada"]; |
|
$dados[$x]["transbordando"] = $row["transbordando"]; |
|
$dados[$x]["abandonadas"] = $row["abandonadas"]; |
|
$dados[$x]["atendidas_fila"] = $row["atendidas_fila"]; |
|
$dados[$x]["atendidas_pa"] = $row["atendidas_pa"]; |
|
$dados[$x]["atendidas_30"] = $row["atendidas_30"]; |
|
$dados[$x]["transferidas"] = $row["transferidas"]; |
|
$dados[$x]["originadas_pa"] = $row['originadas_pa']; |
|
$dados[$x]["espera"] = $row["espera"]; |
|
$dados[$x]["tme"] = $row["tme"]; |
|
$dados[$x]["tma"] = $row["tma"]; |
|
$dados[$x]["tmab"] = $row["tmab"]; |
|
$dados[$x]["inb"] = $row["inb"]; |
|
$x++; |
|
} |
|
|
|
//HEADER DA TABELA DO PDF -> DADOS EM ARRAY |
|
$dadosCabecalio = array( |
|
'Dia' => 'C', |
|
'Fila' => 'C', |
|
'Conexões' => 'C', |
|
'Trans. E.' => 'C', |
|
'Trans. S.' => 'C', |
|
'Aband.' => 'C', |
|
'Atend. Ramal' => 'C', |
|
'Atend. PA' => 'C', |
|
'Atend. 30' => 'C', |
|
'Transf.' => 'C', |
|
'Espera' => 'C', |
|
'Orig. PA' => 'C', |
|
'TME' => 'C', |
|
'PA' => 'C', |
|
'Abandono' => 'C', |
|
'NS' => 'C', |
|
'Atend.' => 'C', |
|
'Livre' => 'C', |
|
'Pausa' => 'C' |
|
); |
|
$dadosField = array( |
|
'data' => 'C', |
|
'oferecidas' => 'C', |
|
'conexoes' => 'C', |
|
'transbordada' => 'C', |
|
'transbordando' => 'C', |
|
'abandonadas' => 'C', |
|
'atendidas_fila' => 'C', |
|
'atendidas_pa' => 'C', |
|
'atendidas_30' => 'C', |
|
'transferidas' => 'C', |
|
'espera' => 'C', |
|
'originadas_pa' => 'C', |
|
'tme' => 'C', |
|
'tma' => 'C', |
|
'tmab' => 'C', |
|
'inb' => 'C', |
|
'agtAtend' => 'C', |
|
'agtLivre' => 'C', |
|
'agtPausa' => 'C' |
|
); |
|
$this->setType("L"); |
|
$widthHeader = array(11, 11, 15, 11, 11, 11, 16, 11, 13, 10, 10, 12, 20, 20, 20, 20, 20, 20, 20); |
|
$totaliza = array( |
|
'Média', round($somaFila / $somaReg), round($somaConexao/$somaReg), round($somaTransbordada / $somaReg), round($somaTransbordando / $somaReg), round($somaAbandonadas / $somaReg), round($somaAtendRamal / $somaReg), round($somaAtendPA / $somaReg), round($somaAtend30 / $somaReg), round($somaTransferidas / $somaReg), round($somaEspera / $somaReg), round($somaOriginadasPA / $somaReg), ' - ', ' - ', ' - ', ' - ', ' - ', ' - ', ' - '); |
|
|
|
//Monta o array para passar para o prepara; Necessário passar 6 parametros |
|
$table1 = array($dadosCabecalio, $dadosField, $dados, $widthHeader, $totaliza, 0); |
|
|
|
$totaliza1 = array('Total', $somaFila, $somaConexao, $somaTransbordada, $somaTransbordando, $somaAbandonadas, $somaAtendRamal, $somaAtendPA, $somaAtend30, $somaTransferidas, $somaEspera, $somaOriginadasPA, ' - ', ' - ', ' - ', ' - ', ' - ', ' - ', ' - '); |
|
|
|
$widthHeader1 = array(11, 11, 15, 11, 11, 11, 16, 11, 13, 10, 10, 12, 20, 20, 20, 20, 20, 20, 20); |
|
$table2 = array('', '', '', $widthHeader1, $totaliza1, 0); |
|
|
|
$this->___dataRel = array($table1, $table2); |
|
} |
|
|
|
private function adjustPercentageResidual($residualPercentage, $percentForAdjustment) |
|
{ |
|
if ($residualPercentage > 0){ |
|
$adjustedPercentage = $percentForAdjustment - $residualPercentage; |
|
} else if ($residualPercentage < 0) { |
|
$adjustedPercentage = $percentForAdjustment + ($residualPercentage * -1); |
|
} else { |
|
$adjustedPercentage = $percentForAdjustment; |
|
} |
|
|
|
return $adjustedPercentage; |
|
} |
|
|
|
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'); |
|
} |
|
|
|
} |
|
|
|
$relDesempenhoOp = new RelDesempenhoOperacao($idProg, $dbcon, 1); |
|
$relDesempenhoOp->ExecutaRelatorio(); |
|
|
|
?>
|
|
|