const axios = require('axios'); const qs = require('qs'); const mysql = require('mysql2/promise'); // Configurações const CREDENTIALS = { usuario: '0005010', senha: 'Cclinic#03' }; const DB_CONFIG = { host: 'localhost', user: 'root', password: '', database: 'cassems_automation' }; class CassemsRobot { constructor() { this.client = axios.create({ baseURL: 'https://viventeris.topsaudehub.com.br/api/APICredenciado/api', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36', 'Accept': 'application/json, text/plain, */*' } }); this.token = null; } async login() { console.log('🔐 Autenticando no portal...'); const loginUrl = 'https://viventerisportalcredenciado.topsaudehub.com.br/credenciado/Account/AutenticarCredenciado/?returnUrl='; const payload = qs.stringify({ ...CREDENTIALS, 'token': '', 'login-submit': 'ENTRAR' }); const res = await axios.post(loginUrl, payload, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, maxRedirects: 0, validateStatus: s => s < 400 }); // Extrair Token do Cookie const cookies = res.headers['set-cookie'] || []; const tokenCookie = cookies.find(c => c.includes('TOKEN=bearer')); if (!tokenCookie) { console.log('Cookies recebidos:', cookies); throw new Error('Token não encontrado nos cookies de resposta.'); } // Decodificar o token da URL (substituir %20 por espaço se necessário) const rawToken = tokenCookie.split('TOKEN=')[1].split(';')[0]; this.token = decodeURIComponent(rawToken).replace('bearer ', ''); this.client.defaults.headers.common['Authorization'] = `bearer ${this.token}`; console.log('✅ Autenticado com sucesso! Token JWT capturado.'); } async buscarBeneficiario(cpf) { const cpfLimpo = cpf.replace(/\D/g, ''); console.log(`🔍 Buscando beneficiário CPF: ${cpf}...`); const payload = { codPrestadorTs: "501", numAssociado: "", numCpf: cpfLimpo, numRg: "", nomeAssociado: "", numPedido: "", numProtocoloAns: "", tipoPrestador: "D" }; const res = await this.client.post('/beneficiario/buscaBeneficiario', payload); if (res.data && res.data.length > 0) { const b = res.data[0]; console.log('DEBUG - Estrutura do Beneficiário:', JSON.stringify(b, null, 2)); // Mapeamento correto conforme o DEBUG b.nome_final = b.nome_associado || b.NOM_PESSOA || "NOME DESCONHECIDO"; b.id_final = b.cod_ts || b.COD_TS || "ID DESCONHECIDO"; console.log(`👤 Beneficiário Encontrado: ${b.nome_final} (ID: ${b.id_final})`); return b; } console.log('⚠️ Beneficiário não encontrado.'); return null; } async lancarGuia(beneficiario, procedimento, dente, face) { console.log(`🚀 Lançando guia para ${beneficiario.nome_final}...`); const dataHoje = new Date().toLocaleDateString('pt-BR'); const payload = { "dadosAtendimento": [{ "codPrestadorTs": "501", "codTs": beneficiario.cod_ts, "numAssociado": beneficiario.num_associado, "nomeAssociado": beneficiario.nome_associado, "indSexo": beneficiario.indSexo || "", "codPlano": beneficiario.codPlano || "", "codEmpresa": beneficiario.codEmpresa || "", "numCPF": beneficiario.cpf || "", "numContrato": beneficiario.numContrato || "", "numAssociadoTitular": beneficiario.numAssociadoTitular || "", "nomeAssociadoTitular": beneficiario.nomeAssociadoTitular || "", "nomeContrato": beneficiario.nomeContrato || "", "num_ddd_cel_contato": "", "num_cel_contato": "", "num_ddd_res_contato": "", "num_res_contato": "", "txt_end_email_contato": "" }], "dadosProfissional": [{ "codProExecutanteTs": "502", "atendimentoRN": "N", "enderecoAtendimento": "1", "cnes": "9999999", "dataSolicitacao": dataHoje, "tipoAtendimento": "1", "nomeProfissionalExecutante": "RUI CESAR VARGAS CASANOVA", "croExecutante": "07381", "ufExecutante": "MS", "cboExecutante": "", "nomeProfissionalSolicitante": "Murilo", "croSolicitante": "", "ufSolicitante": "", "codCboSolicitante": "", "observacaoJustificativa": "" }], "autorizacaoItem": [{ "num_seq_item": 1, "item_medico": procedimento, "nome_item": "PROCEDIMENTO VIA ROBÔ", "dente_regiao": dente, "cod_face": face, "ind_rx_odonto": "N", "ind_foto": "N", "ind_laudo": "N", "qtd_procedimento": "1" }], "situacaoInicial": [], "ortodontiaPartial": [], "prorrogacaoPartial": [], "ExisteProrrogacao": "N", "ExisteOrtodontia": "N", "TratamentoTransferido": "N", "NumeroTratamento": "", "CodUsuario": "0005010", "NumSeqPedidoUltimo": "" }; const res = await this.client.post('/autorizacao/NovoTratamento', payload); if (res.data) { console.log('✅ Guia Processada com Sucesso!'); return res.data; } throw new Error('Falha no processamento da guia.'); } async registrarNoBanco(dados) { const connection = await mysql.createConnection(DB_CONFIG); await connection.execute( 'INSERT INTO guias_pendentes (cpf, procedimento, dente, face, status, gto) VALUES (?, ?, ?, ?, ?, ?)', [dados.cpf, dados.procedimento, dados.dente, dados.face, dados.status, dados.gto || null] ); console.log('💾 Registro salvo no MySQL.'); await connection.end(); } } // Execução de Teste (async () => { const robot = new CassemsRobot(); try { await robot.login(); const cpf = '005.983.051-49'; const proc = '85100196'; const dente = '11'; const face = 'V'; const beneficiario = await robot.buscarBeneficiario(cpf); if (beneficiario) { const resultado = await robot.lancarGuia(beneficiario, proc, dente, face); console.log('Dados do Retorno da API:', JSON.stringify(resultado, null, 2)); // Tenta capturar o número da guia se existir no JSON const numeroGuia = resultado.NumeroTratamento || resultado.numGuia || "VER_LOG"; await robot.registrarNoBanco({ cpf: cpf, procedimento: proc, dente: dente, face: face, status: 'AUTORIZADO (AXIOS)', gto: numeroGuia }); } console.log('\n🔥 SUCESSO TOTAL! Guia lançada via API em milissegundos.'); } catch (e) { console.error('❌ Erro no Robô:', e.message); if (e.response) console.log('Detalhes:', JSON.stringify(e.response.data, null, 2)); } })();