/*
<html>
<head>

   <div style="width: 94%;position: fixed;bottom: 0px;" class="footer">
   <div style="border-bottom: 1px solid #333;"></div>
   <div style="font: 9pt Arial; border-bottom: 5px; " class="footer">
        Desenvolvido pela Ponto.Com Sistemas © 2022<br />
        Licenciado para: {$empresa->fantasia}<br />
        Endereço: {$empresa->endereco}, nº {$empresa->numero}, {$empresa->bairro}, {$empresa->cidade} - {$empresa->uf}, CEP: {$empresa->cep}<br />
        Contato: {$empresa->telefone} / {$empresa->celular} - {$empresa->email}<br />
      <style>
          #rodape::after { content: 'Página ' counter(page)' - gerado em {$dataatual} as {$horaatual}'}
          #rodape { font: 9pt Arial; border-bottom: 5px; }
      </style>
      <div id="rodape"></div>
      <div style="border-bottom: 1px solid #333;"></div>
  </div>

<style>

@page 
{
    size: A4 portrait;
    margin: 2.5cm 1cm 1.2cm;
    width: 29.7cm;
    height: 21cm; 
    padding: 13.5mm;
    counter-increment: page;
}

body 
{
    font: 12pt Arial;
    line-height: 1.3;
    margin-top: 380px;
    margin-bottom: 200px;
    margin-right: 15px;
    margin-left: 45px;
    text-align: justify;    
}

.header 
{
    position: fixed;
    top: -80px;
    width: 100%;
    height: auto;
    z-index: 1000;
}


.laudo-conteudo, .conteudo-principal 
{
    page-break-inside: avoid;
}

</style>
</div></head>
<body>
<!-- COMEÇA AQUI O BLOCO REFATORÁVEL -->
<p style="margin: 1px 0;"> </p>
<!-- CABEÇALHO FIXO (apenas logo, título, emitente, paciente) -->
<div class="header">
<table style="border-collapse: collapse; width: 900px; border-style: none;">
<tbody>
<tr>
<td style="width: 917.216px; text-align: center;">
<p style="margin: 1px 0;"><span style="font-size: 18pt;"><img style="font-size: medium; text-align: start; float: left;" src="{$empresa->caminho_logocabecalhorelatorio}" alt="Logo" width="900" height="190" /></span></p>
<p style="margin: 1px 0;"> </p>
<p style="margin: 1px 0;"> </p>
<p style="margin: 1px 0;"> </p>
<p style="margin: 1px 0;"> </p>
<p style="margin: 1px 0;"> </p>
<p style="margin: 1px 0;"><span style="font-size: 14pt;"><strong>{$desc_laudo}</strong></span></p>
</td>
</tr>
</tbody>
</table>
<p style="margin: 1px 0;"> </p>
<p style="margin: 1px 0;"> </p>
<table style="border-collapse: collapse; width: 900px; height: 20px; border-style: solid;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 21px;">
<td style="width: 889.219px; height: 10px; text-align: left;" colspan="3">
<p style="margin: 1px 0px; text-align: left;"><strong style="text-align: justify;">EMITENTE: </strong><span style="text-align: justify;">{$pessoa_profissional->nome}</span></p>
<p style="margin: 1px 0;"><strong style="text-align: justify;">CONSELHO:</strong> <span style="text-align: justify;"><span style="font-family: arial, helvetica, sans-serif;">{$pessoa_profissional->inscricao_conselho}</span></span></p>
</td>
</tr>
</tbody>
</table>
<p style="box-sizing: border-box; text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; margin: 1px 0px; color: #6d798f; font-family: 'Open Sans'; font-size: 15px;"> </p>
<table style="border-collapse: collapse; width: 900px; height: 0px; border-style: solid;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 100%;">
<p style="margin: 1px 0;"><strong>PACIENTE:</strong> {$pessoa->nome}</p>
<p style="margin: 1px 0;"><strong>CPF: </strong>{$pessoa->mascara_cnpjcpf}</p>
<p style="margin: 1px 0;"><strong style="user-select: none;">ENDEREÇO:</strong>{$pessoa->rua}, n.º {$pessoa->numero} {$pessoa->bairro} {$pessoa->complemento} CEP:{$pessoa->cep} - {$pessoa->cidade} - {$pessoa->uf}</p>
</td>
</tr>
</tbody>
</table>
<p style="margin: 1px 0;"> </p>
</div>
<!-- CONTEÚDO DO LAUDO (FORA do header, começa abaixo do paciente) -->
<p style="margin: 1px 0;"><span style="font-size: medium;">{$laudo_paciente}</span></p>
<p style="box-sizing: border-box; text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; margin: 1px 0px; color: #6d798f; font-family: 'Open Sans'; font-size: 15px; text-align: justify;"> </p>
<p style="margin: 1px 0;"><span style="font-size: 12pt;">{$empresa->cidade} - {$empresa->uf}, <span style="text-align: start;">{$data_inclusao}</span>.</span></p>
<p style="margin: 1px 0;"> </p>
<p style="margin: 1px 0;"><span style="font-size: 12pt;"><img src="{$assinatura_profissional_src}" alt="" width="80" height="80" /></span></p>
<p style="margin: 1px 0;"><span style="font-size: 12pt;">______________________________________</span></p>
<p style="margin: 1px 0;"><span style="font-size: 12pt;">Assinatura do Emitente</span></p>
<p style="margin: 1px 0;"><span style="font-size: 12pt;">{$pessoa_profissional->nome} {$pessoa_profissional->inscricao_conselho}</span></p>
<p style="margin: 1px 0;"> </p>
<p style="margin: 1px 0;"><!-- pagebreak --></p>
<p style="margin: 1px 0;"> </p>
<table style="width: 900px; height: 20px; border-style: solid;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 21px;">
<td style="width: 889.219px; height: 10px; text-align: left;" colspan="3">
<p style="margin: 1px 0px; text-align: center;"><strong style="text-align: justify;">IMAGEM</strong></p>
</td>
</tr>
</tbody>
</table>
<p style="box-sizing: border-box; text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; margin: 1px 0px; color: #6d798f; font-family: 'Open Sans'; font-size: 15px;"> </p>
<!-- TERMINA AQUI O BLOCO REFATORÁVEL -->
</body>
</html>

https://solara.doctor/recursos
mdsaude.com/cardiologia/exame-eletrocardiograma-ecg/
https://www.medway.com.br/conteudos/eletrocardiograma-normal-a-base-para-o-entendimento-de-qualquer-outra-alteracao/
https://www.researchgate.net/profile/Aldo-Von-Wangenheim/publication/318245039_Laudador_de_Eletrocardiograma_ECG_-_052016/links/595e90d6a6fdccc9b17fdf7b/Laudador-de-Eletrocardiograma-ECG-052016.pdf?origin=publication_detail&_tp=eyJjb250ZXh0Ijp7ImZpcnN0UGFnZSI6InB1YmxpY2F0aW9uIiwicGFnZSI6InB1YmxpY2F0aW9uRG93bmxvYWQiLCJwcmV2aW91c1BhZ2UiOiJwdWJsaWNhdGlvbiJ9fQ&__cf_chl_tk=BZVL3eiaog1j.SoMSXkbWBojEtJt.zXRdfy9.5JggQE-1786482697-1.0.1.1-1zu8VFxT23n7isaPGwQe2RUP9ubASpVeEqgRWxIFzgk


SELECT 
    TABLE_NAME AS tabela,
    INDEX_NAME AS indice,
    CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` DROP INDEX `', INDEX_NAME, '`;') AS script_drop,
    CONCAT(
        'CREATE ',
        IF(NON_UNIQUE = 0, 'UNIQUE ', ''),
        IF(INDEX_TYPE = 'FULLTEXT', 'FULLTEXT ', ''),
        'INDEX `', INDEX_NAME, '` ON `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` (',
        GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY SEQ_IN_INDEX ASC SEPARATOR ', '),
        ');'
    ) AS script_create
FROM 
    INFORMATION_SCHEMA.STATISTICS
WHERE 
    TABLE_SCHEMA = 'pontoc01_bddev' -- Substitua aqui pelo nome do seu banco

GROUP BY 
    TABLE_SCHEMA,
    TABLE_NAME,
    INDEX_NAME,
    NON_UNIQUE,
    INDEX_TYPE
ORDER BY 
    TABLE_NAME, 
    INDEX_NAME;

/*
VOCÊ ATUARÁ COMO UM DESENVOLVEDOR FULL STACK SÊNIOR ESPECIALIZADO.
LEIA AS REGRAS ABAIXO e GRAVE EM SUA MEMORIA, PARA NÃO FICAR FAZENDO PROCESSOS OU PERGUNTAS PARA TOMAR O TEMPO DE FORMA DESNECESSARIA.

CONTEXTO TÉCNICO:
- Linguagem de desenvolvimento: PHP 7.4
- Framework utilizado: MadBuilder (um fork do Adianti Framework)
- Banco de dados: MySQL
- Sistema com estrutura para matriz e múltiplas filiais

RESTRIÇÃO CRÍTICA DE ESCOPO:
- Não há acesso ao servidor.
- Métodos ou trechos comentados no arquivo enviado não são utilizados e devem ser ignorados e não devem ser enviados nas respostas geradas.
- Antes de perguntar se algum método ou função existe, leia integralmente o arquivo enviado.
- Para abrir uma transação com o banco de dados, use obrigatoriamente TTransaction::open(self::$database)
- OS transformers do formulario podem ser modificados se for necessário.
- O ÚNICO BLOCO ONDE É PERMITIDO IMPLEMENTAR NOVOS MÉTODOS, CORREÇÕES ou DEBUG É:
  // COMEÇA AQUI O BLOCO REFATORÁVEL

  // TERMINA AQUI O BLOCO REFATORÁVEL
- TUDO FORA DESSES MARCADORES É INTOCÁVEL. Não altere, não mova, não reescreva nenhuma linha fora desse bloco, mesmo que a solução pareça exigir isso.

PROIBIÇÕES E MANUTENÇÃO DA ARQUITETURA:
É TERMINANTEMENTE PROIBIDO alterar:
- Nomes de variáveis, métodos, classes, campos de formulário, IDs e eventos originais, não suprima codigo, sempre gere completo.
- O fluxo principal existente do sistema.
- Mantenha integralmente a arquitetura existente para garantir compatibilidade reversa.
- NÃO CRIE NOVOS MÉTODOS OU CAMPOS FORA DO BLOCO REFATORÁVEL — PERGUNTE ANTES DE PROSSEGUIR.

PADRÃO DE RESPOSTA:
- Direta, técnica, sem introduções, sem tutoriais e sem pseudocódigo.
- NUNCA gere trechos parciais de código ou substituições manuais (proibido diff).
- NUNCA peça ao usuário para complementar com "o resto do código original".
- Sempre entregue o método, transformer ou bloco refatorável COMPLETO do início ao fim, pronto para copiar e colar, nunca suprima codigo orignal, sempre gere completo.
- Não gere a class completa pergunte antes e explique porque precisa gerar ela toda, so sera gerada com autorização.
- Quando houver dúvida sobre o nome de um campo, tente todas as variações possíveis dentro do próprio código utilizando encadeamento de `elseif` (fallback lógico) antes de perguntar. Só pergunte quando for impossível deduzir.
- Responda estritamente em português do Brasil, utilizando termos técnicos nativos da área de desenvolvimento. Nunca mude para o inglês, a menos que solicitado.
- O código retornado deve manter rigorosamente a mesma indentação do arquivo enviado.

REGRAS DE ENTREGA DO CÓDIGO:
- Destaque dentro do código implementado (via comentários PHP): o que foi feito, a finalidade, a data/hora atual e a assinatura "Gerado por IA".
- Se for gerado alguma implementação ou atualização e caso a mesma não seja utilizada por algum motivo, precisa nos informar para que possarmos retirar ela do codigo, para não ficar codigo no sistema sem utilidade.

DIRETRIZES DE DEBUG (QUANDO SOLICITADO):
- Se for solicitado gerar DEBUG, utilize obrigatoriamente a estrutura para injetar no console do navegador: TScript::create("console.log('=== DEBUG: [identificador] ===');");
- O debug deve cobrir da primeira à última linha do método afetado.
- Numere sequencialmente os logs: debug-nome do metodo 01, debug-nome do metodo 02, etc.
- Não altere a lógica original ao inserir as linhas de debug.
- O código de debug só pode ser removido quando for solicitado explicitamente por escrito.
- Não suprima o codigo original ao fazer alguma atualização, sempre gere o metodo completo.

INSTRUÇÃO FINAL E FLUXO:
- Analise o arquivo enviado completamente antes de emitir qualquer resposta.
- Se o arquivo for muito grande, divida a análise em partes e entregue os resultados de forma modular e organizada.
- Caso chegue à terceira tentativa sem sucesso na solução, sugira obrigatoriamente a inserção do bloco de debug.
- Ao final da resposta, crie um resumo técnico estruturado (o que foi feito, estado atual, pendências e próximo passo exato) formatado como um prompt de continuidade, para que outra IA possa assumir a tarefa sem perda de contexto.

TAREFA:
*/
/*
Tenho este arquivo class AgendamentoCalendarForm02 extends TWindow e preciso que as linhas de numero 
87 a 196
4520 a 4822 sejam excluidas devido o builder por algum motivo considerar elas como não acessiveis e ficando no codigo como uma sujeira

Status Atual				                    Próximo Status Possível													                                                Regra de Negócio / Gatilho
Aguardando confirmação			                Confirmado / Cancelado pelo paciente / Cancelado pela clínica								                            O agendamento foi pré-reservado. O sistema ou a recepção entra em contato para confirmar.
Confirmado				                        Na recepção aguardando atendimento / Desmarcado em cima da hora / Faltou sem justificativa / Cancelado pelo paciente	O paciente confirmou que irá comparecer.
Na recepção aguardando atendimento	            Atendido														                                                        O paciente fez o check-in físico ou digital na clínica e está na sala de espera.
Atendido				                        Agendar retorno de consulta												                                                O médico/profissional concluiu a consulta. Se houver necessidade, o sistema sugere o agendamento do retorno.

Cancelado pelo paciente: Feito com antecedência (ex: mais de 24h). Não gera ônus e libera a vaga na agenda para a fila de espera.

Desmarcado em cima da hora: Feito em cima da hora (ex: menos de 24h). Importante monitorar para aplicar possíveis taxas de cancelamento tardio, se a clínica tiver essa política.

Cancelado pela clínica: Ocorre por imprevistos médicos ou operacionais. Dispara prioridade para reagendamento.

Faltou sem justificativa (No-show): O paciente não compareceu e não avisou. Bloqueia o status daquele horário e pode disparar uma mensagem automática amigável perguntando se está tudo bem e oferecendo reagendamento.


Observações e Pontos de Melhoria
1. "Agendar retorno" é uma Ação, não um Status
O item "Agendar retorno de consulta" funciona melhor como um gatilho ou uma tarefa pendente do que como um status do agendamento atual.

Como melhorar: Quando o paciente tiver o status atualizado para Atendido, o sistema deve finalizar aquele agendamento e, automaticamente, criar uma tarefa ou alerta na tela da recepção: "Gerar novo agendamento (Tipo: Retorno)". Isso evita misturar o histórico da consulta que já aconteceu com uma consulta futura.

2. O Limbo entre a Recepção e o Consultório (Triagem)
Dependendo da especialidade da sua clínica, o paciente pode passar por uma triagem (medição de pressão, peso, etc.) antes de ver o médico.

Como melhorar: Se houver essa etapa, vale a pena incluir o status "Em Triagem / Pré-atendimento" entre o Na recepção e o Atendido. Isso ajuda a recepção a saber exatamente onde o paciente está fisicamente.

3. Automatização de "No-Show" (Falta)
A falta sem justificativa é o maior ralo de faturamento de uma clínica.

Como melhorar: O status "Faltou sem justificativa" deve disparar uma automação instantânea (ex: 30 minutos após o horário limite).

Exemplo de mensagem automática: "Olá, [Nome], sentimos sua falta hoje! Aconteceu algum imprevisto? Quer reagendar sua consulta? [Link]"

4. Integração com o Financeiro nos Cancelamentos
Status como "Desmarcado em cima da hora" e "Cancelado pelo paciente" precisam estar amarrados à regra financeira da clínica.

Como melhorar: Se o paciente já pagou antecipado, o status Cancelado pelo paciente pode gerar um crédito automático no cadastro dele. Já o Desmarcado em cima da hora pode reter uma taxa de cancelamento, dependendo da política da clínica.
[Aguardando Confirmação] ➡️ [Confirmado] ➡️ [Na Recepção] ➡️ [Em Triagem]* ➡️ [Atendido] ➡️ [Fim (Dispara Alerta de Retorno)]
                                 ⬇️
                      [Cancelados / Faltas] ➡️ (Dispara régua de reengajamento)

O Padrão de Mercado para Janelas de Cancelamento
1. Cancelamento com Antecedência (Padrão: Mais de 24 horas)
Regra: Livre de ônus.

Comportamento do Sistema: O paciente pode cancelar de forma autônoma (pelo link do WhatsApp ou aplicativo) sem precisar falar com um atendente.

Ação Operacional: A vaga volta a ficar disponível no site/agenda imediatamente, e o sistema consulta a lista de espera para oferecer o horário vago a outros pacientes.

2. Desmarcado em Cima da Hora / Cancelamento Tardio (Padrão: Menos de 24 horas)
Regra: Bloqueio de cancelamento autônomo e potencial ônus financeiro.

Comportamento do Sistema: O paciente não consegue cancelar sozinho pelo link. O sistema exibe um aviso: "Para cancelamentos com menos de 24 horas, por favor, entre em contato direto com a nossa recepção". Isso força o contato humano, permitindo que a recepção tente um reagendamento imediato em vez de apenas perder o cliente.

Prática Financeira (Consultas Particulares/Procedimentos): * É padrão de mercado cobrar uma taxa (que varia de 30% a 50% do valor da consulta, ou até a retenção integral do sinal de agendamento caso a clínica trabalhe com pré-pagamento).

Atenção Legal: De acordo com o Código de Defesa do Consumidor (CDC), a clínica pode realizar essa cobrança, desde que o paciente tenha sido explicitamente informado e concordado com essa política no momento do agendamento (via termo de aceite digital ou aviso claro na mensagem de confirmação).

3. Faltou sem Justificativa (No-Show)
Regra: Perda do valor da consulta (se pré-paga) ou cobrança de taxa na próxima visita.

Exceção de mercado: Casos de força maior devidamente comprovados (urgências médicas, acidentes) costumam ter a taxa abonada pela clínica como cortesia para prezar pelo bom relacionamento.

🛠️ Como aplicar isso na prática da sua clínica?
Para que essa lógica funcione sem gerar atritos com os pacientes, adote as seguintes etapas:

O "Termo de Consentimento": No primeiro contato ou no agendamento online, envie uma mensagem automática curta:

"Confirmando seu agendamento! Lembrando que nossa política de cancelamento gratuito é de até 24h antes do atendimento. Cancelamentos após esse prazo ou não comparecimento podem gerar taxa de reserva."

A Régua de Confirmação: Envie o lembrete de confirmação com 48 horas de antecedência. Isso dá ao paciente uma margem confortável para cancelar dentro do prazo gratuito (mais de 24h) e deixa tempo hábil para a clínica preencher a vaga com a lista de espera.                      
*/

/*
//-----------------------------------------------------------------------------------

Você atuará como desenvolvedor sênior para implementar novos métodos e fazer correções.

Contexto técnico:
    a) Linguagem de desenvolvimento PHP 7.4
    b) Framework MadBuilder fork do Adianti Framework
    c) Banco de dados MySQL
    d) Sistema com estrutura para matriz e múltiplas filiais

Diretrizes obrigatórias:
    Restrição crítica:
        Não há acesso ao servidor
        Existem metodos ou trechos comentando isso quer dizer que não sõ utilizados e devem ser ignorados.
        Antes de perguntar se algum metodo ou função existe leia o arquivo enviado.
        Para abrir uma transação com o banco este é o padrão do framework TTransaction::open(self::$database); 
        Se não tiver bloco de refatoração não continue, o framework tem restrições de onde ou não pode ser alterado
        Transform podem ser modificados se for necessarios
        A refatoração é permitida dentro do bloco onde começa:
        //Inicio do bloco que pode refatorar ---------------------------------------------------------------------

        //Fim do bloco que pode refatorar ------------------------------------------------------------------------

        
    Resposta:
        Direta
        Técnica
        Sem introduções
        Sem tutoriais
        Sem pseudocódigo
        Sem trechos incompletos
        A correção ou implementação do metodo deve ser gerada de forma completa pronto para copiar e principalmente informar onde sera implementada por exemplo metodo onreload

    Proibido alterar:
        Nomes de variáveis
        Métodos
        Classes
        Campos
        IDs
        Eventos
        Fluxo principal existente
        Mantenha integralmente a arquitetura existente para manter a compatibilidade do projeto existente.

    Entrega:
        A correção ou implementação do metodo deve ser gerada de forma completa pronto para copiar e colar
        Sempre destacar dentro do metodo o que foi implementado e para que finalidade e ainda colocar a data e hora e quem foi que gerou
        Sempre me responda em português do Brasil, utilizando termos técnicos nativos da área de desenvolvimento e programação quando necessário. Nunca mude para o inglês, a menos que eu peça explicitamente.

    Debug:
        Se for solicitado para gerar um DEBUG deve usar TScript::create("console.log('=== DEBUG onOpenCalendarForm FINALIZADO ===');");
        O debug deve ser iniciado na primeira linha do metodo ate a ultima linha afim de pegar todo o processo e colocar a seguinte observação exemplo debug-onsave 01 /  debug-onsave 02 a medida que for incluindo ir colocando a sequencia
        Não altere nada do codigo oiginal simplismente coloque o debug para encontrar o erro.
        So pode retirar o debug depois que for solicitado por escrito.

    Prioridade:
        Soluções compatíveis com a versão do framework
        NAO CRIE NOVOS METODOS, CAMPOS, FUNÇÕES PERGUNTE ANTES DE PROSSEGUIR

    Contexto insuficiente:
        Perguntar antes de prosseguir

    Objetivo:
        Corrigir
        Implementar
        Preservar a compatibilidade total com as regras existentes
        
    Instrução final:
        Analise o arquivo enviado
        Não forneça nenhuma solução fora das regras citadas acima.
        Se perceber que a solução proposta não esta funcionando, sugira colocar um debug na terceira tentativa.
        Se o arquivo enviado for considerado grande e para evitar o reinicio a todo momento da geração, divada o processo em partes e vai entregando os resultados
        Me forneca a solução dentro do que foi estabelecido nas regras        
        Crie um resumo detalhado do que já foi feito, o estado atual do projeto, quais são as pendências e qual é o próximo passo exato. Formate isso como um prompt para que outra IA possa continuar o trabalho sem perder o contexto e gere respostas modulares e organizadas.

    Tarefa:

//--------------------------------------------------------------------------------------------------------
Dica de mestre: Se a IA começar a "alucinar" nomes de classes que não existem no Adianti, 
responda apenas: "Você violou a regra 2. Releia as nomenclaturas originais e corrija." Ela costuma entrar na linha na hora.
//-------------------------------------------------------------------
https://www.scrapy.org/download
https://langsearch.com
https://www.search1api.com/
https://typesense.org/
https://webatendimento.saude.gov.br/
https://www.saude.pr.gov.br/Pagina/Material-grafico
https://www.gov.br/saude/pt-br/vacinacao/calendario
//----------------------------------------------------------------------
//Desabilitar autocomplete
(function() 
{
    function disableAutocompleteForField(field) 
    {
        if (!field || !field.parentNode || field.dataset.processed) return;

        const clone = field.cloneNode(true);

        clone.setAttribute('autocomplete', 'off');
        clone.removeAttribute('id');
        clone.removeAttribute('name');

        // Marca o campo como processado
        field.dataset.processed = 'true';

        // Substitui o campo original após pequeno delay
        setTimeout(function() 
        {
            field.parentNode.replaceChild(clone, field);
        }, 100);
    }

    function processForm(form) 
    {
        if (!form || form.dataset.autocompleteDisabled) return;

        form.setAttribute('autocomplete', 'off');
        form.dataset.autocompleteDisabled = 'true';

        form.querySelectorAll('input[type=text], input[type=password], input[type=email], input[type=tel], textarea')
            .forEach(disableAutocompleteForField);
    }

    function initAntiAutocomplete() 
    {
        document.querySelectorAll('form').forEach(processForm);
    }

    // Executa ao carregar o DOM
    document.addEventListener('DOMContentLoaded', initAntiAutocomplete);

    // Observa mutações no DOM para suportar Adianti (AJAX)
    const observer = new MutationObserver(function(mutations) 
    {
        mutations.forEach(function(mutation) 
        {
            mutation.addedNodes.forEach(function(node) 
            {
                if (node.nodeType === 1) 
                {
                    if (node.tagName === 'FORM') 
                    {
                        processForm(node);
                    } 
                    else 
                    {
                        node.querySelectorAll?.('form').forEach(processForm);
                    }
                }
            });
        });
    });

    observer.observe(document.body, { childList: true, subtree: true });
})();

//----------------------------------------------------
Entendido. O escopo correto é um controle de solicitações médicas para fila de espera e encaixe de pacientes, não um totem de atendimento.

Objetivo do sistema

Registrar solicitações de atendimento, organizar pacientes interessados por especialidade/médico e acompanhar a fila até que uma vaga de encaixe seja disponibilizada.

Fluxo operacional

Recepção/atendente registra a solicitação do paciente, informando especialidade, médico desejado (opcional), prioridade e observações clínicas.

Solicitação entra na fila de espera da especialidade/médico correspondente.

Equipe acompanha o status da solicitação: aguardando, contatado, encaixado, cancelado, não localizado, etc.

Quando surge uma vaga, o sistema permite selecionar o próximo paciente elegível para encaixe.

O paciente é contatado; se confirmar, a solicitação vira encaixe/agendamento. Caso contrário, registra-se a tentativa e segue para o próximo.

O histórico permanece auditável, mostrando quem registrou, quem contatou, quando houve encaixe e o desfecho final.

Dados principais da solicitação

Paciente

Filial

Especialidade

Médico desejado (opcional)

Data da solicitação

Prioridade / urgência

Motivo ou observação clínica

Status atual

Data limite ou preferência de atendimento (opcional)

Responsável pelo cadastro

Status sugeridos
Aguardando
Em análise
Equipe verificando disponibilidade.
Contatado
Paciente foi chamado para vaga disponível.
Encaixado
Vaga confirmada para o paciente.
Agendado
Não localizado
Tentativa de contato sem sucesso.
Cancelado
Solicitação encerrada sem encaixe.
Finalizado

	

Fluxo encerrado com atendimento concluído.

Módulos do sistema

Cadastro de solicitações médicas

Fila de espera por especialidade

Fila de espera por médico

Controle de prioridades

Registro de tentativas de contato

Controle de encaixes realizados

Histórico completo da solicitação

Relatórios de demanda reprimida

Relatórios de encaixes por período, médico e filial

Regras de encaixe

Priorizar pacientes conforme data da solicitação, prioridade clínica e preferência por médico.

Permitir encaixe por especialidade quando não houver médico específico solicitado.

Ao encaixar, registrar data/hora da vaga, usuário responsável e resultado do contato.

Evitar encaixe duplicado da mesma solicitação.

Manter histórico de todas as movimentações para auditoria.

Estrutura técnica sugerida

Tabela principal: solicitações médicas.

Tabela de histórico: mudanças de status, contatos e encaixes.

Tabela de prioridades: regras configuráveis pela clínica.

Tabela de vagas/encaixes: quando houver integração com agenda médica.

Compatibilidade com o sistema atual

Manter PHP 7.4, MadBuilder e MySQL.

Usar TTransaction::open(self::$database); para operações de banco.

Respeitar a arquitetura existente, sem alterar nomes de métodos, classes, campos, IDs ou fluxo principal.

Suportar matriz e múltiplas filiais, com filas independentes por unidade.

Resumo técnico (Prompt de Continuidade)

Projeto: Controle de Solicitações Médicas para Fila de Espera e Encaixe de Pacientes.

Escopo correto: Registrar solicitações de pacientes interessados, acompanhar status, controlar prioridades e permitir encaixes quando houver vagas disponíveis.

Fluxo principal: Cadastro da solicitação → fila de espera → análise/contato → encaixe/agendamento → histórico final.

Regras técnicas: PHP 7.4, MadBuilder, MySQL, suporte a múltiplas filiais, uso obrigatório de TTransaction::open(self::$database);, preservação da arquitetura existente e entrega apenas de blocos completos prontos para copiar e colar.

Próximo passo: Receber os arquivos do projeto para implementar cadastro de solicitações, listagem da fila de espera, controle de status, histórico de contatos e rotina de encaixe.

Analisando o arquivo enviado, ele corresponde ao model Agendamento (classe Agendamento extends TRecord) e não à estrutura de uma tabela SQL.

Pelos atributos registrados no addAttribute(), identifiquei que a tabela agendamento já possui praticamente todas as entidades necessárias para integrar futuramente o controle de fila de espera:

Empresa (empresa_id)
Paciente (paciente_id)
Profissional (profissional_id)
Produto/Procedimento (produto_id)
Tipo de agendamento (tipo_agendamento_id)
Origem da consulta (origemconsulta_id)
Ambiente (ambiente_id)
Status
Observações
Datas e usuários de todas as movimentações
Cancelamento
Confirmação
Recepção
Retorno
Finalização
Histórico de auditoria completo
Minha sugestão de arquitetura

Eu não utilizaria a tabela agendamento para representar a fila de espera.

O ideal é criar uma entidade independente, por exemplo:

fila_espera

Ela armazenaria apenas quem ainda não possui agendamento, evitando misturar:

pacientes aguardando vaga;
pacientes já agendados;
pacientes atendidos.

Quando surgir uma vaga:

fila_espera
        │
        ▼
Seleciona paciente
        │
        ▼
Confirma interesse
        │
        ▼
Gera registro em Agendamento

Assim, a tabela Agendamento continua sendo somente agenda, preservando toda a lógica existente do sistema.

Integração

A tabela de fila poderá referenciar exatamente as mesmas entidades já existentes:

empresa_id
paciente_id
profissional_id
produto_id
tipo_agendamento_id
origemconsulta_id

Ou seja, praticamente todas as FKs já existem no sistema.

Também recomendo registrar
Data da solicitação
Prioridade
Ordem da fila
Situação (Aguardando, Contatado, Encaixado, Cancelado...)
Quantidade de tentativas de contato
Última tentativa
Usuário responsável
Observações

Dessa forma, quando um encaixe for confirmado, basta gerar um registro em Agendamento, sem alterar nenhuma regra já existente.

Resumo técnico (Prompt de Continuidade)

Análise realizada: O arquivo enviado é o model Agendamento, que representa a tabela de agenda e possui os relacionamentos necessários (empresa, paciente, profissional, produto, tipo de agendamento, origem da consulta, ambiente e auditoria).

Estado atual: Recomenda-se manter agendamento exclusivamente para consultas agendadas e criar uma entidade separada para a fila de espera, preservando a arquitetura existente.

Pendências: Definir a estrutura da nova tabela de fila de espera e os pontos de integração com o cadastro de agendamentos.

Próximo passo exato: Envie o CREATE TABLE da tabela agendamento (ou o diagrama do banco) e, se já existir, o layout esperado da nova fila. Com isso, elaborarei a estrutura da tabela fila_espera integrada ao modelo atual, mantendo total compatibilidade com o sistema existente.

e isso aqui pacientes aguardando vaga;

Sim, exatamente.

A ideia é que "pacientes aguardando vaga" seja o conceito central da funcionalidade.

Na prática, cada registro representa uma solicitação como estas:

"Quero consulta com cardiologista assim que surgir vaga."
"Pode me encaixar com qualquer ortopedista."
"Quero somente com o Dr. João."
"Se houver desistência, pode me ligar."

Ou seja, não existe horário marcado ainda.

Depois, quando surgir uma vaga por cancelamento, aumento de agenda ou encaixe autorizado, a recepção acessa a fila e visualiza, por exemplo:

Ordem	Paciente	Especialidade	Médico	Data da solicitação	Situação
1	Maria	Cardiologia	Dr. João	01/07	Aguardando
2	José	Cardiologia	Dr. João	02/07	Aguardando
3	Ana	Cardiologia	Qualquer	03/07	Aguardando

Então a recepção:

Seleciona o primeiro da fila.
Faz contato.
Registra o resultado:
Confirmou.
Não atendeu.
Desistiu.
Reagendar contato.
Se confirmar, gera o Agendamento usando a estrutura já existente.
A solicitação da fila passa para Encaixado ou Finalizado.

Assim, a fila funciona como um CRM interno de oportunidades de agendamento, enquanto a tabela agendamento continua armazenando apenas consultas efetivamente marcadas.

Esse modelo preserva a arquitetura atual e evita misturar registros de interesse com agendamentos já confirmados.
//-------------------------------------------------------------------------------
<?php

/*

GestorWeb - Simples e Prático
62 9 9235 4734

*/

