Manual Oficial
Documentação Técnica Oficial • Hiroshi Tecnologia

Manual Oficial e Base de Conhecimento — Ecossistema Brasil Powerlifting

Seção 1

Visão Geral, Launcher Windows e Painel de Controle Principal

1.1. Arquitetura Híbrida (Offline-Master / Cloud-Companion)

O ecossistema opera sob a regra de ouro de segurança de dados esportivos: a máquina local no dia do evento é sempre a fonte absoluta da verdade.

  • Topologia Local (LAN): O computador principal Windows executa o Launcher em C# (PainelPowerlifting.cs), que hospeda internamente um servidor Node.js e um banco de dados SQLite (campeonato.db) em modo WAL de alta concorrência. Dispositivos conectados ao mesmo roteador Wi-Fi (celulares de árbitros, Smart TVs de telão e aquecimento, notebooks secundários) comunicam-se via IP local na porta TCP 3000 usando API REST e WebSockets (Socket.io), sem depender de internet.
  • Topologia Web (Cloud): O servidor de API em nuvem (app.brasilpowerlifting.com.br) gerencia inscrições online prévias, backups remotos e visualização pública antes, durante e após o campeonato.
  • Sincronização Master/Slave: Nenhuma alteração feita na web sobrescreve o computador local durante o evento. O organizador baixa os inscritos da nuvem antes de iniciar a competição e, durante o torneio, o aplicativo desktop envia atualizações unidirecionais (Auto-Push) para a nuvem a cada ação da Mesa de Controle.

1.2. O Launcher (Janela do Servidor no Windows)

Ao abrir o programa no computador principal, a primeira janela exibida é o Launcher em C#. Esta janela não deve ser fechada durante o campeonato.

  • Painel de Logs (Registro de Atividades): Exibe em tempo real as operações internas do servidor Node.js (criação de backups automáticos, sincronizações, conexões de aparelhos e alertas de rede).
  • Controle de Energia (Anti-Hibernação): O Launcher comunica-se diretamente com a API SetThreadExecutionState do Windows. Enquanto a janela do servidor estiver aberta, o computador fica bloqueado de entrar em modo de suspensão, hibernar ou desligar a tela (mesmo operando na bateria do notebook), garantindo que o servidor não saia do ar no meio de um levantamento.
  • Botão 🛡️ Liberar Firewall (Wi-Fi): Essencial para conectar outros aparelhos no dia do torneio. Ao clicar neste botão, o aplicativo aciona o UAC do Windows e configura automaticamente o Windows Defender para abrir a porta TCP 3000 na rede local (LAN). Sem isso, os celulares dos árbitros e Smart TVs não conseguirão se conectar ao computador.
  • Botão 🔄 Atualizar IP Wi-Fi: Varre novamente as placas de rede do computador (ignorando adaptadores virtuais como WSL, Hamachi ou VPNs) para atualizar os links de conexão local caso o computador tenha acabado de trocar de roteador Wi-Fi.
  • Botão 🛑 Encerrar Servidor com Segurança: Nunca feche o servidor de forma forçada. Ao clicar em 🛑 Encerrar Servidor com Segurança, o Launcher envia um sinal ao servidor para consolidar os arquivos temporários (WAL) do SQLite e gerar um último backup local antes de encerrar o processo Node.js.

1.3. A Tela Inicial no Navegador (index.html)

Clicar no botão azul 🌐 ABRIR PAINEL PRINCIPAL no Launcher abrirá o navegador padrão (Chrome ou Edge) na página inicial do aplicativo (http://localhost:3000).

  • Menu de Navegação: A tela inicial apresenta 8 grandes cartões coloridos, estruturados sequencialmente em fases (da Configuração do Evento até o Telão, Resultados e Nuvem) para guiar o organizador.
  • Links de Distribuição em Rede Local (QR Codes / IPs Locais):
    • Na base da tela, o sistema identifica o IP real da máquina no roteador Wi-Fi (ex: 192.168.1.100) e exibe atalhos diretos e botões para copiar os endereços dos aparelhos periféricos:
      • Celular dos Árbitros: http://192.168.1.100:3000/arbitro
      • TV da Sala de Aquecimento: http://192.168.1.100:3000/aquecimento
      • Telão da Plateia: http://192.168.1.100:3000/display
  • Caminho Físico dos Dados: Exibe o diretório real no Windows (%LOCALAPPDATA%\BrasilPowerlifting) onde o banco de dados (campeonato.db) e os backups locais estão salvos.

1.4. Proteção LGPD e Bloqueio de Encerramento Remoto

  • Política de Privacidade (LGPD): O rodapé da tela inicial possui a Política de Privacidade informando que os dados residem localmente e que o uso da Nuvem é 100% opcional.
  • Visibilidade Restrita do Botão de Desligamento: O botão 🛑 Encerrar Servidor com Segurança dentro do navegador só aparece para quem acessa a partir da própria máquina principal (localhost). Se alguém acessar a tela inicial via Wi-Fi, o botão fica oculto, impedindo o desligamento remoto por terceiros.
Seção 2

Aplicativo Desktop — Guia Operacional dos Módulos (Local-First)

MÓDULO 1: Configuração de Campeonato (criar-evento.html — Cartão 1. Evento)

Ponto de partida do sistema, responsável por definir a estrutura, as regras de categorização e a física (plataformas e anilhas) do torneio.

1. Visão Geral e Navegação

  • Barra de Navegação Superior: Apresenta atalhos para todas as telas do sistema (Início, Evento, Inscrição, Baterias, Pesagem, Mesa, Telão, Resultados e Nuvem).
  • Integração Cloud (Opcional): Um banner informativo orienta o organizador sobre a possibilidade de usar o portal brasilpowerlifting.com.br para receber inscrições online, ressaltando que o uso da nuvem é 100% opcional.
  • Seletor de Ação (select_acao_evento): Permite escolher entre a opção ✨ CRIAR NOVO CAMPEONATO ✨ ou selecionar um campeonato já existente na lista para edição.

2. Configurações Estruturais Base

  • Nome e Data (nome_evento e data_evento): Campos obrigatórios. Sem eles, o sistema bloqueia o salvamento.
  • Plataformas Simultâneas (num_plataformas): Define de 1 a 5 plataformas operando ao mesmo tempo no evento.
  • Padrão de Anilhas (anilhas_calibradas): Define a interface visual da Mesa de Controle e do Telão:
    • Anilhas Calibradas (IPF): Gera o desenho da barra com anilhas coloridas oficiais (Vermelha 25 kg, Azul 20 kg, Amarela 15 kg, Verde 10 kg, etc.).
    • Anilhas Padrão (Academia): Gera o desenho da barra com anilhas pretas padrão.

3. Motor de Categorização (Regras de Negócio e Tags)

O sistema utiliza Tags interativas para permitir competições amadoras com regras customizadas ou torneios estritamente federados:

  • Modalidades de Levantamento (Checkboxes): Permite ativar múltiplas modalidades simultâneas: Full Power, Push-Pull, Agachamento Solo, Supino Solo e Terra Solo (mínimo de 1 obrigatória).
  • Equipamentos / Sub-modalidades: Inserção de texto livre e botão Adicionar (ex: Raw, Equipado, Wraps, Sling Shot, SBD). Exige no mínimo 1 item cadastrado.
  • Divisões de Idade: Inserção livre e botão Adicionar (ex: Sub-Júnior, Open, Master 1, Teen). Exige no mínimo 1 item cadastrado.
  • Categorias de Peso (Masculino e Feminino): Listas independentes. O algoritmo interno ordena automaticamente as categorias em ordem numérica crescente e posiciona categorias com o prefixo + (ex: +140) sempre no final da lista. É obrigatório cadastrar pelo menos uma categoria de peso no campeonato.

4. Zona de Exclusão Local Segura

  • Ocultação Inteligente: A zona vermelha de exclusão (painel_excluir_evento) fica oculta durante a criação de um novo evento, aparecendo apenas ao editar um campeonato existente.
  • Validação Anti-Erro: Exige clicar no botão de exclusão e digitar exatamente o nome do campeonato em um prompt de confirmação.
  • Isolamento Master/Slave: A exclusão apaga inscrições, baterias e tentativas apenas do aplicativo no computador local, preservando intactos os dados que já foram enviados para a Nuvem.

MÓDULO 2: Inscrição e Gestão Local de Atletas (inscricao.html — Cartão 2. Inscrição)

Gerencia a entrada, alteração e cancelamento de competidores após selecionar o campeonato no menu select_evento.

1. Modos de Operação e Filtros

  • Seletor de Modo (select_modo_atleta): Alterna entre ✨ CADASTRAR NOVO ATLETA ou editar um atleta existente. No modo edição, o painel fica amarelo com borda laranja e o botão principal muda para Salvar Alterações do Atleta.
  • Barra de Busca/Filtro (filtro_edicao_atleta): Permite digitar o nome ou CPF para filtrar rapidamente o dropdown de edição.
  • Atualização Silenciosa em Rede: Escuta o evento WebSocket dados_atletas_atualizados. Se dois computadores estiverem cadastrando atletas na recepção na mesma rede local, a lista é atualizada automaticamente em segundo plano sem recarregar a página.

2. Preenchimento Automático via Histórico Global

  • Busca no Acervo (busca_historico_atleta): Dispara (com debounce de 250 ms) a partir de 3 caracteres digitados, buscando atletas que já competiram em eventos anteriores naquela máquina.
  • Autofill: Clicar em um atleta sugerido no dropdown preenche instantaneamente todos os dados pessoais e sociais no formulário.

3. Dados Pessoais e Validações

  • Nome e Equipe: O Nome Completo é o único campo estritamente obrigatório. O campo Equipe vem preenchido por padrão como Sem Equipe.
  • Data de Nascimento Flexível: Aceita a data completa (DD/MM/AAAA) ou apenas o ano (ex: 1995), que é convertido internamente para AAAA-01-01.
  • Sexo Biológico (M / F): Atualiza dinamicamente a lista de categorias de peso (masculinas ou femininas).
  • Campos Secundários: Cidade, Estado, WhatsApp (com máscara automática), checkbox PCD (Pessoa com Deficiência) e Redes Sociais (Instagram, YouTube, Outros).

4. Inteligência e Proteção do Campo CPF

O CPF não é obrigatório, mas possui verificação anti-sobrescrita em tempo real (debounce de 250 ms ao atingir 11 dígitos):

  • Banner de Conflito (alerta_cpf_existente): Se o CPF pertencer a outro cadastro com nome divergente, um alerta amarelo bloqueia a sobrescrita silenciosa e oferece duas opções:
    • 📥 Sim, preencher formulário: Importa os dados do atleta vinculado àquele CPF.
    • ➕ Não, manter meus dados atuais: Define forcarNovoAtletaMesmoComCPF = true, criando um cadastro 100% independente para não corromper o histórico do outro atleta.

5. Dados de Competição e Agrupamento

  • Múltiplas Divisões de Idade: Apresentadas como checkboxes, permitindo que o mesmo atleta compita em múltiplas divisões simultaneamente (ex: Júnior + Open).
  • Categoria "Livre": Inclui a opção Livre (Sem Categoria / Definir na Pesagem) para cadastrar o atleta antecipadamente e definir sua categoria exata automaticamente ao subir na balança.
  • Conflito de Edição Simultânea (versao_edicao): Se dois aparelhos tentarem salvar o mesmo atleta simultaneamente, o servidor retorna HTTP 409 Conflict, aborta a sobrescrita e recarrega os dados mais recentes.

6. Cancelamento Seguro (Remoção)

  • Zona Vermelha de Exclusão: O operador seleciona o atleta em select_cancelar_atleta e clica em Remover Atleta do Campeonato.
  • Arquivamento: Após confirmação via prompt, o atleta não é apagado do disco, mas transferido para um evento oculto de sistema chamado "Cadastros Cancelados", removendo-o das listas e baterias ativas.

MÓDULO 3: Gerenciamento de Baterias e Remanejamentos (baterias.html — Cartão 3. Baterias)

Organiza os atletas em grupos de levantamento por movimento e plataforma.

1. Visão Geral e Alertas Proativos

  • Seletor de Movimento (select_movimento): As baterias são independentes por movimento (Agachamento, Supino ou Levantamento Terra).
  • Radar de Atletas Sem Bateria (aviso_sem_bateria): Exibe um banner laranja no topo alertando os nomes de quaisquer atletas inscritos no movimento que ainda estejam sem bateria definida.
  • Painel de Baterias Existentes: Filtra a visualização por uma bateria criada ou permite excluí-la com o botão 🗑️ Excluir Bateria (devolvendo os atletas ao status Sem Bateria).

2. Modo 1: Agrupar por Categorias (Modo Padrão)

Exibe cartões (card-grupo) representando os grupos de atletas por modalidade, equipamento, sexo, divisão e categoria de peso:

  • Motor de Filtragem Avançada: Filtra os cartões por Sexo, Divisão de Idade, Faixa de Peso (incluindo Acima de X kg ou Até Y kg), Modalidade, Equipamento e Status (Com Bateria / Sem Bateria).
  • Barra de Seleção Rápida: Botões ☑️ Marcar Cartões Visíveis, ⬜ Desmarcar Visíveis e 🗑️ Desmarcar Tudo, com contador em tempo real de cartões e atletas marcados.
  • Painel de Ação de Agrupamento (painel_acao): O organizador digita o nome da nova bateria (ex: Bateria A) ou seleciona uma existente, escolhe a Plataforma de Competição (1 a 5) e clica em Agrupar Selecionados.

3. Modo 2: Remanejar Individual e Rodadas Avulsas (4ª Tentativa / PR)

Voltado para exceções, atrasos, faltas ou quebras de recorde:

  • Tabela de Atletas: Lista os atletas do movimento com busca rápida e botão ☑️ Marcar Visíveis.
  • Remanejamento por Atraso: Permite selecionar um atleta atrasado, escolher uma bateria posterior e clicar em 🔀 Aplicar Remanejamento / Criar Bateria Avulsa.
  • Remoção de Faltas: Clicar no botão vermelho 🚫 Remover da Bateria (Atleta Faltou) passa o atleta para Sem Bateria naquele movimento sem afetar os demais movimentos.
  • 🔥 Bateria Avulsa (4ª Tentativa / PR / Desempate):
    • Ao marcar a caixa 🔥 Habilitar Rodada Extra / Bateria Avulsa, surge o campo Carga Inicial da Tentativa Extra (kg) (pode ser deixado em 0 para definir na Mesa; valores acima de 500 kg pedem confirmação).
    • Ao clicar em 🔀 Aplicar Remanejamento / Criar Bateria Avulsa, o sistema gera automaticamente a 4ª tentativa para os atletas selecionados.

MÓDULO 4: Pesagem Oficial (pesagem.html — Cartão 4. Pesagem)

Oficializa a entrada do atleta na competição, registra o peso corporal real, ajusta categorias automaticamente, afere alturas de rack e coleta as 1ªs pedidas.

1. Visão Geral e Status na Fila

No seletor de atletas do campeonato, cada inscrito exibe um prefixo automático:

  • ✅ PRONTO: Peso corporal, alturas de suporte e todas as 1ªs pedidas obrigatórias foram preenchidos.
  • ⚠️ PENDENTE: Dados parciais preenchidos, mas faltam informações obrigatórias.
  • ⏳ AGUARDANDO: Ficha vazia; o atleta ainda não subiu na balança.
  • Proteção contra Conflito Remoto (versaoFichaAberta): Se outro computador da rede atualizar o mesmo atleta enquanto a ficha estiver aberta, o salvamento é bloqueado por um aviso vermelho (aviso_conflito_remoto) exigindo clicar em 🔄 Recarregar Ficha Atualizada.

2. Balança e Realocação Inteligente de Categoria (badge_alerta_peso)

Ao digitar o Peso Corporal (peso_corporal), o sistema compara instantaneamente com a categoria inscrita:

  • Atleta "Livre": Sugere a categoria ideal assim que o peso é digitado (ex: 💡 Categoria p/ 82.45kg: ➔ botão Mudar p/ -82.5).
  • Peso Acima do Limite: Exibe um alerta vermelho informando o excesso (ex: ⚠️ +0.90kg acima de -82.5kg) e um botão laranja sugerindo a nova categoria (ex: Mudar p/ -90). Ao clicar, o atleta e suas baterias são atualizados automaticamente.
  • Peso Abaixo do Limite Mínimo (na categoria +): Exibe um alerta amarelo sugerindo a categoria inferior correspondente.
  • Nota: Os alertas são não-bloqueantes; o mesário pode aceitar a sugestão com um clique ou salvar mesmo assim.

3. Equipamentos (Racks) e 1ª Pedida Oficial

Exibe dinamicamente apenas os movimentos em que o atleta compete:

  • Agachamento: Altura do Suporte (Rack) e 1ª Pedida (kg).
  • Supino: Altura do Suporte, Trava de Segurança e 1ª Pedida (kg).
  • Levantamento Terra: Apenas 1ª Pedida (kg).
  • Cadeado de Segurança (lock_pedida): Se a Mesa de Controle já tiver julgado a 1ª tentativa do atleta, o campo da 1ª pedida fica bloqueado (readonly) com o aviso verde 🔒 1ª pedida já julgada na Mesa.

4. Proteções Anti-Erro no Salvamento

Ao clicar em Salvar Peso e Pedidas, o sistema verifica:

  1. Formato numérico válido (impede múltiplas vírgulas como 82,5,5).
  2. Alerta de confirmação se o peso corporal for > 250 kg ou < 25 kg.
  3. Alerta de confirmação se alguma 1ª pedida for > 500 kg.
  4. Alerta de confirmação caso alguma 1ª pedida obrigatória esteja vazia ou 0 kg.

MÓDULO 5: Mesa de Controle (admin.html — Cartão 5. Mesa)

O cérebro operacional do campeonato em tempo real.

1. Visão Geral, Conexão e Isolamento por Plataforma

  • Seletor de Plataforma (select_plataforma): Cada computador de Mesa controla uma plataforma específica (1 a 5), isolando bateria, fila, luzes e telão.
  • Monitoramento de Rede (barra-status-sistema):
    • Conexão Local (Socket): Exibe 🟢 Conectado em Tempo Real ou pisca 🔴 Reconectando ao Servidor se houver queda local.
    • Status da Nuvem (Cloud Companion): Monitora o backup remoto a cada 30 segundos. Se a internet cair, fica vermelho silenciosamente sem travar o campeonato local.
  • Airbag de Interface: Se uma requisição demorar mais de 8 segundos (Timeout), o sistema reverte o estado visual e exibe um aviso não-bloqueante em painel_erro_operacional para não travar o navegador.

2. Painel Central: Na Plataforma e Fluxo de Ação

  • Desenho Visual da Barra (visual_barra): Exibe graficamente a montagem exata das anilhas (coloridas IPF ou pretas de academia) descontando o peso da barra oficial e presilhas definidos na lateral direita. Pesos impossíveis de montar geram aviso em aviso_calculo_barra.
  • Fluxo Padrão de Operação na Mesa:
    1. Clicar em A Barra Está Pronta (Load Bar): Trava os seletores de bateria, exibe o atleta no Telão/Overlay e libera os botões de voto nos celulares dos árbitros.
    2. Os árbitros votam (ou o mesário marca as luzes na tela).
    3. Clicar em Confirmar e Salvar Decisão: Oficializa o resultado e acende as luzes no Telão.
    4. Clicar em ➡️ PUXAR PRÓXIMO ATLETA: Avança a fila automaticamente para o próximo competidor.
  • Botões de Correção e Contingência na Plataforma:
    • 🔓 Destravar / Cancelar Chamada: Limpa a plataforma e o telão caso o atleta errado tenha sido chamado antes do julgamento.
    • ✏️ Corrigir Carga / Rack: Corrige rapidamente o peso ou a altura do rack enquanto o atleta está na plataforma.
    • 🔄 Anular Julgamento: Aparece após o salvamento das luzes; cancela o veredito e devolve o atleta ao estado pendente para repetir a tentativa.

3. Fila de Levantamento ("A Barra Só Sobe")

  • Regra de Auto-Ordenamento no SQLite: A fila da bateria selecionada é ordenada automaticamente pelos seguintes critérios estritos:
    1. Menor número de tentativa (1ª, depois 2ª, depois 3ª);
    2. Tentativas com peso A DEFINIR (0kg) vão para o topo;
    3. Menor carga solicitada em kg;
    4. Menor peso corporal do atleta (1º critério de desempate);
    5. Menor número de lote/inscrição (2º critério de desempate).
  • Botões Rápidos por Atleta na Fila:
    • 📢 (Chamar Manual): Puxa um atleta específico diretamente para a plataforma.
    • ✏️ (Corrigir Carga): Altera a pedida antes de o atleta ser convocado.
    • ⏭️ (Desistir / Passar): Aciona o menu condicional de desistência.
  • Proteção "Anti-Clique Engolido": Intercepta eventos pointerdown e touch, atrasando atualizações de HTML em 180 ms caso o mesário esteja clicando em um botão no exato instante de um pacote de rede.

4. Gestão Pós-Tentativa (Aguardando Pedida (1 min))

Atletas que concluem a 1ª ou 2ª tentativa vão para a caixa Aguardando Pedida (1 min):

  • Atalhos Rápidos: Botões para repetir a carga anterior (=) ou somar +2.5, +5 e +10 kg.
  • Alertas de Regra: Pede confirmação se a nova carga for menor que a anterior ou tiver um salto acima de +60 kg.
  • Alerta de Transição de Rodada (aviso_rodada_pendente): Se a fila puxar um atleta da 2ª tentativa enquanto outro competidor ainda estiver em "Aguardando Pedida" para definir sua 2ª tentativa, um banner alerta o mesário para cobrar o peso pendente antes que a barra suba.

5. Julgamento (Luzes), Retificação e Modo Planilha

  • Modo Árbitro Único: A checkbox Apenas Árbitro Central vincula o voto central às 3 luzes e bloqueia os celulares laterais.
  • Retificação Pós-Salvamento: Se um árbitro votou errado e a Mesa já salvou, basta clicar sobre a luz incorreta na tela da Mesa. O botão principal ficará laranja com o texto ⚠️ SALVAR RETIFICAÇÃO DE LUZES AGORA!. Se o mesário tentar puxar o próximo atleta sem salvar a retificação, um alerta será exibido.
  • Modo Planilha (⚠️ MODO PLANILHA): Tela de emergência estilo Excel sem travas de fila. Permite editar status (pendente/concluído), validar levantamentos manualmente e clicar no botão roxo ➕ +Xª Tent. para criar tentativas extras diretamente no banco de dados.

6. Fluxo Avançado: Botão ⏭️ (Desistir ou Passar a Tentativa)

  • Na 1ª ou 2ª Tentativa: Exibe um prompt numérico:
    • Digitar 1 (Passar apenas a atual): Cancela apenas a tentativa atual, mas cria automaticamente a próxima tentativa (ex: 3ª) e envia o atleta para "Aguardando Pedida".
    • Digitar 2 (Desistir de todas as restantes — Padrão): Cancela a tentativa atual e encerra a participação do atleta naquele movimento.
  • Na 3ª Tentativa (Última): Exibe apenas confirmação simples (OK / Cancelar).

MÓDULO 6: Periféricos Locais em Rede LAN (Árbitros, Telão e Aquecimento)

1. Painel do Árbitro (arbitro.html — Cartão 6. Celulares)

  • Conexão e Posição: Acessado via navegador do celular pelo IP local. O árbitro seleciona sua Plataforma (1 a 5) e sua cadeira (Esquerda, Central ou Direita), que ficam salvas no localStorage.
  • Interface de Voto: Mostra o nome do atleta e o peso na barra em letras grandes. O árbitro toca em BRANCA ou VERMELHA e confirma no botão verde CONFIRMAR DECISÃO.
  • Prevenção de Bloqueio de Tela (Wake Lock API): Após o primeiro toque na tela, o celular não apaga a tela nem entra em suspensão enquanto o navegador estiver aberto.
  • Sincronização e Bloqueios: Bloqueia votos laterais quando em Modo Árbitro Único Ativo, trava os botões exibindo ✅ Decisão Finalizada na Mesa! assim que a Mesa salva o veredito, e utiliza heartbeat a cada 4 segundos (solicitar_estado_plataforma) + visibilitychange para reconexão instantânea.

2. Telão de Exibição da Plateia (display.html — Cartão 7. Telão)

  • Layout e Escalonamento Fluido: Projetado para Smart TVs e telões de LED. Utiliza clamp() e re-escalonamento automático para nomes com mais de 24 ou 36 caracteres.
  • Transição Visual: Exibe AGUARDANDO ATLETA... até que a Mesa clique em A Barra Está Pronta. Quando a decisão é salva na Mesa, acende as 3 luzes simultaneamente com brilho radial intenso e exibe MOVIMENTO VÁLIDO (verde) ou MOVIMENTO INVÁLIDO (vermelho).
  • Seletor Discreto (seletor-tv): Menu semitransparente no canto superior direito para escolher a Plataforma (1 a 5).

3. Painel da Sala de Aquecimento (aquecimento.html — Cartão 8. Aquecimento)

  • Modo 1 — Visão Geral (Sem Rodada Ativa): Exibe cartões com todas as baterias previstas do campeonato, listando atletas, categorias e cargas iniciais.
  • Modo 2 — Fila Ativa Focada (Rodada Iniciada): Mostra a fila em andamento da plataforma selecionada, destacando o atleta atual em verde (▶ AGORA), o próximo da fila com tarja azul (proximo) e listando no rodapé amarelo quem está em Aguardando Pedida.

MÓDULO 7: Apuração, Resultados e Rankings (resultados.html — Cartão 9. Resultados)

Consolida todos os levantamentos válidos em tempo real e calcula pódios e recordes automaticamente.

1. Critérios e Fórmulas de Coeficiente

  • TOTAL_KG (Carga Total): Soma da maior tentativa válida de cada movimento disputado. Critério de desempate automático: menor peso corporal aferido na pesagem.
  • DOTS (Polinômio de 4º grau): Coeficiente padrão moderno utilizado internacionalmente no powerlifting para comparar atletas de diferentes pesos corporais.
  • WILKS (Polinômio de 5º grau): Fórmula clássica de coeficiente de força relativa.
  • RELATIVO (Força Relativa Simples): Divisão matemática direta entre a carga levantada e o peso corporal do atleta (Carga / Peso Corporal).

2. Visões de Disputa e Modos Especiais

  • Filtros de Disputa: Visualização separada por Movimento Único (Agachamento, Supino ou Terra), Total Push-Pull, Total Full Power e Overall (Best Lifter) unificando categorias de peso.
  • Modo "Total Flexível": Permite configurar se atletas que zerarem um dos movimentos de uma disputa completa ainda devem ter suas cargas válidas somadas ou se devem receber status desclassificado (DQ/Sem Total).
  • Modo "Sexo Misto": Permite gerar rankings Overall unificados ou separados por sexo biológico.

3. Exportação para Excel (.CSV), PDF e Acervo Permanente

  • Exportação .CSV Nativa para Excel: Gera planilhas com codificação UTF-8 BOM e separador ponto e vírgula (;), garantindo abertura direta no Microsoft Excel em português sem desconfigurar acentos ou colunas. Permite exportar apenas a tabela filtrada na tela ou a base completa de atletas e levantamentos.
  • Impressão / PDF: Gera súmulas formatadas prontas para impressão ou salvamento em PDF.
  • Publicação no Acervo Web Permanente: Permite enviar os resultados consolidados diretamente para o ranking histórico oficial do portal brasilpowerlifting.com.br.

MÓDULO 8: Central da Nuvem e Gestão de Dados no Desktop (nuvem.html — Cartão 10. Nuvem)

Gerencia o fluxo de dados entre o computador local, backups em pendrive (.JSON) e o servidor em nuvem.

1. Configuração de Conexão e Modo Offline

  • Modo Offline Local: Para operar 100% sem internet, o campo ID do Organizador permanece como LOCAL e o Token fica em branco (aviso-nuvem-opcional).
  • Conexão Cloud: Organizadores com licença inserem seu ID do Organizador, URL da Nuvem e Token e clicam em Salvar Configuração.
  • Badges de Status (msg-status-nuvem): Indicam Conectado na Nuvem com sucesso!, Modo Offline Local ativo, Erro de Autenticação ou Sem Token.

2. Exportação Local e Upload de Segurança

O seletor de campeonatos locais indica se o evento está 🟢 Sincronizado ou com ⏳ Alterações Pendentes:

  • Botão ☁️ Atualizar / Publicar Snapshot: Envia o pacote completo do campeonato para a nuvem (ou salva no cofre rotativo local se estiver em modo LOCAL).
  • Botão 📑 Criar Cópia Independente: Envia o campeonato gerando um novo identificador único para não sobrescrever o evento original.
  • Botão 💾 Baixar Arquivo (.JSON): Exporta todos os dados do torneio em um arquivo .json estruturado para backup em pendrive.

3. Fluxo Nuvem ➔ Desktop no Dia do Evento (Duas Opções de Importação)

Para carregar no computador do ginásio os atletas que se inscreveram previamente pela internet:

  • Opção A (Via Internet Direta): Na aba Nuvem do aplicativo desktop, insira as credenciais de organizador, atualize a lista de campeonatos da nuvem, escolha o evento (ou um dos últimos 20 snapshots íntegros do cofre 🛡️ Ponto de Restauração) e clique em Baixar / Restaurar.
  • Opção B (Via Pendrive Sem Internet no Ginásio): Baixe o pacote .JSON previamente na Etapa 3 do Portal Web (/organizador-evento), leve em um pendrive até o computador da Mesa e utilize a opção de importar arquivo .JSON local.

4. Os 3 Modos Cirúrgicos de Importação (Disaster Recovery)

Tanto ao baixar da nuvem quanto ao importar via pendrive, o operador escolhe um dos 3 modos:

  1. Modo 1 — Substituir / Atualizar Campeonato (Padrão): Substitui os dados locais pelos do backup e restaura o estado exato das 5 Plataformas (Mesas de Controle), permitindo que Telão e Árbitros retomem do exato atleta que estava na barra caso o PC principal precise ser trocado.
  2. Modo 2 — Baixar e Criar uma Cópia Completa: Cria um novo campeonato paralelo na máquina local sem afetar o evento em andamento.
  3. Modo 3 — Apenas Atletas (Limpar Pesagem e Tentativas): Modo pré-evento ("Reset"). Importa todos os atletas inscritos na web, mas descarta quaisquer pesagens, baterias e luzes fictícias criadas durante simulações e testes da equipe antes da competição oficial.
Seção 3

Plataforma Web e Serviços em Nuvem (brasilpowerlifting.com.br)

A plataforma web complementa o aplicativo desktop oferecendo serviços online para organizadores, atletas, equipes de transmissão ao vivo e público geral.

3.1. Mapa de URLs e Serviços Web

  • /solicitar-licenca-nuvem: Formulário público para organizadores solicitarem gratuitamente suas credenciais de uso da Central da Nuvem e inscrições online.
  • /organizador-evento: Painel administrativo privado na web para criar e gerir campeonatos online.
  • /inscrever: Portal público e responsivo onde os atletas realizam suas inscrições online.
  • /ao-vivo: Painel público em tempo real para a plateia e atletas acompanharem filas de baterias e resultados parciais pelo celular.
  • /gerador-overlay: Ferramenta para configurar e gerar o link de overlay transparente para transmissões ao vivo.
  • /overlay: Renderizador gráfico (Browser Source 1920x1080) utilizado dentro do OBS Studio ou vMix.
  • /rankings: Biblioteca pública e acervo permanente de resultados (Competições Amadoras Brasil Powerlifting + Competições Federadas OpenPowerlifting).
  • /torneios: Calendário e páginas oficiais das competições cadastradas.

3.2. Central Online do Organizador (/organizador-evento)

Acessada mediante Identificador do Organizador e Token de Acesso. É dividida em 3 Etapas:

Etapa 1: Estrutura e Regras do Campeonato

  • Configura nome, data, local, visibilidade pública, modalidades, equipamentos, divisões de idade e categorias de peso (masculinas e femininas).
  • Exclusão na Nuvem: É o único local onde um campeonato pode ser excluído definitivamente do servidor em nuvem (exigindo digitar o nome exato do evento no final da Etapa 1). Também permite ocultar ou remover resultados publicados no acervo público.

Etapa 2: Página Pública de Inscrição e QR Codes

  • Geração de QR Codes (PNG e Cartaz A4): Gera automaticamente códigos QR em alta resolução e folhas A4 prontas para impressão (apontando para a página de inscrição antes do evento ou para o painel /ao-vivo no dia do campeonato).
  • Controle de Vagas e Prazos: Permite definir o status das inscrições (Abertas/Encerradas), data limite e o Limite Máximo de Inscrições (que encerra o formulário automaticamente assim que a última vaga é preenchida).
  • Personalização de Campos do Formulário: O organizador define livremente quais dados do atleta serão Obrigatórios, Opcionais ou Ocultos (CPF, WhatsApp, Equipe, Cidade/Estado, PCD, Redes Sociais).
  • Regulamento, PIX e Termos Jurídicos: Espaço para inserir o texto do regulamento, instruções de pagamento/chave PIX para taxa de inscrição e termos de uso de imagem. O termo de ciência da política de privacidade (LGPD) é integrado de forma fixa.

Etapa 3: Sumário de Inscritos e Exportação

  • Exibe painel estatístico em tempo real com total de atletas inscritos, filtro de busca rápida e listagem detalhada.
  • Permite exportar a lista de inscritos em planilha Excel (.CSV) ou baixar o pacote criptografado .JSON para importação via pendrive no computador da Mesa.

3.3. Portal Público de Inscrição do Atleta (/inscrever)

Interface mobile-first onde o competidor escolhe suas categorias e envia sua inscrição:

  • Opção de Anonimização Histórica (LGPD): Durante a inscrição, o atleta conta com uma caixa de seleção permitindo solicitar a ocultação de seus dados pessoais após o evento. Caso marcada, seu nome completo continuará visível para a Mesa de Controle no dia do campeonato (para permitir a chamada na plataforma), mas, ao ser enviado para o Acervo Permanente (/rankings), o sistema converterá automaticamente seu nome para iniciais (ex: "J. S.") e removerá cidade e redes sociais, preservando apenas o registro esportivo da carga levantada.

3.4. Transmissão Ao Vivo e Broadcast para OBS Studio / vMix (/gerador-overlay e /overlay)

Permite exibir placares televisivos em tempo real em lives no YouTube, Twitch ou Instagram:

  • Configuração Segura (/gerador-overlay): O organizador insere suas credenciais, escolhe qual Plataforma (1 a 5) aquele link irá monitorar e pode enviar o logotipo personalizado do campeonato. O link final gerado para o /overlay utiliza identificadores públicos seguros que não expõem o Token privado do organizador.
  • Integração no OBS Studio / vMix: Basta adicionar uma fonte do tipo Navegador (Browser Source) com resolução 1920x1080 e colar a URL gerada.
  • Comportamento Dinâmico na Live (Lower Third Inteligente):
    1. O gráfico permanece invisível (fundo 100% transparente) enquanto a plataforma está livre.
    2. Assim que a Mesa de Controle local clica em A Barra Está Pronta, o Lower Third entra em cena exibindo o nome do atleta, equipe, categoria, tentativa atual, peso na barra e os 3 círculos de luzes apagados.
    3. Quando a Mesa confirma o julgamento dos árbitros, as 3 luzes acendem simultaneamente na transmissão com efeito luminoso radial (Brancas ou Vermelhas) junto ao veredito do levantamento, permanecendo em tela até a chamada do próximo atleta.

3.5. Acompanhamento Ao Vivo Público (/ao-vivo)

Acessado por atletas e espectadores pelo celular (via QR Code espalhado pelo ginásio ou link direto):

  • 3 Abas de Consulta em Tempo Real:
    1. Fila da Bateria Atual: Mostra quem está na plataforma agora, a ordem exata dos próximos levantadores e as cargas solicitadas.
    2. Todas as Baterias: Permite aos atletas consultarem a programação completa de baterias para planejar seu aquecimento.
    3. Resultados Parciais: Exibe a classificação dinâmica das categorias conforme os levantamentos acontecem.
  • Proteção Anti-Crawler de 24 Horas: A rota /ao-vivo aceita consultas dinâmicas apenas durante o campeonato e por até 24 horas após o último clique registrado na Mesa de Controle. Após 24 horas de inatividade, o sistema bloqueia requisições dinâmicas ao banco SQL contra robôs (crawlers) e redireciona automaticamente os visitantes para o Acervo Histórico Estático (/rankings).

3.6. Acervo Histórico e Rankings Permanentes (/rankings)

Biblioteca pública com arquitetura Zero-DB (baseada em índices JSON estáticos de alta velocidade) que reúne duas fontes separadas:

  • 1. Acervo Brasil Powerlifting (Competições Amadoras e Independentes): Exibe os rankings gerais, filtros por movimento, sexo, equipamento e divisão, súmulas completas de campeonatos realizados no ecossistema e perfil histórico de cada atleta com suas melhores marcas (Personal Records — PRs).
  • 2. Competições Federadas (OpenPowerlifting): Ao pesquisar o nome de um atleta, o sistema consulta de forma separada a base pública do projeto OpenPowerlifting (openpowerlifting.org), exibindo o histórico oficial do atleta em federações nacionais e internacionais sem misturar ou confundir homônimos das competições amadoras.
Seção 4

Arquitetura de Segurança, Estabilidade e Resiliência de Dados

A arquitetura de segurança do Ecossistema Brasil Powerlifting foi desenhada para garantir que o torneio nunca seja interrompido por falhas de rede, erros operacionais ou conflitos de sincronização.

4.1. Isolamento de Rede e Controle de Acesso Local

  • Restrição Rigorosa a Localhost (Computador Principal): Middlewares de segurança (ehRequisicaoDaMaquinaLocal, exigirMaquinaLocalPagina, exigirMaquinaLocalAPI) interceptam todas as requisições recebidas e verificam as interfaces de rede do sistema operacional. Rotas destrutivas ou de configuração (criar, editar ou excluir eventos, importar backups ou desligar o servidor) só podem ser executadas diretamente na máquina host (127.0.0.1, ::1 ou IPs físicos locais da própria máquina).
  • Bloqueio de Dispositivos Externos (403 Forbidden): Se um árbitro, atleta ou mesário tentar acessar rotas de configuração através de um celular ou tablet conectado ao Wi-Fi, o servidor bloqueia a requisição com erro 403 Forbidden.
  • Controle de Firewall via UAC: O botão 🛡️ Liberar Firewall (Wi-Fi) no Launcher C# abre exclusivamente a porta TCP 3000 no Windows Defender para tráfego na rede local (LAN).

4.2. Integridade de Banco de Dados e Prevenção de Conflitos

  • Controle de Concorrência Otimista (Versionamento de Fichas): Cada inscrição possui um controle de versão (versao). Se dois mesários em aparelhos diferentes tentarem editar a ficha ou a pesagem do mesmo atleta simultaneamente, o servidor rejeita a segunda tentativa com status HTTP 409 Conflict, exigindo recarregar os dados atualizados.
  • Sanitização Enterprise Grade: Nenhuma entrada do usuário vai diretamente para o banco de dados sem passar pelas rotinas de purificação:
    • sanitizarCPF: Remove caracteres não numéricos e restringe a 11 dígitos.
    • sanitizarPeso: Aceita apenas números válidos, converte vírgulas em pontos e arredonda para duas casas decimais (0.01 kg).
    • decodificarParamSeguro: Previne falhas (URIError) ao receber URLs malformadas contendo caracteres especiais como %.
  • Logs de Auditoria (log_acoes / registrarLogSeguranca): Registra silenciosamente todas as ações críticas (exclusões locais, edições de dados sensíveis, correções forçadas na Mesa, anulações de julgamento e arquivamento de fichas) com carimbo de data e hora.
  • Modo WAL do SQLite (Write-Ahead Logging): Garante alta concorrência de leitura e escrita sem bloquear ou travar o banco durante o fluxo contínuo de votações dos árbitros.

4.3. Resiliência Operacional, Backups e Recuperação

  • Snapshots Point-in-Time (Cofre Local): Antes de qualquer ação destrutiva (excluir evento, arquivar atleta, excluir bateria ou forçar importação da nuvem), a função criarSnapshotSeguranca() congela o estado atual do banco e salva um backup instantâneo na pasta local do computador.
  • Rotina de Backups Rotativos (A cada 5 minutos): O servidor cria backups automáticos de todos os dados do torneio a cada 5 minutos, armazenando os últimos 20 snapshots por campeonato para restauração imediata.
  • Airbag Global do Servidor (uncaughtException e unhandledRejection): Intercepta erros críticos não tratados no Node.js. Se uma falha inesperada ocorrer, em vez de fechar o programa e parar o campeonato, o "Airbag" grava o erro no log de segurança e mantém a Mesa, o Telão e os celulares funcionando normalmente.
  • Encerramento Seguro Automático (SIGINT, SIGTERM): Ao clicar em 🛑 Encerrar Servidor com Segurança, o sistema fecha conexões ativas, consolida o cache WAL do banco de dados e cria um backup final antes de encerrar o processo.

4.4. Segurança na Sincronização em Nuvem (Cloud Companion)

  • Gatekeeper de Criptografia SHA-256: Antes de enviar ou receber pacotes da nuvem, o sistema gera um hash canônico SHA-256 de todo o pacote JSON. Se o hash recalculado no destino não bater exatamente com o enviado, o pacote é sumariamente rejeitado sob suspeita de corrupção na rede.
  • Circuit-Breaker de Rede: O Auto-Push opera em segundo plano a cada 30 segundos. Se a internet do ginásio cair (Timeout), ele absorve o erro silenciosamente, entra em espera e tenta reenviar no próximo ciclo sem travar nem exibir pop-ups de erro na tela da Mesa.
  • Proteção Anti-Corrupção ("Zerar Atletas"): A Nuvem recusa automaticamente qualquer pacote de atualização automática que contenha "0 atletas" caso o evento online já possua atletas cadastrados, impedindo que um erro operacional apague o torneio na web.
Seção 5

Perguntas Frequentes (FAQ) e Resolução de Problemas

P1: O aplicativo no computador trava se a internet do ginásio cair?

Resposta: Não. Toda a operação do campeonato (pesagem, celulares dos árbitros, Mesa de Controle, Telão e TV de aquecimento) funciona 100% offline através do roteador Wi-Fi local (LAN). Se a internet cair, a sincronização com a nuvem entra em modo Circuit-Breaker silencioso e volta a enviar os backups automaticamente assim que a internet retornar, sem interromper o campeonato.

P2: Os celulares dos árbitros não estão conseguindo abrir o link do servidor. Como resolver?

Resposta: Verifique três pontos:

  1. Certifique-se de que o computador principal e os celulares estão conectados exatamente à mesma rede Wi-Fi.
  2. Na janela do Launcher no Windows, clique no botão 🛡️ Liberar Firewall (Wi-Fi) e confirme a permissão de Administrador para desbloquear a porta 3000.
  3. Caso tenha trocado de roteador Wi-Fi com o programa aberto, clique em 🔄 Atualizar IP Wi-Fi no Launcher e utilize o novo endereço IP exibido na tela inicial.

P3: Como limitar o número de inscrições online ou encerrar o formulário na web?

Resposta: Acesse a Central Online do Organizador (/organizador-evento), faça login com seu ID e Token e abra a Etapa 2 (Página de Inscrição). Você pode alterar o Status manualmente para encerrado, definir uma data limite ou preencher o campo Limite Máximo de Inscrições para que o portal feche automaticamente ao atingir o número desejado de inscritos.

P4: Um atleta foi chamado para a plataforma por engano. Como cancelar a chamada?

Resposta: No painel central da Mesa de Controle (5. Mesa), clique no botão laranja 🔓 Destravar / Cancelar Chamada. Isso limpa imediatamente a plataforma e o Telão da plateia, devolvendo o atleta para a fila e liberando a Mesa para chamar o atleta correto.

P5: O atleta bateu um recorde e terá direito a uma 4ª tentativa (PR). Como adicionar?

Resposta: Há duas formas:

  • Pelo Módulo de Baterias (3. Baterias): Clique na aba Modo 2 (Remanejar Individual / Avulsa), selecione o atleta, marque a caixa 🔥 Habilitar Rodada Extra / Bateria Avulsa, informe a carga inicial (ou deixe 0) e clique em 🔀 Aplicar Remanejamento / Criar Bateria Avulsa.
  • Direto pela Mesa de Controle (5. Mesa): Clique no botão vermelho ⚠️ MODO PLANILHA e clique no botão roxo ➕ +4ª Tent. ao lado do nome do atleta.

P6: Um árbitro clicou na luz errada no celular e a Mesa já clicou em Salvar. Como corrigir?

Resposta: Com o atleta ainda exibido no painel da Mesa de Controle, basta o mesário clicar diretamente sobre o círculo da luz que precisa ser corrigida (trocando entre Branca e Vermelha). O botão principal mudará para a cor laranja com o aviso ⚠️ SALVAR RETIFICAÇÃO DE LUZES AGORA!. Clique nele para atualizar o resultado no banco de dados e no Telão. Caso a Mesa já tenha puxado o atleta seguinte, utilize o botão 🔄 Anular Julgamento ou edite pelo ⚠️ MODO PLANILHA.

P7: O atleta pesou na balança acima do limite da categoria em que se inscreveu (ex: pesou 83.4 kg na categoria -82.5 kg). O que fazer?

Resposta: Ao digitar 83.4 no módulo Pesagem (4. Pesagem), o sistema exibirá automaticamente um alerta vermelho (⚠️ +0.90kg acima de -82.5kg) acompanhado de um botão laranja sugerindo a categoria imediatamente superior (Mudar p/ -90). Basta clicar nesse botão laranja e salvar: o sistema mudará a categoria do atleta e atualizará automaticamente o agrupamento dele nas baterias.

P8: Como excluir um campeonato da Nuvem? E como excluir apenas do Computador Local?

Resposta: Os ambientes são isolados por segurança:

  • Para excluir da Nuvem: Acesse exclusivamente o portal web (/organizador-evento), vá até o final da Etapa 1 e confirme digitando o nome exato do campeonato.
  • Para excluir apenas do PC Local: Abra o aplicativo desktop no módulo Configuração (1. Evento), selecione o campeonato para edição, role até a zona vermelha no final da página e digite o nome exato do evento. Excluir no PC não apaga o campeonato da nuvem, e vice-versa.