✏️ 正在编辑: Sonax.php
路径:
/srv/systems_dir/yuppiecred-lidernegocios/library/Core/Discador/Sonax.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php class Core_Discador_Sonax extends Core_Discador_Abstract { const BASE_URL = 'http://api.sonax.net.br/a2billing_v2/admin/Public/dbdial_webapi.php?'; public $discador = 'Sonax'; public $arquivo = 'uploads/contatos.csv'; public $statusNaoTabular = ['falando']; public function __construct($noficicacao) { parent::__construct($noficicacao); $this->carregarConfiguracao(); } public function lancarChamadaDiscador(array &$chamadas, $dadosCampanha) { $this->pausarAtivarCampanha('stop_campanha', $dadosCampanha['codigo']); $prioridades = []; $campanhaDiscadorId = $dadosCampanha['codigo']; $arquivo = $this->gerarArquivoCSV(); foreach ($chamadas as $chamada) { if (array_key_exists($chamada['contato_id'], $prioridades)) { $prioridades[$chamada['contato_id']] += 1; } else { $prioridades[$chamada['contato_id']] = 1; } $numero = self::trataNumeroTelefone($chamada['numero']); if( !(new Yuppie_Validate_Phone())->isValid($numero) ){ continue; } $this->adicionarConteudo($arquivo, [ $chamada['contato_id'], $numero, $prioridades[$chamada['contato_id']], $chamada['telefone_id'] ]); } $this->fecharArquivo($arquivo); $cFile = new CURLFile($this->arquivo, 'text/csv', $this->arquivo); $data = [ 'token' => $this->parametrosConfiguracao['api_token'], 'id_cliente' => $this->parametrosConfiguracao['id'], 'acao' => 'upload_arquivo_contato', 'id_campanha' => $campanhaDiscadorId, 'arquivo' => $cFile, ]; $result = $this->enviaCSV(self::BASE_URL, $data); $linhas = explode('<br>', $result); foreach ($linhas as $linha) { if (empty($linha)) continue; list($numeroId, $contatoId, $numero) = explode(',', $linha); if (empty($contatoId)) continue; $this->dbTableTelefones->update([ 'discador_status' => 'ENVIADO', 'discador_chamada_id' => $numeroId, ], "cliente_id = {$contatoId} AND fone = '{$numero}' AND excluido = 0"); } unlink(publicPath("/" . $this->arquivo)); return [ 'status' => true, 'mensagem' => count($chamadas) . ' chamadas enviadas ao discador!' ]; } public function consultarUnicaChamada($chamadaId) { $url = $this->_montaUrl([ 'acao' => 'status_chamada', 'id_chamada' => $chamadaId ]); $retornoSonax = $this->envia($url); if ($retornoSonax == '404 not found') { return 'error_sonax'; } return current(explode('|', $retornoSonax)); } /** * Metodo responsavel por consultar status de uma chamada e atualizar esse status no banco * @param array $chamadas * @param int $campanhaDiscadorId * @return array */ public function consultarChamadasDiscador(array $chamadas, int $campanhaDiscadorId) { $limite = $this->validaQuantidadeParaEnvio(count($chamadas)); $contador = 0; while ($contador < $limite) { $retornoSonax = $this->consultarUnicaChamada($chamadas[$contador]['chamada_id']); $this->dbTableTelefones->update([ 'discador_status' => $retornoSonax, ], "id = {$chamadas[$contador]['telefone_id']}"); unset($url); $contador++; } return [ 'status' => true, 'mensagem' => "$contador chamadas consultadas!" ]; } public function listarMotivoPausas() { $url = $this->_montaUrl([ 'acao' => 'lista_pausas', ]); $retornoSonax = $this->envia($url); if( empty($retornoSonax) ){ return []; } $linhas = explode("<br>", $retornoSonax); $retorno = []; foreach( $linhas as $linha ){ if( empty($linha) ){ continue; } $campos = explode("|", $linha); $retorno[] = [ "id" => $campos[0], "descricao" => $campos[1], ]; } return $retorno; } public function atendentePausaOuRetorno($acao, $agenteIdDiscador, $motivo = null) { $params = [ 'acao' => $acao, 'id_atendente' => $agenteIdDiscador ]; if( $acao == "pausar" && !empty($motivo) ){ $pausas = $this->listarMotivoPausas(); foreach( $pausas as $pausa ){ if( $pausa['descricao'] == $motivo ){ $params['id_motivo'] = $pausa['id']; break; } } } $url = $this->_montaUrl($params); $retornoSonax = $this->envia($url); if ( $retornoSonax == 1 ) { return [ 'status' => true, 'mensagem' => 'Status do Ramal atualizado' ]; }elseif( is_string($retornoSonax) ){ return [ 'status' => false, 'mensagem' => $retornoSonax ]; } return [ 'status' => false, 'mensagem' => 'Algo errado aconteceu, verifique se o agente esta está logado!' ]; } public function listarTabulacao() { $url = $this->_montaUrl(['acao' => 'lista_tabulacao']); $retonoSonax = $this->envia($url); if ($retonoSonax == '404 not found') { return false; } return $retonoSonax; } public function tabularChamada($campanhaId, $chamadaId, $tabulacaoId) { $url = $this->_montaUrl([ 'acao' => 'atualiza_tabulacao_contato', 'id_campanha' => $campanhaId, 'id_contato_campanha' => $chamadaId, 'id_tabulacao' => $tabulacaoId ]); return $this->envia($url); } //Alerar metodo para enviar request via post, para a tabulacao funcionou! private function _montaUrl(array $parametros) { if (!count($parametros) > 0) return false; $url = self::BASE_URL; $contador = 1; $parametros = array_merge($parametros, [ 'token' => $this->parametrosConfiguracao['api_token'], 'id_cliente' => $this->parametrosConfiguracao['id'] ]); foreach ($parametros as $key => $value) { $url .= $contador++ > 1 ? "&$key={$value}" : "$key={$value}"; } return str_replace(' ', '', $url); } public function getStatus() : Array { return [ 'indisponivel' => "Número de destino está indisponível ou não atendeu a chamada", 'ENVIADO' => "Enviado para discador", 'campanha' => "Inserido na campanha e será trabalhado", 'andamento' => "Chamada esta em andamento na discadora", 'ramal atendeu' => "PA/Ramal atendeu a chamada direcionada", 'ramal falhou' => "PA/Ramal não atendeu a chamada direcionada", 'discando' => "Chamada já foi atendida pela PA/Ramal e foi para discagem ao número de destino", 'falando' => "PA/Ramal e número de destino estão em conversação", 'ocupado' => "Número de destino está ocupado", 'desligada' => "Chamada foi desligada após ter sido bem-sucedida (falada)", ]; } public function atendenteLogout($atendenteId) { $url = $this->_montaUrl([ 'acao' => 'logout', 'id_atendente' => $atendenteId, ]); return $this->envia($url); } public function getGravacao($chamadaId) { $url = $this->_montaUrl([ 'acao' => 'pega_gravacao', 'id_chamada' => $chamadaId, ]); return $url; } public function pausarAtivarCampanha($acao, $campanhaId) { $params = [ 'acao' => $acao, 'id_campanha' => $campanhaId ]; $url = $this->_montaUrl($params); $retornoSonax = $this->envia($url); if( $retornoSonax == 1 ){ return true; } return false; } public function consultarStatusOperador($operadorId) { $params = [ 'acao' => 'status_atendente', 'id_atendente' => $operadorId ]; $url = $this->_montaUrl($params); return $this->envia($url); } public function relatorioUraReversa($campanhaId, $dataInicial, $dataFinal) { $params = [ 'acao' => 'relatorio_ura', 'id_campanha' => $campanhaId, 'data_ini' => $dataInicial, 'data_fim' => $dataFinal, ]; $url = $this->_montaUrl($params); $retornoSonax = $this->envia($url); if ($retornoSonax == '404 not found') { return false; } return $retornoSonax; } public function gerarArquivoCSV() { return fopen(publicPath("/" . $this->arquivo), 'w'); } public function adicionarConteudo($file, Array $colunas, $delimiter = ',') { fputcsv($file, $colunas, $delimiter); } public function fecharArquivo($arquivo) { fclose($arquivo); } public function listarCampanhas() { $params = [ 'acao' => 'lista_campanha', 'id_campanha' => 'todas', ]; $url = $this->_montaUrl($params); $retorno = $this->envia($url); $campanhas = explode('<br>', $retorno); foreach ($campanhas as $campanha) { $dados = explode('|', $campanha); $arrayCampanhas[$dados[0]] = $dados; } return $arrayCampanhas; } }
💾 保存文件
← 返回文件管理器