PABX da Simples IP
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.
 
 
 
 
 
 

1398 lines
51 KiB

<?php
/*
* *******************************************************************************************************************
* FUNÇÕES
* *******************************************************************************************************************
* - Evento($str) -> Analiza um linha retornada do Manager para ver se é o inicio de um evento, ex.: Event: NewChannel.
* - LerBloco($lerBloco, $evento, $eventosAtivos) -> Verifica se o evento esta presente no array $eventosAtivos. Lê so-
* mente eventos presentes neste bloco.
* - Imprime($linha, $quebraLinha = false) -> Imprime um linha para saida padarao, usada para verificar a saida do mana-
* ger, tem um controle para linhas em branco imprimindo apenas uma no fim do bloco.
* - ImportaCampanha() -> Importa os dados da campanha/lista;agtentes para o discador iniciar sua tarefa.
* - ImPortaAgente($matricula) -> Importa um agente da pbx_supervisor_agentes e insere na base interna do discador na
* tabela correspondente.
* - LimpaMysql() -> Limpa quaisquer informações sobre a campanha que existam na base local, antes da importação.
* - InsereAgente($dadosAgt) -> Recebe um array com informações do Agente e insere na base interna do discados.
* - AddAgente($matricula) -> Esta função adiciona ao array global "$agentesLogados" uma matricula para ser utilizadao
* como um meio rápido de consulta aos agentes logados.
* - RmAgente($matricula) -> Marca a matricula com removida no array gloval "$agentesLogados".
* - AgenteLogado($matricula) -> Retorna true se a matricula existir e for igual a "1" no array global "$agentesLogados".
* - RemoveAgente($matricula) -> Remove a matricula do array global "$agentesLogados" e da base interna do discador.
* - InformacoesDac() -> Esta função preenche o array global "$dadosDac" com informações sobre o dac/Campanha obtidas do banco de
* dados da aplicação a partir do "id" da campanha informado pela linha de comando na chamada do discador.
* - RegistraCampanha($id, $nome) -> Registra as informações sobre a campanha passadas na linha de comanado nas variaveis
* "$idCampanha" e "$nomeCampanha".
* - IdCampanha() - Retorna o valor da variavel global $idCampanha".
* - NomeCampanha() - Retorna o valor da variavel global $nomeCampanha".
* - AlimentaLog($str, $metodo = '', $label = '', $nivel = 2) - Armazenha informações no array global "$log" para ser utilizado
* posteriormente pela funcção LogDiscador();
* - LogDiscador() -> Grava Arquivo de log da aplicação.
*/
error_reporting(E_ERROR);
ini_set('display_errors', 0);
ini_set("memory_limit", "512M");
ini_set("max_input_time", "-1");
set_time_limit(0);
/*
* Status das chamadas.
*/
define("CHAMADA_DISCADA", "CALL");
define("CHAMADA_ATENDIDA", "ANSWER");
define("CHAMADA_NAOATENDIDA", "NO_ANSWER");
define("CHAMADA_ATENDIDA_MAQUINA", "MACHINE");
define("CHAMADA_OCUPADA", "BUSY");
define("CHAMADA_INVALIDA", "INVALID");
/*
* Status do contato.
*/
define("CONTATO_DISCADO", "1");
define("CONTATO_NAO_DISCADO", "0");
/*
* Status campanha.
*/
define("CAMPANHA_INATIVA", "0");
define("CAMPANHA_ATIVA", "1");
define("CAMPANHA_CONCLUIDA", "2");
define("CAMPANHA_CANCELADA", "3");
define("MAX_TENTATIVA_RETORNO", 50); //Retorno do socket;
define("TIMEOUT_CONEXAO_MONITOR", 5); //Segundos
define("TEMPO_TENTATIVA_CONEXAO_MONITOR", 200000); //Milhonesimo de segundos
include('util/util.php');
require("funcoes/shared.php");
require("util/funcoesAmi.php");
$nomeCampanha = '';
$idCampanha = 0;
$dadosDac = array(); // Aramazena informações sobre o dac associado a uma camapanha.
/*
* Armazena lista de Agentes logados para consulta
*/
$agentesLogados = array();
/*
* Canais discando, para acesso rapdo;
*/
$canaisDiscando = array();
/*
* Configura o nivel de log para execução.
* 0 -> Registra erros.
* 1 -> Registras comandos do banco de dados.
* 2 -> Registra Todas as operações.
*/
$nivelLog = 2;
/*
* 1-> Ativa display do log para a saida padrão.
*/
$MostraLog = 1;
/*
* Imprime os comandos do manager para um arquivo
* quando o valor é verdadeiro.
*/
$imprimeSaida = 1;
/*
* Saida padrao para o log e eventos do monitor.
*/
$saidaLogEventos = '/var/log/asterisk/monitor_power.log';
/*
* Buffer de mensagens de log, será utilizado pelas funções
* AlimentaLog() e LogDiscador().
*/
$log = array();
/*
* Log da aplicação.
*/
$pathLog = '/var/log/asterisk/discador.log';
/*
* Data Atual.
*/
$dataAtual = date("Y-m-d H:i:s");
/*
* Controle para impressão de linhas em branco.
*/
$linhaVazia = 0;
/*
* Eventos tratados pela aplicação.
*/
$eventosAtivos = array('Newchannel', 'Rename', 'Join', 'Leave', 'Cdr', 'QueueMemberRemoved', 'Hangup', 'QueueMemberStatus', 'Agentcallbacklogin', 'QueueMemberPaused', 'QueueMemberAdded', 'Agentcallbacklogoff', 'Agentlogin', 'Link', 'Unlink', 'OriginateResponse');
/*
* parametros de conexao com o socket.
*/
list($sck_host, $sck_porta, $sck_usuario, $sck_senha) = GetSckConnect();
$sck_events = 1;
/*
* Se não for definido uma conexão para o banco de dados aqui, o sistema irá
* usar a configuração padrão baseada nas informações contidas no arquivo
* /var/lib/asterisk/scripts/callcenter/bd e retornadas pela função GetDefStrDb()
* contida no arquivo funcoes/shared.php localizado no diretorio include.
*/
$conStr = false;
//$conStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '127.0.0.1', '5432', 'pbx', 'contacte', 'ctepgSQL');
$conStr = GetDefStrDb();
/*
* Parametros para conexao com o mysql.
*/
$hostMy = "127.0.0.1";
$userMy = "root";
$senhaMy = "";
$baseMy = "pbx";
function Evento($str) {
if (stripos($str, 'Event') !== false) {
$evt = explode(":", $str);
return trim($evt[1]);
}
if (trim($str) == "")
return 'fim_bloco';
return "";
}
/*
*
function LerBloco($lerBloco, $evento, $eventosAtivos)
{
if($evento == "fim_bloco"){ return false; }
if($lerBloco) return true;
return array_search($evento, $eventosAtivos) !== false;
}
*/
function GeraBloco($str) {
return trim($str) != "";
}
function LerBloco($bloco) {
global $eventosAtivos;
$evento = $bloco['Event'];
$acId = $bloco['ActionID'];
return (array_search($evento, $eventosAtivos) !== false) || (LerActionId($acId));
}
function LerActionId($acId) {
return false;
}
function Imprime($linha, $quebraLinha = false, $file = null) {
global $linhaVazia;
$linhaLimpa = trim($linha);
if (!$linhaVazia && !$linhaLimpa) {
echo "\n";
$linhaVazia = 1;
if ($file)
fwrite($file, $linha);
return;
}
if ($quebraLinha)
return;
echo $linha;
if ($file)
fwrite($file, $linha);
$linhaVazia = 0;
}
function ImportaCampanha() {
$idCampanha = IdCampanha();
LimpaMysql();
// create table pbx_campanha(cmp_id int not null primary key, cmp_descricao varchar(120), id_dac int, cmp_aguarda_agente int, cmp_numero_ligacoes_agente int, cmp_ramal varchar(100)) ENGINE=MEMORY;
//create table pbx_lista(id bigint not null auto_increment primary key, cmp_id int not null, list_id int not null, cont_id int not null, conf_id int not null, cont_identificador varchar(200), cont_discado int, cont_peso int, conf_fone varchar(30), conf_status varchar(50), agente int, conf_uid varchar(32), conf_protocolo varchar(32), conf_agente_matricula varchar(10)) ENGINE=MEMORY;
//create table pbx_supervisor_agentes( id bigint not null auto_increment primary key, dac varchar(50), matricula varchar(4), ramal varchar(50), nome varchar(50), origem_destino varchar(50), status varchar(50), duracao datetime, canal varchar(50), canal_agente varchar(50), canal_transfer varchar(50), uniqueid varchar(32) ) ENGINE=MEMORY;
/*
* Obtem informações sobre campanha/dac.
*/
$source = InformacoesDac();
$idDac = $source['id_dac'];
$nomeDac = $source['nome_dac'];
$statusCampanha = 1; //ativa
$pid = 0;
/*
* Importa a campanha
*/
$queryMy = "insert into pbx_campanha(cmp_id, cmp_descricao, id_dac, cmp_aguarda_agente, cmp_numero_ligacoes_agente, cmp_ramal, cmp_status, cmp_pid, nome_dac, numero_dac) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)";
$queryMy = sprintf($queryMy, QuotedStr($source['cmp_id']), QuotedStr($source['cmp_descricao']), QuotedStr($source['id_dac']), QuotedStr($source['cmp_aguarda_agente']), QuotedStr($source['cmp_numero_ligacoes_agente']), QuotedStr($source['cmp_ramal']), $statusCampanha, $pid, QuotedStr($source['nome_dac']), QuotedStr($source['numero_dac']));
AlimentaLog($queryMy, "ImportaCampanha", 'Nova Campanha', 1);
$resultMy = mysql_query($queryMy);
if (!$resultMy)
throw new Exception("Erro ao importar dados da campanha para o servidor destino!");
/*
* Importa Lista
*/
$queryPg = "select a.cmp_id, a.cmp_descricao, a.cmp_aguarda_agente, a.cmp_numero_ligacoes_agente, a.cmp_ramal, a.id_dac,
b.list_id, b.list_nome,
c.cont_id, c.cont_identificador, c.cont_discado, c.cont_peso, c.cont_param1, c.cont_param2, c.cont_param3, c.cont_param4, c.cont_param5,
d.conf_id, d.conf_fone, d.conf_status, d.agente, d.conf_uid, d.conf_protocolo
from pbx_campanha a, pbx_campanha_lista b, pbx_campanha_contato c,
pbx_campanha_contato_fone d
where b.cmp_id = a.cmp_id
and c.list_id = b.list_id
and d.cont_id = c.cont_id
and b.list_status = 1
and c.cont_discado = 0
and d.conf_status = '0'
and a.cmp_id = '$idCampanha'
and b.list_status = '1' ";
AlimentaLog($queryPg, "ImportaCampanha", 'Importa a Lista', 1);
$result = pg_query($queryPg);
if (!$result)
throw new Exception("Não foi possível importar a campanha. Erro ao conectar ao servidor de origem.");
if (!pg_numrows($result))
throw new Exception("Não existem lista de dados disponíveis na campanha informada!");
$fields = array('cmp_id', 'list_id', 'cont_id', 'conf_id', 'cont_identificador', 'cont_discado', 'cont_peso', 'conf_fone', 'conf_status');
while ($source = pg_fetch_array($result)) {
$queryMy = "insert into pbx_lista(cmp_id,list_id,cont_id,conf_id,cont_identificador,cont_discado,cont_peso,conf_fone,conf_status)values({cmp_id},{list_id},{cont_id},{conf_id},{cont_identificador},{cont_discado},{cont_peso},{conf_fone},{conf_status})";
foreach ($fields as $field) {
$queryMy = str_replace('{' . $field . '}', QuotedStr($source[$field]), $queryMy);
}
AlimentaLog($queryMy, "ImportaCampanha", 'Insere Lista', 1);
$resultMy = mysql_query($queryMy);
if (!$resultMy) {
throw new Exception("Erro ao importar dados da lista para o servidor destino!");
}
}
/*
* Importa a tabela de agentes
*/
$queryPg = "select dac,matricula,ramal,nome,origem_destino,status,duracao,canal,canal_agente,canal_transfer,uniqueid from pbx_supervisor_agentes where dac = '$nomeDac'";
AlimentaLog($queryPg, "ImportaCampanha", 'Importa Agentes', 1);
$result = pg_query($queryPg);
if (!$result)
throw new Exception("Não foi possível informações dos agentes. Erro ao conectar ao servidor de origem.");
$fields = array('dac', 'matricula', 'ramal', 'nome', 'origem_destino', 'status', 'duracao', 'canal', 'canal_agente', 'canal_transfer', 'uniqueid');
while ($source = pg_fetch_array($result)) {
$queryMy = "insert into pbx_supervisor_agentes(dac,matricula,ramal,nome,origem_destino,status,duracao,canal,canal_agente,canal_transfer,uniqueid)values({dac},{matricula},{ramal},{nome},{origem_destino},{status},{duracao},{canal},{canal_agente},{canal_transfer},{uniqueid})";
$source['canal_agente'] = "Agent/" . $source['matricula'];
foreach ($fields as $field) {
$queryMy = str_replace('{' . $field . '}', QuotedStr($source[$field]), $queryMy);
}
AlimentaLog($queryMy, "ImportaCampanha", 'Insere Agentes', 1);
$resultMy = mysql_query($queryMy);
if (!$resultMy)
throw new Exception("Erro ao importar informações dos agentes!");
AddAgente($source['matricula']);
}
}
function LimpaMysql() {
$idCampanha = IdCampanha();
$source = InformacoesDac();
$nomeDac = $source['nome_dac'];
/*
* Limpa dados da campanha se existirem
*/
$queryMy = "delete from pbx_campanha where cmp_id = '$idCampanha'";
AlimentaLog($queryMy, "LimpaMysql", 'Deleta Campanha: ', 1);
$resultMy = mysql_query($queryMy);
$queryMy = "delete from pbx_lista where cmp_id = '$idCampanha'";
AlimentaLog($queryMy, "LimpaMysql", 'Deleta Lista: ', 1);
if ($resultMy)
$resultMy = mysql_query($queryMy);
$queryMy = "delete from pbx_supervisor_agentes where dac = '$nomeDac'";
AlimentaLog($queryMy, "LimpaMysql", 'Limpa Supervisor Agente: ', 1);
if ($resultMy)
$resultMy = mysql_query($queryMy);
if (!$resultMy)
throw new Exception("Não foi possível limpar informações previas no destino. Cmd:[$queryMy]");
}
function AlimentaLog($str, $metodo = '', $label = '', $nivel = 2, $getErro = 0) {
/*
* Configura o nivel de log para execução.
* 0 -> Registra erros.
* 1 -> Registras comandos do banco de dados.
* 2 -> Registra Todas as operações.
*/
global $log, $nivelLog, $MostraLog, $dataAtual;
if (!$metodo) {
$metodo = "Discador";
}
if (!$label) {
$label = "Cmd ";
}
$logerro = "\n";
if ($getErro) {
$erro = error_get_last();
$logerro = sprintf("\nErro: %s %s Linha: %s\n", $erro['message'], $erro['line']);
}
if ($nivel <= $nivelLog) {
$str = sprintf("%s: %s Data: %s%s", $label, $str, $dataAtual, $logerro);
$log[$metodo][] = $str;
if ($MostraLog)
echo "$str\n";
}
}
function LogDiscador($path = '') {
global $log, $pathLog;
if (!$path) {
$path = $pathLog;
}
$arq = fopen($path, 'a');
foreach ($log as $key => $value) {
$strLog = sprintf("%s: Data: %s\n", $key, date("d/m/Y H:i:s"));
fwrite($arq, $strLog);
foreach ($value as $msg) {
fwrite($arq, "$msg\n");
}
fwrite($arq, "\n");
}
fclose($arq);
/*
* Limpa o buffer.
*/
$log = array();
}
//pbx_supervisor_agentes(dac,matricula,ramal,nome,origem_destino,status,duracao,canal,canal_agente,canal_transfer,uniqueid)
function InsereAgente($dadosAgt) {
if (!count($dadosAgt))
throw new Exception('InsereAgente: A variavel $dadosAgt esta vazia!');
$matricula = $dadosAgt['matricula'];
$queryMy = '';
$fields = '';
$values = '';
foreach ($dadosAgt as $key => $value) {
$fields .= !$fields ? sprintf('%s', $key) : sprintf(',%s', $key);
$values .= !$values ? sprintf("%s", QuotedStr($value)) : sprintf(",%s", QuotedStr($value));
}
$queryMy = sprintf("insert into pbx_supervisor_agentes(%s)values(%s)", $fields, $values);
AlimentaLog($queryMy, "InsereAgente", 'Insere Agente', 1);
$resultMy = mysql_query($queryMy);
if (!$resultMy)
throw new Exception("Erro ao importar informações do agente!");
AddAgente($matricula);
}
function AtualizaAgente($matricula, $dac, $dadosAgt) {
if (!count($dadosAgt))
throw new Exception('AtualizaAgente: A variavel $dadosAgt esta vazia!');
$queryMy = '';
$values = '';
foreach ($dadosAgt as $key => $value) {
$values .= !$values ? sprintf("%s = %s", $key, QuotedStr($value)) : sprintf(",%s = %s", $key, QuotedStr($value));
}
$dac = $dac ? " dac = '$dac' " : "";
$queryMy = sprintf("update pbx_supervisor_agentes set %s where %s and matricula = '%s'", $values, $dac, $matricula);
AlimentaLog($queryMy, "AtualizaAgente", 'Atualiza Agente', 1);
$resultMy = mysql_query($queryMy);
if (!$resultMy)
throw new Exception("Erro ao atualizar informações do agente!");
}
function ImPortaAgente($matricula) {
$infoDac = InformacoesDac();
$nomeDac = $infoDac['nome_dac'];
$queryPg = "select dac,matricula,ramal,nome,origem_destino,status,duracao,canal,canal_agente,canal_transfer,uniqueid
from pbx_supervisor_agentes
where dac = '$nomeDac'
and matricula = '$matricula'";
AlimentaLog($queryPg, "ImPortaAgente", 'Importa Agente', 1);
$result = pg_query($queryPg);
if (!$result)
throw new Exception("Não foi possível obter informações do agente. Erro ao conectar ao servidor de origem.");
/*
* Representa os campos da tabela destino.
*/
$fields = array('dac', 'matricula', 'ramal', 'nome', 'origem_destino', 'status', 'duracao', 'canal', 'canal_agente', 'canal_transfer', 'uniqueid');
$source = pg_fetch_array($result);
/*
* Prepara o insert na tabela destino
*/
$queryMy = "insert into pbx_supervisor_agentes(dac,matricula,ramal,nome,origem_destino,status,duracao,canal,canal_agente,canal_transfer,uniqueid)values({dac},{matricula},{ramal},{nome},{origem_destino},{status},{duracao},{canal},{canal_agente},{canal_transfer},{uniqueid})";
foreach ($fields as $field) {
$queryMy = str_replace('{' . $field . '}', QuotedStr($source[$field]), $queryMy);
}
AlimentaLog($queryMy, "ImPortaAgente", 'Insere Agente', 1);
$resultMy = mysql_query($queryMy);
if (!$resultMy)
throw new Exception("Erro ao importar informações do agente!");
AddAgente($matricula);
return true;
}
function AddAgente($matricula) {
global $agentesLogados;
$agentesLogados[$matricula] = 1;
}
function RmAgente($matricula) {
global $agentesLogados;
$agentesLogados[$matricula] = 0;
}
function AgenteLogado($matricula) {
global $agentesLogados;
return (isset($agentesLogados[$matricula]) && ($agentesLogados[$matricula] == 1));
}
function RemoveAgente($matricula) {
$infoDac = InformacoesDac();
$nomeDac = $infoDac['nome_dac'];
$queryMy = "delete from pbx_supervisor_agentes where dac = '$nomeDac' and matricula = '$matricula'";
AlimentaLog($queryMy, "RemoveAgente", '', 1);
$resultMy = mysql_query($queryMy);
if (!$resultMy)
throw new Exception("Erro ao remover o agente: $matricula!");
RmAgente($matricula);
return true;
}
function InformacoesDac() {
global $dadosDac;
/*
* A primeira vez que a consulta é executada
* armazena o retorna no array global $dadosDac.
*/
if (count($dadosDac))
return $dadosDac;
$idCampanha = IdCampanha();
$queryPg = "select cmp_id, cmp_descricao, id_dac, cmp_aguarda_agente, cmp_numero_ligacoes_agente, cmp_ramal, b.nome as nome_dac, b.numero as numero_dac from pbx_campanha a, pbx_dacs b where b.id = a.id_dac and cmp_id = '$idCampanha'";
AlimentaLog($queryPg, "InformacoesDac", 'Campanha', 1);
$result = pg_query($queryPg);
if (!$result)
throw new Exception("Não foi possível importar a campanha. Erro ao conectar ao servidor de origem! Cmd:[$queryPg]");
if (!pg_numrows($result))
throw new Exception("Não existem dados disponíveis na campanha informada! Cmd:[$queryPg]");
$source = pg_fetch_array($result);
$dadosDac = $source;
return $source;
}
function IdCampanha() {
global $idCampanha;
return $idCampanha;
}
function NomeCampanha() {
global $nomeCampanha;
return $nomeCampanha;
}
function RegistraCampanha($id, $nome) {
global $idCampanha, $nomeCampanha;
$idCampanha = $id;
$nomeCampanha = $nome;
}
function Encerra() {
$idCampanha = IdCampanha();
$query = "select * from pbx_campanha where cmp_id = '$idCampanha' and cmp_status = '1'";
$result = mysql_query($query);
return mysql_num_rows($result) ? mysql_fetch_array($result) : false;
}
function CampanhaConcluida() {
// $query = sprintf("select '' from pbx_lista a where cmp_id = %s and cont_discado = '0' and conf_status = '0' ", IdCampanha());
$query = sprintf("select '' from pbx_lista a where cmp_id = %s and cont_discado = '0' ", IdCampanha());
$result = mysql_query($query);
return !mysql_num_rows($result) && !GetCanaisOperacao();
}
function EncerraCampanha($status) {
$idCampanha = IdCampanha();
$query = "update pbx_campanha set cmp_status = '$status' where cmp_id = '$idCampanha'";
mysql_query($query);
return mysql_affected_rows() ? true : false;
}
function RegistraPid() {
$query = sprintf("update pbx_campanha set cmp_pid = %s where cmp_id = '%s'", GetPid(), IdCampanha());
mysql_query($query);
return mysql_affected_rows() ? true : false;
}
function GetPid() {
return getmypid();
}
function MysqlOpen() {
global $hostMy, $userMy, $senhaMy, $baseMy;
$connMy = mysql_pconnect($hostMy, $userMy, $senhaMy);
return ($connMy && mysql_select_db($baseMy)) ? $connMy : false;
}
function PgOpen() {
global $conStr;
$conn = pg_pconnect($conStr);
return $conn ? $conn : false;
}
function EncerraMonitor($pid) {
return true;
$cmd = "kill -9 $pid";
AlimentaLog($cmd, 'EncerraMonitor');
system($cmd);
}
function AnalisaBloco($bloco) {
global $imprimeSaida;
//$dadosAgt=array('dac' => '','matricula' => '','ramal' => '','nome' => '','origem_destino' => '','status' => '','duracao' => '','canal' => '','canal_agente' => '','canal_transfer' => '','uniqueid' => '');
$infoDac = InformacoesDac();
$nomeDac = trim($infoDac['nome_dac']);
$event = $bloco["Event"];
if ($event == "QueueMemberAdded") {
/*
* Event: QueueMemberAdded
* Privilege: agent,all
* Queue: Discador
* Location: Agent/1000
* MemberName: Agent/1000
* Membership: dynamic
* Penalty: 0
* CallsTaken: 0
* LastCall: 0
* Status: 5
* Paused: 0
*/
$dac = trim($bloco["Queue"]);
$tipo = $bloco["Membership"];
if (($dac == $nomeDac) && ($tipo == 'dynamic')) {
$matricula = InfoCanal($bloco["MemberName"]);
$canalAgente = trim($bloco["MemberName"]);
$dadosAgt = array('dac' => $nomeDac, 'matricula' => $matricula, 'status' => 'ADD', 'duracao' => date("Y-m-d H:i:s"), 'canal_agente' => $canalAgente);
InsereAgente($dadosAgt);
}
} else if ($event == "QueueMemberStatus") {
/*
* Event: QueueMemberStatus
* Privilege: agent,all
* Queue: Discador
* Location: Agent/1000
* MemberName: Agent/1000
* Membership: dynamic
* Penalty: 0
* CallsTaken: 1
* LastCall: 1410531414
* Status: 1
* Paused: 0
*/
$dac = $bloco["Queue"];
$tipo = $bloco["Membership"];
if (($dac == $nomeDac) && ($tipo == 'dynamic')) {
$status = $bloco["Status"];
$pausa = $bloco["Paused"];
if ($pausa == '1')
$status = 'PAUSA';
else if ($status == '1')
$status = 'LIVRE';
else
$status = 'CHAMANDO';
$matricula = InfoCanal($bloco["MemberName"]);
$dadosAgt = array('status' => $status);
AtualizaAgente($matricula, $nomeDac, $dadosAgt);
}
}
else if ($event == "Agentlogin") {
/*
* Event: Agentlogin
* Privilege: agent,all
* Agent: 1000
* Channel: Local/4097@app-login-3e60,2
* Uniqueid: 1410444441.68
*/
$ramal = InfoCanal($bloco["Channel"]);
$matricula = trim($bloco["Agent"]);
$dadosAgt = array('ramal' => $ramal, 'status' => 'PAUSA');
AtualizaAgente($matricula, $nomeDac, $dadosAgt);
} else if ($event == "Agentcallbacklogin") {
/*
* Event: Agentcallbacklogin
* Privilege: agent,all
* Agent: 1000
* Loginchan: 4097@app-callcenter
* Uniqueid: 1410526724.168
*/
$ramal = InfoCanal($bloco["Loginchan"], 0);
$matricula = trim($bloco["Agent"]);
$dadosAgt = array('ramal' => $ramal, 'status' => 'PAUSA');
AtualizaAgente($matricula, $nomeDac, $dadosAgt);
} else if ($event == "QueueMemberPaused") {
/*
* Event: QueueMemberPaused
* Privilege: agent,all
* Queue: Discador
* Location: Agent/1000
* MemberName: Agent/1000
* Paused: 0
*/
$dac = trim($bloco["Queue"]);
$pausa = trim($bloco["Paused"]) == "1" ? 'PAUSA' : 'LIVRE';
if ($nomeDac == $dac) {
$matricula = InfoCanal($bloco["MemberName"]);
$dadosAgt = array('status' => $pausa);
AtualizaAgente($matricula, $nomeDac, $dadosAgt);
}
} else if ($event == "QueueMemberRemoved") {
/*
* Event: QueueMemberRemoved
* Privilege: agent,all
* Queue: simples
* Location: Agent/1000
* MemberName: Agent/1000
*/
$dac = trim($bloco["Queue"]);
if ($nomeDac == $dac) {
$matricula = InfoCanal($bloco["MemberName"]);
RemoveAgente($matricula);
}
} else if ($event == "Agentcallbacklogoff") {
/*
* Event: Agentcallbacklogoff
* Privilege: agent,all
* Agent: 1000
* Reason: CommandLogoff
* Loginchan: 1009@app-callcenter
* Logintime: 317
*/
$matricula = $bloco["Agent"];
RemoveAgente($matricula);
} else if ($event == "OriginateResponse") {
/* Event: OriginateResponse
* Privilege: call,all
* ActionID: 245691788631667
* Response: Success
* Channel: Local/392893913@padrao-b700,1
* Context: padrao
* Exten: 6660
* Reason: 4
* Uniqueid: 1410959627.647
* CallerID: 4111
* CallerIDNum: 4111
* CallerIDName: <unknown>
*/
OriginateResponse($bloco);
} else if ($event == "Newchannel") {
/*
* Event: Newchannel
* Privilege: call,all
* Channel: Local/92893913@padrao-0d15,1
* State: Down
* CallerIDNum: <unknown>
* CallerIDName: <unknown>
* Uniqueid: 1410958041.635
* dispositivo: 1410958041.635
*/
Newchannel($bloco);
} else if ($event == "Link") {
/*
* Event: Link
* Privilege: call,all
* Channel1: SIP/4099-0000003a
* Channel2: Agent/1000
* Uniqueid1: 1410468713.137
* Uniqueid2: 1410468714.140
* CallerID1: 4099
* CallerID2: 4099
*/
$matricula = InfoCanal($bloco["Channel2"]);
if (AgenteLogado($matricula)) {
$canal = $bloco["Channel1"];
$fone = $bloco["CallerID1"];
$dadosAgt = array('status' => 'OCUPADO', 'origem_destino' => $fone, 'canal' => $canal);
AtualizaAgente($matricula, $nomeDac, $dadosAgt);
}
LinkAmi($bloco);
} else if ($event == "Unlink") {
/*
* Event: Unlink
* Privilege: call,all
* Channel1: SIP/4099-0000003a
* Channel2: Agent/1000
* Uniqueid1: 1410468713.137
* Uniqueid2: 1410468714.140
* CallerID1: 4099
* CallerID2: 4099
* Source: SIP/4099-0000003a
* Destination: Agent/1000
*/
$matricula = InfoCanal($bloco["Channel2"]);
if (AgenteLogado($matricula)) {
$dadosAgt = array('status' => 'LIVRE', 'origem_destino' => '', 'canal' => '');
AtualizaAgente($matricula, $nomeDac, $dadosAgt);
}
UnlinkAmi($bloco);
} else if ($event == "Rename") {
/* Event: Rename
* Privilege: call,all
* Oldname: Local/92893913@padrao-98d0,1
* Newname: IAX2/SIMPLESIP-29709
* Uniqueid: 1410977797.722
*/
RenameAmi($bloco);
} else if ($event == "Join") {
/*
* Event: Join
* Privilege: call,all
* Channel: SIP/4002-00000155
* CallerID: 4111
* CallerIDName: unknown
* Queue: Discador
* Position: 2
* Count: 2
* Uniqueid: 1411582827.1654
*/
JoinAmi($bloco);
} else if ($event == "Leave") {
/*
* Event: Leave
* Privilege: call,all
* Channel: SIP/4002-00000155
* Queue: Discador
* Count: 1
* Uniqueid: 1411582827.1654
*/
LeaveAmi($bloco);
} else if ($event == "Cdr") {
/*
* Event: Cdr
* Privilege: call,all
* AccountCode:
* Source: 4111
* Destination: 6660
* DestinationContext: padrao
* CallerID: 4111
* Channel: SIP/4002-00000162
* DestinationChannel: Agent/1000
* LastApplication: Queue
* LastData: Discador|t||||agente_fila.php|Discador
* StartTime: 2014-09-24 16
* AnswerTime: 2014-09-24 16
* EndTime: 2014-09-24 16
* Duration: 66
* BillableSeconds: 63
* Disposition: ANSWERED
* AMAFlags: DOCUMENTATION
* UniqueID: 1411590608.1718
* UserField: 6660-1991649899-1411590608.1716.WAV
*/
CdrAmi($bloco);
} else if ($event == "Hangup") {
/*
* Event: Hangup
* Privilege: call,all
* Channel: Agent/1000
* Uniqueid: 1410468714.140
* Cause: 0
* Cause-txt: Unknown
*/
$matricula = InfoCanal($bloco["Channel"]);
$dadosAgt = array('status' => 'LIVRE', 'origem_destino' => '', 'canal' => '');
AtualizaAgente($matricula, $nomeDac, $dadosAgt);
Hangup($bloco);
}
/*
* Imprime os comanados para um arquivo.
*/
if ($imprimeSaida)
ImprimeComando($bloco);
}
function InfoCanal($channel, $arPos = 1, $pattern = '/[\/@]/') {
/*
* Retorna o valor de acordeo com $pattern e posição passados.
* Com a configuração default retorna o ramal a partir do canal(Channel: Local/4097@app-login-3e60,2) do agente
* ou a matricula a partir da String "Agent/NumeroMatricula".
*/
$dados = preg_split($pattern, $channel);
return trim($dados[$arPos]);
}
function Newchannel($bloco) {
$query = "insert into pbx_channels(Channel, CallerIDNum, CallerIDName, Uniqueid)values(%s,%s,%s,%s)";
$query = sprintf($query, QuotedStr($bloco['Channel']), QuotedStr($bloco['CallerIDNum']), QuotedStr($bloco['CallerIDName']), QuotedStr($bloco['Uniqueid'])
);
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "Newchannel", "", 0, 1);
}
}
function JoinAmi($bloco) {
$query = "insert into pbx_join(nome_dac, channel, uniqueid)values(%s,%s,%s)";
$query = sprintf($query, QuotedStr($bloco['Queue']), QuotedStr($bloco['Channel']), QuotedStr($bloco['Uniqueid'])
);
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "JoinAmi", "", 0, 1);
}
}
function LeaveAmi($bloco) {
$query = "delete from pbx_join where uniqueid = %s";
$query = sprintf($query, QuotedStr($bloco['Uniqueid']));
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "LeaveAmi", "", 0, 1);
}
}
function LinkAmi($bloco) {
$query = "insert into pbx_link(Channel1, Channel2, Uniqueid1, Uniqueid2, CallerID1, CallerID2)values(%s,%s,%s,%s,%s,%s)";
$query = sprintf($query, QuotedStr($bloco['Channel1']), QuotedStr($bloco['Channel2']), QuotedStr($bloco['Uniqueid1']), QuotedStr($bloco['Uniqueid2']), QuotedStr($bloco['CallerID1']), QuotedStr($bloco['CallerID2'])
);
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "LinkAmi", "pbx_link", 0, 1);
}
if (stripos($bloco["Channel2"], 'Agent') !== false) {
$matricula = InfoCanal($bloco["Channel2"]);
$query = "update pbx_canais_discando set matricula = %s, channel_rename = %s, channel_link = %s where uniqueid = %s";
$query = sprintf($query, QuotedStr($matricula), QuotedStr($bloco['Channel1']), QuotedStr($bloco['Channel2']), QuotedStr($bloco['Uniqueid1'])
);
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "LinkAmi", "pbx_canais_discando", 0, 1);
}
}
}
function CdrAmi($bloco) { /*
* Event: Cdr
* Privilege: call,all
* AccountCode:
* Source: 4111
* Destination: 6660
* DestinationContext: padrao
* CallerID: 4111
* Channel: SIP/4002-00000162
* DestinationChannel: Agent/1000
* LastApplication: Queue
* LastData: Discador|t||||agente_fila.php|Discador
* StartTime: 2014-09-24 16
* AnswerTime: 2014-09-24 16
* EndTime: 2014-09-24 16
* Duration: 66
* BillableSeconds: 63
* Disposition: ANSWERED
* AMAFlags: DOCUMENTATION
* UniqueID: 1411590608.1718
* UserField: 6660-1991649899-1411590608.1716.WAV
*/
if (!isset($bloco['Channel']))
return;
$duracao = $bloco['BillableSeconds'];
$status = ($duracao > 3) ? CHAMADA_ATENDIDA : CHAMADA_NAOATENDIDA;
$query = "update pbx_canais_discando set status = %s, status_motivo = %s, starttime = %s, answertime = %s, endtime = %s, duration = %s, billableseconds = %s where channel = %s";
$query = sprintf($query, QuotedStr($status), QuotedStr($bloco['Disposition']), QuotedStr($bloco['StartTime']), QuotedStr($bloco['AnswerTime']), QuotedStr($bloco['EndTime']), QuotedStr($bloco['Duration']), QuotedStr($bloco['BillableSeconds']), QuotedStr($bloco['Channel'])
);
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "CdrAmi", "", 0, 1);
}
}
function UnlinkAmi($bloco) {
return true;
}
function Hangup($bloco) {
/*
* Event: Hangup
Privilege: call,all
Channel: SIP/4004-0000017f
Uniqueid: 1411759565.1810
Cause: 16
Cause-txt: Normal Clearing
*/
$uniqueid = $bloco['Uniqueid'];
$qyery = sprintf("select '' from pbx_canais_discando where uniqueid = %s", QuotedStr($uniqueid));
$result = mysql_query($qyery);
if (mysql_num_rows($result)) {
RemoveCanal($bloco['Uniqueid']);
}
}
function RenameAmi($bloco) {
$query = "update pbx_channels set Channel = %s where Channel = %s";
$query = sprintf($query, QuotedStr($bloco['Newname']), QuotedStr($bloco['Oldname'])
);
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "RenameAmi", "pbx_channels", 0, 1);
}
$query = "update pbx_canais_discando set channel_rename = %s where uniqueid = %s";
$query = sprintf($query, QuotedStr($bloco['Newname']), QuotedStr($bloco['Uniqueid'])
);
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "RenameAmi", "pbx_canais_discando", 0, 1);
}
}
function OriginateRegister($bloco) {
$infoDac = InformacoesDac();
@AddCanalDiscando($bloco['cmp_id'], $bloco['uniqueid'], $bloco['channel']);
$query = "insert into pbx_canais_discando(actionid,channel,destino,status,uniqueid,cmp_id,list_id,cont_id,conf_id,status_motivo,originate_status,originate_motivo,id_dac,nome_dac)values(%s,%s,%s,%s,%s,%s,%s,%s,%s,'-1','discando', '-1',%s,%s)";
$query = sprintf($query, QuotedStr($bloco['actionid']), QuotedStr($bloco['channel']), QuotedStr($bloco['destino']), QuotedStr($bloco['status']), QuotedStr($bloco['uniqueid']), QuotedStr($bloco['cmp_id']), QuotedStr($bloco['list_id']), QuotedStr($bloco['cont_id']), QuotedStr($bloco['conf_id']), QuotedStr($infoDac['id_dac']), QuotedStr($infoDac['nome_dac'])
);
$result = mysql_query($query);
AlimentaLog($query, "OriginateRegister", "", 1, 0);
if (!$result) {
AlimentaLog($query, "OriginateRegister", "", 0, 1);
}
}
function StatusListaOpr($confId, $status) {
$query = "update pbx_lista set st_opr = %s where conf_id = %s ";
$query = sprintf($query, QuotedStr($status), QuotedStr($confId));
$result = mysql_query($query);
AlimentaLog($query, "StatusListaOpr", "pbx_lista", 1, 0);
if (!$result) {
AlimentaLog($query, "StatusListaOpr", "", 0, 1);
}
}
function OriginateResponse($bloco) {
/*
* Success indica que a discagem foi efetivada.
*/
$uniqueid = $bloco['Uniqueid'];
$status = $bloco['Response'] == 'Success';
$query = "update pbx_canais_discando set channel = %s, uniqueid = %s, originate_status = %s, originate_motivo = %s, status = %s where actionid = %s";
$query = sprintf($query, QuotedStr($bloco['Channel']), QuotedStr($uniqueid), QuotedStr($bloco['Response']), QuotedStr($bloco['Reason']), QuotedStr($status ? CHAMADA_DISCADA : CHAMADA_INVALIDA), QuotedStr($bloco['ActionID'])
);
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "OriginateResponse", "", 0, 1);
}
if (!$status) {
RemoveCanal($uniqueid, CHAMADA_INVALIDA);
}
}
function RemoveCanal($uniqueid, $status = '') {
/*
* Informações dos contatos.
*/
$query = "select cont_id, conf_id, matricula, status from pbx_canais_discando where uniqueid = %s";
$query = sprintf($query, QuotedStr($uniqueid));
$result = mysql_query($query);
$dados = mysql_fetch_array($result);
$contId = $dados['cont_id'];
$confId = $dados['conf_id'];
$matricula = $dados['matricula'];
if (!$status)
$status = $dados['status'];
if (!$result) {
AlimentaLog($query, "RemoveCanal", "Seleciona Contato", 0, 1);
}
/*
* Altera o status do telefone na lista do discador.
*/
$query = "update pbx_lista set conf_status = %s where conf_id = %s";
$query = sprintf($query, QuotedStr($status), QuotedStr($confId));
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "RemoveCanal", "Atualiza fone Lista", 0, 1);
}
$statusContato = CONTATO_DISCADO;
if ($status != CHAMADA_ATENDIDA) {
/*
* Verifica quantos números ainda faltam discar.
*/
$query = "select count(*) from pbx_lista where cont_id = %s and conf_status = '0'";
$query = sprintf($query, QuotedStr($contId));
$result = mysql_query($query);
$dados = mysql_fetch_row($result);
$numDiscar = $dados[0];
if (!$result) {
AlimentaLog($query, "RemoveCanal", "Qt a discar", 0, 1);
}
$statusContato = ($numDiscar > 0) ? CONTATO_NAO_DISCADO : CONTATO_DISCADO;
}
/*
* Altera o status do contato na lista do discador.
*/
$query = "update pbx_lista set cont_discado = %s where cont_id = %s";
$query = sprintf($query, QuotedStr($statusContato), QuotedStr($contId));
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "RemoveCanal", "Atualiza Contato Lista", 0, 1);
}
/*
* Altera o satus da aplicação.
*/
$query = "update pbx_campanha_contato_fone set conf_status = %s, conf_uid = %s, conf_agente_matricula = %s where conf_id = %s";
$query = sprintf($query, QuotedStr($statusContato), QuotedStr($uniqueid), QuotedStr($matricula), QuotedStr($confId));
$result = pg_query($query);
if (!$result) {
AlimentaLog($query, "RemoveCanal", "Atualiza Fone", 0, 1);
}
$query = "update pbx_campanha_contato set cont_discado = %s where cont_id = %s";
$query = sprintf($query, QuotedStr($statusContato), QuotedStr($contId));
$result = pg_query($query);
if (!$result) {
AlimentaLog($query, "RemoveCanal", "Atualiza Contato", 0, 1);
}
/*
* Apaga o canal.
*/
$query = "delete from pbx_canais_discando where uniqueid = %s";
$query = sprintf($query, QuotedStr($uniqueid));
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, "RemoveCanal", "Deleta Canal", 0, 1);
}
}
function ImprimeComando($bloco) {
global $fileMonitor;
if (count($bloco)) {
foreach ($bloco as $key => $value) {
fwrite($fileMonitor, sprintf("%s: %s\n", $key, $value));
}
fwrite($fileMonitor, "\n");
}
}
function SetVar($name, $var) {
$query = sprintf("delete from pbx_session where sess_name = '%s'", $name);
if (!@mysql_query($query))
return false;
AlimentaLog($var, "SetVar", "Valor bruto", 2);
$var = serialize($var);
AlimentaLog($var, "SetVar", "Serialize", 2);
$var = base64_encode($var);
AlimentaLog($var, "SetVar", "Encode", 2);
$query = sprintf("insert into pbx_session(sess_name, sess_share)values('%s','%s')", $name, $var);
AlimentaLog($query, "SetVar", "Insert", 2);
return mysql_query($query) ? true : false;
}
function GetVar($name) {
$query = sprintf("select sess_share from pbx_session where sess_name = '%s'", $name);
AlimentaLog($query, "GetVar", "Query", 2);
$result = mysql_query($query);
if (!$result)
return false;
$get = mysql_fetch_row($result);
AlimentaLog($get[0], "GetVar", "Valor Banco", 2);
$var = base64_decode($get[0]);
AlimentaLog($var, "GetVar", "Valor Decode", 2);
$var = unserialize($var);
AlimentaLog($var, "GetVar", "Valor Real", 2);
return $var;
}
function ConectaMonitor() {
$tentaviConexao = 0;
$NumeroTentavivas = (TIMEOUT_CONEXAO_MONITOR * 1000000) / TEMPO_TENTATIVA_CONEXAO_MONITOR;
while ($tentaviConexao < $NumeroTentavivas) {
if (($dados = Encerra()) !== false) {
if ($dados['cmp_pid']) {
return $dados['cmp_pid'];
}
}
usleep(TEMPO_TENTATIVA_CONEXAO_MONITOR);
$tentaviConexao++;
}
return false;
}
function Originate($socket, $infoCampanha) {
$infoLog = print_r($infoCampanha, true);
AlimentaLog($infoLog, 'Originate', 'infoCampanha', 2);
$numeroFila = $infoCampanha['numeroFila'];
$destino = $infoCampanha['conf_fone'];
$origem = $infoCampanha['origem'];
$rand = rand(000000000, 9999999999);
fwrite($socket, "Action: Originate\r\n");
fwrite($socket, "Channel: Local/$destino@padrao\r\n"); //Numero discando.
fwrite($socket, "Context: padrao\r\n");
fwrite($socket, "Exten: $numeroFila\r\n"); //Número da fila para qual será redirecionado.
fwrite($socket, "Priority: 1\r\n");
fwrite($socket, "Callerid: $origem\r\n"); //Ramal com permissoes de discagem, não deve estar registrado.
fwrite($socket, "Timeout: 30000\r\n");
fwrite($socket, "Async: True\r\n");
fwrite($socket, "Variable: TIPO-DISCAGEM=APLICACAO|PERMISSAO=OK\r\n");
fwrite($socket, "ActionID: $rand\r\n\r\n");
$blocoCmd['Action'] = "Originate";
$blocoCmd['Channel'] = "Local/$destino@padrao";
$blocoCmd['Context'] = "default";
$blocoCmd['Exten'] = "$numeroFila";
$blocoCmd['Priority'] = "1";
$blocoCmd['Callerid'] = "$origem";
$blocoCmd['Timeout'] = "30000";
$blocoCmd['Async'] = "True";
$blocoCmd['Variable'] = "TIPO-DISCAGEM=APLICACAO|PERMISSAO=OK";
$blocoCmd['ActionID'] = "$rand";
ImprimeComando($blocoCmd);
$bloco = array('actionid' => $rand, 'channel' => '', 'destino' => $destino, 'status' => OPERACAO_INICIADA, 'uniqueid' => '', 'cmp_id' => $infoCampanha['cmp_id'], 'list_id' => $infoCampanha['list_id'], 'cont_id' => $infoCampanha['cont_id'], 'conf_id' => $infoCampanha['conf_id']);
$infoLog = print_r($bloco, true);
AlimentaLog($infoLog, 'Originate', 'Bloco', 2);
OriginateRegister($bloco);
//VerificaRetorno($socket);
}
function ExisteActionId($acId) {
$query = "select count(*) from pbx_canais_discando where actionid = %s";
$query = sprintf($query, QuotedStr($acId));
$result = mysql_query($query);
$row = mysql_fetch_row($result);
return $row[0];
}
function HangupAmi($socket, $channel) {
$rand = rand(000000000, 9999999999);
fwrite($socket, "Action: Hangup\r\n");
fwrite($socket, "Channel: $channel\r\n");
fwrite($socket, "ActionID: $rand\r\n\r\n");
//VerificaRetorno($socket);
}
function VerificaRetorno($socket) {
$i = 0;
$bloco = array();
while (!feof($socket)) {
$bufer = fgets($socket);
$lerBloco = GeraBloco($bufer);
if ($lerBloco) {
list($label, $cmd) = explode(":", $bufer);
$bloco[trim($label)] = trim($cmd);
} else if (count($bloco)) {
//ImprimeComando($bloco);
if (LerBloco($bloco))
AnalisaRetorno($bloco);
$bloco = array();
}
if ((!$lerBloco) && ($i++ > MAX_TENTATIVA_RETORNO))
break;
}
}
function AnalisaRetorno($bloco) {
//
}
function AgentesLivres() {
$infoDac = InformacoesDac();
$nomeDac = $infoDac['nome_dac'];
$queryMy = "select count(*) from pbx_supervisor_agentes where dac = '$nomeDac' and status = 'LIVRE'";
AlimentaLog($queryMy, "AgentesLivres", 'Query', 1);
$resultMy = mysql_query($queryMy);
if (!$resultMy) {
AlimentaLog($queryMy, "AgentesLivres", 'Erro query', 1, 1);
}
$row = mysql_fetch_row($resultMy);
return $row[0];
}
function GetCanaisOperacao() {
$infoDac = InformacoesDac();
$query = sprintf("select count(*) pbx_join where nome_dac = %s", QuotedStr($infoDac['nome_dac']));
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, 'GetCanaisOperacao', '', 0, 1);
}
$row = mysql_fetch_row($result);
return $row[0];
}
function DerrubaCanais($socket) {
$infoDac = InformacoesDac();
$query = sprintf("select * pbx_canais_discando where nome_dac = %s and status = %s", QuotedStr($infoDac['nome_dac']));
$result = mysql_query($query);
if (!$result) {
AlimentaLog($query, 'DerrubaCanais', '', 0, 1);
}
while ($row = mysql_fetch_array($result)) {
$actionid = $row['actionid'];
$cannel = $row['channel_rename'];
HangupAmi($socket, $cannel);
$cannel = $row['channel_link'];
HangupAmi($socket, $cannel);
$query = sprintf("delete from pbx_canais_discando where actionid = %s", QuotedStr($actionid));
@mysql_query($query);
}
}
function ProcessarLista($socket) {
/*
* Informações sobre o Dac e Camapnha.
*/
$infoDac = InformacoesDac();
/*
* Agentes Disponível para o atendimento.
*/
$numAgt = AgentesLivres();
if (!$numAgt) {
/*
* Não existem agentes disponiveis, então derruba todos os canais ativos.
*/
DerrubaCanais($socket);
} else {
/*
* Número de canais selecionados pelo discador que já foram discados
* e ainda não foi completada a operação(Todos os canais presente na
* tabela pbx_canais_discando para a lista atual).
*/
$canaisOperacao = GetCanaisOperacao();
$infoCampanha = array('numeroFila' => $infoDac['numero_dac'], 'origem' => $infoDac['cmp_ramal']);
$numLigacoesAgt = isset($infoDac['cmp_numero_ligacoes_agente']) && $infoDac['cmp_numero_ligacoes_agente'] ? $infoDac['cmp_numero_ligacoes_agente'] : 1;
$limitLigacoes = $numAgt * $numLigacoesAgt;
/*
* Este valor é calculado pelo número de agentes livre no momento por
* o número de canais por agente passado no parametro "cmp_numero_ligacoes_agente"
* "$limitLigacoes = $numAgt * $numLigacoesAgt", para um controle mais efetivo
* diminui-se os canais que já estao em operação "$limitLigacoes = $limitLigacoes - $canaisOperacao".
*
*/
$limitLigacoes = $limitLigacoes - $canaisOperacao;
if ($limitLigacoes > 0) {
/*
* Seleciona para discagem contatos da lista com cont_status = 0, conf_status = 0 e que o ocntato
* não esteja em operação, ou seja, cont_id não estaeja inserido na tabela pbx_canais_discando.
*/
$query = sprintf("select id, cmp_id, list_id, cont_id, conf_id, conf_fone from pbx_lista a where cmp_id = %s and cont_discado = '0' and conf_status = '0' and not exists(select '' from pbx_canais_discando where cont_id = a.cont_id) order by cont_peso, cont_id, conf_id limit %s", $infoDac['cmp_id'], $limitLigacoes);
$result = mysql_query($query);
AlimentaLog($query, 'ProcessarLista', 'Query Lista', 1);
if (!$result) {
AlimentaLog($query, 'ProcessarLista', 'Query Lista Erro', 0, 1);
}
while ($dados = mysql_fetch_array($result)) {
$infoCampanha['cmp_id'] = $dados['cmp_id'];
$infoCampanha['list_id'] = $dados['list_id'];
$infoCampanha['cont_id'] = $dados['cont_id'];
$infoCampanha['conf_id'] = $dados['conf_id'];
$infoCampanha['conf_fone'] = $dados['conf_fone'];
Originate($socket, $infoCampanha);
}
}
}
RemoveCanaisMortos();
if (CampanhaConcluida()) {
EncerraCampanha(CAMPANHA_CONCLUIDA);
}
}
function RemoveCanaisMortos() {
$query = sprintf("select actionid from pbx_canais_discando a where cmp_id = '%s' and coalesce(uniqueid, '') = '' and (now() - data_atual) >= 3 ", IdCampanha());
$result = mysql_query($query);
AlimentaLog($query, 'RemoveCanaisMortos', 'select', 1);
if (!$result) {
AlimentaLog($query, 'RemoveCanaisMortos', 'select', 0, 1);
}
while ($dados = mysql_fetch_row($result)) {
$actionid = $dados[0];
$query = sprintf("update pbx_canais_discando set uniqueid = %s where actionid = %s", $actionid, $actionid);
$resultCmd = mysql_query($query);
if (!$resultCmd) {
AlimentaLog($query, 'RemoveCanaisMortos', 'update', 0, 1);
} else {
RemoveCanal($actionid, CHAMADA_INVALIDA);
}
}
}
function AddCanalDiscando($cmpId, $uniqueId, $canal) {
global $canaisDiscando;
$canaisDiscando[$cmpId][$uniqueId] = $canal;
}
function RemCanalDiscando($cmpId, $uniqueId) {
global $canaisDiscando;
$canaisDiscando[$cmpId][$uniqueId] = '0';
}
function GetCanalDiscando($cmpId, $uniqueId) {
global $canaisDiscando;
return !$canaisDiscando[$cmpId][$uniqueId] ? false : $canaisDiscando[$cmpId][$uniqueId];
}
/*
* Response: Success
ActionID: 24569179085636
Message: Originate successfully queued
Response: Error
ActionID: 245691790886185
Message: Invalid/unknown command
*/
?>