|
|
<?php |
|
|
|
|
|
/* |
|
|
* To change this license header, choose License Headers in Project Properties. |
|
|
* To change this template file, choose Tools | Templates |
|
|
* and open the template in the editor. |
|
|
*/ |
|
|
|
|
|
/** |
|
|
* Description of DashboardHandler |
|
|
* |
|
|
* @author victor |
|
|
*/ |
|
|
class AbstractDashboard { |
|
|
|
|
|
private static $instance; |
|
|
|
|
|
const ARRAY_ROOT_INDEX_NAME = 'rotinasFrequentes'; |
|
|
const PREFIX = "prog_"; |
|
|
const DASHBOARD_ID = 12100; |
|
|
|
|
|
/** |
|
|
* |
|
|
* @var IDashboard $handler |
|
|
*/ |
|
|
public $handler = null; |
|
|
protected $conn = null; |
|
|
private $matricula, $login, $id, $nome, $agenteContribuinte, |
|
|
$ramalMonitorAgente, $canalMonitorAgente = null; |
|
|
private $dacPadrao, $dacAtual, $isAgente = false; |
|
|
protected static $listaDacsTemplate = <<<HTML |
|
|
<tr> |
|
|
<td align="center">[dac]</td> |
|
|
<td align="center">[nome]</td> |
|
|
<td align="center">[ramal_monitor]</td> |
|
|
<td align="center"><a href="javaScript:NovaJanela('index.php?idProg=126&matricula=[matricula]&dac=[dac]', 'jnGraphAgente', '1048', '640', 'resizable=NO,scrollbars=NO');" style="color:black;">[matricula]</a></td> |
|
|
<td align="center">[tempo_logado]</td> |
|
|
<td align="center">[modo_atendimento]</td> |
|
|
<td align="center">[status_chamada]</td> |
|
|
<td align="center">[status]</td> |
|
|
<td align="center">[chamadas_originadas]</td> |
|
|
<td align="center">[chamadas_atendidas]</td> |
|
|
<td align="center">[tempo_media_atendimento]</td> |
|
|
<td align="center"><a href="javaScript:LogoffAgente('[matricula]','[modo_atendimento]','[dac]' );">Logoff do agente</a></td> |
|
|
<td align="center"><a href="javaScript:PausaAgente('[matricula]','[ramal_monitor]','[dac]', '1');">Pausar agente</a></td> |
|
|
</tr> |
|
|
HTML; |
|
|
|
|
|
private function __construct($session, $optionals = []) { |
|
|
if (!isset($session) || empty($session)) { |
|
|
return $this; |
|
|
} |
|
|
global $dbcon; |
|
|
$this->conn = $dbcon; |
|
|
$this->matricula = $session['SSmatriculaUser']; |
|
|
$this->login = $session['SSlogin']; |
|
|
$this->id = $session['SSidUser']; |
|
|
$this->nome = $session['SSnomeUser']; |
|
|
$this->agenteContribuinte = $session['prm_agente_contribuinte']; |
|
|
$this->dacPadrao = $session['SSdacPadraoAgente']; |
|
|
$this->dacAtual = $session['SSsupervisorDacAtu']; |
|
|
$this->ramalMonitorAgente = $session['ramalMonitorAgente']; |
|
|
$this->canalMonitorAgente = $session['canalMonitorAgente']; |
|
|
$this->isAgente = (isset($session['SSagente']) && ($session['SSagente'] === true)); |
|
|
|
|
|
if (!empty($optionals)) { |
|
|
array_walk($optionals, [$this, 'setOptional']); |
|
|
} |
|
|
} |
|
|
|
|
|
private function setOptional($item, $key) { |
|
|
$this->$item = $_SESSION[$item]; |
|
|
} |
|
|
|
|
|
public function __clone() { |
|
|
|
|
|
} |
|
|
|
|
|
public function __wakeup() { |
|
|
|
|
|
} |
|
|
|
|
|
/** |
|
|
* |
|
|
* @param array $session |
|
|
* @param array $optionals |
|
|
* @return AbstractDashboard |
|
|
*/ |
|
|
public static function init($session, $optionals = []) { |
|
|
if (is_null(static::$instance)) { |
|
|
static::$instance = new self($session, $optionals); |
|
|
} |
|
|
return static::$instance; |
|
|
} |
|
|
|
|
|
public static function ProcessaRotinasMaisUsadas($idProg) { |
|
|
$isAjax = (getRequest('ajax', INPUT_GET) !== null); |
|
|
$isPopup = (getRequest('window', INPUT_GET) !== null); |
|
|
$isSubProg = (getRequest('idSubProg', INPUT_GET) !== null); |
|
|
if ($isAjax || $isPopup) { |
|
|
return; |
|
|
} |
|
|
if (!isset($idProg) || $idProg == self::DASHBOARD_ID || $isSubProg) { |
|
|
return; |
|
|
} |
|
|
$name = self::ARRAY_ROOT_INDEX_NAME; |
|
|
if (isset($_SESSION[$name][self::PREFIX . self::DASHBOARD_ID])) { |
|
|
unset($_SESSION[$name][self::PREFIX . self::DASHBOARD_ID]); |
|
|
} |
|
|
if (!isset($_SESSION[$name])) { |
|
|
$_SESSION[$name] = []; |
|
|
} |
|
|
$count = isset($_SESSION[$name][self::PREFIX . $idProg]) ? $_SESSION[$name][self::PREFIX . $idProg] : 0; |
|
|
$_SESSION[$name][self::PREFIX . $idProg] = $count + 1; |
|
|
} |
|
|
|
|
|
private static function aksort(&$array, $valrev = false, $keyrev = false) { |
|
|
if ($valrev) { |
|
|
arsort($array); |
|
|
} else { |
|
|
asort($array); |
|
|
} |
|
|
$vals = array_count_values($array); |
|
|
$i = 0; |
|
|
foreach ($vals as $val => $num) { |
|
|
$first = array_splice($array, 0, $i); |
|
|
$tmp = array_splice($array, 0, $num); |
|
|
if ($keyrev) { |
|
|
krsort($tmp); |
|
|
} else { |
|
|
ksort($tmp); |
|
|
} |
|
|
$array = array_merge($first, $tmp, $array); |
|
|
unset($tmp); |
|
|
$i = $num; |
|
|
} |
|
|
} |
|
|
|
|
|
public static function RotinasMaisUsadas() { |
|
|
$name = self::ARRAY_ROOT_INDEX_NAME; |
|
|
if (!isset($_SESSION[$name]) || empty($_SESSION[$name])) { |
|
|
return []; |
|
|
} |
|
|
$rotinas = $_SESSION[$name]; |
|
|
self::aksort($rotinas); |
|
|
$tmp = array_reverse(array_slice($rotinas, 0, 10), true); |
|
|
$top = []; |
|
|
|
|
|
foreach ($tmp as $prog => $count) { |
|
|
$idProg = substr($prog, strlen(self::PREFIX . ''), strlen($prog)); |
|
|
if (intval($idProg) === self::DASHBOARD_ID) { |
|
|
continue; |
|
|
} |
|
|
$linkPrefix = 'index.php?idProg=%s'; |
|
|
$idProgPai = \GetFieldFromIdProg($idProg, 'id_prog_pai'); |
|
|
$nomeRotina = GetDispProgSel($idProgPai); |
|
|
if (empty($nomeRotina)) { |
|
|
continue; |
|
|
} |
|
|
$sameProg = (intval($idProg) === intval($idProgPai)); |
|
|
$id = ($sameProg ? $idProg : $idProgPai); |
|
|
$top[$id] = [ |
|
|
'rotina' => \GetDispProgSel($id), |
|
|
'url' => sprintf($linkPrefix, $id), |
|
|
'count' => $count |
|
|
]; |
|
|
} |
|
|
|
|
|
return $top; |
|
|
} |
|
|
|
|
|
public function UltimasOperacoes() { |
|
|
//$query = "select full_data_hora, id_prog, full_prog_nome, full_log from pbx_audita_full where login = '{$this->login}' and id_prog not in ('12100','56','16','-1') order by full_id desc limit 20"; |
|
|
$query = "select max(full_id) as \"full_id\",id_prog,full_prog_nome,max(full_data_hora) as \"full_data_hora\", max(full_log) as \"full_log\" from pbx_audita_full where login = '{$this->login}' and id_prog not in ('12100','56','16','-1') and full_prog_nome <> '' group by id_prog,full_prog_nome order by max(full_id) desc limit 20"; |
|
|
$result = pg_query($this->conn, $query); |
|
|
$logs = []; |
|
|
$i = 0; |
|
|
if ($result) { |
|
|
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) { |
|
|
$log = json_decode($dados['full_log'], false, 512, JSON_BIGINT_AS_STRING); |
|
|
if (property_exists($log, 'request')) { |
|
|
$idProg = $log->request->idProg; |
|
|
} else { |
|
|
$idProg = $log->idProg; |
|
|
} |
|
|
$nomeRotina = GetDispProgSel($idProg); |
|
|
$urlText = (!empty($nomeRotina) ? $nomeRotina : 'Desconhecido'); |
|
|
$unset = ['uid', 'ip', 'data', 'login', 'prog']; |
|
|
if (strtolower($urlText) == 'desconhecido') { |
|
|
continue; |
|
|
} |
|
|
$logs[$i] = [ |
|
|
'data' => ParseDbTimestamp($dados['full_data_hora'], 'D'), |
|
|
'hora' => ParseDbTimestamp($dados['full_data_hora'], 'T'), |
|
|
//'url' => "<a href='index.php?idProg={$idProg}'>{$urlText}</a>", |
|
|
'url' => $urlText, # . " ({$dados['id_prog']})", |
|
|
'prog_id' => $dados['id_prog'], |
|
|
'prog_nome' => $dados['full_prog_nome'], |
|
|
//'log' => $dados['full_log'] |
|
|
]; |
|
|
$i++; |
|
|
} |
|
|
} else { |
|
|
throw new Exception(pg_last_error($this->conn)); |
|
|
} |
|
|
|
|
|
return $logs; |
|
|
} |
|
|
|
|
|
public function DadosAgentes() { |
|
|
|
|
|
$isDacPadrao = empty($this->dacAtual); |
|
|
$dac = ($isDacPadrao ? $this->dacPadrao : $this->dacAtual); |
|
|
$where = ''; |
|
|
if ($this->isAgente) { |
|
|
$where = " AND a.nome = '{$dac}'"; |
|
|
} |
|
|
|
|
|
$sqlDacs = "select * from pbx_dacs a where a.status = 'A' and exists(select '' from pbx_fila_grupos where id = a.id) {$where} order by 1"; |
|
|
$queryDacs = pg_query($sqlDacs); |
|
|
$dacs = []; |
|
|
while ($dac = pg_fetch_assoc($queryDacs)) { |
|
|
$dacs[] = $dac; |
|
|
} |
|
|
|
|
|
foreach ($dacs as $dac) { |
|
|
$dadosAgt = GetDadosAgt($dac['nome']); |
|
|
|
|
|
$i = 0; |
|
|
|
|
|
$result[$dac['nome']] = []; |
|
|
foreach ($dadosAgt as $dadosAgente) { |
|
|
$isAgenteAtual = intval($dadosAgente['matricula']) === intval($this->matricula); |
|
|
if ($this->isAgente && !$isAgenteAtual) { |
|
|
continue; |
|
|
} |
|
|
$dadosAgente['dacPadrao'] = !$isDacPadrao; |
|
|
$dadosAgente['isPausado'] = (stripos($dadosAgente['status'], 'pausa') !== false); |
|
|
if (isset($dadosAgente['tipo_ligacao']) && !empty($dadosAgente['tipo_ligacao'])) { |
|
|
$dadosAgente['status_chamada'] = 'Chamada ' . ($dadosAgente['tipo_ligacao'] == 'E' ? 'Entrante' : 'Sainte') . " {$dadosAgente['fone']}"; |
|
|
} else { |
|
|
$dadosAgente['status_chamada'] = 'Livre'; |
|
|
} |
|
|
$chamadaAgt = $dadosAgente["chamadas_originadas"] + $dadosAgente["chamadas_atendidas"]; |
|
|
$strTmp = $chamadaAgt <> 0 ? round(($dadosAgente["tempo_atendimento"] / $chamadaAgt), 0) : 0; |
|
|
$tempoAtd = SecondToStrTime($strTmp); |
|
|
$dadosAgente['tempo_media_atendimento'] = $tempoAtd; |
|
|
|
|
|
$html = preg_replace_callback('/\[(.*?)\]/', function($matches) use ($dadosAgente) { |
|
|
if (isset($dadosAgente[$matches[1]])) { |
|
|
return $dadosAgente[$matches[1]]; |
|
|
} |
|
|
return $matches[0]; |
|
|
}, self::$listaDacsTemplate); |
|
|
|
|
|
if ($isAgenteAtual) { |
|
|
$html = str_replace('td', 'td style="background-color: palegreen"', $html); |
|
|
} |
|
|
|
|
|
$result[$dac['nome']]['agentes'][] = ['dados' => $dadosAgente, 'html' => $html, 'isAgenteAtual' => $isAgenteAtual]; |
|
|
$i++; |
|
|
} |
|
|
} |
|
|
return $result; |
|
|
} |
|
|
|
|
|
public function ChamadasNaoClassificadas($ultimosXMeses = 3) { |
|
|
if (empty($this->ramalMonitorAgente)) { |
|
|
return []; |
|
|
} |
|
|
$where = ($this->isAgente ? " and b.src = '{$this->ramalMonitorAgente}'" : ''); |
|
|
$query = "select to_char(b.calldate, 'MM/YYYY') as \"competencia\", count(b.calldate) as \"total\" |
|
|
from pbx_bilhetes as \"b\" |
|
|
inner join pbx_eventos_dacs as \"e\" on e.uid2 = b.uniqueid |
|
|
left join pbx_classifica_reg as \"c\" on c.id_bilhetes = b.uniqueid |
|
|
where c.matricula is null |
|
|
and b.src = '{$this->ramalMonitorAgente}' |
|
|
group by to_char(b.calldate, 'MM/YYYY') |
|
|
order by count(b.calldate) desc limit {$ultimosXMeses} |
|
|
"; |
|
|
$result = pg_query($this->conn, $query); |
|
|
$chamadas = []; |
|
|
if ($result) { |
|
|
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) { |
|
|
$exp = explode("/", $dados['competencia']); |
|
|
$date = new \DateTime("{$exp[1]}-{$exp[0]}-01"); |
|
|
$chamadas[] = [ |
|
|
'timestamp' => $date->getTimestamp(), |
|
|
'data' => $date->format('m/Y'), |
|
|
'total' => $dados['total'] |
|
|
]; |
|
|
} |
|
|
} else { |
|
|
throw new Exception(pg_last_error($this->conn)); |
|
|
} |
|
|
if (!empty($chamadas)) { |
|
|
usort($chamadas, function($a, $b) { |
|
|
return $b['timestamp'] - $a['timestamp']; |
|
|
}); |
|
|
} |
|
|
|
|
|
return $chamadas; |
|
|
} |
|
|
|
|
|
public function getMatricula() { |
|
|
return $this->matricula; |
|
|
} |
|
|
|
|
|
public function getLogin() { |
|
|
return $this->login; |
|
|
} |
|
|
|
|
|
public function getId() { |
|
|
return $this->id; |
|
|
} |
|
|
|
|
|
public function getNome() { |
|
|
return $this->nome; |
|
|
} |
|
|
|
|
|
public function getAgenteContribuinte() { |
|
|
return $this->agenteContribuinte; |
|
|
} |
|
|
|
|
|
public function getRamalMonitorAgente() { |
|
|
return (empty($this->ramalMonitorAgente) ? 'S/Ramal' : $this->ramalMonitorAgente); |
|
|
} |
|
|
|
|
|
public function getCanalMonitorAgente() { |
|
|
return $this->canalMonitorAgente; |
|
|
} |
|
|
|
|
|
public function getDacPadrao() { |
|
|
return $this->dacPadrao; |
|
|
} |
|
|
|
|
|
public function getDacAtual() { |
|
|
return $this->dacAtual; |
|
|
} |
|
|
|
|
|
public function getIsAgente() { |
|
|
return $this->isAgente; |
|
|
} |
|
|
|
|
|
/** |
|
|
* |
|
|
* @return \DashboardGraph |
|
|
*/ |
|
|
public function getGraph() { |
|
|
return new DashboardGraph($this); |
|
|
} |
|
|
|
|
|
public static function postarComunicado($data, &$msg) { |
|
|
extract($data); |
|
|
if (strlen($conteudo) <= 0) { |
|
|
return; |
|
|
} |
|
|
global $dbcon; |
|
|
|
|
|
$conteudo = QuotedStr($conteudo); |
|
|
|
|
|
$sql = "INSERT INTO pbx_mural (autor_id,data,conteudo) VALUES ({$autor}, '{$timestamp}', $conteudo)"; |
|
|
|
|
|
$begin = pg_query($dbcon, "begin"); |
|
|
$result = pg_query($dbcon, $sql); |
|
|
if ($result) { |
|
|
$msg = "Publicado com sucesso"; |
|
|
$commit = pg_query($dbcon, "commit"); |
|
|
} else { |
|
|
$msg = "N<EFBFBD>o foi poss<EFBFBD>vel publicar no mural."; |
|
|
if (isset($_SESSION['DEBUG']) && intval($_SESSION['DEBUG']) === 1 && IsAdmin()) { |
|
|
$msg .= "Erro: " . pg_last_error($dbcon); |
|
|
} |
|
|
$rollback = pg_query($dbcon, "rollback"); |
|
|
} |
|
|
} |
|
|
|
|
|
public static function getPublicacoes() { |
|
|
global $dbcon; |
|
|
$ultimaNotificacao = pg_escape_string(getRequest('ultimaNotificacao', INPUT_GET)); |
|
|
$where = ''; |
|
|
if (IsAjax()) { |
|
|
$where .= " WHERE data BETWEEN now()::timestamp - (interval '10s') AND now()::timestamp + (interval '10s')"; |
|
|
if ($ultimaNotificacao) { |
|
|
$where .= " AND id > {$ultimaNotificacao}"; |
|
|
} |
|
|
} |
|
|
|
|
|
$sql = "SELECT * FROM pbx_mural {$where} ORDER BY id DESC LIMIT 10"; |
|
|
$getPubs = pg_query($dbcon, $sql); |
|
|
$publicacoes = []; |
|
|
while ($dados = pg_fetch_assoc($getPubs)) { |
|
|
if (IsAjax()) { |
|
|
$dados = array_map('utf8_encode', $dados); |
|
|
} |
|
|
$dados['autor'] = GetLoginFromId($dbcon, $dados['autor_id']); |
|
|
$dados['conteudo'] = pg_escape_string(trim($dados['conteudo'])); |
|
|
$publicacoes[] = $dados; |
|
|
} |
|
|
|
|
|
return $publicacoes; |
|
|
} |
|
|
|
|
|
}
|
|
|
|