`;
      const footer = `
`; const blob = new Blob([header + escapeHtml(text) + footer], { type: 'application/msword;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } function printElement(textareaId) { const text = document.getElementById(textareaId).value; printTextDirect(text); } function printTextDirect(text) { const printArea = document.getElementById('printable-doc-area'); printArea.innerHTML = `
${escapeHtml(text)}
`; window.print(); } function downloadMockFile(filename) { const blob = new Blob([`Arquivo digital comprobatório: ${filename}\nEscritório RS Advogados e Associados.\nRegistrado para fins de instrução processual.`], { type: 'text/plain;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } ======= 5) CHAT FLUTUANTE IA (EM TODAS AS TELAS) Coleta dados ao final e gera Contrato + Hipossuficiência ======================================================== */ let chatState = { step: 0, clientName: '', data: { name: '', cpf: '', rg: '', civil: 'Solteiro(a)', qualif: 'Profissional', address: 'São Paulo - SP', phone: '(11) 944974907', email: 'contato@cliente.com', caseDesc: 'Atendimento e formalização de patrocínio jurídico via chat interativo.' } }; function initChat() { const openBtn = document.getElementById('openChatBtn'); const closeBtn = document.getElementById('closeChatBtn'); const chatWin = document.getElementById('chatWindow'); const sendBtn = document.getElementById('chatSendBtn'); const input = document.getElementById('chatInput'); openBtn.addEventListener('click', () => { chatWin.classList.toggle('active'); if (chatWin.classList.contains('active')) input.focus(); }); closeBtn.addEventListener('click', () => { chatWin.classList.remove('active'); }); sendBtn.addEventListener('click', handleChatUserSend); input.addEventListener('keypress', (e) => { if (e.key === 'Enter') handleChatUserSend(); }); } function addChatMsg(text, sender) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = `chat-msg ${sender}`; div.innerHTML = text; body.appendChild(div); body.scrollTop = body.scrollHeight; } function handleChatUserSend() { const input = document.getElementById('chatInput'); const txt = input.value.trim(); if (!txt) return; addChatMsg(escapeHtml(txt), 'user'); input.value = ''; setTimeout(() => { processChatLogic(txt); }, 700); } function processChatLogic(userText) { const lower = userText.toLowerCase(); if (chatState.step === 0) { // Coletar nome chatState.clientName = userText.replace(/meu nome é|sou o|sou a|me chamo/gi, '').trim(); if (chatState.clientName.length > 25) chatState.clientName = chatState.clientName.slice(0, 25); chatState.data.name = chatState.clientName; chatState.step = 1; addChatMsg(`Prazer em falar com você, ${escapeHtml(chatState.clientName)}! Me conte resumidamente qual problema jurídico você está enfrentando no momento para que eu possa orientar o melhor caminho.`, 'bot'); return; } if (chatState.step === 1) { chatState.data.caseDesc = userText; chatState.step = 2; addChatMsg(`Compreendo perfeitamente a gravidade dessa situação, ${escapeHtml(chatState.clientName)}. Casos assim demandam ação rápida para resguardar as provas e exigir a devida reparação.

Você possui mais alguma dúvida específica ou gostaria de avançar para o próximo passo e já formalizar os documentos do seu atendimento?`, 'bot'); return; } if (chatState.step === 2) { if (lower.includes('não') || lower.includes('avançar') || lower.includes('proximo') || lower.includes('próximo') || lower.includes('quero') || lower.includes('sim') || lower.includes('formalizar')) { chatState.step = 3; addChatMsg(`Excelente decisão, ${escapeHtml(chatState.clientName)}! Vamos formalizar seu cadastro de patrocínio imediatamente.

Por gentileza, informe seu CPF e RG (Ex: 000.000.000-00 e 00.000.000-0):`, 'bot'); } else { addChatMsg(`Estamos 100% à sua disposição sobre isso. Quando se sentir pronto(a), basta me avisar que você 'não tem mais dúvidas' ou que 'quer avançar' para gerarmos seus documentos protocolares!`, 'bot'); } return; } if (chatState.step === 3) { chatState.data.cpf = userText; chatState.data.rg = "00.000.000-0 SSP/SP"; chatState.step = 4; addChatMsg(`Perfeito! Agora informe seu Endereço Completo com CEP, Profissão e Estado Civil:`, 'bot'); return; } if (chatState.step === 4) { chatState.data.address = userText; chatState.step = 5; // Gerar documentos via chat const tempClient = { name: chatState.data.name || 'Cliente Atendido', cpf: chatState.data.cpf || '000.000.000-00', rg: '00.000.000-0 SSP/SP', civil: 'Solteiro(a)', qualif: 'Profissional', address: chatState.data.address || 'São Paulo - SP', phone: '(11) 944974907', email: 'atendimento@portal.com', caseDesc: chatState.data.caseDesc || 'Ação de reparação de direitos', area: 'Cível', feeTotal: '4.500,00', feeMonthly: '225,00', feeDaily: '7,50' }; const contract = generateContractContent(tempClient); const hipo = generateHipoContent(tempClient); // Guardar no window para download pelo chat window._chatContractDoc = contract; window._chatHipoDoc = hipo; addChatMsg(` 🎉 Cadastro e Documentos Gerados com Sucesso!

Seu Contrato de Prestação de Serviços e sua Declaração de Hipossuficiência estão prontos nos formatos oficiais (.doc e .pdf):


Para agilizar a distribuição da sua causa, envie uma mensagem direta ao nosso sócio no WhatsApp pelo botão abaixo:

Abrir WhatsApp do Escritório (11) 944974907 `, 'bot'); } } function downloadChatDoc(type, format) { const text = type === 'contract' ? window._chatContractDoc : window._chatHipoDoc; const title = type === 'contract' ? 'Contrato de Prestação de Serviços' : 'Declaração de Hipossuficiência'; const safeName = (chatState.clientName || 'Cliente').normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-zA-Z0-9]+/g, '_'); const filename = type === 'contract' ? `Contrato_${safeName}` : `Declaracao_Hipossuficiencia_${safeName}`; if (!text) { showDocToast('Documento ainda não foi gerado.', false); return; } if (format === 'word') { const blob = generateValidWordBlob(title, text); triggerDownload(blob, filename + '.doc'); } else if (format === 'pdf') { const blob = generateValidPDFBlob(title, text); triggerDownload(blob, filename + '.pdf'); } else if (format === 'preview') { previewDocument(title, text); } } ======= 5) CHAT FLUTUANTE IA (EM TODAS AS TELAS) Comportamento consultivo, ritmo natural de escrita, perguntas investigativas acolhedoras e explicação rica ======================================================== */ let chatState = { step: 0, clientName: '', isBusy: false, detectedArea: 'Cível', data: { name: '', storyFacts: '', storyWhenWho: '', storyPreviousContact: '', storyDocsAndDoubts: '', cpf: '', rg: '', civil: 'Solteiro(a)', qualif: 'Profissional', address: 'São Paulo - SP', phone: '(11) 944974907', email: 'atendimento@portal.com', caseDesc: '' } }; function initChat() { const openBtn = document.getElementById('openChatBtn'); const closeBtn = document.getElementById('closeChatBtn'); const chatWin = document.getElementById('chatWindow'); const sendBtn = document.getElementById('chatSendBtn'); const input = document.getElementById('chatInput'); openBtn.addEventListener('click', () => { chatWin.classList.toggle('active'); if (chatWin.classList.contains('active')) input.focus(); }); closeBtn.addEventListener('click', () => { chatWin.classList.remove('active'); }); sendBtn.addEventListener('click', handleChatUserSend); input.addEventListener('keypress', (e) => { if (e.key === 'Enter') handleChatUserSend(); }); } function addChatUserMsg(text) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg user'; div.textContent = text; body.appendChild(div); body.scrollTop = body.scrollHeight; } const sleep = (ms) => new Promise(res => setTimeout(res, ms)); function showTypingIndicator() { const body = document.getElementById('chatMessages'); const indicator = document.createElement('div'); indicator.id = 'chatTypingIndicator'; indicator.className = 'chat-typing'; indicator.innerHTML = `
Assistente está digitando... `; body.appendChild(indicator); body.scrollTop = body.scrollHeight; } function hideTypingIndicator() { const indicator = document.getElementById('chatTypingIndicator'); if (indicator) indicator.remove(); } // Efeito de digitação suave e natural (20-26ms por caractere com pausas nas pontuações) async function typeBotMessage(htmlString, extraActionElement = null) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg bot'; body.appendChild(div); let currentHtml = ''; let i = 0; const len = htmlString.length; while (i < len) { // Se encontrar tag HTML, adiciona a tag inteira de uma vez sem quebrar a marcação if (htmlString[i] === '<') { const closeIdx = htmlString.indexOf('>', i); if (closeIdx !== -1) { currentHtml += htmlString.substring(i, closeIdx + 1); div.innerHTML = currentHtml; i = closeIdx + 1; continue; } } const char = htmlString[i]; currentHtml += char; div.innerHTML = currentHtml; body.scrollTop = body.scrollHeight; i++; // Pausas naturais de leitura humana let delay = 22; // 22ms por caractere (faixa confortável de 18-30ms) if (char === '.' || char === '!' || char === '?') { delay = 280; // pausa maior entre frases } else if (char === ',' || char === ';' || char === ':') { delay = 120; // pausa breve em vírgulas e conectivos } else if (char === '\n') { delay = 150; } await sleep(delay); } // Se houver botões ou CTAs complementares, anexa com suave transição if (extraActionElement) { div.appendChild(extraActionElement); body.scrollTop = body.scrollHeight; } } // Entrega de blocos curtos e pausados precedidos por indicador "digitando..." (1-2s) async function deliverBotSequence(blocks) { chatState.isBusy = true; const input = document.getElementById('chatInput'); const sendBtn = document.getElementById('chatSendBtn'); input.disabled = true; sendBtn.disabled = true; input.placeholder = "Assistente jurídica formulando orientação..."; for (let idx = 0; idx < blocks.length; idx++) { const item = blocks[idx]; const html = typeof item === 'string' ? item : item.text; const extra = typeof item === 'object' && item.extra ? item.extra : null; // Indicador visível de 1.2 a 1.7 segundos simulando reflexão e análise showTypingIndicator(); await sleep(1300 + Math.random() * 400); hideTypingIndicator(); // Digitação progressiva do bloco await typeBotMessage(html, extra); // Intervalo sereno entre um bloco e outro if (idx < blocks.length - 1) { await sleep(650); } } input.disabled = false; sendBtn.disabled = false; input.placeholder = "Digite sua mensagem..."; input.focus(); chatState.isBusy = false; } function handleChatUserSend() { if (chatState.isBusy) return; const input = document.getElementById('chatInput'); const txt = input.value.trim(); if (!txt) return; addChatUserMsg(txt); input.value = ''; processChatLogic(txt); } // Identificação consultiva de área temática a partir dos relatos do cliente function inferAreaFromText(text) { const lower = text.toLowerCase(); if (/trabalh|empresa|patrão|chefe|salário|fgts|carteira|demiss|hora extra|vínculo/i.test(lower)) { return 'Trabalhista'; } if (/voo|aérea|bagagem|produto|banco|compra|golpe|pix|cartão|loja|atraso|consumidor/i.test(lower)) { return 'Consumidor'; } if (/inss|aposentad|benefício|perícia|loas|bpc|auxílio|doença|pensão por morte/i.test(lower)) { return 'Previdenciário'; } if (/divórcio|guarda|pensão alimentícia|filho|partilha|herança|inventário|casamento/i.test(lower)) { return 'Família'; } return 'Cível'; } async function processChatLogic(userText) { const lower = userText.toLowerCase().trim(); // ========================================== // ETAPA 0: Coleta do Nome // ========================================== if (chatState.step === 0) { let name = userText.replace(/meu nome é|sou o|sou a|me chamo|o meu nome é|pode me chamar de/gi, '').trim(); name = name.split(' ')[0] || userText.trim(); name = name.charAt(0).toUpperCase() + name.slice(1); if (name.length > 20) name = name.slice(0, 20); chatState.clientName = name; chatState.data.name = name; chatState.step = 1; await deliverBotSequence([ `É um prazer falar com você, ${escapeHtml(name)}! Seja muito bem-vindo(a) à nossa banca.`, `Me conte, ${escapeHtml(name)}, o que está acontecendo? Pode relatar com calma, no seu próprio tempo, o que houve.` ]); return; } // ========================================== // ETAPA 1: O que aconteceu -> Pergunta investigativa 1 (Quando e Com Quem) // ========================================== if (chatState.step === 1) { chatState.data.storyFacts = userText; chatState.detectedArea = inferAreaFromText(userText); chatState.step = 2; await deliverBotSequence([ `Compreendo perfeitamente, ${escapeHtml(chatState.clientName)}. Sei o quanto uma situação dessas causa apreensão, desgaste emocional e sentimento de desamparo.`, `Para que eu possa situar os aspectos legais com clareza: quando exatamente isso aconteceu (ou há quanto tempo vem ocorrendo) e quem foi a empresa, órgão ou pessoa envolvida?` ]); return; } // ========================================== // ETAPA 2: Quando e com quem -> Pergunta investigativa 2 (Tentativas de contato) // ========================================== if (chatState.step === 2) { chatState.data.storyWhenWho = userText; chatState.step = 3; await deliverBotSequence([ `Perfeito, anotei essas informações. A precisão de datas e a identificação do polo envolvido são pilares essenciais para resguardar a responsabilidade jurídica.`, `E me diga: você já tentou algum contato direto para resolver (como SAC, ouvidoria, mensagens, conversas formais ou notificações), ou chegou a procurar algum outro órgão antes de falar conosco?` ]); return; } // ========================================== // ETAPA 3: Tentativas anteriores -> Pergunta investigativa 3 (Documentos e Maior Preocupação) // ========================================== if (chatState.step === 3) { chatState.data.storyPreviousContact = userText; chatState.step = 4; await deliverBotSequence([ `Entendi. Ter registro ou histórico dessas tentativas demonstra claramente a sua boa-fé diante do ocorrido.`, `Para completarmos esse diagnóstico inicial: você possui documentos, comprovantes, prints, contratos ou protocolos guardados? E qual é a sua principal dúvida ou maior preocupação neste momento?` ]); return; } // ========================================== // ETAPA 4: Documentos e Dúvidas -> EXPLICAÇÃO RICA, DETALHADA E CONSULTIVA // ========================================== if (chatState.step === 4) { chatState.data.storyDocsAndDoubts = userText; chatState.data.caseDesc = `${chatState.data.storyFacts}. Ocorrido: ${chatState.data.storyWhenWho}. Tratativas: ${chatState.data.storyPreviousContact}. Documentos: ${chatState.data.storyDocsAndDoubts}`; chatState.step = 5; // Construção da explicação personalizada com riqueza de detalhes let blockSignificado = ""; let blockDireitos = ""; let blockPraPratica = ""; if (chatState.detectedArea === 'Trabalhista') { blockSignificado = `O que a sua situação significa juridicamente:
A conduta relatada aponta para descumprimento expresso de normas trabalhistas e contratuais. O trabalhador não é obrigado a tolerar violações contínuas, atrasos ou ausência de recolhimentos legais fundamentais à sua subsistência.`; blockDireitos = `Quais os direitos envolvidos:
Dependendo da gravidade dos fatos narrados, a legislação (CLT e Constituição Federal) prevê o direito à rescisão indireta (a chamada 'justa causa do empregador'), liberação integral do FGTS com multa rescisória de 40%, seguro-desemprego, quitação de todas as verbas rescisórias devidas e, quando houver dano moral por assédio ou rigor excessivo, a devida reparação indenizatória.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Esses casos são instruídos com carteira de trabalho (física ou digital), extratos analíticos de FGTS, comprovantes de salário, mensagens ou trocas de e-mail e testemunhas. Se houver urgência de desligamento imediato, ajuíza-se a ação com pedido liminar para afastar o empregado sem caracterizar abandono.`; } else if (chatState.detectedArea === 'Consumidor') { blockSignificado = `O que a sua situação significa juridicamente:
Trata-se de uma falha grave na prestação do serviço e violação aos princípios da boa-fé objetiva e proteção do consumidor (Código de Defesa do Consumidor - Lei 8.078/90). A responsabilidade da empresa pelos danos causados é objetiva, ou seja, independe da prova de culpa da parte dela.`; blockDireitos = `Quais os direitos envolvidos:
Você tem direito ao ressarcimento imediato e corrigido de todo e qualquer dano material (valores gastos a mais, prejuízos financeiros concretos), cumprimento forçado da obrigação ou restituição do montante pago, além de indenização por danos morais compensatórios pelo desrespeito, frustração e desvio produtivo do seu tempo útil.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Nos tribunais, os magistrados aplicam a inversão do ônus da prova em favor do consumidor vulnerável. Os documentos essenciais são: notas fiscais, faturas, bilhetes aéreos ou comprovantes de compra, número de protocolos e registros das reclamações não resolvidas.`; } else if (chatState.detectedArea === 'Família') { blockSignificado = `O que a sua situação significa juridicamente:
Questões de direito familiar envolvem não apenas patrimônio, mas resguardo da dignidade, alimentos e bem-estar dos envolvidos. A lei busca priorizar a proteção dos vulneráveis e a justa partilha do que foi construído em conjunto.`; blockDireitos = `Quais os direitos envolvidos:
Estão resguardados o direito à fixação e cumprimento de pensão alimentícia compatível com a capacidade financeira de quem presta e a necessidade de quem recebe, regulamentação de convivência, guarda e partilha equitativa de bens conforme o regime adotado.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
O procedimento pode se dar pela via consensual extrajudicial (mais ágil) ou judicial litigiosa. É importante reunir certidões de casamento/nascimento, documentos de propriedade e comprovantes de gastos mensais essenciais.`; } else if (chatState.detectedArea === 'Previdenciário') { blockSignificado = `O que a sua situação significa juridicamente:
O indeferimento indevido ou a demora excessiva do INSS muitas vezes ignora laudos médicos particulares ou a realidade contributiva do segurado, contrariando a Lei de Benefícios da Previdência Social (Lei 8.213/91).`; blockDireitos = `Quais os direitos envolvidos:
Você tem direito à revisão ou concessão judicial do benefício adequado, com pagamento cumulado de todas as parcelas retroativas desde a data do primeiro requerimento administrativo (DER).`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Na Justiça Federal, é designada perícia médica independente por perito de confiança do juízo. Devemos manter em mãos: laudos médicos atualizados com CID, receitas, exames e cópia do processo administrativo do INSS.`; } else { blockSignificado = `O que a sua situação significa juridicamente:
A conduta narrada gera o descumprimento de obrigação legal e contratual, dando causa ao dever inequívoco de indenizar nos termos dos artigos 186 e 927 do Código Civil Brasileiro.`; blockDireitos = `Quais os direitos envolvidos:
Você possui direito à reparação integral: restituição de valores corrigidos, cobrança de multas contratuais aplicáveis e indenização pelos abalos morais decorrentes do ilícito.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Iniciamos a instrução com a notificação preliminar ou ajuizamento de ação ordinária cumulada com pedido de tutela provisória de urgência. Precisamos de contratos, comprovantes de pagamento e trocas de mensagens que registrem a infração.`; } await deliverBotSequence([ `Muito obrigado por relatar todos esses detalhes, ${escapeHtml(chatState.clientName)}. Agora que compreendi os fatos de ponta a ponta, posso te explicar com riqueza de detalhes como funciona:`, blockSignificado, blockDireitos, blockPraPratica, `Ficou clara essa explicação para você, ${escapeHtml(chatState.clientName)}? Tem algum detalhe que gostaria que eu aprofunde mais ou já se sente confortável para avançarmos juntos ao próximo passo?` ]); return; } // ========================================== // ETAPA 5: Diálogo consultivo sobre dúvidas ou avanço // ========================================== if (chatState.step === 5) { const wantsToAdvance = /não|nao|sem dúvidas|sem duvida|tudo claro|ficou claro|entendi|avançar|avancar|proximo|próximo|quero|formalizar|seguir|sim|podemos|vamos/i.test(lower) && !/tenho dúvida|tenho duvida|me explica|quanto custa|demora|não entendi|nao entendi/i.test(lower); if (wantsToAdvance) { chatState.step = 6; await deliverBotSequence([ `Excelente, ${escapeHtml(chatState.clientName)}! Fico muito feliz que a orientação tenha trazido clareza e segurança para você.`, `Vamos dar o próximo passo com total tranquilidade. Para elaborarmos formalmente o seu Contrato de Prestação de Serviços Advocatícios e a sua Declaração de Hipossuficiência Econômica, por favor me informe o seu CPF e seu RG (ex: 000.000.000-00 e 00.000.000-0):` ]); } else { // O cliente trouxe uma dúvida ou pediu detalhamento await deliverBotSequence([ `Com certeza, ${escapeHtml(chatState.clientName)}! Faz toda a diferença esclarecer cada vírgula antes de tomar qualquer atitude.`, `Nossa atuação é totalmente transparente: o primeiro ato consiste na análise documental criteriosa pela nossa banca. Em casos urgentes, ingressamos com pedido liminar imediato para estancar prejuízos. Todas as etapas processuais e andamentos ficam disponíveis em tempo real tanto aqui pelo nosso portal quanto no acompanhamento direto com os sócios.`, `Consegui responder ao que você precisava? Se agora você se sentir seguro(a), basta me avisar que podemos avançar para gerarmos seus documentos protocolares!` ]); } return; } // ========================================== // ETAPA 6: Coleta de CPF e RG -> Pergunta Endereço, Profissão e Estado Civil // ========================================== if (chatState.step === 6) { chatState.data.cpf = userText; chatState.data.rg = "00.000.000-0 SSP/SP"; chatState.step = 7; await deliverBotSequence([ `Dados registrados com total sigilo e proteção conforme a LGPD.`, `Agora, por gentileza, informe o seu Endereço Completo com CEP, sua Profissão e seu Estado Civil (ex: Solteiro(a), Casado(a)):` ]); return; } // ========================================== // ETAPA 7: Geração do Contrato, Declaração e Botão WhatsApp Oficial // ========================================== if (chatState.step === 7) { chatState.data.address = userText; chatState.step = 8; const tempClient = { name: chatState.data.name || 'Cliente Atendido', cpf: chatState.data.cpf || '000.000.000-00', rg: '00.000.000-0 SSP/SP', civil: 'Solteiro(a)', qualif: 'Profissional', address: chatState.data.address || 'São Paulo - SP', phone: '(11) 944974907', email: 'atendimento@portal.com', caseDesc: chatState.data.caseDesc || 'Ação e patrocínio jurídico de reparação de direitos', area: chatState.detectedArea || 'Cível', feeTotal: '4.500,00', feeMonthly: '225,00', feeDaily: '7,50' }; const contract = generateContractContent(tempClient); const hipo = generateHipoContent(tempClient); window._chatContractDoc = contract; window._chatHipoDoc = hipo; const actionBox = document.createElement('div'); actionBox.style.marginTop = '14px'; actionBox.innerHTML = `
Seus Documentos Oficiais Prontos:
Para validação imediata da equipe jurídica e envio das peças aos tribunais:
Conversar no WhatsApp (11) 944974907
`; await deliverBotSequence([ `Parabéns, ${escapeHtml(chatState.clientName)}! Seu atendimento foi registrado com pleno êxito em nosso sistema operacional.`, { text: `Seus documentos já foram formalizados e estão disponíveis para download imediato abaixo. Você pode baixá-los tanto no formato Word (.doc) editável quanto visualizá-los ou salvá-los em PDF:`, extra: actionBox } ]); return; } // Interações adicionais pós-formalização if (chatState.step >= 8) { await deliverBotSequence([ `Estamos prontos para atuar pelo seu caso, ${escapeHtml(chatState.clientName)}! Clique no botão do WhatsApp acima para falar diretamente com nosso plantão de advogados pelo número (11) 944974907.` ]); } } function downloadChatDoc(type, format) { const text = type === 'contract' ? window._chatContractDoc : window._chatHipoDoc; const filename = type === 'contract' ? 'Contrato_Prestacao_RSAdvogados' : 'Declaracao_Hipossuficiencia_RSAdvogados'; if (!text) return; if (format === 'word') { downloadDocBlob(text, filename + '.doc'); } else { printTextDirect(text); } } ======= /* ======================================================== 5) CHAT FLUTUANTE IA (EM TODAS AS TELAS) Comportamento humano de digitação (45-70ms/char), indicador "digitando..." por 2 a 4s, mensagens curtas (3-4 linhas max) com pausas de 1.5 a 3s. NENHUM LINK WHATSAPP antes de esgotar TODAS as dúvidas. Fluxo completo em 11 passos conforme regras A, B, C, D e E. ======================================================== */ let chatState = { step: 0, clientName: '', isBusy: false, detectedArea: 'Cível', data: { name: '', storyFacts: '', storyWhenWho: '', storyPreviousContact: '', storyDocs: '', fullName: '', address: '', email: '', phone: '', cpf: '', rg: '', civil: 'Solteiro(a)', qualif: 'Profissional', caseDesc: '' } }; function initChat() { const openBtn = document.getElementById('openChatBtn'); const closeBtn = document.getElementById('closeChatBtn'); const chatWin = document.getElementById('chatWindow'); const sendBtn = document.getElementById('chatSendBtn'); const input = document.getElementById('chatInput'); openBtn.addEventListener('click', () => { chatWin.classList.toggle('active'); if (chatWin.classList.contains('active')) input.focus(); }); closeBtn.addEventListener('click', () => { chatWin.classList.remove('active'); }); sendBtn.addEventListener('click', handleChatUserSend); input.addEventListener('keypress', (e) => { if (e.key === 'Enter') handleChatUserSend(); }); } function addChatUserMsg(text) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg user'; div.textContent = text; body.appendChild(div); body.scrollTop = body.scrollHeight; } const sleep = (ms) => new Promise(res => setTimeout(res, ms)); function showTypingIndicator() { const body = document.getElementById('chatMessages'); const indicator = document.createElement('div'); indicator.id = 'chatTypingIndicator'; indicator.className = 'chat-typing'; indicator.innerHTML = `
Dra. Especialista está digitando... `; body.appendChild(indicator); body.scrollTop = body.scrollHeight; } function hideTypingIndicator() { const indicator = document.getElementById('chatTypingIndicator'); if (indicator) indicator.remove(); } // A1: Digitação de 45-70ms por caractere (ritmo humano real) async function typeBotMessage(htmlString, extraActionElement = null) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg bot'; body.appendChild(div); let currentHtml = ''; let i = 0; const len = htmlString.length; while (i < len) { if (htmlString[i] === '<') { const closeIdx = htmlString.indexOf('>', i); if (closeIdx !== -1) { currentHtml += htmlString.substring(i, closeIdx + 1); div.innerHTML = currentHtml; i = closeIdx + 1; continue; } } const char = htmlString[i]; currentHtml += char; div.innerHTML = currentHtml; body.scrollTop = body.scrollHeight; i++; // Velocidade humana: ~50-65ms por caractere let delay = 50 + Math.floor(Math.random() * 18); if (char === '.' || char === '!' || char === '?') { delay = 380; } else if (char === ',' || char === ';' || char === ':') { delay = 180; } else if (char === '\n') { delay = 200; } await sleep(delay); } if (extraActionElement) { div.appendChild(extraActionElement); body.scrollTop = body.scrollHeight; } } // A2 & A3: Indicador "digitando..." por 2 a 4s + mensagens curtas com pausa de 1.5 a 3s entre elas async function deliverBotSequence(blocks) { chatState.isBusy = true; const input = document.getElementById('chatInput'); const sendBtn = document.getElementById('chatSendBtn'); input.disabled = true; sendBtn.disabled = true; input.placeholder = "Dra. Especialista está digitando..."; for (let idx = 0; idx < blocks.length; idx++) { const item = blocks[idx]; const html = typeof item === 'string' ? item : item.text; const extra = typeof item === 'object' && item.extra ? item.extra : null; // A2: Indicador visível por 2 a 4 segundos (proporcional ao tamanho da resposta) const rawText = html.replace(/<[^>]*>/g, ''); const typingDuration = Math.min(4000, Math.max(2200, Math.floor(rawText.length * 18))); showTypingIndicator(); await sleep(typingDuration); hideTypingIndicator(); await typeBotMessage(html, extra); if (idx < blocks.length - 1) { // A3: Pausa de 1,5 a 3 segundos entre mensagens curtas enviadas em sequência await sleep(1600 + Math.floor(Math.random() * 900)); } } input.disabled = false; sendBtn.disabled = false; input.placeholder = "Digite sua mensagem..."; input.focus(); chatState.isBusy = false; } function handleChatUserSend() { if (chatState.isBusy) return; const input = document.getElementById('chatInput'); const txt = input.value.trim(); if (!txt) return; addChatUserMsg(txt); input.value = ''; processChatLogic(txt); } function inferAreaFromText(text) { const lower = text ? text.toLowerCase() : ''; if (/trabalh|empresa|patrão|chefe|salário|fgts|carteira|demiss|hora extra|vínculo|rescisão/i.test(lower)) { return 'Trabalhista'; } if (/voo|aérea|bagagem|produto|banco|compra|golpe|pix|cartão|loja|atraso|consumidor|vício|defeito/i.test(lower)) { return 'Consumidor'; } if (/inss|aposentad|benefício|perícia|loas|bpc|auxílio|doença|pensão por morte|segurado/i.test(lower)) { return 'Previdenciário'; } if (/divórcio|guarda|pensão alimentícia|filho|partilha|herança|inventário|casamento|paternidade/i.test(lower)) { return 'Família'; } return 'Cível'; } /* ======================================================== FLUXO EM 11 PASSOS - PROCESSAMENTO LÓGICO DO CHAT ======================================================== */ async function processChatLogic(userText) { const lower = userText.toLowerCase().trim(); // ---------------------------------------------------- // PASSO 3 (Parte 1): Pergunta o Nome e Confirma a Grafia // ---------------------------------------------------- if (chatState.step === 0) { let rawName = userText.replace(/meu nome é|sou o|sou a|me chamo|o meu nome é|pode me chamar de/gi, '').trim(); rawName = rawName.split(' ')[0] || userText.trim(); rawName = rawName.charAt(0).toUpperCase() + rawName.slice(1); if (rawName.length > 20) rawName = rawName.slice(0, 20); chatState.clientName = rawName; chatState.data.name = rawName; chatState.step = 1; await deliverBotSequence([ `Só para confirmar, é ${escapeHtml(rawName)}, com essa grafia?` ]); return; } // ---------------------------------------------------- // PASSO 3 (Parte 2): Resposta da grafia + Primeira pergunta investigativa (Uma por vez) // ---------------------------------------------------- if (chatState.step === 1) { if (!/sim|correto|isso|é isso|exato|esta certo|está certo|mesmo|correta/i.test(lower) && userText.length < 25) { let corrected = userText.replace(/não|nao|é|sou/gi, '').trim(); if (corrected) { corrected = corrected.charAt(0).toUpperCase() + corrected.slice(1); chatState.clientName = corrected; chatState.data.name = corrected; } } chatState.step = 2; await deliverBotSequence([ `Prazer em falar com você, ${escapeHtml(chatState.clientName)}! Sou especialista sênior com mais de 30 anos de atuação jurídica.`, `Me conte, ${escapeHtml(chatState.clientName)}: o que aconteceu no seu caso? Pode relatar com calma o ocorrido principal.` ]); return; } // ---------------------------------------------------- // PASSO 3 (Parte 3): Pergunta investigativa 2 - Quando e Com Quem (Uma por vez) // ---------------------------------------------------- if (chatState.step === 2) { chatState.data.storyFacts = userText; chatState.detectedArea = inferAreaFromText(userText); chatState.step = 3; await deliverBotSequence([ `Compreendo a gravidade da situação, ${escapeHtml(chatState.clientName)}. Situar a cronologia dos fatos é essencial para resguardar seus direitos.`, `Para eu entender melhor: quando exatamente isso aconteceu e quem foi a empresa, órgão ou pessoa envolvida?` ]); return; } // ---------------------------------------------------- // PASSO 3 (Parte 4): Pergunta investigativa 3 - Contatos Anteriores (Uma por vez) // ---------------------------------------------------- if (chatState.step === 3) { chatState.data.storyWhenWho = userText; chatState.step = 4; await deliverBotSequence([ `Anotei tudo, ${escapeHtml(chatState.clientName)}. A precisão de datas e a identificação do polo contrária são fundamentais na tese jurídica.`, `E me diga: você já tentou algum contato direto ou reclamação para resolver (como SAC, ouvidoria, mensagens ou notificações)?` ]); return; } // ---------------------------------------------------- // PASSO 3 (Parte 5): Pergunta investigativa 4 - Documentos // ---------------------------------------------------- if (chatState.step === 4) { chatState.data.storyPreviousContact = userText; chatState.step = 5; await deliverBotSequence([ `Registrado, ${escapeHtml(chatState.clientName)}. Ter registros de tentativas amigáveis demonstra sua boa-fé objetiva perante o Judiciário.`, `Para fecharmos o diagnóstico inicial: você possui documentos, comprovantes, contratos ou prints guardados referentes a essa situação?` ]); return; } // ---------------------------------------------------- // PASSO 3 (Parte 6) & PASSO B2: EXPLICAÇÃO PASSO A PASSO COM RIQUEZA DE DETALHES // Dividida em mensagens curtas (3-4 linhas max) // Ao final pergunta: "Ficou alguma dúvida sobre isso?" e AGUARDA // ---------------------------------------------------- if (chatState.step === 5) { chatState.data.storyDocs = userText; chatState.data.caseDesc = `${chatState.data.storyFacts}. Ocorrido: ${chatState.data.storyWhenWho}. Tratativas: ${chatState.data.storyPreviousContact}. Provas: ${chatState.data.storyDocs}`; chatState.step = 6; let blockSignificado = ""; let blockDireitos = ""; let blockPratica = ""; let blockDocs = ""; let blockPasso = ""; if (chatState.detectedArea === 'Trabalhista') { blockSignificado = `1. O que a sua situação significa juridicamente:
Conforme os entendimentos mais recentes dos tribunais superiores, a conduta narrada aponta para descumprimento de obrigações do contrato de trabalho.`; blockDireitos = `2. Quais direitos podem estar envolvidos:
A legislação (CLT e CF/88) garante o direito de pleitear a rescisão indireta, quitação de verbas rescisórias integrais, liberação do FGTS + 40%, seguro-desemprego e eventuais reparações.`; blockPratica = `3. O que costuma acontecer nesses casos:
O processo busca a apuração célere perante a Justiça do Trabalho, requerendo-se tutela de urgência se necessário para afastar o empregado sem caracterizar abandono.`; blockDocs = `4. Quais documentos reunir:
Carteira de trabalho, extratos de FGTS, holerites, registros de ponto, e-mails e trocas de mensagens armazenadas.`; blockPasso = `5. Qual o próximo passo:
Ajuizamento de ação com memória de cálculo detalhada discriminando cada verba e pedido.`; } else if (chatState.detectedArea === 'Consumidor') { blockSignificado = `1. O que a sua situação significa juridicamente:
Conforme os entendimentos mais recentes dos tribunais superiores, trata-se de vício na prestação de serviço sob responsabilidade civil objetiva da empresa (CDC - Lei 8.078/90).`; blockDireitos = `2. Quais direitos podem estar envolvidos:
Direito ao ressarcimento de danos materiais causados, cumprimento forçado da obrigação e compensação por danos morais pelo tempo útil desperdiçado.`; blockPratica = `3. O que costuma acontecer nesses casos:
O Judiciário aplica a inversão do ônus da prova em favor do consumidor. O processo busca a rápida restituição dos valores corrigidos.`; blockDocs = `4. Quais documentos reunir:
Notas fiscais, faturas, bilhetes aéreos, comprovantes de pagamento e registros de protocolos não atendidos.`; blockPasso = `5. Qual o próximo passo:
Ingresso com ação de reparação de danos cumulada com pedido de tutela de urgência.`; } else if (chatState.detectedArea === 'Previdenciário') { blockSignificado = `1. O que a sua situação significa juridicamente:
Conforme os entendimentos mais recentes dos tribunais superiores, a negativa indevida do INSS descumpre os mandamentos da Lei de Benefícios (Lei 8.213/91 e LOAS).`; blockDireitos = `2. Quais direitos podem estar envolvidos:
Direito à concessão ou restabelecimento do benefício adequado, com pagamento cumulado das parcelas retroativas desde o requerimento administrativo (DER).`; blockPratica = `3. O que costuma acontecer nesses casos:
Na Justiça Federal, realiza-se perícia médica por perito oficial neutro para avaliar as reais condições do segurado.`; blockDocs = `4. Quais documentos reunir:
Indeferimento do INSS, laudos médicos com CID, receitas e comprovantes de contribuição/CNIS.`; blockPasso = `5. Qual o próximo passo:
Distribuição de ação previdenciária com pedido de antecipação de tutela.`; } else if (chatState.detectedArea === 'Família') { blockSignificado = `1. O que a sua situação significa juridicamente:
Conforme os entendimentos mais recentes dos tribunais superiores, a matéria resguarda a dignidade, subsistência e partilha justa segundo o Código Civil.`; blockDireitos = `2. Quais direitos podem estar envolvidos:
Fixação de pensão alimentícia proporcional, regulamentação de guarda e convivência, e partilha justa de bens.`; blockPratica = `3. O que costuma acontecer nesses casos:
Busca-se prioritariamente a conciliação ou fixação imediata de alimentos provisórios pelo juiz no início da causa.`; blockDocs = `4. Quais documentos reunir:
Certidões de nascimento/casamento, comprovantes de rendimento e planilha de gastos essenciais.`; blockPasso = `5. Qual o próximo passo:
Ajuizamento de petição inicial com pedido liminar emergencial.`; } else { blockSignificado = `1. O que a sua situation significa juridicamente:
Conforme os entendimentos mais recentes dos tribunais superiores, o ilícito gera o dever de indenizar e reparar nos termos dos arts. 186 e 927 do Código Civil.`; blockDireitos = `2. Quais direitos podem estar envolvidos:
Restituição de quantias com juros e correção, aplicação de multas contratuais e ressarcimento por danos materiais e morais.`; blockPratica = `3. O que costuma acontecer nesses casos:
Ajuizamento de ação de cobrança/indenização por rito comum com pedido de produção de provas.`; blockDocs = `4. Quais documentos reunir:
Contratos, comprovantes de pagamento, notificações e registros das tratativas mantidas.`; blockPasso = `5. Qual o próximo passo:
Elaboração de petição inicial fundamentada instruída com os elementos probatórios.`; } await deliverBotSequence([ `Muito obrigada por relatar todos esses detalhes, ${escapeHtml(chatState.clientName)}. Com base em mais de 30 anos de experiência jurídica, preparei um diagnóstico do seu caso:`, blockSignificado, blockDireitos, blockPratica, blockDocs, blockPasso, `Ficou alguma dúvida sobre isso, ${escapeHtml(chatState.clientName)}?` ]); return; } // ---------------------------------------------------- // PASSO B3 & PASSO 4: SÓ AVANÇA QUANDO O CLIENTE SINALIZAR QUE NÃO TEM MAIS DÚVIDAS // Se o cliente fizer nova pergunta, a IA responde com calma e retoma sem pular etapas. // ---------------------------------------------------- if (chatState.step === 6) { const hasNoMoreDoubts = /não|nao|sem dúvidas|sem duvida|sem nenhuma dúvida|tudo claro|ficou claro|entendi|avançar|avancar|proximo|próximo|quero|formalizar|seguir|sim|podemos|vamos/i.test(lower) && !/tenho dúvida|tenho duvida|tenho uma dúvida|quanto custa|demora|não entendi|nao entendi|como funciona|e se|qual o valor/i.test(lower); if (hasNoMoreDoubts) { chatState.step = 7; await deliverBotSequence([ `Então, ${escapeHtml(chatState.clientName)}, não havendo mais dúvidas sobre o seu caso, vamos avançar?`, `Vamos avançar agora para o próximo passo.`, `Neste momento, estou analisando todas as informações que você trouxe e gerando a sua **Petição Inicial** com memória de cálculo detalhada, fundamentação em leis atuais, fatos em ordem cronológica e direitos apontados.`, `Em paralelo, para formalizarmos seu contrato e declaração de hipossuficiência, vou solicitar seus dados cadastrais, uma pergunta por vez.`, `Por gentileza, informe o seu **nome completo**:` ]); } else { // Cliente ainda tem dúvida: IA responde e aprofunda sem oferecer WhatsApp await deliverBotSequence([ `Com certeza, ${escapeHtml(chatState.clientName)}! Faço questão de esclarecer qualquer detalhe antes de prosseguirmos.`, `Conforme os entendimentos mais recentes dos tribunais superiores, a análise documental minuciosa antes da distribuição garante a liquidez do pedido e previne sobressaltos durante a instrução.`, `Consegui responder ao seu ponto, ${escapeHtml(chatState.clientName)}? Ficou mais alguma dúvida sobre isso?` ]); } return; } // ---------------------------------------------------- // PASSO 6: Coleta de Dados Cadastrais - UMA pergunta por vez // ---------------------------------------------------- // Dado 1: Nome Completo recebido -> Solicita Endereço Completo com CEP if (chatState.step === 7) { chatState.data.fullName = userText; chatState.step = 8; await deliverBotSequence([ `Anotado, ${escapeHtml(chatState.clientName)}! Agora informe o seu endereço completo com CEP:` ]); return; } // Dado 2: Endereço recebido -> Solicita E-mail if (chatState.step === 8) { chatState.data.address = userText; chatState.step = 9; await deliverBotSequence([ `Perfeito! Qual é o seu e-mail para contato e atualizações do processo?` ]); return; } // Dado 3: E-mail recebido -> Solicita Celular com DDD if (chatState.step === 9) { chatState.data.email = userText; chatState.step = 10; await deliverBotSequence([ `Registrado! Informe o seu número de celular com DDD:` ]); return; } // Dado 4: Celular recebido -> Solicita CPF if (chatState.step === 10) { chatState.data.phone = userText; chatState.step = 11; await deliverBotSequence([ `Ótimo! Qual é o número do seu CPF?` ]); return; } // Dado 5: CPF recebido -> Solicita RG if (chatState.step === 11) { chatState.data.cpf = userText; chatState.step = 12; await deliverBotSequence([ `Anotado! Informe o número do seu RG (com órgão expedidor e UF):` ]); return; } // Dado 6: RG recebido -> Solicita Estado Civil e Qualificação Completa if (chatState.step === 12) { chatState.data.rg = userText; chatState.step = 13; await deliverBotSequence([ `Para finalizar seu cadastro, informe o seu estado civil (ex: Solteiro(a), Casado(a)) e sua qualificação/profissão completa:` ]); return; } // ---------------------------------------------------- // PASSOS 4, 5, 7, 8, 9, 10, 11: // GERAÇÃO AUTOMÁTICA EM PARALELO DE TUDO: // - Petição Inicial com memória de cálculo detalhada // - Contrato completo (objeto, honorários, 24x, multa, 30% êxito, LGPD, foro SP) // - Declaração de Hipossuficiência // - Login e Senha gerados automaticamente // - Cadastro no painel administrativo do advogado // - Cálculo de Honorários (OAB + 10% + 5%, 24x) com destaque GRANDE de Parcela + Por Dia (Total Oculto) // - Notificação WhatsApp no painel administrativo // - SOMENTE AGORA entrega o botão de WhatsApp wa.me/5511944974907 // ---------------------------------------------------- if (chatState.step === 13) { const userQualif = userText; const parts = userQualif.split(','); chatState.data.civil = parts[0] ? parts[0].trim() : 'Solteiro(a)'; chatState.data.qualif = parts[1] ? parts[1].trim() : (userQualif || 'Profissional'); chatState.step = 14; const fullName = chatState.data.fullName || chatState.clientName || 'Cliente Atendido'; const area = chatState.detectedArea || 'Cível'; // PASSOS 8: Login e Senha gerados AUTOMATICAMENTE const cleanName = fullName.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]/g, "."); const nameParts = cleanName.split('.').filter(p => p.length > 2); const username = nameParts.length >= 2 ? `${nameParts[0]}.${nameParts[nameParts.length - 1]}` : `${nameParts[0] || 'cliente'}.${Math.floor(100 + Math.random() * 899)}`; const password = 'RS@' + Math.floor(1000 + Math.random() * 9000); // PASSO 9: Cálculo de Honorários const fees = computeFeeValues(area); // PASSO 8: Cadastro automático no objeto de clientes const newClient = { id: 'c_' + Date.now(), name: fullName, cpf: chatState.data.cpf || '000.000.000-00', rg: chatState.data.rg || '00.000.000-0 SSP/SP', civil: chatState.data.civil, qualif: chatState.data.qualif, area: area, phone: chatState.data.phone || '(11) 944974907', email: chatState.data.email || 'cliente@email.com', address: chatState.data.address || 'São Paulo - SP', caseDesc: chatState.data.caseDesc || 'Atendimento e formalização de patrocínio via Chat IA', username: username, password: password, createdAt: new Date().toLocaleDateString('pt-BR'), feeMonthly: fees.monthlyFmt, feeDaily: fees.dailyFmt, feeTotal: fees.totalFmt, docs: [], contractText: '', hipoText: '', initialText: '' }; // PASSOS 4 & 7: Geração em paralelo das minutas de Petição, Contrato e Hipossuficiência newClient.contractText = generateContractContent(newClient); newClient.hipoText = generateHipoContent(newClient); newClient.initialText = generateInitialPetitionContent(newClient); // PASSO 8: Salvar cliente e processo no painel do advogado state.clients.unshift(newClient); saveClients(); const newCase = { internalNum: 'RS-2025-' + String(state.cases.length + 1).padStart(3, '0'), clientId: newClient.id, clientName: newClient.name, cnj: 'Aguardando protocolo', area: newClient.area, status: 'Em análise', events: [{ date: new Date().toLocaleDateString('pt-BR'), desc: 'Cadastro e Petição Inicial gerados via Chat IA da RS Advogados.' }] }; state.cases.unshift(newCase); saveCases(); // PASSO 11: Registrar notificação no painel administrativo const waMsg = `${fullName} e o número cadastrado na plataforma ${username} cadastrado com sucesso`; state.whatsappLogs.unshift({ id: 'w_' + Date.now(), text: waMsg, date: new Date().toLocaleString('pt-BR'), phone: '5511944974907' }); saveWhatsappLogs(); // Atualizar tabelas do painel renderClientsTable(); renderAdminDashboard(); renderCasesTable(); // Expor documentos no window para download direto pelo chat window._chatContractDoc = newClient.contractText; window._chatHipoDoc = newClient.hipoText; window._chatInitialDoc = newClient.initialText; // PASSO 10: Destaque GRANDE e chamativo SOMENTE da parcela e valor diário (Total NÃO aparece aqui!) const feeBox = document.createElement('div'); feeBox.className = 'fee-highlight'; feeBox.style.margin = '10px 0'; feeBox.style.textAlign = 'center'; feeBox.innerHTML = `
Condições Especiais de Parcelamento
Parcela Mensal (24x)
R$ ${fees.monthlyFmt}
Valor por Dia
R$ ${fees.dailyFmt} /dia
* Para causas com pleito de valores, será cobrado 30% de honorários advocatícios de êxito sobre o valor conseguido.
`; // PASSO 8: Caixa de Credenciais com Botão "Copiar credenciais" const credBox = document.createElement('div'); credBox.style.background = '#091220'; credBox.style.border = '1px solid #5dd579'; credBox.style.borderRadius = '10px'; credBox.style.padding = '14px'; credBox.style.margin = '10px 0'; credBox.innerHTML = `
🔑 Credenciais Geradas para Acesso ao Portal:
Acesse a Área do Cliente para acompanhar seu processo e enviar arquivos.
Usuário: ${escapeHtml(username)}
Senha: ${escapeHtml(password)}
`; // PASSOS 4, 5, 7: Caixa com Downloads de Contrato, Declaração e Petição Inicial const docBox = document.createElement('div'); docBox.style.background = '#0b1526'; docBox.style.border = '1px solid rgba(201,168,76,0.3)'; docBox.style.borderRadius = '10px'; docBox.style.padding = '14px'; docBox.style.margin = '10px 0'; docBox.innerHTML = `
📄 Seus Documentos Oficiais Gerados:
1. Contrato de Prestação de Serviços
2. Declaração de Hipossuficiência
3. Petição Inicial Pré-Pronta com Memória de Cálculo
`; // PASSOS B1, C11: SOMENTE AGORA O WHATSAPP É OFERECIDO AO CLIENTE const waBox = document.createElement('div'); waBox.style.textAlign = 'center'; waBox.style.marginTop = '10px'; waBox.innerHTML = ` Abrir no WhatsApp (11) 944974907 `; await deliverBotSequence([ `Parabéns, ${escapeHtml(chatState.clientName)}! Seu atendimento, cadastro e minuta de Petição Inicial foram gerados com pleno êxito em nosso sistema.`, { text: `Aqui estão as condições do seu parcelamento:`, extra: feeBox }, { text: `Suas credenciais para o Portal do Cliente:`, extra: credBox }, { text: `Seus documentos Oficiais disponíveis para download:`, extra: docBox }, { text: `Para encaminhar seu protocolo e conversar com o advogado de plantão:`, extra: waBox } ]); return; } if (chatState.step >= 14) { await deliverBotSequence([ `Seu cadastro e petição já foram gerados, ${escapeHtml(chatState.clientName)}! Clique no botão do WhatsApp acima para conversar diretamente com nosso plantão pelo número (11) 944974907.` ]); } } function copyChatCredentials(username, password) { const text = `Credenciais de acesso RS Advogados:\nUsuário: ${username}\nSenha: ${password}\nAcesse o Portal na Área do Cliente.`; navigator.clipboard.writeText(text).then(() => { showDocToast('Credenciais copiadas com sucesso!'); }).catch(() => { alert(`Usuário: ${username}\nSenha: ${password}`); }); } function downloadChatDoc(type, format) { let text = ''; let title = ''; const safeName = (chatState.clientName || 'Cliente').normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-zA-Z0-9]+/g, '_'); let filename = ''; if (type === 'contract') { text = window._chatContractDoc; title = 'Contrato de Prestação de Serviços Advocatícios'; filename = `Contrato_${safeName}`; } else if (type === 'hipo') { text = window._chatHipoDoc; title = 'Declaração de Hipossuficiência Econômica'; filename = `Declaracao_Hipossuficiencia_${safeName}`; } else if (type === 'initial') { text = window._chatInitialDoc; title = 'Petição Inicial Pré-Pronta'; filename = `Peticao_Inicial_${safeName}`; } if (!text) { showDocToast('Documento ainda não foi gerado.', false); return; } if (format === 'word') { const blob = generateValidWordBlob(title, text); triggerDownload(blob, filename + '.doc'); } else if (format === 'pdf') { const blob = generateValidPDFBlob(title, text); triggerDownload(blob, filename + '.pdf'); } else if (format === 'preview') { previewDocument(title, text); } }======================================================== 5) CHAT FLUTUANTE IA — ATENDIMENTO CONSULTIVO COMPLETO IA Especialista Sênior (>30 anos de experiência) Coleta de dados passo a passo + Geração em Paralelo ======================================================== */ let chatState = { step: 0, clientName: '', isBusy: false, detectedArea: 'Cível', data: { name: '', storyFacts: '', storyWhenWho: '', storyPreviousContact: '', storyDocsAndDoubts: '', fullName: '', address: '', email: '', phone: '', cpf: '', rg: '', civil: 'Solteiro(a)', qualif: 'Profissional', caseDesc: '' } }; function initChat() { const openBtn = document.getElementById('openChatBtn'); const closeBtn = document.getElementById('closeChatBtn'); const chatWin = document.getElementById('chatWindow'); const sendBtn = document.getElementById('chatSendBtn'); const input = document.getElementById('chatInput'); openBtn.addEventListener('click', () => { chatWin.classList.toggle('active'); if (chatWin.classList.contains('active')) input.focus(); }); closeBtn.addEventListener('click', () => { chatWin.classList.remove('active'); }); sendBtn.addEventListener('click', handleChatUserSend); input.addEventListener('keypress', (e) => { if (e.key === 'Enter') handleChatUserSend(); }); } function addChatUserMsg(text) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg user'; div.textContent = text; body.appendChild(div); body.scrollTop = body.scrollHeight; } const sleep = (ms) => new Promise(res => setTimeout(res, ms)); function showTypingIndicator() { const body = document.getElementById('chatMessages'); const indicator = document.createElement('div'); indicator.id = 'chatTypingIndicator'; indicator.className = 'chat-typing'; indicator.innerHTML = `
Dra. Especialista está digitando... `; body.appendChild(indicator); body.scrollTop = body.scrollHeight; } function hideTypingIndicator() { const indicator = document.getElementById('chatTypingIndicator'); if (indicator) indicator.remove(); } async function typeBotMessage(htmlString, extraActionElement = null) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg bot'; body.appendChild(div); let currentHtml = ''; let i = 0; const len = htmlString.length; while (i < len) { if (htmlString[i] === '<') { const closeIdx = htmlString.indexOf('>', i); if (closeIdx !== -1) { currentHtml += htmlString.substring(i, closeIdx + 1); div.innerHTML = currentHtml; i = closeIdx + 1; continue; } } const char = htmlString[i]; currentHtml += char; div.innerHTML = currentHtml; body.scrollTop = body.scrollHeight; i++; let delay = 20; if (char === '.' || char === '!' || char === '?') { delay = 250; } else if (char === ',' || char === ';' || char === ':') { delay = 110; } else if (char === '\n') { delay = 140; } await sleep(delay); } if (extraActionElement) { div.appendChild(extraActionElement); body.scrollTop = body.scrollHeight; } } async function deliverBotSequence(blocks) { chatState.isBusy = true; const input = document.getElementById('chatInput'); const sendBtn = document.getElementById('chatSendBtn'); input.disabled = true; sendBtn.disabled = true; input.placeholder = "Especialista sênior formulando orientação..."; for (let idx = 0; idx < blocks.length; idx++) { const item = blocks[idx]; const html = typeof item === 'string' ? item : item.text; const extra = typeof item === 'object' && item.extra ? item.extra : null; showTypingIndicator(); await sleep(1100 + Math.random() * 400); hideTypingIndicator(); await typeBotMessage(html, extra); if (idx < blocks.length - 1) { await sleep(500); } } input.disabled = false; sendBtn.disabled = false; input.placeholder = "Digite sua mensagem..."; input.focus(); chatState.isBusy = false; } function handleChatUserSend() { if (chatState.isBusy) return; const input = document.getElementById('chatInput'); const txt = input.value.trim(); if (!txt) return; addChatUserMsg(txt); input.value = ''; processChatLogic(txt); } function inferAreaFromText(text) { const lower = text ? text.toLowerCase() : ''; if (/trabalh|empresa|patrão|chefe|salário|fgts|carteira|demiss|hora extra|vínculo|rescisão/i.test(lower)) { return 'Trabalhista'; } if (/voo|aérea|bagagem|produto|banco|compra|golpe|pix|cartão|loja|atraso|consumidor|vício|defeito/i.test(lower)) { return 'Consumidor'; } if (/inss|aposentad|benefício|perícia|loas|bpc|auxílio|doença|pensão por morte|segurado/i.test(lower)) { return 'Previdenciário'; } if (/divórcio|guarda|pensão alimentícia|filho|partilha|herança|inventário|casamento|paternidade/i.test(lower)) { return 'Família'; } return 'Cível'; } async function processChatLogic(userText) { const lower = userText.toLowerCase().trim(); // ========================================== // ETAPA 0: Solaginar o NOME do cliente // ========================================== if (chatState.step === 0) { let rawName = userText.replace(/meu nome é|sou o|sou a|me chamo|o meu nome é|pode me chamar de/gi, '').trim(); rawName = rawName.split(' ')[0] || userText.trim(); rawName = rawName.charAt(0).toUpperCase() + rawName.slice(1); if (rawName.length > 20) rawName = rawName.slice(0, 20); chatState.clientName = rawName; chatState.data.name = rawName; chatState.step = 1; await deliverBotSequence([ `Entendi! Só para confirmar, é ${escapeHtml(rawName)}, com essa grafia? Correto?` ]); return; } // ========================================== // ETAPA 1: Confirmação da Grafia do Nome // ========================================== if (chatState.step === 1) { if (!/sim|correto|isso|é isso|exato|esta certo|está certo|mesmo/i.test(lower) && userText.length < 25) { let corrected = userText.replace(/não|nao|é|sou/gi, '').trim(); if (corrected) { corrected = corrected.charAt(0).toUpperCase() + corrected.slice(1); chatState.clientName = corrected; chatState.data.name = corrected; } } chatState.step = 2; await deliverBotSequence([ `Perfeito, ${escapeHtml(chatState.clientName)}! É um grande prazer orientar o seu atendimento.`, `Me conte, ${escapeHtml(chatState.clientName)}: o que aconteceu no seu caso? Pode relatar com calma o ocorrido principal que motivou o seu contato.` ]); return; } // ========================================== // ETAPA 2: Investigação 1 - O que aconteceu -> Pergunta Quando e Com Quem // ========================================== if (chatState.step === 2) { chatState.data.storyFacts = userText; chatState.detectedArea = inferAreaFromText(userText); chatState.step = 3; await deliverBotSequence([ `Compreendo perfeitamente a sua preocupação, ${escapeHtml(chatState.clientName)}. Situar os detalhes cronológicos é fundamental para resguardar seus direitos.`, `Para eu entender melhor o seu caso: quando exatamente isso aconteceu (ou há quanto tempo vem ocorrendo) e quem foi a empresa, órgão ou pessoa envolvida?` ]); return; } // ========================================== // ETAPA 3: Investigação 2 - Quando e quem -> Pergunta Tentativas Anteriores // ========================================== if (chatState.step === 3) { chatState.data.storyWhenWho = userText; chatState.step = 4; await deliverBotSequence([ `Anotei tudo, ${escapeHtml(chatState.clientName)}. A precisão das datas e identificação da parte contrária é decisiva na tese jurídica.`, `E me diga: você já tentou algum contato direto para resolver (como SAC, ouvidoria, mensagens ou notificações), ou procurou outro órgão antes de falar conosco?` ]); return; } // ========================================== // ETAPA 4: Investigação 3 - Contatos anteriores -> Pergunta Documentos e Dúvida Principal // ========================================== if (chatState.step === 4) { chatState.data.storyPreviousContact = userText; chatState.step = 5; await deliverBotSequence([ `Registrado, ${escapeHtml(chatState.clientName)}. O histórico de tentativas de solução amigável demonstra a sua boa-fé objetiva perante o Judiciário.`, `Para fecharmos o diagnóstico do seu caso: você possui documentos, comprovantes, contratos ou prints guardados? E qual é a sua dúvida principal neste momento?` ]); return; } // ========================================== // ETAPA 5: Documentos & Dúvidas -> EXPLICAÇÃO RICA PASSO A PASSO // ========================================== if (chatState.step === 5) { chatState.data.storyDocsAndDoubts = userText; chatState.data.caseDesc = `${chatState.data.storyFacts}. Ocorrido em: ${chatState.data.storyWhenWho}. Tratativas: ${chatState.data.storyPreviousContact}. Provas/Dúvidas: ${chatState.data.storyDocsAndDoubts}`; chatState.step = 6; let blockSignificado = ""; let blockDireitos = ""; let blockPratica = ""; let blockDocs = ""; let blockPasso = ""; if (chatState.detectedArea === 'Trabalhista') { blockSignificado = `1. O que a sua situação significa juridicamente:
A conduta narrada configura violação continuada às obrigações do contrato de trabalho, conforme os entendimentos mais recentes dos tribunais superiores trabalhistas.`; blockDireitos = `2. Quais direitos podem estar envolvidos:
A legislação (CLT e CF/88) garante o direito de pleitear a rescisão indireta (justa causa do empregador), quitação de verbas rescisórias integrais, liberação do FGTS com multa de 40%, seguro-desemprego e indenização por danos morais.`; blockPratica = `3. O que costuma acontecer nesses casos:
O processo tramita perante a Justiça do Trabalho. Em situações urgentes, requer-se tutela liminar para baixa imediata na carteira de trabalho e liberação do FGTS sem caracterizar abandono de emprego.`; blockDocs = `4. Quais documentos reunir:
Carteira de trabalho (física ou digital), extrato analítico do FGTS, comprovantes de pagamento (holerites), registros de horário e trocas de mensagens/e-mails.`; blockPasso = `5. Qual o próximo passo:
Ajuizamento da ação com memória de cálculo detalhada discriminando cada verba e pedido.`; } else if (chatState.detectedArea === 'Consumidor') { blockSignificado = `1. O que a sua situação significa juridicamente:
Trata-se de falha grave na prestação do serviço ou vício de produto, incidindo a responsabilidade civil objetiva da empresa fornecedora (Código de Defesa do Consumidor - Lei 8.078/90), conforme os entendimentos mais recentes dos tribunais superiores.`; blockDireitos = `2. Quais direitos podem estar envolvidos:
Direito à restituição integral do valor pago corrigido, indenização pelos danos materiais sofridos, cumprimento forçado da obrigação e compensação por danos morais decorrentes do desvio produtivo do seu tempo útil.`; blockPratica = `3. O que costuma acontecer nesses casos:
O Judiciário aplica a inversão do ônus da prova em favor do consumidor. A causa costuma ter andamento cérebro para buscar a justa compensação.`; blockDocs = `4. Quais documentos reunir:
Notas fiscais, faturas, bilhetes/vouchers, números de protocolo, e-mails ou conversas e comprovantes de gastos adicionais.`; blockPasso = `5. Qual o próximo passo:
Ingresso com ação de reparação de danos cumulada com pedido de tutela de urgência.`; } else if (chatState.detectedArea === 'Previdenciário') { blockSignificado = `1. O que a sua situação significa juridicamente:
A negativa ou demora excessiva do INSS afronta a Lei de Benefícios da Previdência Social (Lei 8.213/91 e LOAS), conforme os entendimentos mais recentes dos tribunais superiores.`; blockDireitos = `2. Quais direitos podem estar envolvidos:
Direito à concessão ou restabelecimento do benefício previdenciário/assistencial adequado, com recebimento cumulado de todas as parcelas retroativas desde a data do primeiro requerimento administrativo (DER).`; blockPratica = `3. O que costuma acontecer nesses casos:
A causa tramita na Justiça Federal com designação de perícia médica judicial por perito neutro oficial para avaliar as reais condições do segurado.`; blockDocs = `4. Quais documentos reunir:
Carta de indeferimento do INSS, laudos e atestados médicos atualizados com CID, receitas e comprovantes de contribuição/CNIS.`; blockPasso = `5. Qual o próximo passo:
Distribuição da ação previdenciária com pedido de antecipação dos efeitos da tutela.`; } else if (chatState.detectedArea === 'Família') { blockSignificado = `1. O que a sua situação significa juridicamente:
Trata-se de matéria resguardada pelo Direito de Família e Sucessões do Código Civil, visando à proteção prioritária da dignidade, alimentos e bem-estar dos envolvidos, conforme os entendimentos mais recentes dos tribunais superiores.`; blockDireitos = `2. Quais direitos podem estar envolvidos:
Fixação ou revisão de pensão alimentícia proporcional, regulamentação de guarda e regime de convivência, e partilha justa de bens.`; blockPratica = `3. O que costuma acontecer nesses casos:
Procura-se primeiramente a via consensual ou audiência de mediação. Na ausência de acordo, o juiz fixa alimentos provisórios logo de início.`; blockDocs = `4. Quais documentos reunir:
Certidões de nascimento/casamento, comprovantes de rendimento do alimentante e de despesas essenciais.`; blockPasso = `5. Qual o próximo passo:
Elaboração de petição inicial com pedido imediato de fixação de alimentos provisórios.`; } else { blockSignificado = `1. O que a sua situação significa juridicamente:
A conduta narrada configura descumprimento de obrigação civil e legal, gerando o dever inequívoco de indenizar pelos arts. 186 e 927 do Código Civil, conforme os entendimentos mais recentes dos tribunais superiores.`; blockDireitos = `2. Quais direitos podem estar envolvidos:
Restituição de quantias com juros e correção monetária, aplicação de multas contratuais e ressarcimento por danos materiais e morais.`; blockPratica = `3. O que costuma acontecer nesses casos:
Envio de notificação extrajudicial e ajuizamento de ação declaratória/indenizatória perante as Varás Cíveis.`; blockDocs = `4. Quais documentos reunir:
Contratos, recibos de pagamento, notificações anteriores e registros das tratativas.`; blockPasso = `5. Qual o próximo passo:
Distribuição da petição inicial instruída com os elementos probatórios do dano.`; } const fullExplanation = `${blockSignificado}

${blockDireitos}

${blockPratica}

${blockDocs}

${blockPasso}`; await deliverBotSequence([ `Muito obrigado por relatar todos esses detalhes, ${escapeHtml(chatState.clientName)}. Com base em mais de 30 anos de atuação especializada, preparei um diagnóstico passo a passo do seu caso:`, fullExplanation, `Ficou clara essa explicação para você, ${escapeHtml(chatState.clientName)}? Não havendo mais dúvidas sobre o seu caso, vamos avançar?` ]); return; } // ========================================== // ETAPA 6: Resposta sobre Dúvidas / Avançar // ========================================== if (chatState.step === 6) { const wantsToAdvance = /não|nao|sem dúvidas|sem duvida|tudo claro|ficou claro|entendi|avançar|avancar|proximo|próximo|quero|formalizar|seguir|sim|podemos|vamos/i.test(lower) && !/tenho dúvida|tenho duvida|me explica|quanto custa|demora|não entendi|nao entendi/i.test(lower); if (wantsToAdvance) { chatState.step = 7; await deliverBotSequence([ `Excelente, ${escapeHtml(chatState.clientName)}! Vamos avançar agora para o próximo passo.`, `Para formalizarmos o seu cadastro, contrato de prestação de serviços e declaração de hipossuficiência, vou solicitar seus dados básicos, uma pergunta por vez.`, `Em primeiro lugar, informe o seu nome completo:` ]); } else { await deliverBotSequence([ `Com certeza, ${escapeHtml(chatState.clientName)}! Faremos questão de esclarecer qualquer detalhe antes de prosseguir.`, `Nossa atuação é pautada na transparência absoluta. Analisamos minuciosamente todas as provas fornecidas antes da distribuição da ação.`, `Consegui responder ao seu ponto, ${escapeHtml(chatState.clientName)}? Não havendo mais dúvidas sobre o seu caso, vamos avançar?` ]); } return; } // ========================================== // ETAPA 7: Coleta Dado 1 - Nome Completo -> Pergunta Endereço // ========================================== if (chatState.step === 7) { chatState.data.fullName = userText; chatState.step = 8; await deliverBotSequence([ `Obrigado, ${escapeHtml(chatState.clientName)}! Agora, informe o seu endereço completo com CEP:` ]); return; } // ========================================== // ETAPA 8: Coleta Dado 2 - Endereço -> Pergunta E-mail // ========================================== if (chatState.step === 8) { chatState.data.address = userText; chatState.step = 9; await deliverBotSequence([ `Anotado, ${escapeHtml(chatState.clientName)}! Qual é o seu e-mail para contato e envio das notificações?` ]); return; } // ========================================== // ETAPA 9: Coleta Dado 3 - E-mail -> Pergunta Celular // ========================================== if (chatState.step === 9) { chatState.data.email = userText; chatState.step = 10; await deliverBotSequence([ `Perfeito, ${escapeHtml(chatState.clientName)}! Informe o seu número de celular com DDD:` ]); return; } // ========================================== // ETAPA 10: Coleta Dado 4 - Celular -> Pergunta CPF // ========================================== if (chatState.step === 10) { chatState.data.phone = userText; chatState.step = 11; await deliverBotSequence([ `Registrado, ${escapeHtml(chatState.clientName)}! Qual é o número do seu CPF?` ]); return; } // ========================================== // ETAPA 11: Coleta Dado 5 - CPF -> Pergunta RG // ========================================== if (chatState.step === 11) { chatState.data.cpf = userText; chatState.step = 12; await deliverBotSequence([ `Ótimo, ${escapeHtml(chatState.clientName)}! Informe o seu número de RG (com órgão expedidor e UF):` ]); return; } // ========================================== // ETAPA 12: Coleta Dado 6 - RG -> Pergunta Estado Civil e Qualificação // ========================================== if (chatState.step === 12) { chatState.data.rg = userText; chatState.step = 13; await deliverBotSequence([ `Excelente, ${escapeHtml(chatState.clientName)}! Para finalizar, informe o seu estado civil (ex: Solteiro(a), Casado(a)) e a sua qualificação/profissão completa:` ]); return; } // ========================================== // ETAPA 13: Conclusão da Coleta -> GERAÇÃO AUTOMÁTICA EM PARALELO DE TUDO! // ========================================== if (chatState.step === 13) { chatState.data.civilQualif = userText; const parts = userText.split(','); chatState.data.civil = parts[0] ? parts[0].trim() : 'Solteiro(a)'; chatState.data.qualif = parts[1] ? parts[1].trim() : (userText || 'Profissional'); chatState.step = 14; const fullName = chatState.data.fullName || chatState.clientName || 'Cliente Atendido'; const area = chatState.detectedArea || 'Cível'; // A) Gerar Credenciais const cleanName = fullName.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]/g, "."); const nameParts = cleanName.split('.').filter(p => p.length > 2); const username = nameParts.length >= 2 ? `${nameParts[0]}.${nameParts[nameParts.length - 1]}` : `${nameParts[0] || 'cliente'}.${Math.floor(100 + Math.random() * 899)}`; const password = 'RS@' + Math.floor(1000 + Math.random() * 9000); // B) Cálculo de Honorários const fees = computeFeeValues(area); // C) Criar Objeto do Cliente const newClient = { id: 'c_' + Date.now(), name: fullName, cpf: chatState.data.cpf || '000.000.000-00', rg: chatState.data.rg || '00.000.000-0 SSP/SP', civil: chatState.data.civil, qualif: chatState.data.qualif, area: area, phone: chatState.data.phone || '(11) 944974907', email: chatState.data.email || 'cliente@email.com', address: chatState.data.address || 'São Paulo/SP', caseDesc: chatState.data.caseDesc || 'Atendimento e patrocínio jurídico via Chat IA', username: username, password: password, createdAt: new Date().toLocaleDateString('pt-BR'), feeMonthly: fees.monthlyFmt, feeDaily: fees.dailyFmt, feeTotal: fees.totalFmt, docs: [], contractText: '', hipoText: '', initialText: '' }; // Geração paralela dos textos jurídicos newClient.contractText = generateContractContent(newClient); newClient.hipoText = generateHipoContent(newClient); newClient.initialText = generateInitialPetitionContent(newClient); // D) Salvar Cliente e Processo no Painel state.clients.unshift(newClient); saveClients(); const newCase = { internalNum: 'RS-2025-' + String(state.cases.length + 1).padStart(3, '0'), clientId: newClient.id, clientName: newClient.name, cnj: 'Aguardando protocolo', area: newClient.area, status: 'Em análise', events: [{ date: new Date().toLocaleDateString('pt-BR'), desc: 'Cadastro automático realizado via Chat IA com minuta de Petição Inicial gerada.' }] }; state.cases.unshift(newCase); saveCases(); // E) Registrar Notificação WhatsApp const waMsg = `${fullName} e o número cadastrado na plataforma ${username} cadastrado com sucesso`; state.whatsappLogs.unshift({ id: 'w_' + Date.now(), text: waMsg, date: new Date().toLocaleString('pt-BR'), phone: '5511944974907' }); saveWhatsappLogs(); // Atualizar painéis administrativos renderClientsTable(); renderAdminDashboard(); renderCasesTable(); // Armazenar para download direto no chat window._chatContractDoc = newClient.contractText; window._chatHipoDoc = newClient.hipoText; window._chatInitialDoc = newClient.initialText; window._chatClientName = fullName; // F) Montar elementos gráficos no chat const feeBox = document.createElement('div'); feeBox.className = 'fee-highlight'; feeBox.style.margin = '10px 0'; feeBox.style.textAlign = 'center'; feeBox.innerHTML = `
Condições Especiais de Honorários
Parcela Mensal (24x)
R$ ${fees.monthlyFmt}
Por Dia
R$ ${fees.dailyFmt} /dia
* Será cobrado 30% de honorários advocatícios de êxito sobre o valor conseguido para casos com pleito de valores.
`; const credBox = document.createElement('div'); credBox.style.background = '#091220'; credBox.style.border = '1px solid #5dd579'; credBox.style.borderRadius = '10px'; credBox.style.padding = '14px'; credBox.style.margin = '10px 0'; credBox.innerHTML = `
🔑 Credenciais Geradas para a Área do Cliente:
Você já pode acessar a Área do Cliente para acompanhar seu processo e enviar arquivos.
Usuário: ${escapeHtml(username)}
Senha: ${escapeHtml(password)}
`; const docBox = document.createElement('div'); docBox.style.background = '#0b1526'; docBox.style.border = '1px solid rgba(201,168,76,0.3)'; docBox.style.borderRadius = '10px'; docBox.style.padding = '14px'; docBox.style.margin = '10px 0'; docBox.innerHTML = `
📄 Seus Documentos Oficiais Prontos:
1. Contrato de Prestação de Serviços
2. Declaração de Hipossuficiência
3. Petição Inicial Pré-Pronta
`; const waBox = document.createElement('div'); waBox.style.textAlign = 'center'; waBox.style.marginTop = '10px'; waBox.innerHTML = ` Conversar no WhatsApp (11) 944974907 `; await deliverBotSequence([ `Parabéns, ${escapeHtml(chatState.clientName)}! Seu atendimento e cadastro automático foram executados com pleno êxito em nosso sistema operacional.`, { text: `Aqui estão as condições especiais do seu parcelamento:`, extra: feeBox }, { text: `Suas credenciais de acesso ao portal do cliente:`, extra: credBox }, { text: `Seus documentos Oficiais gerados simultaneamente:`, extra: docBox }, { text: `Para falar com o advogado de plantão e dar andamento ao protocolo:`, extra: waBox } ]); return; } if (chatState.step >= 14) { await deliverBotSequence([ `Seu cadastro já foi finalizado, ${escapeHtml(chatState.clientName)}! Clique no botão do WhatsApp acima para falar com nosso plantão pelo número (11) 944974907.` ]); } } function copyChatCredentials(username, password) { const text = `Credenciais de acesso RS Advogados:\nUsuário: ${username}\nSenha: ${password}\nAcesse o Portal na Área do Cliente.`; navigator.clipboard.writeText(text).then(() => { showDocToast('Credenciais copiadas para a área de transferência!'); }).catch(() => { alert(`Usuário: ${username}\nSenha: ${password}`); }); } function downloadChatDoc(type, format) { let text = ''; let title = ''; const safeName = (chatState.clientName || 'Cliente').normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-zA-Z0-9]+/g, '_'); let filename = ''; if (type === 'contract') { text = window._chatContractDoc; title = 'Contrato de Prestação de Serviços Advocatícios'; filename = `Contrato_${safeName}`; } else if (type === 'hipo') { text = window._chatHipoDoc; title = 'Declaração de Hipossuficiência Econômica'; filename = `Declaracao_Hipossuficiencia_${safeName}`; } else if (type === 'initial') { text = window._chatInitialDoc; title = 'Petição Inicial Pré-Pronta'; filename = `Peticao_Inicial_${safeName}`; } if (!text) { showDocToast('Documento ainda não foi gerado.', false); return; } if (format === 'word') { const blob = generateValidWordBlob(title, text); triggerDownload(blob, filename + '.doc'); } else if (format === 'pdf') { const blob = generateValidPDFBlob(title, text); triggerDownload(blob, filename + '.pdf'); } else if (format === 'preview') { previewDocument(title, text); } }======================================================== SISTEMA ROBUSTO DE GERAÇÃO & DOWNLOAD DE DOCUMENTOS Word Válido (.doc HTML A4) + PDF Válido 1.4 Multipage ======================================================== */ // Mapeamento preciso de caracteres para WinAnsiEncoding do PDF function escapeWinAnsi(str) { const map = { 'Á': '\\301', 'À': '\\300', 'Â': '\\302', 'Ã': '\\303', 'É': '\\311', 'Ê': '\\312', 'Í': '\\315', 'Ó': '\\323', 'Ô': '\\324', 'Õ': '\\325', 'Ú': '\\332', 'Ç': '\\307', 'á': '\\341', 'à': '\\340', 'â': '\\342', 'ã': '\\343', 'é': '\\351', 'ê': '\\352', 'í': '\\355', 'ó': '\\363', 'ô': '\\364', 'õ': '\\365', 'ú': '\\372', 'ç': '\\347', 'º': '\\272', 'ª': '\\252', '§': '\\247', '°': '\\260', '–': '\\226', '—': '\\227', '“': '\\223', '”': '\\224', '‘': '\\221', '’': '\\222', '•': '\\225' }; let out = ''; for (let i = 0; i < str.length; i++) { const ch = str[i]; if (ch === '\\') out += '\\\\'; else if (ch === '(') out += '\\('; else if (ch === ')') out += '\\)'; else if (map[ch]) out += map[ch]; else { const code = ch.charCodeAt(0); if (code >= 32 && code <= 126) { out += ch; } else if (code >= 128 && code <= 255) { out += '\\' + code.toString(8).padStart(3, '0'); } else { out += ' '; } } } return out; } // Quebra inteligente de texto em linhas respeitando limites de largura function wrapTextToLines(text, maxChars = 84) { const rawLines = text.split(/\r?\n/); const result = []; for (const rawLine of rawLines) { const trimmed = rawLine.trim(); if (!trimmed) { result.push(''); continue; } if (/^[=\-_]{4,}$/.test(trimmed)) { continue; // ignora separadores puramente decorativos em ASCII } if (trimmed.length <= maxChars) { result.push(trimmed); } else { const words = trimmed.split(/\s+/); let cur = ''; for (const w of words) { if (!cur) { cur = w; } else if ((cur + ' ' + w).length <= maxChars) { cur += ' ' + w; } else { result.push(cur); cur = w; } } if (cur) result.push(cur); } } return result; } // Gerador de PDF 1.4 Estruturalmente Válido e Multipáginas function generateValidPDFBlob(title, textContent) { const lines = wrapTextToLines(textContent, 82); const linesPerPage = 48; const totalPages = Math.max(1, Math.ceil(lines.length / linesPerPage)); const pageStreams = []; for (let p = 0; p < totalPages; p++) { const pageNum = p + 1; const pageLines = lines.slice(p * linesPerPage, (p + 1) * linesPerPage); let stream = ''; // Cabeçalho gráfico da página stream += 'BT /F2 11 Tf 50 806 Td (RS ADVOGADOS E ASSOCIADOS) Tj ET\n'; stream += 'BT /F1 7.5 Tf 50 795 Td (SISTEMA DE GESTAO JURIDICA INTEGRADA) Tj ET\n'; stream += '0.78 0.65 0.30 RG 0.75 w 50 787 m 545 787 l S 0 0 0 RG\n'; // Linhas de texto com detecção de títulos em negrito let curY = 765; const lineHeight = 14; for (const line of pageLines) { if (line.trim()) { const isHeading = /^(CL[ÁA]USULA|PAR[ÁA]GRAFO|DO DIREITO|DOS FATOS|DOS PEDIDOS|DA MEM[ÓO]RIA|DAS PROVAS|I -|II -|III -|IV -|V -|EXCELENT|CONTRATANTE|CONTRATADA|DECLARA|A[ÇC][ÃA]O|PETI[ÇC][ÃA]O)/i.test(line.trim()); const fontTag = isHeading ? '/F2' : '/F1'; const fontSize = isHeading ? '10' : '9'; stream += `BT ${fontTag} ${fontSize} Tf 50 ${curY.toFixed(1)} Td (${escapeWinAnsi(line)}) Tj ET\n`; } curY -= lineHeight; } // Rodapé da página stream += '0.80 0.80 0.80 RG 0.5 w 50 50 m 545 50 l S 0.35 0.35 0.35 rg\n'; stream += `BT /F1 7.5 Tf 50 38 Td (Pagina ${pageNum} de ${totalPages} - RS Advogados e Associados) Tj ET\n`; pageStreams.push(stream); } // Montagem dos Objetos PDF 1.4 let pdf = '%PDF-1.4\n%\xE2\xE3\xCF\xD3\n'; const offsets = {}; function addObj(id, content) { offsets[id] = pdf.length; pdf += `${id} 0 obj\n${content}\nendobj\n`; } const totalObjects = 4 + (totalPages * 2); const pageObjIds = []; for (let i = 0; i < totalPages; i++) { pageObjIds.push(5 + (i * 2)); } // Obj 1: Catalog addObj(1, '<< /Type /Catalog /Pages 2 0 R >>'); // Obj 2: Pages addObj(2, `<< /Type /Pages /Kids [ ${pageObjIds.map(id => `${id} 0 R`).join(' ')} ] /Count ${totalPages} >>`); // Obj 3: Font Helvetica regular addObj(3, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>'); // Obj 4: Font Helvetica-Bold addObj(4, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>'); // Objetos de cada página e respectivos streams de conteúdo for (let i = 0; i < totalPages; i++) { const pageId = 5 + (i * 2); const contentId = pageId + 1; const streamData = pageStreams[i]; // Page Object addObj(pageId, `<< /Type /Page /Parent 2 0 R /MediaBox [0 0 595.28 841.89] /Resources << /Font << /F1 3 0 R /F2 4 0 R >> >> /Contents ${contentId} 0 R >>`); // Content Stream Object addObj(contentId, `<< /Length ${streamData.length} >>\nstream\n${streamData}endstream`); } // Tabela de referências cruzadas (xref) const startXref = pdf.length; pdf += `xref\n0 ${totalObjects + 1}\n`; pdf += '0000000000 65535 f \n'; for (let i = 1; i <= totalObjects; i++) { const off = offsets[i] || 0; pdf += `${String(off).padStart(10, '0')} 00000 n \n`; } // Trailer do PDF pdf += `trailer\n<< /Size ${totalObjects + 1} /Root 1 0 R >>\nstartxref\n${startXref}\n%%EOF\n`; return new Blob([pdf], { type: 'application/pdf' }); } // Gerador de Documento Word Válido (.doc com tags Office Word e BOM UTF-8) function generateValidWordBlob(title, textContent) { const cleanText = textContent.replace(/^[=\-_]{4,}$/gm, ''); const docHtml = `\ufeff ${escapeHtml(title)}
RS ADVOGADOS E ASSOCIADOS
Sistema de Gestão Jurídica Integrada
São Paulo - SP
Sociedade de Advogados
${escapeHtml(cleanText)}
`; return new Blob([docHtml], { type: 'application/msword;charset=utf-8' }); } // Disparador de download seguro com atraso na revogação do ObjectURL function triggerDownload(blob, filename) { try { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(() => { URL.revokeObjectURL(url); }, 2000); showDocToast('Documento gerado. Verifique a pasta de downloads.'); } catch (err) { console.error('Erro ao baixar documento:', err); showDocToast('Falha ao baixar o arquivo. Tente novamente.', false); } } // Feedback visual discreto de download function showDocToast(msg, isSuccess = true) { let toast = document.getElementById('docToast'); if (!toast) { toast = document.createElement('div'); toast.id = 'docToast'; toast.className = 'doc-toast'; document.body.appendChild(toast); } toast.style.borderColor = isSuccess ? 'var(--accent)' : '#ff5b5b'; toast.innerHTML = isSuccess ? ` ${escapeHtml(msg)}` : ` ${escapeHtml(msg)}`; toast.style.display = 'flex'; clearTimeout(toast._timeout); toast._timeout = setTimeout(() => { toast.style.display = 'none'; }, 4000); } // Visualização limpa do documento em nova aba com opção de impressão/salvar PDF function previewDocument(title, textContent) { try { const cleanText = textContent.replace(/^[=\-_]{4,}$/gm, ''); const w = window.open('', '_blank'); if (!w) { alert('Por favor, permita janelas pop-up para visualizar o documento em uma nova aba.'); return; } w.document.write(` ${escapeHtml(title)} | RS Advogados
RS Advogados e Associados — Visualização Oficial
RS ADVOGADOS E ASSOCIADOS
Sistema de Gestão Jurídica Integrada
São Paulo - SP
Documento Oficial
${escapeHtml(cleanText)}
`); w.document.close(); } catch (err) { console.error('Erro ao abrir visualização:', err); showDocToast('Falha ao abrir visualização do documento.', false); } } // Ações dos painéis administrativos function downloadDocAsWord(textareaId, filename) { const el = document.getElementById(textareaId); if (!el) return; const text = el.value; const title = filename.replace(/\.doc$/i, '').replace(/_/g, ' '); const blob = generateValidWordBlob(title, text); triggerDownload(blob, filename.endsWith('.doc') ? filename : filename + '.doc'); } function downloadDocAsPdf(textareaId, filename) { const el = document.getElementById(textareaId); if (!el) return; const text = el.value; const title = filename.replace(/\.pdf$/i, '').replace(/_/g, ' '); const blob = generateValidPDFBlob(title, text); triggerDownload(blob, filename.endsWith('.pdf') ? filename : filename + '.pdf'); } function previewDocFromElement(textareaId, title) { const el = document.getElementById(textareaId); if (!el) return; previewDocument(title, el.value); } function printElement(textareaId) { const el = document.getElementById(textareaId); if (!el) return; previewDocument('Documento Oficial', el.value); } function downloadMockFile(filename) { const blob = new Blob([`Arquivo digital comprobatório: ${filename}\nEscritório RS Advogados e Associados.\nRegistrado para fins de instrução processual.\nData de registro: ${new Date().toLocaleString('pt-BR')}`], { type: 'text/plain;charset=utf-8' }); triggerDownload(blob, filename.includes('.') ? filename : filename + '.txt'); }======================================================== 5) CHAT FLUTUANTE IA (EM TODAS AS TELAS) Comportamento consultivo, ritmo natural de escrita, perguntas investigativas acolhedoras e explicação rica ======================================================== */ let chatState = { step: 0, clientName: '', isBusy: false, detectedArea: 'Cível', data: { name: '', storyFacts: '', storyWhenWho: '', storyPreviousContact: '', storyDocsAndDoubts: '', cpf: '', rg: '', civil: 'Solteiro(a)', qualif: 'Profissional', address: 'São Paulo - SP', phone: '(11) 944974907', email: 'atendimento@portal.com', caseDesc: '' } }; function initChat() { const openBtn = document.getElementById('openChatBtn'); const closeBtn = document.getElementById('closeChatBtn'); const chatWin = document.getElementById('chatWindow'); const sendBtn = document.getElementById('chatSendBtn'); const input = document.getElementById('chatInput'); openBtn.addEventListener('click', () => { chatWin.classList.toggle('active'); if (chatWin.classList.contains('active')) input.focus(); }); closeBtn.addEventListener('click', () => { chatWin.classList.remove('active'); }); sendBtn.addEventListener('click', handleChatUserSend); input.addEventListener('keypress', (e) => { if (e.key === 'Enter') handleChatUserSend(); }); } function addChatUserMsg(text) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg user'; div.textContent = text; body.appendChild(div); body.scrollTop = body.scrollHeight; } const sleep = (ms) => new Promise(res => setTimeout(res, ms)); function showTypingIndicator() { const body = document.getElementById('chatMessages'); const indicator = document.createElement('div'); indicator.id = 'chatTypingIndicator'; indicator.className = 'chat-typing'; indicator.innerHTML = `
Assistente está digitando... `; body.appendChild(indicator); body.scrollTop = body.scrollHeight; } function hideTypingIndicator() { const indicator = document.getElementById('chatTypingIndicator'); if (indicator) indicator.remove(); } // Efeito de digitação suave e natural (20-26ms por caractere com pausas nas pontuações) async function typeBotMessage(htmlString, extraActionElement = null) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg bot'; body.appendChild(div); let currentHtml = ''; let i = 0; const len = htmlString.length; while (i < len) { // Se encontrar tag HTML, adiciona a tag inteira de uma vez sem quebrar a marcação if (htmlString[i] === '<') { const closeIdx = htmlString.indexOf('>', i); if (closeIdx !== -1) { currentHtml += htmlString.substring(i, closeIdx + 1); div.innerHTML = currentHtml; i = closeIdx + 1; continue; } } const char = htmlString[i]; currentHtml += char; div.innerHTML = currentHtml; body.scrollTop = body.scrollHeight; i++; // Pausas naturais de leitura humana let delay = 22; // 22ms por caractere (faixa confortável de 18-30ms) if (char === '.' || char === '!' || char === '?') { delay = 280; // pausa maior entre frases } else if (char === ',' || char === ';' || char === ':') { delay = 120; // pausa breve em vírgulas e conectivos } else if (char === '\n') { delay = 150; } await sleep(delay); } // Se houver botões ou CTAs complementares, anexa com suave transição if (extraActionElement) { div.appendChild(extraActionElement); body.scrollTop = body.scrollHeight; } } // Entrega de blocos curtos e pausados precedidos por indicador "digitando..." (1-2s) async function deliverBotSequence(blocks) { chatState.isBusy = true; const input = document.getElementById('chatInput'); const sendBtn = document.getElementById('chatSendBtn'); input.disabled = true; sendBtn.disabled = true; input.placeholder = "Assistente jurídica formulando orientação..."; for (let idx = 0; idx < blocks.length; idx++) { const item = blocks[idx]; const html = typeof item === 'string' ? item : item.text; const extra = typeof item === 'object' && item.extra ? item.extra : null; // Indicador visível de 1.2 a 1.7 segundos simulando reflexão e análise showTypingIndicator(); await sleep(1300 + Math.random() * 400); hideTypingIndicator(); // Digitação progressiva do bloco await typeBotMessage(html, extra); // Intervalo sereno entre um bloco e outro if (idx < blocks.length - 1) { await sleep(650); } } input.disabled = false; sendBtn.disabled = false; input.placeholder = "Digite sua mensagem..."; input.focus(); chatState.isBusy = false; } function handleChatUserSend() { if (chatState.isBusy) return; const input = document.getElementById('chatInput'); const txt = input.value.trim(); if (!txt) return; addChatUserMsg(txt); input.value = ''; processChatLogic(txt); } // Identificação consultiva de área temática a partir dos relatos do cliente function inferAreaFromText(text) { const lower = text.toLowerCase(); if (/trabalh|empresa|patrão|chefe|salário|fgts|carteira|demiss|hora extra|vínculo/i.test(lower)) { return 'Trabalhista'; } if (/voo|aérea|bagagem|produto|banco|compra|golpe|pix|cartão|loja|atraso|consumidor/i.test(lower)) { return 'Consumidor'; } if (/inss|aposentad|benefício|perícia|loas|bpc|auxílio|doença|pensão por morte/i.test(lower)) { return 'Previdenciário'; } if (/divórcio|guarda|pensão alimentícia|filho|partilha|herança|inventário|casamento/i.test(lower)) { return 'Família'; } return 'Cível'; } async function processChatLogic(userText) { const lower = userText.toLowerCase().trim(); // ========================================== // ETAPA 0: Coleta do Nome // ========================================== if (chatState.step === 0) { let name = userText.replace(/meu nome é|sou o|sou a|me chamo|o meu nome é|pode me chamar de/gi, '').trim(); name = name.split(' ')[0] || userText.trim(); name = name.charAt(0).toUpperCase() + name.slice(1); if (name.length > 20) name = name.slice(0, 20); chatState.clientName = name; chatState.data.name = name; chatState.step = 1; await deliverBotSequence([ `É um prazer falar com você, ${escapeHtml(name)}! Seja muito bem-vindo(a) à nossa banca.`, `Me conte, ${escapeHtml(name)}, o que está acontecendo? Pode relatar com calma, no seu próprio tempo, o que houve.` ]); return; } // ========================================== // ETAPA 1: O que aconteceu -> Pergunta investigativa 1 (Quando e Com Quem) // ========================================== if (chatState.step === 1) { chatState.data.storyFacts = userText; chatState.detectedArea = inferAreaFromText(userText); chatState.step = 2; await deliverBotSequence([ `Compreendo perfeitamente, ${escapeHtml(chatState.clientName)}. Sei o quanto uma situação dessas causa apreensão, desgaste emocional e sentimento de desamparo.`, `Para que eu possa situar os aspectos legais com clareza: quando exatamente isso aconteceu (ou há quanto tempo vem ocorrendo) e quem foi a empresa, órgão ou pessoa envolvida?` ]); return; } // ========================================== // ETAPA 2: Quando e com quem -> Pergunta investigativa 2 (Tentativas de contato) // ========================================== if (chatState.step === 2) { chatState.data.storyWhenWho = userText; chatState.step = 3; await deliverBotSequence([ `Perfeito, anotei essas informações. A precisão de datas e a identificação do polo envolvido são pilares essenciais para resguardar a responsabilidade jurídica.`, `E me diga: você já tentou algum contato direto para resolver (como SAC, ouvidoria, mensagens, conversas formais ou notificações), ou chegou a procurar algum outro órgão antes de falar conosco?` ]); return; } // ========================================== // ETAPA 3: Tentativas anteriores -> Pergunta investigativa 3 (Documentos e Maior Preocupação) // ========================================== if (chatState.step === 3) { chatState.data.storyPreviousContact = userText; chatState.step = 4; await deliverBotSequence([ `Entendi. Ter registro ou histórico dessas tentativas demonstra claramente a sua boa-fé diante do ocorrido.`, `Para completarmos esse diagnóstico inicial: você possui documentos, comprovantes, prints, contratos ou protocolos guardados? E qual é a sua principal dúvida ou maior preocupação neste momento?` ]); return; } // ========================================== // ETAPA 4: Documentos e Dúvidas -> EXPLICAÇÃO RICA, DETALHADA E CONSULTIVA // ========================================== if (chatState.step === 4) { chatState.data.storyDocsAndDoubts = userText; chatState.data.caseDesc = `${chatState.data.storyFacts}. Ocorrido: ${chatState.data.storyWhenWho}. Tratativas: ${chatState.data.storyPreviousContact}. Documentos: ${chatState.data.storyDocsAndDoubts}`; chatState.step = 5; // Construção da explicação personalizada com riqueza de detalhes let blockSignificado = ""; let blockDireitos = ""; let blockPraPratica = ""; if (chatState.detectedArea === 'Trabalhista') { blockSignificado = `O que a sua situação significa juridicamente:
A conduta relatada aponta para descumprimento expresso de normas trabalhistas e contratuais. O trabalhador não é obrigado a tolerar violações contínuas, atrasos ou ausência de recolhimentos legais fundamentais à sua subsistência.`; blockDireitos = `Quais os direitos envolvidos:
Dependendo da gravidade dos fatos narrados, a legislação (CLT e Constituição Federal) prevê o direito à rescisão indireta (a chamada 'justa causa do empregador'), liberação integral do FGTS com multa rescisória de 40%, seguro-desemprego, quitação de todas as verbas rescisórias devidas e, quando houver dano moral por assédio ou rigor excessivo, a devida reparação indenizatória.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Esses casos são instruídos com carteira de trabalho (física ou digital), extratos analíticos de FGTS, comprovantes de salário, mensagens ou trocas de e-mail e testemunhas. Se houver urgência de desligamento imediato, ajuíza-se a ação com pedido liminar para afastar o empregado sem caracterizar abandono.`; } else if (chatState.detectedArea === 'Consumidor') { blockSignificado = `O que a sua situação significa juridicamente:
Trata-se de uma falha grave na prestação do serviço e violação aos princípios da boa-fé objetiva e proteção do consumidor (Código de Defesa do Consumidor - Lei 8.078/90). A responsabilidade da empresa pelos danos causados é objetiva, ou seja, independe da prova de culpa da parte dela.`; blockDireitos = `Quais os direitos envolvidos:
Você tem direito ao ressarcimento imediato e corrigido de todo e qualquer dano material (valores gastos a mais, prejuízos financeiros concretos), cumprimento forçado da obrigação ou restituição do montante pago, além de indenização por danos morais compensatórios pelo desrespeito, frustração e desvio produtivo do seu tempo útil.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Nos tribunais, os magistrados aplicam a inversão do ônus da prova em favor do consumidor vulnerável. Os documentos essenciais são: notas fiscais, faturas, bilhetes aéreos ou comprovantes de compra, número de protocolos e registros das reclamações não resolvidas.`; } else if (chatState.detectedArea === 'Família') { blockSignificado = `O que a sua situação significa juridicamente:
Questões de direito familiar envolvem não apenas patrimônio, mas resguardo da dignidade, alimentos e bem-estar dos envolvidos. A lei busca priorizar a proteção dos vulneráveis e a justa partilha do que foi construído em conjunto.`; blockDireitos = `Quais os direitos envolvidos:
Estão resguardados o direito à fixação e cumprimento de pensão alimentícia compatível com a capacidade financeira de quem presta e a necessidade de quem recebe, regulamentação de convivência, guarda e partilha equitativa de bens conforme o regime adotado.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
O procedimento pode se dar pela via consensual extrajudicial (mais ágil) ou judicial litigiosa. É importante reunir certidões de casamento/nascimento, documentos de propriedade e comprovantes de gastos mensais essenciais.`; } else if (chatState.detectedArea === 'Previdenciário') { blockSignificado = `O que a sua situação significa juridicamente:
O indeferimento indevido ou a demora excessiva do INSS muitas vezes ignora laudos médicos particulares ou a realidade contributiva do segurado, contrariando a Lei de Benefícios da Previdência Social (Lei 8.213/91).`; blockDireitos = `Quais os direitos envolvidos:
Você tem direito à revisão ou concessão judicial do benefício adequado, com pagamento cumulado de todas as parcelas retroativas desde a data do primeiro requerimento administrativo (DER).`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Na Justiça Federal, é designada perícia médica independente por perito de confiança do juízo. Devemos manter em mãos: laudos médicos atualizados com CID, receitas, exames e cópia do processo administrativo do INSS.`; } else { blockSignificado = `O que a sua situação significa juridicamente:
A conduta narrada gera o descumprimento de obrigação legal e contratual, dando causa ao dever inequívoco de indenizar nos termos dos artigos 186 e 927 do Código Civil Brasileiro.`; blockDireitos = `Quais os direitos envolvidos:
Você possui direito à reparação integral: restituição de valores corrigidos, cobrança de multas contratuais aplicáveis e indenização pelos abalos morais decorrentes do ilícito.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Iniciamos a instrução com a notificação preliminar ou ajuizamento de ação ordinária cumulada com pedido de tutela provisória de urgência. Precisamos de contratos, comprovantes de pagamento e trocas de mensagens que registrem a infração.`; } await deliverBotSequence([ `Muito obrigado por relatar todos esses detalhes, ${escapeHtml(chatState.clientName)}. Agora que compreendi os fatos de ponta a ponta, posso te explicar com riqueza de detalhes como funciona:`, blockSignificado, blockDireitos, blockPraPratica, `Ficou clara essa explicação para você, ${escapeHtml(chatState.clientName)}? Tem algum detalhe que gostaria que eu aprofunde mais ou já se sente confortável para avançarmos juntos ao próximo passo?` ]); return; } // ========================================== // ETAPA 5: Diálogo consultivo sobre dúvidas ou avanço // ========================================== if (chatState.step === 5) { const wantsToAdvance = /não|nao|sem dúvidas|sem duvida|tudo claro|ficou claro|entendi|avançar|avancar|proximo|próximo|quero|formalizar|seguir|sim|podemos|vamos/i.test(lower) && !/tenho dúvida|tenho duvida|me explica|quanto custa|demora|não entendi|nao entendi/i.test(lower); if (wantsToAdvance) { chatState.step = 6; await deliverBotSequence([ `Excelente, ${escapeHtml(chatState.clientName)}! Fico muito feliz que a orientação tenha trazido clareza e segurança para você.`, `Vamos dar o próximo passo com total tranquilidade. Para elaborarmos formalmente o seu Contrato de Prestação de Serviços Advocatícios e a sua Declaração de Hipossuficiência Econômica, por favor me informe o seu CPF e seu RG (ex: 000.000.000-00 e 00.000.000-0):` ]); } else { // O cliente trouxe uma dúvida ou pediu detalhamento await deliverBotSequence([ `Com certeza, ${escapeHtml(chatState.clientName)}! Faz toda a diferença esclarecer cada vírgula antes de tomar qualquer atitude.`, `Nossa atuação é totalmente transparente: o primeiro ato consiste na análise documental criteriosa pela nossa banca. Em casos urgentes, ingressamos com pedido liminar imediato para estancar prejuízos. Todas as etapas processuais e andamentos ficam disponíveis em tempo real tanto aqui pelo nosso portal quanto no acompanhamento direto com os sócios.`, `Consegui responder ao que você precisava? Se agora você se sentir seguro(a), basta me avisar que podemos avançar para gerarmos seus documentos protocolares!` ]); } return; } // ========================================== // ETAPA 6: Coleta de CPF e RG -> Pergunta Endereço, Profissão e Estado Civil // ========================================== if (chatState.step === 6) { chatState.data.cpf = userText; chatState.data.rg = "00.000.000-0 SSP/SP"; chatState.step = 7; await deliverBotSequence([ `Dados registrados com total sigilo e proteção conforme a LGPD.`, `Agora, por gentileza, informe o seu Endereço Completo com CEP, sua Profissão e seu Estado Civil (ex: Solteiro(a), Casado(a)):` ]); return; } // ========================================== // ETAPA 7: Geração do Contrato, Declaração e Botão WhatsApp Oficial // ========================================== if (chatState.step === 7) { chatState.data.address = userText; chatState.step = 8; const tempClient = { name: chatState.data.name || 'Cliente Atendido', cpf: chatState.data.cpf || '000.000.000-00', rg: '00.000.000-0 SSP/SP', civil: 'Solteiro(a)', qualif: 'Profissional', address: chatState.data.address || 'São Paulo - SP', phone: '(11) 944974907', email: 'atendimento@portal.com', caseDesc: chatState.data.caseDesc || 'Ação e patrocínio jurídico de reparação de direitos', area: chatState.detectedArea || 'Cível', feeTotal: '4.500,00', feeMonthly: '225,00', feeDaily: '7,50' }; const contract = generateContractContent(tempClient); const hipo = generateHipoContent(tempClient); window._chatContractDoc = contract; window._chatHipoDoc = hipo; const actionBox = document.createElement('div'); actionBox.style.marginTop = '14px'; actionBox.innerHTML = `
Seus Documentos Oficiais Prontos:
Para validação imediata da equipe jurídica e envio das peças aos tribunais:
Conversar no WhatsApp (11) 944974907
`; await deliverBotSequence([ `Parabéns, ${escapeHtml(chatState.clientName)}! Seu atendimento foi registrado com pleno êxito em nosso sistema operacional.`, { text: `Seus documentos já foram formalizados e estão disponíveis para download imediato abaixo. Você pode baixá-los tanto no formato Word (.doc) editável quanto visualizá-los ou salvá-los em PDF:`, extra: actionBox } ]); return; } // Interações adicionais pós-formalização if (chatState.step >= 8) { await deliverBotSequence([ `Estamos prontos para atuar pelo seu caso, ${escapeHtml(chatState.clientName)}! Clique no botão do WhatsApp acima para falar diretamente com nosso plantão de advogados pelo número (11) 944974907.` ]); } } function downloadChatDoc(type, format) { const text = type === 'contract' ? window._chatContractDoc : window._chatHipoDoc; const filename = type === 'contract' ? 'Contrato_Prestacao_RSAdvogados' : 'Declaracao_Hipossuficiencia_RSAdvogados'; if (!text) return; if (format === 'word') { downloadDocBlob(text, filename + '.doc'); } else { printTextDirect(text); } }Logo Badge Plaque */ .brand-plaque { ======= .glass-card:hover { border-color: rgba(201, 168, 76, 0.45); } /* Feedback Toast para Downloads */ .doc-toast { position: fixed; top: 24px; right: 24px; z-index: 99999; background: linear-gradient(135deg, #101d36, #0d1728); border: 1px solid var(--accent); color: #fff; padding: 12px 20px; border-radius: 8px; font-size: 0.88rem; font-weight: 600; box-shadow: 0 10px 30px rgba(0,0,0,0.7); display: flex; align-items: center; gap: 10px; animation: fadeIn 0.3s ease-in-out; } /* Logo Badge Plaque */ .brand-plaque { ======= /* ======================================================== 5) CHAT FLUTUANTE IA (EM TODAS AS TELAS) Comportamento consultivo, ritmo natural de escrita, perguntas investigativas acolhedoras e explicação rica ======================================================== */ let chatState = { step: 0, clientName: '', isBusy: false, detectedArea: 'Cível', data: { name: '', storyFacts: '', storyWhenWho: '', storyPreviousContact: '', storyDocsAndDoubts: '', cpf: '', rg: '', civil: 'Solteiro(a)', qualif: 'Profissional', address: 'São Paulo - SP', phone: '(11) 944974907', email: 'atendimento@portal.com', caseDesc: '' } }; function initChat() { const openBtn = document.getElementById('openChatBtn'); const closeBtn = document.getElementById('closeChatBtn'); const chatWin = document.getElementById('chatWindow'); const sendBtn = document.getElementById('chatSendBtn'); const input = document.getElementById('chatInput'); openBtn.addEventListener('click', () => { chatWin.classList.toggle('active'); if (chatWin.classList.contains('active')) input.focus(); }); closeBtn.addEventListener('click', () => { chatWin.classList.remove('active'); }); sendBtn.addEventListener('click', handleChatUserSend); input.addEventListener('keypress', (e) => { if (e.key === 'Enter') handleChatUserSend(); }); } function addChatUserMsg(text) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg user'; div.textContent = text; body.appendChild(div); body.scrollTop = body.scrollHeight; } const sleep = (ms) => new Promise(res => setTimeout(res, ms)); function showTypingIndicator() { const body = document.getElementById('chatMessages'); const indicator = document.createElement('div'); indicator.id = 'chatTypingIndicator'; indicator.className = 'chat-typing'; indicator.innerHTML = `
Assistente está digitando... `; body.appendChild(indicator); body.scrollTop = body.scrollHeight; } function hideTypingIndicator() { const indicator = document.getElementById('chatTypingIndicator'); if (indicator) indicator.remove(); } // Efeito de digitação suave e natural (20-26ms por caractere com pausas nas pontuações) async function typeBotMessage(htmlString, extraActionElement = null) { const body = document.getElementById('chatMessages'); const div = document.createElement('div'); div.className = 'chat-msg bot'; body.appendChild(div); let currentHtml = ''; let i = 0; const len = htmlString.length; while (i < len) { // Se encontrar tag HTML, adiciona a tag inteira de uma vez sem quebrar a marcação if (htmlString[i] === '<') { const closeIdx = htmlString.indexOf('>', i); if (closeIdx !== -1) { currentHtml += htmlString.substring(i, closeIdx + 1); div.innerHTML = currentHtml; i = closeIdx + 1; continue; } } const char = htmlString[i]; currentHtml += char; div.innerHTML = currentHtml; body.scrollTop = body.scrollHeight; i++; // Pausas naturais de leitura humana let delay = 22; // 22ms por caractere (faixa confortável de 18-30ms) if (char === '.' || char === '!' || char === '?') { delay = 280; // pausa maior entre frases } else if (char === ',' || char === ';' || char === ':') { delay = 120; // pausa breve em vírgulas e conectivos } else if (char === '\n') { delay = 150; } await sleep(delay); } // Se houver botões ou CTAs complementares, anexa com suave transição if (extraActionElement) { div.appendChild(extraActionElement); body.scrollTop = body.scrollHeight; } } // Entrega de blocos curtos e pausados precedidos por indicador "digitando..." (1-2s) async function deliverBotSequence(blocks) { chatState.isBusy = true; const input = document.getElementById('chatInput'); const sendBtn = document.getElementById('chatSendBtn'); input.disabled = true; sendBtn.disabled = true; input.placeholder = "Assistente jurídica formulando orientação..."; for (let idx = 0; idx < blocks.length; idx++) { const item = blocks[idx]; const html = typeof item === 'string' ? item : item.text; const extra = typeof item === 'object' && item.extra ? item.extra : null; // Indicador visível de 1.2 a 1.7 segundos simulando reflexão e análise showTypingIndicator(); await sleep(1300 + Math.random() * 400); hideTypingIndicator(); // Digitação progressiva do bloco await typeBotMessage(html, extra); // Intervalo sereno entre um bloco e outro if (idx < blocks.length - 1) { await sleep(650); } } input.disabled = false; sendBtn.disabled = false; input.placeholder = "Digite sua mensagem..."; input.focus(); chatState.isBusy = false; } function handleChatUserSend() { if (chatState.isBusy) return; const input = document.getElementById('chatInput'); const txt = input.value.trim(); if (!txt) return; addChatUserMsg(txt); input.value = ''; processChatLogic(txt); } // Identificação consultiva de área temática a partir dos relatos do cliente function inferAreaFromText(text) { const lower = text.toLowerCase(); if (/trabalh|empresa|patrão|chefe|salário|fgts|carteira|demiss|hora extra|vínculo/i.test(lower)) { return 'Trabalhista'; } if (/voo|aérea|bagagem|produto|banco|compra|golpe|pix|cartão|loja|atraso|consumidor/i.test(lower)) { return 'Consumidor'; } if (/inss|aposentad|benefício|perícia|loas|bpc|auxílio|doença|pensão por morte/i.test(lower)) { return 'Previdenciário'; } if (/divórcio|guarda|pensão alimentícia|filho|partilha|herança|inventário|casamento/i.test(lower)) { return 'Família'; } return 'Cível'; } async function processChatLogic(userText) { const lower = userText.toLowerCase().trim(); // ========================================== // ETAPA 0: Coleta do Nome // ========================================== if (chatState.step === 0) { let name = userText.replace(/meu nome é|sou o|sou a|me chamo|o meu nome é|pode me chamar de/gi, '').trim(); name = name.split(' ')[0] || userText.trim(); name = name.charAt(0).toUpperCase() + name.slice(1); if (name.length > 20) name = name.slice(0, 20); chatState.clientName = name; chatState.data.name = name; chatState.step = 1; await deliverBotSequence([ `É um prazer falar com você, ${escapeHtml(name)}! Seja muito bem-vindo(a) à nossa banca.`, `Me conte, ${escapeHtml(name)}, o que está acontecendo? Pode relatar com calma, no seu próprio tempo, o que houve.` ]); return; } // ========================================== // ETAPA 1: O que aconteceu -> Pergunta investigativa 1 (Quando e Com Quem) // ========================================== if (chatState.step === 1) { chatState.data.storyFacts = userText; chatState.detectedArea = inferAreaFromText(userText); chatState.step = 2; await deliverBotSequence([ `Compreendo perfeitamente, ${escapeHtml(chatState.clientName)}. Sei o quanto uma situação dessas causa apreensão, desgaste emocional e sentimento de desamparo.`, `Para que eu possa situar os aspectos legais com clareza: quando exatamente isso aconteceu (ou há quanto tempo vem ocorrendo) e quem foi a empresa, órgão ou pessoa envolvida?` ]); return; } // ========================================== // ETAPA 2: Quando e com quem -> Pergunta investigativa 2 (Tentativas de contato) // ========================================== if (chatState.step === 2) { chatState.data.storyWhenWho = userText; chatState.step = 3; await deliverBotSequence([ `Perfeito, anotei essas informações. A precisão de datas e a identificação do polo envolvido são pilares essenciais para resguardar a responsabilidade jurídica.`, `E me diga: você já tentou algum contato direto para resolver (como SAC, ouvidoria, mensagens, conversas formais ou notificações), ou chegou a procurar algum outro órgão antes de falar conosco?` ]); return; } // ========================================== // ETAPA 3: Tentativas anteriores -> Pergunta investigativa 3 (Documentos e Maior Preocupação) // ========================================== if (chatState.step === 3) { chatState.data.storyPreviousContact = userText; chatState.step = 4; await deliverBotSequence([ `Entendi. Ter registro ou histórico dessas tentativas demonstra claramente a sua boa-fé diante do ocorrido.`, `Para completarmos esse diagnóstico inicial: você possui documentos, comprovantes, prints, contratos ou protocolos guardados? E qual é a sua principal dúvida ou maior preocupação neste momento?` ]); return; } // ========================================== // ETAPA 4: Documentos e Dúvidas -> EXPLICAÇÃO RICA, DETALHADA E CONSULTIVA // ========================================== if (chatState.step === 4) { chatState.data.storyDocsAndDoubts = userText; chatState.data.caseDesc = `${chatState.data.storyFacts}. Ocorrido: ${chatState.data.storyWhenWho}. Tratativas: ${chatState.data.storyPreviousContact}. Documentos: ${chatState.data.storyDocsAndDoubts}`; chatState.step = 5; // Construção da explicação personalizada com riqueza de detalhes let blockSignificado = ""; let blockDireitos = ""; let blockPraPratica = ""; if (chatState.detectedArea === 'Trabalhista') { blockSignificado = `O que a sua situação significa juridicamente:
A conduta relatada aponta para descumprimento expresso de normas trabalhistas e contratuais. O trabalhador não é obrigado a tolerar violações contínuas, atrasos ou ausência de recolhimentos legais fundamentais à sua subsistência.`; blockDireitos = `Quais os direitos envolvidos:
Dependendo da gravidade dos fatos narrados, a legislação (CLT e Constituição Federal) prevê o direito à rescisão indireta (a chamada 'justa causa do empregador'), liberação integral do FGTS com multa rescisória de 40%, seguro-desemprego, quitação de todas as verbas rescisórias devidas e, quando houver dano moral por assédio ou rigor excessivo, a devida reparação indenizatória.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Esses casos são instruídos com carteira de trabalho (física ou digital), extratos analíticos de FGTS, comprovantes de salário, mensagens ou trocas de e-mail e testemunhas. Se houver urgência de desligamento imediato, ajuíza-se a ação com pedido liminar para afastar o empregado sem caracterizar abandono.`; } else if (chatState.detectedArea === 'Consumidor') { blockSignificado = `O que a sua situação significa juridicamente:
Trata-se de uma falha grave na prestação do serviço e violação aos princípios da boa-fé objetiva e proteção do consumidor (Código de Defesa do Consumidor - Lei 8.078/90). A responsabilidade da empresa pelos danos causados é objetiva, ou seja, independe da prova de culpa da parte dela.`; blockDireitos = `Quais os direitos envolvidos:
Você tem direito ao ressarcimento imediato e corrigido de todo e qualquer dano material (valores gastos a mais, prejuízos financeiros concretos), cumprimento forçado da obrigação ou restituição do montante pago, além de indenização por danos morais compensatórios pelo desrespeito, frustração e desvio produtivo do seu tempo útil.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Nos tribunais, os magistrados aplicam a inversão do ônus da prova em favor do consumidor vulnerável. Os documentos essenciais são: notas fiscais, faturas, bilhetes aéreos ou comprovantes de compra, número de protocolos e registros das reclamações não resolvidas.`; } else if (chatState.detectedArea === 'Família') { blockSignificado = `O que a sua situação significa juridicamente:
Questões de direito familiar envolvem não apenas patrimônio, mas resguardo da dignidade, alimentos e bem-estar dos envolvidos. A lei busca priorizar a proteção dos vulneráveis e a justa partilha do que foi construído em conjunto.`; blockDireitos = `Quais os direitos envolvidos:
Estão resguardados o direito à fixação e cumprimento de pensão alimentícia compatível com a capacidade financeira de quem presta e a necessidade de quem recebe, regulamentação de convivência, guarda e partilha equitativa de bens conforme o regime adotado.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
O procedimento pode se dar pela via consensual extrajudicial (mais ágil) ou judicial litigiosa. É importante reunir certidões de casamento/nascimento, documentos de propriedade e comprovantes de gastos mensais essenciais.`; } else if (chatState.detectedArea === 'Previdenciário') { blockSignificado = `O que a sua situação significa juridicamente:
O indeferimento indevido ou a demora excessiva do INSS muitas vezes ignora laudos médicos particulares ou a realidade contributiva do segurado, contrariando a Lei de Benefícios da Previdência Social (Lei 8.213/91).`; blockDireitos = `Quais os direitos envolvidos:
Você tem direito à revisão ou concessão judicial do benefício adequado, com pagamento cumulado de todas as parcelas retroativas desde a data do primeiro requerimento administrativo (DER).`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Na Justiça Federal, é designada perícia médica independente por perito de confiança do juízo. Devemos manter em mãos: laudos médicos atualizados com CID, receitas, exames e cópia do processo administrativo do INSS.`; } else { blockSignificado = `O que a sua situação significa juridicamente:
A conduta narrada gera o descumprimento de obrigação legal e contratual, dando causa ao dever inequívoco de indenizar nos termos dos artigos 186 e 927 do Código Civil Brasileiro.`; blockDireitos = `Quais os direitos envolvidos:
Você possui direito à reparação integral: restituição de valores corrigidos, cobrança de multas contratuais aplicáveis e indenização pelos abalos morais decorrentes do ilícito.`; blockPraPratica = `O que normalmente acontece nesses casos e o que reunir:
Iniciamos a instrução com a notificação preliminar ou ajuizamento de ação ordinária cumulada com pedido de tutela provisória de urgência. Precisamos de contratos, comprovantes de pagamento e trocas de mensagens que registrem a infração.`; } await deliverBotSequence([ `Muito obrigado por relatar todos esses detalhes, ${escapeHtml(chatState.clientName)}. Agora que compreendi os fatos de ponta a ponta, posso te explicar com riqueza de detalhes como funciona:`, blockSignificado, blockDireitos, blockPraPratica, `Ficou clara essa explicação para você, ${escapeHtml(chatState.clientName)}? Tem algum detalhe que gostaria que eu aprofunde mais ou já se sente confortável para avançarmos juntos ao próximo passo?` ]); return; } // ========================================== // ETAPA 5: Diálogo consultivo sobre dúvidas ou avanço // ========================================== if (chatState.step === 5) { const wantsToAdvance = /não|nao|sem dúvidas|sem duvida|tudo claro|ficou claro|entendi|avançar|avancar|proximo|próximo|quero|formalizar|seguir|sim|podemos|vamos/i.test(lower) && !/tenho dúvida|tenho duvida|me explica|quanto custa|demora|não entendi|nao entendi/i.test(lower); if (wantsToAdvance) { chatState.step = 6; await deliverBotSequence([ `Excelente, ${escapeHtml(chatState.clientName)}! Fico muito feliz que a orientação tenha trazido clareza e segurança para você.`, `Vamos dar o próximo passo com total tranquilidade. Para elaborarmos formalmente o seu Contrato de Prestação de Serviços Advocatícios e a sua Declaração de Hipossuficiência Econômica, por favor me informe o seu CPF e seu RG (ex: 000.000.000-00 e 00.000.000-0):` ]); } else { // O cliente trouxe uma dúvida ou pediu detalhamento await deliverBotSequence([ `Com certeza, ${escapeHtml(chatState.clientName)}! Faz toda a diferença esclarecer cada vírgula antes de tomar qualquer atitude.`, `Nossa atuação é totalmente transparente: o primeiro ato consiste na análise documental criteriosa pela nossa banca. Em casos urgentes, ingressamos com pedido liminar imediato para estancar prejuízos. Todas as etapas processuais e andamentos ficam disponíveis em tempo real tanto aqui pelo nosso portal quanto no acompanhamento direto com os sócios.`, `Consegui responder ao que você precisava? Se agora você se sentir seguro(a), basta me avisar que podemos avançar para gerarmos seus documentos protocolares!` ]); } return; } // ========================================== // ETAPA 6: Coleta de CPF e RG -> Pergunta Endereço, Profissão e Estado Civil // ========================================== if (chatState.step === 6) { chatState.data.cpf = userText; chatState.data.rg = "00.000.000-0 SSP/SP"; chatState.step = 7; await deliverBotSequence([ `Dados registrados com total sigilo e proteção conforme a LGPD.`, `Agora, por gentileza, informe o seu Endereço Completo com CEP, sua Profissão e seu Estado Civil (ex: Solteiro(a), Casado(a)):` ]); return; } // ========================================== // ETAPA 7: Geração do Contrato, Declaração e Botão WhatsApp Oficial // ========================================== if (chatState.step === 7) { chatState.data.address = userText; chatState.step = 8; const tempClient = { name: chatState.data.name || 'Cliente Atendido', cpf: chatState.data.cpf || '000.000.000-00', rg: '00.000.000-0 SSP/SP', civil: 'Solteiro(a)', qualif: 'Profissional', address: chatState.data.address || 'São Paulo - SP', phone: '(11) 944974907', email: 'atendimento@portal.com', caseDesc: chatState.data.caseDesc || 'Ação e patrocínio jurídico de reparação de direitos', area: chatState.detectedArea || 'Cível', feeTotal: '4.500,00', feeMonthly: '225,00', feeDaily: '7,50' }; const contract = generateContractContent(tempClient); const hipo = generateHipoContent(tempClient); window._chatContractDoc = contract; window._chatHipoDoc = hipo; const actionBox = document.createElement('div'); actionBox.style.marginTop = '14px'; actionBox.innerHTML = `
Seus Documentos Oficiais Prontos:
Para validação imediata da equipe jurídica e envio das peças aos tribunais:
Conversar no WhatsApp (11) 944974907
`; await deliverBotSequence([ `Parabéns, ${escapeHtml(chatState.clientName)}! Seu atendimento foi registrado com pleno êxito em nosso sistema operacional.`, { text: `Seus documentos já foram formalizados e estão disponíveis para download imediato abaixo. Você pode baixá-los tanto no formato Word (.doc) editável quanto visualizá-los ou salvá-los em PDF:`, extra: actionBox } ]); return; } // Interações adicionais pós-formalização if (chatState.step >= 8) { await deliverBotSequence([ `Estamos prontos para atuar pelo seu caso, ${escapeHtml(chatState.clientName)}! Clique no botão do WhatsApp acima para falar diretamente com nosso plantão de advogados pelo número (11) 944974907.` ]); } } function downloadChatDoc(type, format) { const text = type === 'contract' ? window._chatContractDoc : window._chatHipoDoc; const filename = type === 'contract' ? 'Contrato_Prestacao_RSAdvogados' : 'Declaracao_Hipossuficiencia_RSAdvogados'; if (!text) return; if (format === 'word') { downloadDocBlob(text, filename + '.doc'); } else { printTextDirect(text); } }Logo Badge Plaque */ .brand-plaque { display: inline-flex; align-items: center; gap: 12px; padding: 8px 14px; background: linear-gradient(145deg, #0d0d0d, #1a1a1a); border: 1px solid rgba(201, 168, 76, 0.6); border-radius: 8px; box-shadow: 0 4px 18px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,246,194,0.3); } .brand-title { font-family: 'Playfair Display', Georgia, serif; font-weight: 700; letter-spacing: 0.5px; color: #fff; line-height: 1.2; } .brand-sub { font-size: 0.72rem; letter-spacing: 2px; text-transform: uppercase; color: var(--accent); font-weight: 600; } /* Floating WhatsApp Button */ .whatsapp-btn { position: fixed; bottom: 24px; left: 24px; z-index: 990; background: #25d366; color: #fff; padding: 12px 20px; border-radius: 9999px; font-weight: 700; font-size: 0.95rem; text-decoration: none; display: flex; align-items: center; gap: 10px; box-shadow: 0 8px 24px rgba(37, 211, 102, 0.4); transition: transform 0.2s, box-shadow 0.2s; } .whatsapp-btn:hover { transform: translateY(-2px); box-shadow: 0 12px 30px rgba(37, 211, 102, 0.6); color: #fff; } /* Chat Button */ .chat-trigger-btn { position: fixed; bottom: 24px; right: 24px; z-index: 990; background: linear-gradient(135deg, #c9a84c, #9d7c2b); color: #0a1628; border: 1px solid #ffe382; padding: 12px 22px; border-radius: 9999px; font-weight: 700; font-size: 0.95rem; cursor: pointer; display: flex; align-items: center; gap: 10px; box-shadow: 0 8px 24px rgba(201, 168, 76, 0.45); transition: transform 0.2s, box-shadow 0.2s; } .chat-trigger-btn:hover { transform: translateY(-2px); box-shadow: 0 12px 30px rgba(201, 168, 76, 0.7); } /* Chat Modal/Window */ .chat-window { position: fixed; bottom: 84px; right: 24px; width: 410px; max-width: calc(100vw - 32px); height: 600px; max-height: calc(100vh - 120px); z-index: 995; display: none; flex-direction: column; background: #0d1728; border: 1px solid var(--accent); border-radius: 16px; box-shadow: 0 20px 50px rgba(0,0,0,0.85); overflow: hidden; } .chat-window.active { display: flex; } .chat-header { background: linear-gradient(135deg, #101d36, #1a2a4a); padding: 14px 18px; border-bottom: 1px solid rgba(201, 168, 76, 0.3); display: flex; align-items: center; justify-content: space-between; } .chat-body { flex: 1; padding: 16px; overflow-y: auto; display: flex; flex-direction: column; gap: 12px; } .chat-msg { max-width: 85%; padding: 10px 14px; border-radius: 12px; font-size: 0.88rem; line-height: 1.45; word-break: break-word; } .chat-msg.bot { background: #182640; color: #e8ecf4; align-self: flex-start; border-left: 3px solid var(--accent); } .chat-msg.user { background: linear-gradient(135deg, #c9a84c, #b38f32); color: #070e1a; font-weight: 500; align-self: flex-end; } .chat-typing { align-self: flex-start; background: #182640; border-left: 3px solid var(--accent); color: var(--text-muted); font-size: 0.82rem; padding: 9px 14px; border-radius: 12px; display: inline-flex; align-items: center; gap: 10px; box-shadow: 0 4px 12px rgba(0,0,0,0.25); } .chat-typing-dots { display: inline-flex; gap: 4px; align-items: center; } .chat-typing-dots span { width: 6px; height: 6px; background: var(--accent); border-radius: 50%; animation: typingPulse 1.4s infinite ease-in-out both; } .chat-typing-dots span:nth-child(1) { animation-delay: -0.32s; } .chat-typing-dots span:nth-child(2) { animation-delay: -0.16s; } .chat-typing-dots span:nth-child(3) { animation-delay: 0s; } @keyframes typingPulse { 0%, 80%, 100% { transform: scale(0.6); opacity: 0.35; } 40% { transform: scale(1.15); opacity: 1; } } .chat-footer { padding: 12px; background: #091220; border-top: 1px solid rgba(255,255,255,0.08); display: flex; gap: 8px; } /* Custom Form & Tabs */ .tab-btn { background: transparent; border: none; color: var(--text-muted); padding: 10px 18px; font-weight: 600; font-size: 0.9rem; border-bottom: 2px solid transparent; cursor: pointer; transition: color 0.2s, border-color 0.2s; } .tab-btn:hover { color: #fff; } .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); } .sub-tab-btn { background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); color: var(--text); padding: 6px 14px; border-radius: 6px; font-size: 0.82rem; cursor: pointer; } .sub-tab-btn.active { background: var(--accent); color: #0a1628; border-color: var(--accent); font-weight: 700; } .form-control { width: 100%; background: rgba(10, 22, 40, 0.7); border: 1px solid rgba(201, 168, 76, 0.35); color: #fff; padding: 9px 12px; border-radius: 8px; font-size: 0.88rem; box-sizing: border-box; outline: none; transition: border-color 0.2s, box-shadow 0.2s; } .form-control:focus { border-color: #ffd84d; box-shadow: 0 0 0 2px rgba(201, 168, 76, 0.25); } .btn-gold { background: linear-gradient(135deg, #c9a84c, #b38f32); color: #070e1a; font-weight: 700; border: 1px solid #ffd84d; padding: 9px 16px; border-radius: 8px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; text-decoration: none; transition: filter 0.2s, transform 0.15s; } .btn-gold:hover { filter: brightness(1.1); transform: translateY(-1px); color: #070e1a; } .btn-secondary-custom { background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.2); color: #fff; padding: 8px 14px; border-radius: 8px; cursor: pointer; font-size: 0.85rem; display: inline-flex; align-items: center; gap: 6px; } .btn-secondary-custom:hover { background: rgba(255,255,255,0.14); color: #fff; } .btn-danger-custom { background: rgba(220, 53, 69, 0.2); border: 1px solid rgba(220, 53, 69, 0.5); color: #ff8b94; padding: 6px 12px; border-radius: 6px; font-size: 0.8rem; cursor: pointer; } .btn-danger-custom:hover { background: rgba(220, 53, 69, 0.35); } /* Fee Highlight Box */ .fee-highlight { background: linear-gradient(135deg, rgba(201, 168, 76, 0.18), rgba(26, 42, 74, 0.6)); border: 1px solid var(--accent); border-radius: 12px; padding: 18px; text-align: center; box-shadow: 0 8px 24px rgba(0,0,0,0.3); } .timeline { position: relative; padding-left: 24px; border-left: 2px solid rgba(201, 168, 76, 0.4); } .timeline-item { position: relative; margin-bottom: 18px; } .timeline-item::before { content: ''; position: absolute; left: -31px; top: 4px; width: 12px; height: 12px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 8px #ffd84d; } .badge-status { display: inline-block; padding: 4px 10px; border-radius: 9999px; font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; } .badge-active { background: rgba(40, 167, 69, 0.2); color: #5dd579; border: 1px solid #28a745; } .badge-analysis { background: rgba(255, 193, 7, 0.2); color: #ffdb65; border: 1px solid #ffc107; } .badge-done { background: rgba(0, 123, 255, 0.2); color: #6bb4ff; border: 1px solid #007bff; } /* Print layout for documents */ @media print { body * { visibility: hidden; } #printable-doc-area, #printable-doc-area * { visibility: visible; } #printable-doc-area { position: absolute; left: 0; top: 0; width: 100%; background: #fff !important; color: #000 !important; padding: 30px; } .no-print { display: none !important; } } .app-screen { display: none; animation: fadeIn 0.3s ease-in-out; } .app-screen.active { display: block; } @keyframes fadeIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } } /* Modal */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.75); z-index: 1000; display: none; align-items: center; justify-content: center; padding: 16px; } .modal-overlay.active { display: flex; } /* Scrollbars */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: #08111e; } ::-webkit-scrollbar-thumb { background: #1f3355; border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: #c9a84c; } WhatsApp
Assistente Jurídica IA
RS Advogados e Associados
Olá! Seja muito bem-vindo(a) à RS Advogados e Associados. Sou a especialista sênior em direito da banca, com mais de 30 anos de experiência e atuação atualizada em todas as áreas jurídicas.

Para darmos início ao seu atendimento de forma acolhedora: qual é o seu nome?
GESTÃO JURÍDICA
RS ADVOGADOS & ASSOCIADOS
Sistema de Gestão Jurídica Integrada

Acesso à Plataforma

Selecione seu perfil de acesso para entrar no sistema operacional

Credenciais de Demonstração (Admin):
Usuário: Rafael.silva
Senha: @Rafa7882
Voltar ao site
Protótipo de aplicação interna funcional. Os dados são mantidos em segurança no armazenamento do seu navegador (localStorage).
RS ADVOGADOS
Painel Administrativo

Visão Geral do Escritório

Métricas operacionais consolidadas em tempo real

Total de Clientes
0
Base ativa monitorada
Processos Ativos
0
Em andamento judicial
Documentos Recebidos
0
Enviados via Área do Cliente
Notificações WhatsApp
0
Registros para envio

Fila de Notificações WhatsApp

RS ADVOGADOS
Portal Área do Cliente

Olá, Cliente

Acompanhe o andamento da sua causa, documentos e honorários transparentes

Condições Especiais de Pagamento do Seu Caso
Parcela Mensal (24x com juros 1% a.m.)
R$ 0,00
Equivalente por Dia
R$ 0,00 /dia
* Para causas com pleito de valores, será cobrado 30% de honorários advocatícios de êxito sobre o valor conseguido.

Dados do Processo & Cadastro

Área: -
CPF: -
E-mail: -
Telefone: -
Status da Causa: -

Linha do Tempo de Andamentos

Envio de Arquivos ao Escritório

Envie fotos de documentos, comprovantes, áudios ou vídeos necessários para a instrução da sua causa.

Selecione qualquer arquivo do seu dispositivo
Aceita PDF, imagens, áudios de WhatsApp, vídeos e comprovantes

Meus Arquivos Enviados

Documentos Oficiais do Seu Caso

Contrato de Prestação
Comprovante formal da contratação com a banca
Declaração Hipossuficiência
Requerimento para isenção e justiça gratuita
Petição Inicial
Peça protocolada e fundamentação da causa

Dúvidas urgentes sobre sua audiência ou prazo?

Falar pelo WhatsApp (11) 944974907
RS ADVOGADOS
Artigo Jurídico & Soluções
Início > Consumidor > Artigo

Título do Artigo Jurídico

Por Equipe Jurídica RS Advogados Atualizado recentemente Tempo de leitura: 3 min

Sofreu esta mesma situação ou teve prejuízo?

Nossa banca especializada atua com urgência para garantir a reparação e indenização devida.

Falar com Advogado no WhatsApp

Solicitar Parecer Rápido

Preencha seus dados para contato prioritário da nossa equipe.