218 lines
7.8 KiB
JavaScript
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));
|
|
}
|
|
})();
|