✏️ 正在编辑: ChatBot.php
路径:
/srv/systems_dir/yuppiecred/application/models/ChatBot.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php class Model_ChatBot { private $_chaves = [ '{getMargemCPF}', '{getComissao}', '{getMargemBMG}' ]; private $_chave = null; private $_contactPhone; private $_contactName; private $_log; private $_serviceName = 'Digisac'; public function filtrarEventos($request) { $this->_gerarLog(); $contactId = !empty($request['data']['contactId']) ? $request['data']['contactId'] : null; $fromId = !empty($request['data']['fromId']) ? $request['data']['fromId'] : null; $text = !empty($request['data']['text']) ? $request['data']['text'] : ''; // $this->_log->log(print_r($request, 1), Zend_Log::INFO); if ($request['event'] == 'message.created' && $contactId != $fromId && $this->_verificarChave($text) ) { $this->abrirChamado($request); } if ($request['event'] == 'contact.updated') { $this->_identificarCorretor($request); } if ($request['event'] == 'message.created' && $contactId == $fromId) { $this->acionarChamado($request); } } public function abrirChamado($request) { $evento = $request['data']; $this->_identificarCorretor($request); $dbDigisacChamado = new Model_DbTable_DigisacChamados(); $chamado = $dbDigisacChamado->fetchRow([ 'contato_id = ?' => $evento['contactId'], 'finalizado = 0' ]); if (!$chamado) { $dbDigisacChamado->insert([ 'contato_id' => $evento['contactId'], 'contato_fone' => $this->_contactPhone, 'contato_nome' => $this->_contactName, 'chave' => $this->_chave ]); } } protected function _identificarCorretor($request) { $evento = $request['data']; $contactId = !empty($evento['contactId']) ? $evento['contactId'] : null; if(empty($contactId) && $request['event'] == "contact.updated"){ $contactId = $evento['id']; } $corretorBot = new Model_CorretorBot(); $identificacao = $corretorBot->exibir($contactId, $this->_serviceName); $contatoNome = !empty($evento['internalName']) ? $evento['internalName'] : null; $contatoFone = !empty($evento['data']['number']) ? $evento['data']['number'] : null; if( empty($contatoNome) ){ $contatoNome = !empty($evento['name']) ? $evento['name'] : null; } if( empty($identificacao) && !empty($contactId) ){ $corretorBot->setServico($this->_serviceName); $corretorBot->setUserId($contactId); $corretorBot->setContatoNome($contatoNome); $corretorBot->setContatoFone($contatoFone); $corretorBot->salvar($corretorBot); $identificacao = $corretorBot->exibir($contactId, $this->_serviceName); } if(empty($identificacao)){ return; } if( empty($identificacao->contato_fone) && !empty($contatoFone) ){ $identificacao->contato_nome = $contatoNome; $identificacao->contato_fone = $contatoFone; $identificacao->save(); } $this->_contactPhone = $identificacao->contato_fone; $this->_contactName = $identificacao->contato_nome; } public function acionarChamado($request) { $evento = $request['data']; if( empty($evento['contactId']) ){ return; } $dbDigisacChamado = new Model_DbTable_DigisacChamados(); $chamado = $dbDigisacChamado->fetchRow([ 'contato_id = ?' => $evento['contactId'], 'finalizado = 0' ]); $result = false; $validator = new Validators_Cpf(); if ($chamado && $this->_verificarChave($chamado->chave) && $validator->isValid($evento['text'])) { $this->_log->log('Contato Nome: ' . $chamado->contato_nome, Zend_Log::INFO); $this->_log->log('Telefone Contato: ' . $chamado->contato_fone, Zend_Log::INFO); $this->_contactPhone = substr($chamado->contato_fone, 2, strlen($chamado->contato_fone)); switch ($this->_chave) { case "{getMargemCPF}": $this->_enviarResposta("Aguarde enquanto efetuamos a sua consulta."); $result = $this->_getMargemCPF($evento['text']); break; case "{getMargemBMG}": $this->_enviarResposta("Aguarde enquanto efetuamos a sua consulta no BMG."); $result = $this->_getMargemBmg($evento['text']); break; default: $result = "Tipo de consulta não reconhecida!"; break; } } if (!empty($result)) { $chamado->finalizado = 1; $chamado->save(); $alternaMensagem = [ "Olha {$this->_contactName}, o retorno da sua consulta foi o seguinte:\n\n", "Oi {$this->_contactName}, fizemos a consulta e o resultado mando abaixo:\n\n", "Segue retorno da consulta, {$this->_contactName}:\n\n" ]; $mensagem = $alternaMensagem[rand(0, 2)]; $mensagem .= is_array($result) ? $result['mensagem'] : $result; $this->_enviarResposta($mensagem); if (!empty($result['detalhamento'])) { $this->_enviarArquivo("extrato_inss.pdf", $result['detalhamento']); } } } private function _verificarChave($string) { foreach( $this->_chaves as $chave ){ if( strstr($string, $chave) ){ $this->_log->log(print_r($string, 1), Zend_Log::INFO); $this->_chave = $chave; break; } } return $this->_chave ? true : false; } private function _gerarLog() { $dateFile = Zend_Date::now()->get("yyyy-MM-dd"); $urlSistema = Yuppie_Auth::getSiteKey(); $file = "/var/log/sistemayuppie/whatsapp-webhook-digisac-{$urlSistema}-{$dateFile}.txt"; $writer = new Zend_Log_Writer_Stream($file); $this->_log = new Zend_Log($writer); } private function _getMargemCPF($cpf) { $this->_log->log("Entrou no _getMargemCPF", Zend_Log::INFO); $result = "A consulta não retornou nenhum resultado para este CPF"; if ($consultaMargem = Core_Whatsapp_Consulta_Factory::load()){ $result = $consultaMargem->getMargemCPFWhatsapp($cpf, $this->_log); } return $result; } private function _enviarResposta($textoMensagem) { $this->_log->log("Entrou no _enviarResposta", Zend_Log::INFO); if ($whatsapp = Core_Whatsapp_Factory::load()) { $this->_log->log('Enviando mensagem para '. $this->_contactPhone . ' => ' . $textoMensagem, Zend_Log::INFO); return $whatsapp->sendMessage($this->_contactPhone, $textoMensagem); } $this->_log->log("Passou do _enviarResposta sem enviar a mensagem", Zend_Log::INFO); } private function _enviarArquivo($fileName, $fileBase64) { $this->_log->log("Entrou no _enviarArquivo", Zend_Log::INFO); if ($whatsapp = Core_Whatsapp_Factory::load()) { $this->_log->log('Enviando arquivo para '. $this->_contactPhone, Zend_Log::INFO); return $whatsapp->sendFileMessage($this->_contactPhone, $fileName, 'application/pdf', $fileBase64); } $this->_log->log("Passou do _enviarArquivo sem enviar a mensagem", Zend_Log::INFO); } private function _getMargemBmg($cpf) { try{ $bmg = new Core_Banco_Service_Bmg(); $cartoes = $bmg->buscarPorCpf($cpf); }catch( Core_Exception $e ){ return "*Atenção!* " . $e->getMessage(); } catch (Exception $e){ $this->_log->log('Exception: ' . $e->getTraceAsString(), Zend_Log::ERR); return "_Exception: Erro de exceução!_"; } if( empty($cartoes) ){ $this->_log->log('Nenhum cartão retornado', Zend_Log::INFO); return "Nenhuma informação encontrada para esse CPF"; } if( empty($cartoes['cartoes']) ){ return "Nenhum cartão encontrado para esse CPF"; } $this->_log->log('Cartões retornados '. print_r($cartoes, 1), Zend_Log::INFO); $mensagem = ''; foreach( $cartoes['cartoes'] as $cartao ){ $mensagem .= "*Matrícula/Benefício:* " . $cartao['matricula'] . "\n" . "*Margem do cartão:* " . number_format($cartao['valor_margem'], 2, ',', '.') . "\n" . "*Limite Cartão:* " . number_format($cartao['limite_cartao'], 2, ',', '.') . "\n" . "*Máximo Saque Comp.:* " . number_format($cartao['saque_maximo'], 2, ',', '.') . "\n" . "*Mínimo Saque Comp.:* " . number_format($cartao['saque_minimo'], 2, ',', '.') . "\n" . "*Margem Saque Comp.:* " . number_format($cartao['saque_margem_complementar'], 2, ',', '.') . "\n" . "*ADE:* " . $cartao['numeroAdesao'] . "\n" . "*Nº Cartão:* " . $cartao['numeroCartao'] . "\n" . "*Impedimento:* " . (!empty($cartao['mensagemImpedimento']) ? $cartao['mensagemImpedimento'] : "Nenhum") . "\n\n"; } $mensagem .= "*Origem:* BMG"; return $mensagem; } }
💾 保存文件
← 返回文件管理器