chore(ops): migrate clube67 to newwhats.clube67.com directory
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
This commit is contained in:
@@ -0,0 +1,217 @@
|
||||
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));
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user