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.
1398 lines
51 KiB
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 |
|
*/ |
|
?>
|
|
|