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: */ OriginateResponse($bloco); } else if ($event == "Newchannel") { /* * Event: Newchannel * Privilege: call,all * Channel: Local/92893913@padrao-0d15,1 * State: Down * CallerIDNum: * CallerIDName: * 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 */ ?>