✏️ 正在编辑: Pan.php
路径:
/srv/systems_dir/yuppiecred/library/Core/Banco/Service/Pan.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php use Modules\SimulacaoAberta\Service\SimulacaoAbertaService; class Core_Banco_Service_Pan extends Core_Banco_Service_Autocontratacao_Fgts { protected $_dadosUsuarios; protected $_indiceUsuario = 0; private $_usuarioId; private $_usuario; private $_senha; private $_apiKey; private $_secretKey; private $_authorization; // protected $_url = "https://api.bancopan.com.br/openapi/consignado/v0"; // private $_urlReset = "https://api.bancopan.com.br/openapi/consignado/v0"; protected $_url = "https://ap-gateway-web.bancopan.com.br/openapi/consignado/v0"; private $_urlReset = "https://ap-gateway-web.bancopan.com.br/openapi/consignado/v0"; private $_totalErro = 0; private $_totalHigienizado = 0; private $_totalClientes = 0; private $_bancoId = null; private $_tokenErro = ["Token inválido", "Token expirado"]; private $_origemConsulta; private const ERRO_INSTABILIDADE = 'Nenhuma informação retornada pelo Banco PAN. ' . 'Pode ser uma instabilidade temporária. Tente novamente em instantes.'; function __construct() { $this->_bancoId = Model_Banco::bancoPorNome('PAN'); $this->_bancoLiberacaoApp = "PAN S.A. e PAN Financeira S.A. - Crédito, Financiamento e Investimentos"; if (empty($this->_bancoId)) { throw new Core_Exception("Banco PAN não está cadastrado."); } $application = service('config')->get()->bancos->pan ?? null; if (empty($application)) { $msgErro = 'API do Pan não está configurada.'; throw new Core_Exception($msgErro); } $this->_dadosUsuarios = (Model_UsuariosApi::getByApi('PAN')); if (count($this->_dadosUsuarios) == 0) { $msgErro = 'Nenhum usuário de API cadastrado.'; throw new Core_Exception($msgErro); } $options = [ 'apikey' => $application->apikey, 'secretkey' => $application->secretkey, 'id' => $this->_dadosUsuarios[$this->_indiceUsuario]['id'], 'usuario' => $this->_dadosUsuarios[$this->_indiceUsuario]['usuario'], 'senha' => $this->_dadosUsuarios[$this->_indiceUsuario]['senha'], ]; $this->_origemConsulta = 'PAN'; $this->setOptions($options); } public function setOptions(array $options) { $this->_usuarioId = $options['id']; $this->_usuario = $options['usuario']; $this->_senha = $options['senha']; $this->_apiKey = $options['apikey']; $this->_secretKey = $options['secretkey']; return $this; } public function getUsuario() { return $this->_usuario; } public function setUsuario(string $value) { $this->_usuario = $value; } public function getSenha() { return $this->_senha; } public function setSenha(string $value) { $this->_senha = $value; } public function getUrl() { return $this->_url; } public function getApiKey() { return $this->_apiKey; } public function getSecretKey() { return $this->_secretKey; } public function getAuthorization() { return $this->_authorization; } public function getBancoId() { return $this->_bancoId; } public function getOrigemConsulta() { return $this->_origemConsulta; } /** * @param $clientes * @param $entidade * @param $promotora * @return array * @throws Exception */ public function buscarPorMatriculas($clientes, $entidade, $promotora) { $this->getTokenApi(); if (empty($promotora)) { $dataUsuario = explode("_", $this->getUsuario()); $promotora = $dataUsuario[1] ?? null; } if (empty($entidade)) { $entidade = "007000"; //INSS } foreach ($clientes as $cliente) { $params = [ 'codigo_promotora' => $promotora, 'codigo_convenio' => $entidade, 'cpf_cliente' => $cliente['cpf_cliente'], 'matricula' => $cliente['matricula'], ]; if (empty($cliente['cpf_cliente'])) { continue; } $this->_totalClientes += $this->enviarMatriculasHigienizar($params); } return [ 'total_clientes' => $this->_totalClientes, 'total_success' => $this->_totalHigienizado, 'total_erro' => $this->_totalErro ]; } /** * @throws Exception */ protected function getTokenApi() { $tokenValido = (new Model_DbTable_BancosTokenApi())->checkTokenValido($this->_bancoId, $this->_usuarioId); if ($tokenValido) { $this->_authorization = $tokenValido['token']; return; } $this->newToken(); } protected function newToken() { // $url = "https://api.bancopan.com.br/consignado/v0"; $url = "https://ap-gateway-web.bancopan.com.br/consignado/v0"; $body = json_encode([ 'username' => $this->getUsuario(), 'password' => $this->getSenha(), 'grant_type' => 'client_credentials+password' ]); $endPoint = '/tokens'; $auth = base64_encode($this->getApiKey() . ":" . $this->getSecretKey()); $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $url . $endPoint, CURLOPT_CONNECTTIMEOUT => 15, CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $body, CURLOPT_HTTPHEADER => [ "ApiKey: {$this->_apiKey}", "Authorization: Basic {$auth}", "Content-Type: application/json" ], ]); $response = curl_exec($curl); curl_close($curl); $token = json_decode($response); if (empty($token->token)) { Yuppie_Log::write("Consulta PAN geração de newToken: " . print_r($response, 1), $this); $detalhes = is_array($token->detalhes) ? current($token->detalhes) : ""; if (!$this->setProximoUsuario(true)) { throw new Core_Exception("PAN: " . $token->mensagem . " " . $detalhes); } return $this->newToken(); } $this->_authorization = $token->token; $expiraEm = new Zend_Date($token->expires_in); //GMT (new Model_DbTable_BancosTokenApi())->saveToken($this->_bancoId, $this->_usuarioId, $this->_authorization, $expiraEm->subHour(3)->get('yyyy-MM-dd HH:mm:ss')); Model_UsuariosApi::gravarDataUtilizacao($this->_usuarioId); Yuppie_Log::write("Novo token gerado. Expira em: " . $expiraEm->get('yyyy-MM-dd HH:mm:ss'), $this); } /** * @param $dados * @return int * @throws Exception */ protected function enviarMatriculasHigienizar($dados) { $dadosHigienizados = $this->higienizarCliente($dados); if (!empty($dadosHigienizados->mensagem)) { $message = $dadosHigienizados->mensagem ?? "Nenhuma informação retornada"; $this->_totalErro += 1; return 0; } //limpar contratos PAN do benefício $callcenterBase = (new Model_CallcenterBase())->existeCpf($dados['cpf_cliente']); $clienteEmprestimos = new Model_DbTable_CallcenterEmprestimoCliente(); $clienteEmprestimos->delete( "beneficio = '{$dados['matricula']}' AND base_cliente_id = {$callcenterBase['id']} AND numero_banco = '623'" ); foreach ($dadosHigienizados as $higienizado) { if (is_string($higienizado)) { $this->_totalErro += 1; continue; } $callcenterBase = new Model_CallcenterBase(); $this->_totalHigienizado += $callcenterBase->gravarConsultaPan($higienizado) ? 1 : 0; } return $dadosHigienizados ? 1 : 0; } protected function getResponse($endPoint, $params, $method = 'GET') { $url = $this->_url . $endPoint; $options = [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "ApiKey: {$this->_apiKey}", "Authorization: Bearer {$this->_authorization}", ], CURLOPT_CONNECTTIMEOUT => 30, CURLOPT_TIMEOUT => 30 ]; if ($method == "GET") { $url .= '?' . http_build_query($params); $options[CURLOPT_CUSTOMREQUEST] = "GET"; } elseif ($method == "POST") { $params = json_encode($params); if (empty($params)) { Yuppie_Log::Write("Falha no encode do JSON com a mensagem " . json_last_error_msg(), $this); } $options[CURLOPT_CUSTOMREQUEST] = "POST"; $options[CURLOPT_POSTFIELDS] = $params; $options[CURLOPT_HTTPHEADER][] = "Content-Type: application/json"; } $options[CURLOPT_URL] = $url; Yuppie_Log::write("getResponse Service PAN parâmetros enviados para url {$url}:" . print_r($params, true), $this); $curl = curl_init(); curl_setopt_array($curl, $options); $response = curl_exec($curl); $info = curl_getinfo($curl); curl_close($curl); Yuppie_Log::write("Retorno do getResponse Service PAN:" . print_r($response, true), $this); if (empty($response) || ($info['http_code'] >= 500 && $info['http_code'] <= 599)) { $retorno = new stdClass(); $retorno->detalhes[0] = self::ERRO_INSTABILIDADE; return $retorno; } return $response; } protected function setProximoUsuario($erroAutenticacao = false) { if ($erroAutenticacao) { Model_UsuariosApi::desativarUsuario($this->_usuarioId); } $this->_indiceUsuario++; if (!empty($this->_dadosUsuarios[$this->_indiceUsuario]['id'])) { Yuppie_Log::write("Passando para próximo usuário cadastrado.", $this); $this->_usuarioId = $this->_dadosUsuarios[$this->_indiceUsuario]['id']; $this->_usuario = $this->_dadosUsuarios[$this->_indiceUsuario]['usuario']; $this->_senha = $this->_dadosUsuarios[$this->_indiceUsuario]['senha']; } else { Yuppie_Log::write("Fim dos usuários.", $this); return false; } return true; } /** * @param $dados * @return mixed */ protected function higienizarCliente($dados) { $endPoint = '/emprestimos/contratos'; $response = json_decode($this->getResponse($endPoint, $dados)); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->higienizarCliente($dados); } return $response; } public function consultaFgts($cpf, $qtdParcelas = null, $promotora = null) { if (empty($this->_authorization)) { $this->getTokenApi(); } if (empty($promotora)) { $dataUsuario = explode("_", $this->getUsuario()); $promotora = $dataUsuario[1] ?? null; } $params = [ 'cpf_cliente' => String_Refatorar::formatarCpf($cpf), 'codigo_promotora' => $promotora, 'incluir_seguro' => false, 'data_nascimento' => Zend_Date::now()->subYear(30)->get('dd-MM-yyyy'), ]; if (!empty($qtdParcelas)) { $params['quantidade_parcelas'] = $qtdParcelas; } // $this->_url = "https://api.bancopan.com.br/openapi/consignado/v2"; $this->_url = "https://ap-gateway-web.bancopan.com.br/openapi/consignado/v2"; $endPoint = "/emprestimos/simulacao/fgts"; $response = json_decode($this->getResponse($endPoint, $params, "POST")); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->consultaFgts($cpf, $qtdParcelas, $promotora); } if (!empty($response->condicoes_credito) && count($response->condicoes_credito) > 0) { $tabelas = (new Model_Tabela())->getTabelaAutocontratacao('FGTS', $this->getBancoId()); $codigosTabela = array_map(function($value) { return $value['codigo']; }, $tabelas->toArray()); foreach ($response->condicoes_credito as $condicoesCredito) { if (!in_array($condicoesCredito->codigo_tabela_financiamento, $codigosTabela) || !$condicoesCredito->sucesso) { continue; } $response->condicoes_credito = []; $response->condicoes_credito[0] = $condicoesCredito; break; } } $response->origem_consulta = $this->getOrigemConsulta(); return [$response]; } public function inclusaoFgts($dados, $condicoesCredito, $propostaId) { if (empty($this->_authorization)) { $this->getTokenApi(); } $params = $this->montarParamsFgtsInclusao($dados, $condicoesCredito, $propostaId); // $this->_url = "https://api.bancopan.com.br/openapi/consignado/v1"; $this->_url = "https://ap-gateway-web.bancopan.com.br/openapi/consignado/v1"; $endPoint = "/emprestimos/propostas/fgts"; $response = json_decode($this->getResponse($endPoint, $params, "POST")); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->inclusaoFgts($dados, $condicoesCredito, $propostaId); } return $response; } /** * @return mixed */ protected function consultaPromotora() { if (empty($this->_authorization)) { $this->getTokenApi(); } // $this->_url = "https://api.bancopan.com.br/openapi/consignado/v0"; $this->_url = "https://ap-gateway-web.bancopan.com.br/openapi/consignado/v0"; $endPoint = '/promotoras'; $response = json_decode($this->getResponse($endPoint, [])); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->consultaPromotora(); } return $response; } /** * @param $codPromotora * @return mixed */ protected function consultaDigitador($codPromotora) { if (empty($this->_authorization)) { $this->getTokenApi(); } $this->_url = $this->_urlReset; $endPoint = '/digitadores'; $response = json_decode($this->getResponse($endPoint, ['codigo_promotora' => $codPromotora])); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->consultaDigitador($codPromotora); } $codigoDigitador = null; foreach ($response as $digitador) { if ($digitador->nome == $this->_usuario) { $codigoDigitador = $digitador; break; } } return $codigoDigitador; } protected function consultaUsuarios() { if (empty($this->_authorization)) { $this->getTokenApi(); } // $this->_url = "https://api.bancopan.com.br/openapi/consignado/v0"; $this->_url = "https://ap-gateway-web.bancopan.com.br/openapi/consignado/v0"; $usuarioPan = explode('_', $this->getUsuario()); $endPoint = '/usuarios'; $response = json_decode($this->getResponse($endPoint, ['cpf' => $usuarioPan[0]])); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->consultaUsuarios(); } $codigoUsuario = null; foreach ($response as $digitador) { if ($digitador->identificador == $this->_usuario) { $codigoUsuario = $digitador; break; } } return $codigoUsuario; } /** * @param $dados * @param $condicoesCredito * @param $numeroExterno * @return array */ public function montarParamsFgtsInclusao($dados, $condicoesCredito, $numeroExterno): array { $params = []; $dadosPromotora = current($this->consultaPromotora()); $usuarioPan = explode('_', $this->getUsuario()); $dadosDigitador = $this->consultaDigitador($usuarioPan[1]); try { $dataNascimento = new Zend_Date($dados['data_nascimento']); if ($dados['data_nascimento'] == ($dados['data_nascimento']*1)) { $dataNascimento = new Zend_Date($dados['data_nascimento'], "ddMMyyyy"); } } catch (Zend_Date_Exception $e) { throw new Core_Exception("Data de nascimento ({$dados['data_nascimento']}) é inválida."); } try { $dataEmissao = new Zend_Date($dados['data_emissao_documento']); if ($dados['data_emissao_documento'] == ($dados['data_emissao_documento']*1)) { $dataEmissao = new Zend_Date($dados['data_emissao_documento'], "ddMMyyyy"); } } catch (Zend_Date_Exception $e) { throw new Core_Exception("Data de emissão do documento ({$dados['data_emissao_documento']}) é inválida."); } $params['cliente'] = [ 'nome' => substr($dados['nome'],0,34), 'cpf_cliente' => String_Refatorar::formatarCpf($dados['cpf']), 'numero_documento' => $dados['rg'], 'data_emissao_documento' => $dataEmissao ? $dataEmissao->get('dd-MM-yyyy') : null, 'uf_emissao_documento' => $dados['uf_emissao_documento'], 'data_nascimento' => $dataNascimento->get('dd-MM-yyyy'), 'estado_civil' => $dados['estado_civil'], 'nacionalidade' => $dados['nacionalidade'] ?? 'BRASILEIRA', 'nome_mae' => substr($dados['nome_mae'], 0, 40), 'pessoa_politicamente_exposta' => false, 'renda_valor' => String_Refatorar::parseStringToFloat($dados['renda_valor']) ]; $params['codigo_digitador'] = $dadosDigitador->codigo; $params['codigo_filial'] = $dadosPromotora->filial->codigo; $params['codigo_supervisor'] = $dadosPromotora->supervisor->codigo; $params['codigo_promotora'] = $usuarioPan[1]; $params['cpf_usuario_certificado'] = $usuarioPan[0]; $fone = trim(String_Refatorar::soNumeros($dados['fone'])); $params['cliente']['telefones'][] = [ 'tipo' => $dados['tipo_fone'] ?? 'CELULAR', 'ddd' => substr($fone,0,2), 'numero' => substr($fone, 2, strlen($fone)), 'ramal' => null, ]; $params['cliente']['enderecos'][] = [ 'tipo' => $dados['tipo_endereco'] ?? 'FISICO', 'logradouro' => substr($dados['endereco'], 0, 35), 'numero' => $dados['numero'], 'complemento' => substr($dados['complemento'], 0, 10), 'bairro' => substr($dados['bairro'], 0, 25), 'cidade' => $dados['cidade'], 'uf' => $dados['uf'], 'cep' => $dados['cep'] ]; $codLiberacao = $dados['numero_banco'] == '623' ? '024' : '020'; $codOperacao = $dados['numero_banco'] == '104' ? $dados['cod_oper_cef'] : null; $params['cliente']['dados_bancarios'] = [ 'numero_banco' => $dados['numero_banco'], 'numero_agencia' => String_Refatorar::resetNumero(ltrim($dados['numero_agencia'],'0'), 4), 'digito_agencia' => $dados['digito_agencia'], 'numero_conta' => $dados['numero_conta'], 'digito_conta' => $dados['digito_conta'], 'tipo_conta' => $dados['tipo_conta'] ?? 'CONTA_CORRENTE_INDIVIDUAL', 'CodOperCEF' => $codOperacao, 'codigo_meio_liberacao' => "035" //$codLiberacao ]; unset($condicoesCredito['sucesso']); unset($condicoesCredito['mensagem_erro']); unset($condicoesCredito['api']); unset($condicoesCredito['codigo_orgao']); unset($condicoesCredito['tipo_contrato']); $params['operacoes_credito'][]['condicao_credito'] = $condicoesCredito; $params['id_rastreamento_externo'] = $numeroExterno; Yuppie_Log::write("montarParamsFgtsInclusao => " . print_r($params, true), $this); return $params; } /** * @param int $clienteId * @param $retorno * @return bool * @throws Exception */ public function tratarMensagemErro(int $clienteId, $retorno, $tipo = 'FGTS') { if (empty($retorno)) { throw new Core_Exception(self::ERRO_INSTABILIDADE); } $retorno = is_array($retorno) ? current($retorno) : $retorno; $condicoesCredito = !empty($retorno->condicoes_credito) ? current($retorno->condicoes_credito) : null; if (empty($retorno->detalhes[0]) && empty($condicoesCredito->mensagem_erro)) { return null; } if (empty($retorno->detalhes[0])) { if (!empty($condicoesCredito->mensagem_erro)) { $mensagem = $condicoesCredito->mensagem_erro; } } else { $mensagem = $retorno->detalhes[0]; } if (empty($mensagem)) { throw new Core_Exception('PAN: Erro não informado.'); } if ($tipo == 'FGTS') { $mensagemRetorno = parent::_erroMessageTreatment($mensagem); if (!empty($mensagemRetorno)) { (new Model_DbTable_CallcenterFgts())->insert([ 'base_id' => $clienteId, 'periodo' => 0, 'data_repasse' => null, 'valor' => 0, 'codigo_erro' => $retorno->codigo ?? '0', 'descricao_erro' => $mensagemRetorno['message'], 'origem_consulta' => "PAN" ]); throw new Core_Exception($mensagemRetorno['message'], $mensagemRetorno['code']); } } $serviceInss = new Core_Banco_Service_Autocontratacao_Inss(); $serviceInss->setOrigemConsulta($this->getOrigemConsulta()); $mensagemRetorno = $serviceInss->_erroMessageTreatment($mensagem); if (!empty($mensagemRetorno)) { throw new Core_Exception($mensagemRetorno['message'], $mensagemRetorno['code']); } } public function getProposta($numeroContrato) { if (empty($this->_authorization)) { $this->getTokenApi(); } $this->_url = $this->_urlReset; $endPoint = '/emprestimos/propostas/' . $numeroContrato; $response = json_decode($this->getResponse($endPoint, ['tipo_proposta' => "PROPOSTA_INTERNA"])); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->getProposta($numeroContrato); } if (!empty($response->detalhes)) { throw new Core_Exception("PAN: " . current($response->detalhes)); } return current($response); } public function getUrlFormalizacao($numeroContrato, $cpf) { if (empty($this->_authorization)) { $this->getTokenApi(); } $dataUsuario = explode("_", $this->getUsuario()); $promotora = $dataUsuario[1]; $endPoint = "/formalizador/{$promotora}/{$cpf}/{$numeroContrato}/links"; $response = json_decode($this->getResponse($endPoint, ['tipoEnvio' => 'SMS'])); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->getUrlFormalizacao($numeroContrato, $cpf); } Yuppie_Log::write("Resposta do getUrlFormalizacao: " . print_r($response, true), $this); return $response->linkCliente ?? ""; } public function enviarLinkFormalizacao($numeroContrato, $cpf, $celular) { sleep(2); //aguarda 2s para poder fazer a verificação do fluxo if (empty($celular)) { return; } if (empty($numeroContrato)) { return; } Yuppie_Log::write("Iniciou o processo para envio do link de formalização: " . print_r([ 'numero_contrato' => $numeroContrato, 'cpf' => $cpf, 'celular' => $celular ], true), $this); //verificar o status que ela está. Precisa do status "Aguardando Fluxo Digital" $dadosProposta = $this->getProposta($numeroContrato); if ($dadosProposta->descricao_status != "Aguardando Fluxo Digital") { Yuppie_Log::write("Proposta não está no status " . "\"Aguardando Fluxo Digital\". " . "Dados da proposta no PAN: " . print_r($dadosProposta, true), $this); } if (empty($this->_authorization)) { $this->getTokenApi(); } $dataUsuario = explode("_", $this->getUsuario()); $promotora = $dataUsuario[1]; $cpf = String_Refatorar::formatarCpf($cpf); $celular = String_Refatorar::soNumeros($celular); $endPoint = "/formalizador/{$promotora}/{$cpf}/{$numeroContrato}/links?tipoEnvio=SMS"; $response = json_decode($this->getResponse($endPoint, ['destinatario' => $celular], "POST")); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->enviarLinkFormalizacao($numeroContrato, $cpf, $celular); } Yuppie_Log::write("Resposta do envio de link para o cliente: " . print_r($response, true), $this); return $this->enviarLinkWhatsapp($promotora, $cpf, $numeroContrato, $celular); } public function enviarLinkWhatsapp($promotora, $cpf, $numeroContrato, $celular) { $endPoint = "/formalizador/{$promotora}/{$cpf}/{$numeroContrato}/links"; $response = json_decode($this->getResponse($endPoint, ['tipoEnvio' => 'SMS'])); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->enviarLinkWhatsapp($promotora, $cpf, $numeroContrato, $celular); } Yuppie_Log::write("Resposta do envio de link para o cliente pelo whatsapp: " . print_r($response, true), $this); if (!empty($response->linkCliente)) { (new SimulacaoAbertaService())->notificarLeadLinkFormalizacao($celular, "PAN", $numeroContrato, $response->linkCliente); return $response->linkCliente; } return null; } protected function _consultaCartaoConsignado($dados) { $retorno = new stdClass(); $condicoesCredito = new stdClass(); $condicoesCredito->codigo_produto = "888543"; $condicoesCredito->descricao_produto = "INSS_BENEFICIO_CARTAO"; $condicoesCredito->codigo_tabela_financiamento = "888543"; $condicoesCredito->descricao_tabela_financiamento = "INSS_BENEFICIO_CARTAO"; $condicoesCredito->tipo_operacao = "PROPOSTA_CARTAO"; $condicoesCredito->filial = "016"; $condicoesCredito->valor_liquido = String_Refatorar::parseStringToFloat($dados['valor_solicitado']); $condicoesCredito->valor_financiado = String_Refatorar::parseStringToFloat($dados['valor_solicitado']); $retorno->condicoes_credito[0] = $condicoesCredito; $retorno->cartao = new stdClass(); $retorno->tipo_operacao = "PROPOSTA_CARTAO"; $retorno->cartao->codigo_tabela = "888543"; $retorno->cartao->deseja_saque = true; $retorno->cartao->tipo_saque = 'AVISTA'; $retorno->cartao->valor_saque = String_Refatorar::parseStringToFloat($dados['valor_solicitado']); $retorno->cartao->valor_parcela = (String_Refatorar::parseStringToFloat($dados['valor_solicitado'])*5/100); $retorno->origem_consulta = $this->getOrigemConsulta(); return [$retorno]; } public function consultaConsignado($dados, $promotora = null) { if ($dados['codigo_orgao'] == 'CARTAO BENEFICIO') { return $this->_consultaCartaoConsignado($dados); } if (empty($this->_authorization)) { $this->getTokenApi(); } if (empty($promotora)) { $dataUsuario = explode("_", $this->getUsuario()); $promotora = $dataUsuario[1] ?? null; } $params = $this->montarParamsConsignadoConsulta($dados); $endPoint = !empty($params['endpoint']) ? $params['endpoint'] : "/emprestimos/simulacao"; $response = json_decode($this->getResponse($endPoint, $params, "POST")); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->consultaConsignado($dados, $promotora); } if (is_array($response)) { $response[0]->origem_consulta = $this->getOrigemConsulta(); } return $this->retornoConsignado($response, $dados); } protected function retornoConsignado($response, $dados) { $condicoesCredito = current($response)->condicoes_credito ?? null; if (empty($condicoesCredito)) { throw new Core_Exception("Nenhuma condição de crédito encontrada para os dados fornecidos."); } $tipoTabela = $this->getTipoTabela($dados); foreach ($condicoesCredito as $key => $condicao) { if (!stristr($condicao->descricao_tabela_financiamento, $tipoTabela)) { unset($condicoesCredito[$key]); continue; } } current($response)->condicoes_credito = $condicoesCredito; return $response; } public function getTipoTabela($dados) { $modelTabela = new Model_Tabela(); $whereNot = ['%AUMENTO%', '%REP%', '%LOAS%', '%INVALID%']; $tabelaNormal = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%NORMAL%'], $whereNot); $tabela = !empty($tabelaNormal) ? $tabelaNormal->nome : 'INSS_NOV_NORMAL_A_'; if (!empty($dados['margem_complementar'])) { $whereNot = ['%REP%', '%LOAS%', '%INVALID%']; $tabelaAumento = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%AUMENTO%'], $whereNot); $tabela = !empty($tabelaAumento) ? $tabelaAumento->nome : "INSS_NOV_AUMENTO_NORMAL_A_"; } if ($dados['tipo_beneficio'] == 'LOAS_BPC') { $whereNot = ['%AUMENTO%', '%REP%']; $tabelaLoas = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%LOAS%'], $whereNot); $tabela = !empty($tabelaLoas) ? $tabelaLoas->nome : "INSS_NOV_LOAS_NORMAL"; if (!empty($dados['margem_complementar'])) { $whereNot = ['%REP%']; $tabelaLoasAumento = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%LOAS%', '%AUMENTO%'], $whereNot); $tabela = !empty($tabelaLoasAumento) ? $tabelaLoasAumento->nome : "INSS_NOV_AUMENTO_LOAS_NORMAL"; } if (!empty($dados['possui_representante_legal'])) { $whereNot = ['%NORMAL%', '%AUMENTO%']; $tabelaLoasRep = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%LOAS%', '%REP%'], $whereNot); $tabela = !empty($tabelaLoasRep) ? $tabelaLoasRep->nome : 'INSS_NOV_LOAS_REP_LEGAL'; if (!empty($dados['margem_complementar'])) { $whereNot = ['%NORMAL%']; $tabelaLoasRepAumento = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%LOAS%', '%REP%', '%AUMENTO%'], $whereNot); $tabela = !empty($tabelaLoasRepAumento) ? $tabelaLoasRepAumento->nome : "INSS_NOV_LOAS_AUMENTO_REP_LEGAL"; } } return $tabela; } if (!empty($dados['possui_representante_legal'])) { $whereNot = ['%AUMENTO%', '%LOAS%', '%INVALID%']; $tabelaRep = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%REP%', '%NORMAL%'], $whereNot); $tabela = !empty($tabelaRep) ? $tabelaRep->nome : 'INSS_REP_LEGAL_NOV_NORMAL_A_'; if (!empty($dados['margem_complementar'])) { $whereNot = ['%LOAS%', '%INVALID%']; $tabelaRepAumento = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%REP%', '%NORMAL%', '%AUMENTO%'], $whereNot); $tabela = !empty($tabelaRepAumento) ? $tabelaRepAumento->nome : "INSS_REP_LEGAL_AUMENTO_NOV_NORMAL_A"; } if (!empty($dados['beneficio_invalidez'])) { $whereNot = ['%AUMENTO%', '%LOAS%']; $tabelaRepInvalid = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%REP%', '%INVALID%'], $whereNot); $tabela = !empty($tabelaRepInvalid) ?$tabelaRepInvalid->nome : 'INSS_REP_LEGAL_INVALID_NOV_NORMA'; if (!empty($dados['margem_complementar'])) { $whereNot = ['%LOAS%']; $tabelaRepInvalidAumento = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%REP%', '%AUMENTO%', '%INVALID%'], $whereNot); $tabela = !empty($tabelaRepInvalidAumento) ? $tabelaRepInvalidAumento->nome : "INSS_REP_LEGAL_AUMENTO_INVALID_NOV_NORMA"; } } // if (Core_Util::calcularIdade($dados['data_nascimento'], true) < 18) { // $tabela = !empty($dados['margem_complementar']) ? "INSS_AUMENTO_REP_LEGAL_MENOR_IDADE_NORMA" : 'INSS_REP_LEGAL_MENOR_IDADE_NORMAL'; // } return $tabela; } if (!empty($dados['beneficio_invalidez'])) { $whereNot = ['%REP%', '%AUMENTO%']; $tabelaInvalid = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%INVALID%'], $whereNot); $tabela = !empty($tabelaInvalid) ? $tabelaInvalid->nome : 'INSS_NOV_INVALID_NORMAL'; if (!empty($dados['margem_complementar'])) { $whereNot = ['%REP%']; $tabelaInvalidAumento = $modelTabela->getTabelaAutocontratacaoInss('INSS', $this->_bancoId, ['%INVALID%', '%AUMENTO%'], $whereNot); $tabela = !empty($tabelaInvalidAumento) ? $tabelaInvalidAumento->nome : "INSS_AUMENTO_NOV_INVALID_NORMAL"; } } if ($dados['tipo'] == 'gov_ba') { $tabela = 'GOV_BA_FLEX6'; } if ($dados['tipo'] == 'siape') { $tabela = 'SIAPE_SERV_NOV_NORMAL'; } if (empty($tabelas)) { return $tabela; } foreach ($tabelas as $tab) { if ($tabela == $tab->nome) { return $tabela; } } throw new Core_Exception("PAN: Tabela não habilitada."); } public function montarParamsConsignadoConsulta(array $dados) { $params = []; $dadosPromotora = current($this->consultaPromotora()); $usuarioPan = explode('_', $this->getUsuario()); $valorSolicitado = String_Refatorar::parseStringToFloat($dados['valor_solicitado']); // $this->_url = "https://api.bancopan.com.br/openapi/consignado/v1"; $this->_url = "https://ap-gateway-web.bancopan.com.br/openapi/consignado/v1"; $params = [ 'codigo_filial' => $dadosPromotora->filial->codigo, 'codigo_supervisor' => $dadosPromotora->supervisor->codigo, 'codigo_promotora' => $usuarioPan[1], 'codigo_convenio' => "007000", 'valor' => $valorSolicitado, 'metodo' => 'PARCELA', 'prazo' => null, 'tipo_operacao' => 'MARGEM_LIVRE', 'incluir_seguro' => false ]; try { $dataNascimento = new Zend_Date($dados['data_nascimento']); if ($dados['data_nascimento'] == ($dados['data_nascimento']*1)) { $dataNascimento = new Zend_Date($dados['data_nascimento'], "ddMMyyyy"); } } catch (Zend_Date_Exception $e) { throw new Core_Exception("Data de nascimento ({$dados['data_nascimento']}) é inválida."); } $params['cliente'] = [ 'cpf' => String_Refatorar::formatarCpf($dados['cpf']), 'matricula_preferencial' => !empty($dados['numero_beneficio']) ? $dados['numero_beneficio'] : "12345678", 'data_nascimento' => $dataNascimento->get('dd-MM-yyyy'), 'renda_mensal' => String_Refatorar::parseStringToFloat($dados['renda_valor']) ]; return $this->_getParamsByOrgao($dados['codigo_orgao'], $dados, $params); } public function _getParamsByOrgao(string $orgao, $dados, $params) { switch ($orgao) { case 'AUXILIO BRASIL': $retorno = $this->_getParamsAuxilioBrasil($dados, $params); break; case 'SIAPE': $retorno = $this->_getParamsSiape($params); break; case 'GOV_BA': $retorno = $this->_getParamsGovba($params); break; default: $retorno = $params; } return $retorno; } protected function _getParamsAuxilioBrasil($dados, $params) { $valorSolicitado = (String_Refatorar::parseStringToFloat($dados['valor_solicitado']) * 40 / 100); $rendaMensal = String_Refatorar::parseStringToFloat($dados['valor_solicitado']); $params['codigo_convenio'] = '000542'; $params['valor'] = $valorSolicitado; $params['cliente']['renda_mensal'] = $rendaMensal; return $params; } protected function _getParamsSiape($params) { $this->_url = $this->_urlReset; $params['endpoint'] = "/emprestimos/simulacoes"; $params['codigo_convenio'] = '005001'; $params['metodo'] = 'SOLICITADO'; $dadosUsuario = $this->consultaUsuarios(); $params['codigo_usuario'] = $dadosUsuario->codigo; return $params; } protected function _getParamsGovba($params) { $params['codigo_convenio'] = '000483'; return $params; } public function inclusaoConsignado($dados, $condicoesCredito, $numeroExterno) { if (empty($this->_authorization)) { $this->getTokenApi(); } $params = $this->montarParamsConsignadoInclusao($dados, $condicoesCredito, $numeroExterno); // $this->_url = "https://api.bancopan.com.br/openapi/consignado/v1"; $this->_url = "https://ap-gateway-web.bancopan.com.br/openapi/consignado/v1"; $endPoint = "/emprestimos/propostas"; $response = json_decode($this->getResponse($endPoint, $params, "POST")); if (!empty($response->codigo) && in_array($response->mensagem, $this->_tokenErro) && $this->_countRequest <= 3) { $this->newToken(); return $this->inclusaoConsignado($dados, $condicoesCredito, $numeroExterno); } if (is_array($response)) { $response[0]->origem_consulta = $this->getOrigemConsulta(); if (!empty($response[0]->id)) { $response[0]->numero_proposta = $response[0]->id; $response[0]->url_formalizacao = $this->getUrlFormalizacao($response[0]->id, $params['cliente']['cpf']); } } return $response; } public function montarParamsConsignadoInclusao(array $dados, $condicoesCredito, $numeroExterno) { $params = []; $dadosPromotora = current($this->consultaPromotora()); $usuarioPan = explode('_', $this->getUsuario()); $dadosDigitador = $this->consultaDigitador($usuarioPan[1]); $valorRenda = String_Refatorar::parseStringToFloat($dados['renda_valor']); $params = [ 'codigo_convenio' => "007000", 'codigo_filial' => $dadosPromotora->filial->codigo, 'codigo_meio_liberacao' => '100', 'codigo_orgao' => $dados['tipo_beneficio'] == 'PENSIONISTA' ? '000502' : "000501", 'codigo_promotora' => $usuarioPan[1], 'codigo_digitador' => $dadosDigitador->codigo, 'codigo_supervisor' => $dadosPromotora->supervisor->codigo, 'cpf_usuario_certificado' => $usuarioPan[0], 'tipo_formalizacao' => 'DIGITAL', 'id_rastreamento_externo' => $numeroExterno ]; try { $dataNascimento = new Zend_Date($dados['data_nascimento']); if ($dados['data_nascimento'] == ($dados['data_nascimento']*1)) { $dataNascimento = new Zend_Date($dados['data_nascimento'], "ddMMyyyy"); } } catch (Zend_Date_Exception $e) { throw new Core_Exception("Data de nascimento ({$dados['data_nascimento']}) é inválida."); } try { $dataEmissao = new Zend_Date($dados['data_emissao_documento']); if ($dados['data_emissao_documento'] == ($dados['data_emissao_documento']*1)) { $dataEmissao = new Zend_Date($dados['data_emissao_documento'], "ddMMyyyy"); } } catch (Zend_Date_Exception $e) { throw new Core_Exception("Data de emissão do documento ({$dados['data_emissao_documento']}) é inválida."); } $params['cliente'] = [ 'codigo_tipo_beneficio' => $dados['especie'] ?? null, 'cpf' => String_Refatorar::formatarCpf($dados['cpf']), 'data_emissao_documento' => $dataEmissao ? $dataEmissao->get('dd-MM-yyyy') : null, 'uf_emissao_documento' => $dados['uf_emissao_documento'], 'tipo_documento' => "RG", 'data_nascimento' => $dataNascimento->get('dd-MM-yyyy'), 'estado_civil' => $dados['estado_civil'] ?? "SOLTEIRO", 'matricula_preferencial' => $dados['numero_beneficio'], 'nacionalidade' => 'BRASILEIRA', 'nome' => substr($dados['nome'], 0, 35), 'numero_documento' => $dados['rg'], 'pessoa_politicamente_exposta' => false, 'renda_valor' => $valorRenda, 'nome_mae' => substr($dados['nome_mae'], 0, 40), 'sexo' => $dados['sexo'] == "F" ? "FEMININO" : "MASCULINO" ]; if (!empty($dados['possui_representante_legal'])) { $params['cliente']['representante_legal'] = [ 'nome_representante_legal' => $dados['nome_representante_legal'], 'cpf_representante_legal' => String_Refatorar::soNumeros($dados['cpf_representante_legal']) ]; } $tipoConta = in_array($dados['cod_oper_cef'], ["001", "002", "023", "032", "037"]) ? 'CONTA_CORRENTE_INDIVIDUAL' : 'CONTA_POUPANCA_INDIVIDUAL'; $params['cliente']['dados_bancarios'][] = [ 'numero_banco' => $dados['numero_banco'], 'numero_agencia' => String_Refatorar::resetNumero(ltrim($dados['numero_agencia'],'0'), 4), 'numero_conta' => $dados['numero_conta'], 'digito_conta' => $dados['digito_conta'], 'tipo_conta' => $tipoConta ]; if ($dados['numero_banco'] == '104') { $params['cliente']['dados_bancarios'][0]['codigo_operacao'] = $dados['cod_oper_cef']; } $params['cliente']['enderecos'][] = [ 'bairro' => String_Refatorar::removeAspas(substr($dados['bairro'], 0, 25)), 'cep' => $dados['cep'], 'cidade' => String_Refatorar::removeAspas($dados['cidade']), 'logradouro' => String_Refatorar::removeAspas(substr($dados['endereco'], 0, 35)), 'numero' => $dados['numero'], 'tipo' => $dados['tipo_endereco'] ?? 'FISICO', 'uf' => $dados['uf'], ]; $fone = trim(String_Refatorar::soNumeros($dados['fone'])); $params['cliente']['telefones'][] = [ 'tipo' => $dados['tipo_fone'] ?? 'CELULAR', 'ddd' => substr($fone,0,2), 'numero' => substr($fone, 2, strlen($fone)), 'ramal' => null, ]; if ($condicoesCredito['tipo_operacao'] == "PROPOSTA_CARTAO") { $params['cartao'] = [ 'codigo_tabela' => $condicoesCredito['codigo_tabela_financiamento'], 'deseja_saque' => true, 'valor_saque' => String_Refatorar::parseStringToFloat($dados['valor_solicitado']), 'margem_rmc' => ($valorRenda * 5 / 100), 'seguro' => false, 'tipo_saque' => 'AVISTA' ]; $params['cliente']['dados_bancarios'][0]['conta_para_recebimento'] = true; $params['cliente']['dados_bancarios'][0]['cartao_magnetico'] = false; } $this->_getParamsInclusaoEspecifico($dados, $params); unset($condicoesCredito['sucesso']); unset($condicoesCredito['mensagem_erro']); unset($condicoesCredito['login_certificado']); unset($condicoesCredito['api']); unset($condicoesCredito['simulacao_id']); unset($condicoesCredito['base_id']); unset($condicoesCredito['banco_id']); unset($condicoesCredito['codigo_orgao']); unset($condicoesCredito['tipo_contrato']); $params['operacoes_credito'][0]['tipo_operacao'] = $condicoesCredito['tipo_operacao'] ?? 'MARGEM_LIVRE'; $params['operacoes_credito'][0]['condicao_credito'] = $condicoesCredito; Yuppie_Log::write("montarParamsConsignadoInclusao => " . print_r($params, true), $this); return $params; } public function _getParamsInclusaoEspecifico($dados, &$params) { switch ($dados['codigo_orgao']) { case 'AUXILIO BRASIL': $params['codigo_orgao'] = "542000"; $params['codigo_convenio'] = "000542"; $params['cliente']['renda_valor'] = String_Refatorar::parseStringToFloat($dados['valor_solicitado']); break; case 'SIAPE': $params['codigo_convenio'] = "005001"; $params['codigo_orgao'] = "500100"; break; case 'GOV_BA': $params['codigo_convenio'] = "000483"; $params['codigo_orgao'] = "483001"; unset($params['cliente']['codigo_tipo_beneficio']); break; case 'CARTAO BENEFICIO': $params['codigo_orgao'] = "000543"; $params['codigo_secretaria'] = "001"; $params['codigo_lotacao'] = "0001"; $dadosUsuario = $this->consultaUsuarios(); $params['codigo_usuario'] = $dadosUsuario->codigo; $params['nome_operador'] = substr($dadosUsuario->nome, 0, 20); break; } } }
💾 保存文件
← 返回文件管理器