Files
clube67_newwhats.local/base-scoreodonto/axios-engine/robot-axios-v1.js
T
VPS 4 Deploy Agent 5ec6bd6354
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
chore(ops): migrate clube67 to newwhats.clube67.com directory
2026-05-18 03:26:41 +02:00

218 lines
7.8 KiB
JavaScript

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));
}
})();