chore(ops): migrate clube67 to newwhats.clube67.com directory
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)

This commit is contained in:
VPS 4 Deploy Agent
2026-05-18 03:26:41 +02:00
parent 298b1c64b0
commit 5ec6bd6354
576 changed files with 29016 additions and 235673 deletions
@@ -0,0 +1,91 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
});
const page = await context.newPage();
try {
console.log('Realizando login para exploração...');
await page.goto('https://viventerisportalcredenciado.topsaudehub.com.br/', { waitUntil: 'networkidle' });
await page.fill('#usuario', '0005010');
await page.fill('#senha', 'Cclinic#03');
await page.click('#login-submit');
await page.waitForURL('**/AreaLogada**');
console.log('Login realizado. Explorando menu...');
// Esperar o menu carregar
await page.waitForTimeout(3000);
// Listar menus principais
const menuNames = ['Tratamento Odontológico', 'Elegibilidade', 'Faturamento', 'Solicitações Diversas'];
for (const name of menuNames) {
console.log(`Clicando no menu: ${name}`);
try {
await page.click(`text="${name}"`, { timeout: 2000 });
await page.waitForTimeout(1000);
} catch (e) {
console.log(`Erro ao clicar em ${name}: ${e.message}`);
}
}
// Tentar clicar em Solicitações Diversas -> Inclusão
console.log('Navegando em Solicitações Diversas -> Inclusão...');
try {
await page.click('text="Solicitações Diversas"');
await page.waitForTimeout(500);
await page.click('text="Inclusão"');
await page.waitForTimeout(2000);
console.log('URL após clicar em Inclusão:', page.url());
} catch (e) {
console.log('Falha ao seguir caminho Inclusão:', e.message);
}
// Listar links com palavras-chave
const guiaLinks = await page.evaluate(() => {
const keywords = ['guia', 'sadt', 'consulta', 'externa', 'recebimentos', 'faturamento', 'lote'];
return Array.from(document.querySelectorAll('a')).map(a => ({
text: a.innerText.trim(),
href: a.getAttribute('href')
})).filter(l => keywords.some(k => l.text.toLowerCase().includes(k)) || keywords.some(k => (l.href || '').toLowerCase().includes(k)));
});
console.log('Links relacionados a guias encontrados:', JSON.stringify(guiaLinks, null, 2));
// Listar TODOS os links do DOM para ver os caminhos
const allLinks = await page.evaluate(() => {
return Array.from(document.querySelectorAll('a')).map(a => ({
text: a.innerText.trim().replace(/\n/g, ' '),
href: a.getAttribute('href'),
visible: a.offsetParent !== null
}));
});
console.log('--- TODOS OS LINKS ENCONTRADOS (VISÍVEIS E INVISÍVEIS) ---');
allLinks.forEach(l => {
if (l.text && !l.href.includes('void(0)') && !l.href.startsWith('#')) {
console.log(`[${l.visible ? 'VISÍVEL' : 'OCULTO'}] ${l.text} -> ${l.href}`);
}
});
// Tirar um "print" da estrutura do menu principal
const menuStructure = await page.evaluate(() => {
// Tenta encontrar o container principal do menu (geralmente nav ou ul com classes específicas)
const nav = document.querySelector('nav, ul.navbar-nav, .sidebar, #menu');
return nav ? nav.innerText : 'Container de menu não identificado diretamente';
});
console.log('Estrutura de texto do menu:', menuStructure);
} catch (error) {
console.error('Erro na exploração:', error);
} finally {
console.log('Mantendo aberto para inspeção manual por 60 segundos...');
await page.waitForTimeout(60000);
await browser.close();
}
})();
@@ -0,0 +1,60 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
});
const page = await context.newPage();
try {
console.log('Realizando login...');
await page.goto('https://viventerisportalcredenciado.topsaudehub.com.br/', { waitUntil: 'networkidle' });
await page.fill('#usuario', '0005010');
await page.fill('#senha', 'Cclinic#03');
await page.click('#login-submit');
await page.waitForURL('**/AreaLogada**');
console.log('Login OK. Navegando para Novo Registro (Guia)...');
// Tentar ir direto para a URL de novo registro
const baseUrl = 'https://viventerisportalcredenciado.topsaudehub.com.br';
await page.goto(baseUrl + '/HomePortalCredenciado/WorkFlow/NovoRegistro', { waitUntil: 'networkidle' });
console.log('Página de Novo Registro carregada. Analisando campos...');
await page.waitForTimeout(3000); // Esperar carregar formulário dinâmico
// Listar todos os inputs, selects e botões para entender o formulário de guias
const formFields = await page.evaluate(() => {
const inputs = Array.from(document.querySelectorAll('input, select, textarea, button'));
return inputs.map(i => ({
tagName: i.tagName,
type: i.type,
id: i.id,
name: i.name,
placeholder: i.placeholder,
labelText: i.labels?.[0]?.innerText || i.parentElement?.innerText?.split('\n')[0] || ''
})).filter(i => i.id || i.name);
});
console.log('CAMPOS DO FORMULÁRIO ENCONTRADOS:', JSON.stringify(formFields, null, 2));
// Verificar se há algum seletor de "Tipo de Guia"
const tiposGuia = await page.evaluate(() => {
const select = document.querySelector('select');
if (select) {
return Array.from(select.options).map(o => o.text);
}
return 'Nenhum select encontrado';
});
console.log('Opções de Guia/Select:', tiposGuia);
} catch (error) {
console.error('Erro:', error);
} finally {
console.log('Mantendo aberto para sua visualização por 60 segundos...');
await page.waitForTimeout(60000);
await browser.close();
}
})();
@@ -0,0 +1,221 @@
const { chromium } = require('playwright');
const fs = require('fs');
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
});
const page = await context.newPage();
try {
console.log('🚀 Iniciando Automação de Guia Odontológica...');
// LOGIN
await page.goto('https://viventerisportalcredenciado.topsaudehub.com.br/', { waitUntil: 'networkidle' });
await page.fill('#usuario', '0005010');
await page.fill('#senha', 'Cclinic#03');
await page.click('#login-submit');
await page.waitForURL('**/AreaLogada**');
// 1. Tratamento Odontológico
console.log('1. Acessando Tratamento Odontológico...');
await page.click('text="Tratamento Odontológico"');
await page.waitForTimeout(2000);
// 2. Lupa de pesquisa
console.log('2. Clicando na pesquisa (lupa)...');
// Tentativa de achar o botão de busca que abre o modal de beneficiário
const searchBtn = page.locator('.fa-search, .glyphicon-search, button[title*="Pesquisar"]').first();
await searchBtn.click();
await page.waitForTimeout(1000);
// 3. CPF do Beneficiário
console.log('3. Inserindo CPF: 005.983.051-49...');
// Esperar o campo ficar visível no modal
const cpfInput = page.locator('input[id*="cpf"], input[name*="cpf"], .cpf-mask').first();
await cpfInput.fill('005.983.051-49');
// 4. Pesquisar
console.log('4. Clicando em Pesquisar...');
await page.click('button:has-text("Pesquisar"), #btnPesquisarBeneficiario');
await page.waitForTimeout(2000);
// 5. Clica na coluna número beneficiário
console.log('5. Selecionando beneficiário resultado...');
// Espera especificamente por um link que pareça um número de cartão ou nome
const linkBeneficiario = page.locator('table tbody tr td a').first();
await linkBeneficiario.waitFor({ state: 'visible', timeout: 5000 });
await linkBeneficiario.click();
await page.waitForTimeout(2000); // Espera carregar os dados dele
// 6. Botão +
console.log('6. Clicando em Adicionar (+)...');
// O botão + muitas vezes só aparece após selecionar o beneficiário
const btnMais = page.locator('.fa-plus, .btn-success, #btnNovoRegistro, a:has-text("Novo"), button:has-text("+")').first();
await btnMais.waitFor({ state: 'visible', timeout: 5000 });
await btnMais.click();
await page.waitForTimeout(2000);
// 7. Dropdown tipo atendimento
console.log('7. Selecionando Tipo de Atendimento...');
await page.waitForTimeout(2000);
// Verifica se existe um select de endereço primeiro
const enderecoSelect = page.locator('select[id*="endereco"], select[name*="endereco"]').first();
if (await enderecoSelect.count() > 0) {
console.log('Selecionando endereço de atendimento...');
await enderecoSelect.selectOption({ index: 1 });
await page.waitForTimeout(1000);
}
// Tenta encontrar o select de tipo de atendimento especificamente
const selectTipo = page.locator('select[id*="tipo_solicitacao"], select[id*="tipoAtendimento"], select:has-text("Tratamento")').first();
await selectTipo.waitFor({ state: 'visible', timeout: 5000 }).catch(() => console.log('Aviso: Select de tipo não visível ainda.'));
const options = await selectTipo.evaluate(sel => Array.from(sel.options).map(o => o.text)).catch(() => []);
console.log('Opções no select de tipo:', options);
try {
await selectTipo.selectOption({ label: /Tratamento Odontológico/i });
} catch (e) {
console.log('Tentando selecionar pelo índice 1...');
await selectTipo.selectOption({ index: 1 });
}
// 8 e 9. Lupa Profissional Executante
console.log('8. Selecionando Profissional Executante...');
await page.waitForTimeout(2000);
// Agora temos o ID exato do botão!
const btnBuscaProf = page.locator('#btnBuscaPrestadorExecutante').first();
await btnBuscaProf.waitFor({ state: 'visible', timeout: 5000 });
await btnBuscaProf.click();
await page.waitForTimeout(2000);
// Clica no profissional na tabela
console.log('Selecionando o primeiro profissional da lista...');
const linkProf = page.locator('table tbody tr td a').first();
if (await linkProf.count() > 0) {
await linkProf.click();
} else {
console.log('⚠️ Nenhum profissional encontrado na tabela. Aguardando instrução.');
return; // PARA e aguarda
}
await page.waitForTimeout(1000);
// 10. Profissional Solicitante
console.log('10. Preenchendo Solicitante: Murilo...');
const solicitanteInput = page.locator('input[id*="solicitante"], input[name*="Solicitante"]').first();
if (await solicitanteInput.count() === 0) {
console.log('⚠️ Campo "Profissional Solicitante" não encontrado. Aguardando instrução.');
return;
}
await solicitanteInput.waitFor({ state: 'visible', timeout: 5000 });
await solicitanteInput.clear();
await solicitanteInput.fill('Murilo');
// 11. Justificativa (APENAS se for urgência - Valor 4)
const tipoAtendimentoValue = await page.locator('#tipoAtendimento').inputValue();
if (tipoAtendimentoValue === '4') {
console.log('Detectado Urgência / Emergência. Preenchendo Justificativa...');
await page.fill('#observacaoJustificativa', 'Paciente com dor aguda, necessidade de atendimento de urgência.');
} else {
console.log('Tipo de atendimento normal. Pulando justificativa.');
}
// 12. Próximo
console.log('12. Clicando em Próximo...');
await page.click('button:has-text("Próximo"), #btnProximo');
await page.waitForTimeout(2000);
// 13. Incluir
console.log('13. Clicando em Incluir...');
await page.click('#adicionarProcedimeto');
await page.waitForTimeout(2000);
// EXTRAÇÃO DE CÓDIGOS (Como solicitado pelo usuário na primeira vez)
console.log('🔍 Extraindo lista de procedimentos disponíveis...');
const procedimentos = await page.evaluate(() => {
const items = Array.from(document.querySelectorAll('input[id*="procedimento"], select[id*="procedimento"], .lista-procedimentos td'));
// Tenta pegar de um select se houver
const sel = document.querySelector('select[id*="procedimento"]');
if (sel) return Array.from(sel.options).map(o => `${o.value} - ${o.text}`);
return items.map(i => i.innerText || i.value).filter(t => t && t.length > 5);
});
if (procedimentos.length > 0) {
fs.writeFileSync('procedimentos_encontrados.txt', procedimentos.join('\n'));
console.log('✅ Lista de procedimentos salva em procedimentos_encontrados.txt');
}
// 15, 16 e 17. Dados do Tratamento
console.log('15. Lançando procedimento 85100196...');
const procInput = page.locator('#codProcedimento').first();
await procInput.waitFor({ state: 'visible', timeout: 10000 });
await procInput.fill('85100196');
// Espera e clica no item do autocomplete
console.log('Selecionando item no autocomplete...');
const autocompleteItem = page.locator('.ui-menu-item-wrapper:has-text("85100196")').first();
await autocompleteItem.waitFor({ state: 'visible', timeout: 5000 });
await autocompleteItem.click();
await page.waitForTimeout(2000);
console.log('16. Selecionando Dente 18...');
const selectDente = page.locator('#cmbDente').first();
await selectDente.waitFor({ state: 'visible', timeout: 5000 });
await selectDente.selectOption('18');
await page.waitForTimeout(1000);
// Selecionar a checkbox da Face "V"
console.log('17. Selecionando Face V...');
const checkV = page.locator('#codFaceV').first();
await checkV.waitFor({ state: 'visible', timeout: 5000 });
// Tenta clicar forçado no input ou clica na label (que é o que o usuário vê)
try {
await checkV.check({ force: true });
} catch (e) {
await page.click('label[for="codFaceV"]');
}
// 18. Incluir procedimento (Botão Incluir dentro do modal)
console.log('18. Incluindo procedimento na lista...');
await page.click('#btnIncluirProcedimento');
await page.waitForTimeout(2000);
// Se houver um botão de fechar/salvar o popup geral (como o btnSalvarPopUP que vimos antes)
const btnFechar = page.locator('#btnSalvarPopUP').first();
if (await btnFechar.isVisible()) {
console.log('Fechando popup de procedimentos...');
await btnFechar.click();
await page.waitForTimeout(1000);
}
// 19. Finalizar
console.log('19. Finalizando guia...');
await page.click('button:has-text("Próximo")');
await page.waitForTimeout(1000);
await page.click('button:has-text("Próximo"), #btnFinalizar');
// 20. Captura de GTO
console.log('20. Capturando resultado da GTO...');
await page.waitForTimeout(3000);
const resultadoHTML = await page.content();
const gtoMatch = resultadoHTML.match(/\d{8,12}/); // Tenta achar um número longo que seria a GTO
const status = resultadoHTML.includes('Autorizado') ? 'AUTORIZADO' : 'VERIFICAR STATUS';
console.log(`--- RESULTADO --- GTO: ${gtoMatch ? gtoMatch[0] : 'Não localizada'} | STATUS: ${status}`);
} catch (error) {
console.error('❌ Erro na automação:', error.message);
await page.screenshot({ path: 'erro-guia-odonto.png' });
} finally {
console.log('Processo interrompido para análise. O navegador ficará aberto por 60s.');
await page.waitForTimeout(60000);
await browser.close();
}
})();
@@ -0,0 +1,52 @@
const { chromium } = require('playwright');
(async () => {
// Configuração para evitar mensagem de navegador incompatível
const browser = await chromium.launch({
headless: false // Vamos deixar visível para você ver acontecendo
});
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
});
const page = await context.newPage();
try {
console.log('Navegando para o portal...');
await page.goto('https://viventerisportalcredenciado.topsaudehub.com.br/', { waitUntil: 'networkidle' });
console.log('Preenchendo credenciais...');
await page.fill('#usuario', '0005010');
await page.fill('#senha', 'Cclinic#03');
console.log('Clicando em ENTRAR...');
await page.click('#login-submit');
// Espera um pouco para ver o resultado (sucesso ou erro)
await page.waitForTimeout(5000);
const currentUrl = page.url();
console.log('URL atual após login:', currentUrl);
if (currentUrl.includes('AreaLogada')) {
console.log('✅ LOGIN REALIZADO COM SUCESSO!');
} else {
// Tenta verificar erro apenas se não estiver na área logada
const errorMsg = await page.locator('.msg:visible').textContent({ timeout: 5000 }).catch(() => null);
if (errorMsg) {
console.log('❌ Falha no login. Mensagem do sistema:', errorMsg.trim());
} else {
console.log('Status do login incerto. Verifique a janela do navegador.');
}
}
} catch (error) {
console.error('Ocorreu um erro durante a automação:', error);
} finally {
// Mantemos o navegador aberto por 20 segundos para você ver o resultado
console.log('Mantendo o navegador aberto por 20 segundos...');
await page.waitForTimeout(20000);
await browser.close();
}
})();
@@ -0,0 +1,45 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
});
const page = await context.newPage();
try {
console.log('Realizando login...');
await page.goto('https://viventerisportalcredenciado.topsaudehub.com.br/', { waitUntil: 'networkidle' });
await page.fill('#usuario', '0005010');
await page.fill('#senha', 'Cclinic#03');
await page.click('#login-submit');
await page.waitForURL('**/AreaLogada**');
console.log('Login OK. Varrendo todos os links e data-href...');
await page.waitForTimeout(2000);
const links = await page.evaluate(() => {
return Array.from(document.querySelectorAll('a')).map(a => ({
text: a.innerText.trim(),
href: a.getAttribute('href'),
dataHref: a.getAttribute('data-href'),
id: a.id
}));
});
console.log('LISTA COMPLETA DE LINKS:');
links.forEach(l => {
if (l.text || l.dataHref) {
console.log(`- TEXTO: "${l.text}" | HREF: "${l.href}" | DATA-HREF: "${l.dataHref}" | ID: "${l.id}"`);
}
});
} catch (error) {
console.error('Erro:', error);
} finally {
console.log('Fim da exploração.');
await browser.close();
}
})();
@@ -0,0 +1,138 @@
const { chromium } = require('playwright');
(async () => {
console.log('🔍 Iniciando mapeamento de API para Axios...');
const browser = await chromium.launch({ headless: false }); // Usar Chrome visível para evitar bloqueio
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
});
const page = await context.newPage();
// Interceptar todas as requisições para descobrir os Endpoints
page.on('request', request => {
if (request.method() === 'POST' && !request.url().includes('google-analytics')) {
console.log(`\n🚀 POST Detectado: ${request.url()}`);
console.log('Headers:', JSON.stringify(request.headers(), null, 2));
console.log('Payload:', request.postData());
}
});
try {
await page.goto('https://viventerisportalcredenciado.topsaudehub.com.br/', { waitUntil: 'load', timeout: 60000 });
console.log('Esperando formulário de login...');
const userField = page.locator('#usuario, #Username').first();
await userField.waitFor({ timeout: 30000 });
console.log('Preenchendo credenciais...');
await userField.fill('0005010');
const passField = page.locator('#senha, #Password').first();
await passField.fill('Cclinic#03');
console.log('Clicando em Login...');
const loginBtn = page.locator('#login-submit, #btnLogin').first();
await loginBtn.click();
await page.waitForTimeout(5000);
console.log('Navegando pelo menu...');
await page.click('text="Tratamento Odontológico"');
await page.waitForTimeout(2000);
console.log('Abrindo busca de beneficiário...');
const searchBtn = page.locator('.fa-search, .glyphicon-search, button[title*="Pesquisar"]').first();
await searchBtn.click();
await page.waitForTimeout(2000);
console.log('Inserindo CPF...');
const cpfInput = page.locator('input[id*="cpf"], input[name*="cpf"], .cpf-mask').first();
await cpfInput.fill('005.983.051-49');
await page.click('button:has-text("Pesquisar"), #btnPesquisarBeneficiario');
console.log('Aguardando resultados da busca...');
const linkBeneficiario = page.locator('table tbody tr td a').first();
try {
await linkBeneficiario.waitFor({ state: 'visible', timeout: 15000 });
console.log('Selecionando beneficiário...');
await linkBeneficiario.click();
} catch (e) {
console.log('⚠️ Resultado da busca não apareceu ou demorou demais.');
const content = await page.content();
if (content.includes('nenhum registro encontrado') || content.includes('não encontrado')) {
console.log('❌ Beneficiário não encontrado no portal.');
} else {
console.log('Logando HTML para análise de erro...');
require('fs').writeFileSync('logs-and-data/debug-search-error.html', content);
}
throw new Error('Falha na busca de beneficiário durante o mapeamento.');
}
await page.waitForTimeout(3000);
console.log('Clicando em Adicionar (+)...');
const btnMais = page.locator('.fa-plus, .btn-success, #btnNovoRegistro, button:has-text("+")').first();
await btnMais.click();
await page.waitForTimeout(5000);
console.log('Preenchendo dados da guia...');
const selectTipo = page.locator('select[id*="tipoAtendimento"]').first();
await selectTipo.waitFor({ state: 'visible', timeout: 15000 });
await selectTipo.selectOption('1');
await page.waitForTimeout(2000);
console.log('Buscando Profissional Executante...');
const btnBuscaProf = page.locator('#btnBuscaPrestadorExecutante').first();
await btnBuscaProf.click();
await page.waitForTimeout(3000);
console.log('Selecionando primeiro profissional na tabela...');
const linkProf = page.locator('table tbody tr td a').first();
await linkProf.waitFor({ state: 'visible', timeout: 10000 });
await linkProf.click();
await page.waitForTimeout(3000);
console.log('Verificando campo Solicitante...');
const solicitanteInput = page.locator('input[id*="solicitante"], input[name*="Solicitante"]').first();
// Tenta esperar o campo, mas loga se falhar
try {
await solicitanteInput.waitFor({ state: 'visible', timeout: 15000 });
console.log('Preenchendo Solicitante...');
await solicitanteInput.fill('Murilo');
} catch (e) {
console.log('⚠️ Campo Solicitante não apareceu. Continuando para tentar capturar outros POSTs...');
}
console.log('Avançando para procedimentos...');
const btnProx = page.locator('button:has-text("Próximo"), #btnProximo').first();
await btnProx.click();
await page.waitForTimeout(5000);
console.log('Abrindo inclusão de procedimento...');
await page.click('#adicionarProcedimeto');
await page.waitForTimeout(3000);
console.log('Lançando procedimento para capturar JSON...');
await page.fill('#codProcedimento', '85100196');
await page.waitForTimeout(2000);
await page.click('.ui-menu-item-wrapper:has-text("85100196")');
await page.waitForTimeout(1000);
await page.selectOption('#cmbDente', '11');
await page.click('label[for="codFaceV"]');
console.log('Incluindo no modal (Captura JSON parcial)...');
await page.click('#btnIncluirProcedimento');
await page.waitForTimeout(3000);
console.log('FINALIZANDO GUIA (Captura do POST Final)...');
await page.click('button:has-text("Próximo")');
await page.waitForTimeout(2000);
await page.click('button:has-text("Próximo"), #btnFinalizar');
await page.waitForTimeout(10000);
console.log('\n✅ Mapeamento concluído com sucesso.');
} catch (error) {
console.error('Erro no mapeamento:', error);
} finally {
await browser.close();
}
})();