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.
367 lines
18 KiB
367 lines
18 KiB
<?php |
|
|
|
$templateName = 'discador/desempenhoDiscador.tpl'; |
|
//$vAlineMaster = 'middle'; |
|
$_SESSION["dataIni"] = IsPostBack() ? $_POST["dataIni"] : date('d/m/Y'); |
|
//$_SESSION["dataFim"] = $_SESSION["dataIni"]; |
|
$_SESSION["dataFim"] = IsPostBack() ? $_POST["dataFim"] : date('d/m/Y'); |
|
|
|
if (IsAjax()) { |
|
if (isset($_GET["tipo"])) { |
|
$cmpId = $_GET["cmpId"]; |
|
echo GetCampanhas($dbcon, $cmpId, 0, $_GET["dataIni"], $_GET["dataFim"]); |
|
} else { |
|
$campanhaIn = explode('-', $_GET["listaDacs"]); |
|
$dataIni = is_date($_GET["dataIni"]) ? $_GET["dataIni"] : ""; |
|
$dataFim = is_date($_GET["dataFim"]) ? $_GET["dataFim"] : ""; |
|
|
|
if ($dataIni && $dataFim) { |
|
echo GetListaCampanha($dbcon, $campanhaIn[0], 0, FormatDtMssql($dataIni), FormatDtMssql($dataFim)); |
|
} else { |
|
echo GetListaCampanha($dbcon, $campanhaIn[0], 0); |
|
} |
|
} |
|
} else { |
|
if (IsPostBack()) { |
|
$listId = $_POST["listId"]; |
|
$validaCampanha = 1; |
|
|
|
$campanhas = explode('-', $_POST["listaDacs"]); |
|
$cmpId = $campanhas[0]; |
|
|
|
$dtIni = trim($_SESSION["dataIni"]); |
|
$dtFim = trim($_SESSION["dataFim"]); |
|
|
|
if (!$cmpId) { |
|
$validaCampanha = 0; |
|
$msg = "Selecione pelo menos uma \"Campanha\""; |
|
} else if (empty($dtIni) || !is_date($_SESSION["dataIni"])) { |
|
$validaCampanha = 0; |
|
$msg = "Data Inicial Inválida"; |
|
} else if (empty($dtFim) || !is_date($_SESSION["dataFim"])) { |
|
$validaCampanha = 0; |
|
$msg = "Data Final Inválida"; |
|
} |
|
} |
|
|
|
|
|
|
|
if (IsPostBack() && $validaCampanha) { |
|
$linha = ""; |
|
$linhas = ""; |
|
$rows = array(); |
|
$query = GetQuery($cmpId); |
|
$result = pg_query($dbcon, $query); |
|
/* |
|
* Retorna dados para o relatório |
|
*/ |
|
while ($dados = pg_fetch_array($result)) { |
|
$rows[] = $dados; |
|
} |
|
|
|
/* |
|
* Retorna dados referente a matricula data, inicio e fim da operacao |
|
* inicio e fim serão usados para retirar pausas que ocorrão fora desse período |
|
*/ |
|
$query = " select matricula, inicio_operacao::date as data, count(*) as quant_data from agente_operacao group by 1,2 order by 1, 2"; |
|
$result = pg_query($dbcon, $query); |
|
while ($dados = pg_fetch_array($result)) { |
|
$datas[] = array($dados['matricula'], $dados['data']); |
|
} |
|
|
|
|
|
//matricula, inicio_operacao, final_oepracao, apelido, |
|
//dac, list_nome, operacao, tempo_operacao |
|
$numReg = count($rows); |
|
$dadosBD = array(); |
|
$dadosAgt = array(); |
|
$agtAnterior = ""; |
|
$agtAnteriorPausa = ""; |
|
$start = 0; |
|
$tempo_pausa = 0; |
|
$data = new CalcDataHora(); |
|
$dataAtu = ""; |
|
$dataAnt = ""; |
|
$dataPausaAnt = ""; |
|
|
|
$insert = "insert |
|
into pbx_desempenho_discador |
|
( |
|
id_sessao, data_atual, matricula, data, inicio_operacao, final_oepracao, |
|
apelido, id_dac, dac, list_id, list_nome, operacao, tempo_operacao, tempo_livre |
|
) |
|
values |
|
( |
|
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s |
|
)"; |
|
|
|
$query = "delete from pbx_desempenho_discador where data_atual < (now()::date -1)"; |
|
$result = @pg_query($dbcon, $query); |
|
|
|
$query = "delete from pbx_desempenho_discador where id_sessao = '" . session_id() . "'"; |
|
$result = pg_query($dbcon, $query); |
|
|
|
foreach ($datas as $matData) { |
|
list($matrOper, $dataOper ) = $matData; |
|
$query = "select * from agente_operacao where inicio_operacao::date = '$dataOper' and matricula = '$matrOper' order by inicio_operacao"; |
|
$result = pg_query($dbcon, $query); |
|
|
|
$tempoLivre = 0; |
|
$start = 0; |
|
$dataAtu = ""; |
|
$dataUltPausa = ""; |
|
$horaAnterior = ''; |
|
$query = ""; |
|
while ($dados = pg_fetch_array($result)) { |
|
$dataAtu = date('Y-m-d'); |
|
|
|
if (strtolower($dados["operacao"]) != 'atendimento') { |
|
$horaAnterior = substr(FormataDBDataHora($dados["final_operacao"]), 0, 19); |
|
$tempoLivre = 0; |
|
$query .= FormataInsert($insert, $dados, $dataAtu, $dados['operacao'], $tempoLivre); |
|
//$resultInsert = pg_query($dbcon, $query); |
|
} else { |
|
$tempoLivre = empty($horaAnterior) ? 0 : $data->difDataHora($horaAnterior, substr(FormataDBDataHora($dados["inicio_operacao"]), 0, 19), 's'); |
|
|
|
//Insere operacao de tempo Livre |
|
$query .= FormataInsert($insert, $dados, $dataAtu, 'livre', $tempoLivre, 1); |
|
// $resultInsert = pg_query($dbcon, $query); |
|
|
|
if (true) { //if($resultInsert) |
|
$query .= FormataInsert($insert, $dados, $dataAtu, $dados['operacao'], $tempoLivre); |
|
// $resultInsert = pg_query($dbcon, $query); |
|
} |
|
$horaAnterior = ''; |
|
} |
|
|
|
//Verifica se o insert foi bem sucedido |
|
//if(!$resultInsert) break; |
|
} |
|
|
|
pg_query($dbcon, $query); |
|
} |
|
$GLOBALS["buffLinhas"] = array(); |
|
$linhas = GetResult($dbcon); |
|
$linhas .= GetResult($dbcon, 1); |
|
$imp = $GLOBALS["imp"]; |
|
$_SESSION["SSlinhasDesempenhoDiscador"] = $GLOBALS["buffLinhas"]; |
|
} |
|
$jsPage[] = "functions.js"; |
|
//$jsJQuery[] = "\$('#listaDacs').change(function(){GetCampanhaLista();}) "; |
|
$jsJQuery[] = "\$('#dataIni').keypress(function(){formataData(this);});"; |
|
$jsJQuery[] = "\$('#dataFim').keypress(function(){formataData(this);}); "; |
|
$jsJQuery[] = "\$('#dataIni').change(function(){GetCampanha();}); "; |
|
$jsJQuery[] = "\$('#dataFim').change(function(){GetCampanha();}); "; |
|
$jsJQuery[] = "\$('#dataFim').focus(function(){this.value = '';}); "; |
|
$jsJQuery[] = "\$('#dataIni').focus(function(){this.value = '';}); "; |
|
|
|
$dacs = GetCampanhas($dbcon, $cmpId, 0, $_SESSION["dataIni"], $_SESSION["dataFim"]); |
|
$listas = GetListaCampanha($dbcon, $cmpId, $listId, FormatDtMssql($_SESSION["dataIni"]), FormatDtMssql($_SESSION["dataFim"])); |
|
|
|
//Atualiza template |
|
$smarty->assign("dacs", $dacs); |
|
$smarty->assign("listas", $listas); |
|
$smarty->assign('dataIni', $_SESSION["dataIni"]); |
|
$smarty->assign('dataFim', $_SESSION["dataFim"]); |
|
$smarty->assign("linha", $linhas); |
|
$smarty->assign("imp", $imp); |
|
|
|
|
|
//Seta o template |
|
GetTemplate($smarty, $templateName); |
|
} |
|
|
|
function GetQuery($cmpId) { |
|
$listId = $_POST["listId"]; |
|
$dtIni = is_date($_SESSION["dataIni"]) ? FormatDtMssql($_SESSION["dataIni"]) : ''; |
|
$dtFim = is_date($_SESSION["dataFim"]) ? FormatDtMssql($_SESSION["dataFim"]) : ''; |
|
$dddpadrao = GetDddPadrao(); |
|
$tipoChamada = $_SESSION["tipoChamada"]; |
|
$matricula = '0'; |
|
$ret = ""; |
|
|
|
$ret = "CREATE TEMPORARY TABLE agente_operacao (matricula varchar(4) not null, data date not null, inicio_operacao timestamp not null, final_operacao timestamp, |
|
apelido varchar(20), id_dac int not null, dac varchar(120), list_id int, list_nome varchar(100), uniqueid varchar(32), operacao varchar(20), tempo_operacao bigint); |
|
CREATE INDEX \"idxAnaliseDacOpera\" ON agente_operacao (id_dac, data, matricula ); |
|
CREATE INDEX \"idxAnaliseDacOperaOrd\" ON agente_operacao (matricula, inicio_operacao ); |
|
CREATE INDEX \"pkAnaliseDacOpera\" ON agente_operacao (id_dac, uniqueid, inicio_operacao, matricula); |
|
|
|
|
|
CREATE TEMPORARY TABLE agente_pausa (matricula varchar(4) not null, data date not null, inicio_operacao timestamp not null, final_operacao timestamp, |
|
apelido varchar(20), id_dac int not null, dac varchar(120), list_id int, list_nome varchar(100), uniqueid varchar(32), operacao varchar(20), tempo_operacao bigint); |
|
CREATE INDEX \"idxAnaliseOpera\" ON agente_pausa (id_dac, data, matricula); |
|
CREATE INDEX \"CONSTRAINT\" ON agente_pausa (id_dac, uniqueid, inicio_operacao, matricula); |
|
|
|
|
|
|
|
insert into agente_operacao |
|
select i.matricula, conf_data::date, a.conf_data as inicio_operacao, a.conf_data as final_oepracao, i.apelido, a.cmp_id as id_dac, b.cmp_descricao as dac, a.list_id, j.list_nome, c.uniqueid, cast('atendimento' as varchar(30)) as operacao, |
|
sum(case when(h.evento in('COMPLETECALLER', 'COMPLETEAGENT', 'CONNECT'))then case when(h.evento <> 'CONNECT') then h.param2::int else param1::int end else 0 end) as tempo_operacao |
|
from pbx_campanha_contato_fone a |
|
inner join pbx_campanha b on b.cmp_id = a.cmp_id |
|
inner join pbx_campanha_complemento c on c.conf_id = a.conf_id |
|
inner join pbx_bilhetes g on g.uniqueid = c.uniqueid |
|
inner join pbx_eventos_dacs h on h.uid2 = g.accountcode and h.evento in('COMPLETEAGENT', 'COMPLETECALLER', 'CONNECT') and h.fila = b.cmp_descricao |
|
inner join pbx_usuarios i on i.matricula = c.matricula |
|
inner join pbx_campanha_lista j on j.list_id = a.list_id |
|
where a.cmp_id = '$cmpId' |
|
and a.list_id = case when($listId = 0)then a.list_id else $listId end |
|
and a.conf_data::date >= '$dtIni' |
|
and a.conf_data::date <= '$dtFim' |
|
and g.lastapp <> 'Transferred Call' |
|
and i.matricula = case when('$matricula' = '0')then i.matricula else '$matricula' end |
|
group by 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; |
|
|
|
|
|
insert into agente_pausa |
|
select distinct matricula, entrada_pausa::date, entrada_pausa, coalesce(saida_pausa, entrada_pausa) as saida_pausa, cast('' as varchar(20)) as apelido, id_dac, cast('' as varchar(100)) as dac, 0 as id_lista,cast('' as varchar(100)) as list_nome, '', b.motivo, |
|
extract(epoch from ((coalesce(saida_pausa, entrada_pausa) - entrada_pausa))) as tempo_operacao |
|
from pbx_eventos_agentes a, pbx_motivos_pausas b |
|
where b.id = a.id_motivo_pausa |
|
and coalesce(login, a.entrada_pausa)::date >= (select min(login) as login from agente_operacao c, pbx_campanha_complemento d, pbx_eventos_agentes a where d.uniqueid = c.uniqueid and a.id = d.login_id)::date |
|
and coalesce(login,a.entrada_pausa)::date <= (select max(logoff) as login from agente_operacao c, pbx_campanha_complemento d, pbx_eventos_agentes a where d.uniqueid = c.uniqueid and a.id = d.login_id)::date |
|
and id_dac = '$cmpId' |
|
and a.matricula = case when('$matricula' = '0')then a.matricula else '$matricula' end; |
|
|
|
|
|
|
|
insert into agente_operacao |
|
select * |
|
from agente_pausa a |
|
where exists( |
|
select '' from agente_operacao b |
|
where b.id_dac = a.id_dac |
|
and b.data = a.data::date |
|
and b.matricula = a.matricula |
|
); "; |
|
|
|
|
|
//if(IsAdmin ()){ echo $ret; exit;}//and motivo = 'acw' |
|
return $ret; |
|
} |
|
|
|
function FormataInsert($query, $dados, $dataAtu, $operacao, $tempoLivre, $tmpLivre = 0) { |
|
$finalOper = ($operacao == 'atendimento') ? SomaSegundos($dados["inicio_operacao"], $dados['tempo_operacao']) : $dados['final_operacao']; |
|
|
|
return sprintf($query, QuotedStr(session_id()), QuotedStr($dataAtu), QuotedStr($dados['matricula']), QuotedStr($dados['data']), QuotedStr($dados['inicio_operacao']), QuotedStr($finalOper), QuotedStr($dados['apelido']), QuotedStr($dados['id_dac']), QuotedStr($dados['dac']), QuotedStr($dados['list_id']), QuotedStr($dados['list_nome']), QuotedStr($operacao), QuotedStr(($tmpLivre ? $tempoLivre : $dados['tempo_operacao'])), QuotedStr($tempoLivre) |
|
) . ";\n"; |
|
} |
|
|
|
function SomaSegundos($dtDb, $eg) { |
|
/* |
|
* Retorna array com inforamcoes da data |
|
*/ |
|
$d = split('[-" ":.]', $dtDb); |
|
|
|
/* |
|
* Converte as informacoes do array em timestamp |
|
* -> HORA, MINUTO, SEGUNDO, MÊS, DIA, ANO |
|
*/ |
|
return date('Y-m-d H:i:s', mktime($d[3], $d[4], ($d[5] + $eg), $d[1], $d[2], $d[0])); |
|
/* |
|
* Data Banco -> 2011-12-30 12:45:59.084715 |
|
* Retorno Split -> |
|
* Array |
|
* ( |
|
* [0] => 2011 |
|
* [1] => 12 |
|
* [2] => 30 |
|
* [3] => 12 |
|
* [4] => 45 |
|
* [5] => 59 |
|
* [6] => 084715 |
|
* ) |
|
*/ |
|
} |
|
|
|
function GetResult($dbcon, $agrup = 0) { |
|
$idSessao = session_id(); |
|
if ($agrup) { |
|
$query = "select a.id_dac, b.cmp_descricao as dac, |
|
sum(case when(operacao = 'atendimento')then tempo_operacao else 0 end) as tempo_atendimento, |
|
sum(case when(operacao = 'atendimento')then 1 else 0 end) as qtde_atendimento, |
|
sum(case when(operacao = 'livre')then tempo_livre else 0 end) as tempo_livre, |
|
sum(case when(operacao = 'livre')then 1 else 0 end) as qtde_livre, |
|
sum(case when(operacao not in('livre', 'atendimento'))then tempo_operacao else 0 end) as tempo_pausa, |
|
sum(case when(operacao not in('livre', 'atendimento'))then 1 else 0 end) as qtde_pausa |
|
from pbx_desempenho_discador a, pbx_campanha b, pbx_usuarios c |
|
where b.cmp_id = a.id_dac |
|
and id_sessao = '$idSessao' |
|
and c.matricula = a.matricula |
|
group by a.id_dac, b.cmp_descricao "; |
|
} else { |
|
|
|
|
|
$query = "select a.id_dac, b.cmp_descricao as dac, a.matricula, c.apelido, |
|
sum(case when(operacao = 'atendimento')then tempo_operacao else 0 end) as tempo_atendimento, |
|
sum(case when(operacao = 'atendimento')then 1 else 0 end) as qtde_atendimento, |
|
sum(case when(operacao = 'livre')then tempo_livre else 0 end) as tempo_livre, |
|
sum(case when(operacao = 'livre')then 1 else 0 end) as qtde_livre, |
|
sum(case when(operacao not in('livre', 'atendimento'))then tempo_operacao else 0 end) as tempo_pausa, |
|
sum(case when(operacao not in('livre', 'atendimento'))then 1 else 0 end) as qtde_pausa |
|
from pbx_desempenho_discador a, pbx_campanha b, pbx_usuarios c |
|
where b.cmp_id = a.id_dac |
|
and id_sessao = '$idSessao' |
|
and c.matricula = a.matricula |
|
group by a.id_dac, b.cmp_descricao,a.matricula, c.apelido |
|
order by matricula"; |
|
} |
|
//if(IsAdmin ()) echo $query; |
|
$result = pg_query($dbcon, $query); |
|
$cmpId = $GLOBALS["cmpId"]; |
|
$buffLinhas = array(); |
|
$imp = 0; |
|
while ($dados = pg_fetch_array($result)) { |
|
$dataIni = $_SESSION["dataIni"]; |
|
$dataFim = $_SESSION["dataFim"]; |
|
$dacs = $dados["id_dac"] . "-" . $dados["dac"]; |
|
$listas = $listId ? ($listId . "-" . $dados["list_nome"]) : "Todas"; |
|
$agente = $dados["apelido"] . "/" . $matricula; |
|
$matricula = $dados["matricula"]; |
|
$_SESSION["dac"] = $dados["dac"]; |
|
|
|
|
|
$quantAtende = $dados["qtde_atendimento"]; |
|
$quantPausa = $dados["qtde_pausa"]; |
|
$tempoAtende = SecondToStrTime(round($dados["tempo_atendimento"] / $quantAtende)); |
|
$tempoPausa = SecondToStrTime(round($dados["tempo_pausa"] / $quantAtende)); |
|
|
|
$agt = $dados[apelido] . "/" . $dados[matricula]; |
|
$linkOper = "<a style=\"color:black;\" href=\"javaScript:NovaJanela('index.php?idProg=126&dacs=$dacs&cmpId=$cmpId&listId=$listId&matricula=$matricula&dataIni=$dataIni&dataFim=$dataFim&dacs=$dacs&agente=$agente&listas=$listas&totalPausa=$quantPausa', 'jnDiscadorOperacoes', '600', '500', 'resizable=yes,scrollbars=yes'); \">$agt</a>"; |
|
|
|
$tempoLivre = $dados["tempo_livre"]; |
|
$tempoLivre = SecondToStrTime(round($tempoLivre / $quantAtende), 0); |
|
|
|
$linkPausa = !$quantPausa ? 0 : "<a style=\"color:black;\" href=\"javaScript:NovaJanela('index.php?idProg=123&dacs=$dacs&cmpId=$cmpId&listId=$listId&matricula=$matricula&dataIni=$dataIni&dataFim=$dataFim&dacs=$dacs&agente=$agente&listas=$listas&totalPausa=$quantPausa', 'jnDiscadorPusas', '600', '500', 'resizable=yes,scrollbars=yes'); \">$quantPausa</a>"; |
|
// <td align=\"center\">$tempoTotalAtendimento</td> |
|
$tempoTotalAtendimento = 0; //substr($datasRange[$dados[matricula]][3],0, 8); |
|
if (!$agrup) { |
|
$linha = "<tr> |
|
<td align=\"left\">$dados[dac]</td> |
|
<td align=\"left\">$linkOper</td> |
|
<td align=\"center\">$quantAtende</td> |
|
<td align=\"center\">$tempoAtende</td> |
|
<td align=\"center\">$linkPausa</td> |
|
<td align=\"center\">$tempoPausa</td> |
|
<td align=\"center\">$tempoLivre</td> |
|
</tr>"; |
|
} else { |
|
$linha = "<tr> |
|
<th colspan=\"2\" align=\"center\">Geral</th> |
|
<th align=\"center\">$quantAtende</th> |
|
<th align=\"center\">$tempoAtende</th> |
|
<th align=\"center\">$quantPausa</th> |
|
<th align=\"center\">$tempoPausa</th> |
|
<th align=\"center\">$tempoLivre</th> |
|
</tr>"; |
|
} |
|
$GLOBALS["buffLinhas"][] = $linha; |
|
$linhas .= $linha; |
|
$imp++; |
|
} |
|
|
|
$GLOBALS["imp"] = $imp; |
|
return $linhas; |
|
} |
|
|
|
?>
|
|
|