📁 Documentação Técnica Oficial

WPM Gestão Interna
Fase Browser-Only

33 versões. Mais de 80 horas. Zero budget. Um recepcionista que transformou frustração operacional em sistema — e documentou cada decisão, cada regressão, cada aprendizado. Este documento é o registro completo dessa jornada.

Autor Wallace Phillip Maclayne
Versão Final WPMRECEPV33.html
Arquitetura Monolito Client-Side
Status ✓ Fase Concluída
Unidade WPM — Recepção
01 — Origem
De onde veio o projeto

Como uma planilha de controle manual se tornou um sistema web completo rodando inteiramente no browser.

O Problema Original

O controle operacional da recepção da unidade WPM era feito de forma manual: planilhas, anotações em papel, WhatsApp para pendências. Dados de alunos novos, vendas de addons, NPS e escala de trabalho não tinham uma fonte única da verdade.

Cada recepcionista registrava informações de forma diferente. Relatórios mensais levavam horas para compilar. Pendências se perdiam entre conversas.

A Decisão

A solução foi criar um sistema digital próprio. A escolha de começar como um único arquivo HTML foi deliberada: sem servidor, sem deploy, sem dependências externas. Qualquer computador com um browser poderia abrir e usar imediatamente.

Isso eliminou a barreira de entrada e permitiu iterações rápidas. O arquivo poderia ser passado por pen-drive, WhatsApp ou e-mail.

Escopo Inicial — O que precisava existir

Operacional

Registro de alunos novos com atendente responsável, vendas de addons vinculadas aos atendimentos, controle de pendências com status e responsáveis.

Gestão

Dashboard executivo com métricas do mês, NPS com ranking de recepcionistas, escala de trabalho mensal com regras trabalhistas.

Infraestrutura

Segregação por período mensal, exportação e importação de backups JSON, sistema de fechamento mensal que avança o período automaticamente.

02 — Conceito
O que é o sistema

WPM Gestão Interna — um sistema operacional completo de gestão de recepção rodando 100% no browser, sem backend.

Definição Técnica

O sistema é um Single Page Application (SPA) manual — um único arquivo .html com todo o HTML, CSS e JavaScript embutidos. O estado da aplicação é armazenado no localStorage do browser, segregado por chaves no formato wpm_MM_AAAA. Não há servidor, não há banco de dados externo, não há login.

A UI é controlada por um sistema de abas (tabs) que exibem e ocultam seções sem recarregar a página. Todo o fluxo de dados segue um padrão unidirecional: Input → Estado → saveState() → render().

Equipe Gerenciada

Recepcionistas

Wallace, PESSOA 2, PESSOA 3, PESSOA 4 — podem ser atendentes de alunos novos e hostess de pendências.

Professores

PESSOA A, PESSOA B, PESSOA C, PESSOA D, PESSOA E, PESSOA F, PESSOA G — aparecem na escala. PESSOA G não pode fazer abertura aos sábados e feriados (restrição interjornada).

Períodos Mensais

O sistema trata cada mês como uma unidade isolada. Dados de 01_2026 não vazam para 02_2026. O fechamento mensal congela os dados, gera um JSON de backup e avança automaticamente para o próximo período.

Campos deriváveis — como dia da semana a partir de uma data — nunca são salvos no storage. São sempre calculados em tempo de execução para economizar o limite de ~5MB do localStorage.

03 — Números
A escala da fase
33
Versões Produzidas
5.6k
Linhas na Versão Final
8
Módulos Completos
128
Pontos esc() Sanitizados
13
Confirmações Destrutivas
4
revokeObjectURL() Chamados
>220
KB Arquivo Final
12
Critérios de Validação V33
04 — Stack
Tecnologias utilizadas

Zero build tools. Zero Node.js. Zero backend. Tudo que o sistema usa está disponível nativamente no browser ou carregado via CDN com SRI.

Core — Nativo

Vanilla JavaScript HTML5 CSS3 localStorage API Blob API FileReader API

Bibliotecas via CDN (SRI)

Chart.js jsPDF jsPDF-autotable SheetJS (xlsx) Montserrat (Google Fonts)

Persistência

localStorage com chaves no padrão wpm_{periodo}. Serialização via JSON.stringify e JSON.parse. Proteção contra QuotaExceededError em todos os setItem.

Dados de backup exportados como JSON com metadados. Importação com sanitização profunda antes de aplicar ao estado.

Gráficos

Chart.js para gráficos de barras (produtividade por atendente) e doughnut (NPS). Instâncias destruídas com chartInstance.destroy() antes de recriar, prevenindo memory leaks.

Função destroyChart() centraliza o padrão de limpeza de canvas antes de novas instanciações.

Exportações

jsPDF + autotable para PDFs de relatórios e escala. SheetJS para exportação CSV/Excel de alunos, pendências e escala.

Todos os URL.createObjectURL() são revogados com revokeObjectURL() após download para evitar memory leaks de Blob.

05 — Módulos
Os 8 módulos do sistema

Cada aba do sistema é um módulo completo com CRUD, filtros, exportações e integração com os demais módulos.

📊
Dashboard
Cards executivos, insights automáticos, resumo por atendente, gráfico de produtividade e visão de addons e pendências.
👤
Alunos Novos
CRUD completo com busca, filtros por atendente e feedback. Somente recepcionistas como atendentes. Addons sincronizados automaticamente.
🛒
Vendas de Addons
Matriz atendente × dia × tipo de addon. Valores vindos dos alunos são sincronizados. Edição manual também disponível.
📋
Pendências
Tabela + Kanban drag-and-drop. Status com indicador pulsante. Hostess apenas recepcionistas. Data validada no período ativo.
NPS
Risk Meter visual com 5 faixas. Score e metas editáveis. Ranking de recepcionistas com tendência, coroa no 1º e setas coloridas.
📅
Escala
Grade visual por dia com turnos. Regras trabalhistas: regra dos 7 dias, restrições de abertura por funcionário. Duplicar mês anterior.
🗓
Eventos e Ações
Calendário mensal + cards + tabela. Filtros por tipo, status e busca. Datas em formato ISO (YYYY-MM-DD) para evitar bugs de timezone.
⚙️
Configurações
Backup/import, snapshot local, diagnóstico do sistema, autotestes, reset de mês, painel de segurança e fechamento mensal.

Integrações entre módulos

Os módulos não são ilhas isoladas. Eles compartilham estado e se afetam mutuamente:

Alunos → Addons

Ao cadastrar um aluno com addon, a venda é automaticamente refletida no módulo de Addons. Ao editar ou excluir, o addon é atualizado. O Dashboard agrega ambos.

Escala → Dashboard

O dashboard mostra um resumo de dias trabalhados por funcionário com base na escala do mês ativo. Alertas de inconsistência aparecem no Dashboard e na Central de Inconsistências.

NPS → Dashboard

O score e o ranking do NPS são exibidos nos cards executivos do Dashboard. Mudanças no módulo NPS refletem imediatamente no resumo geral.

06 — Design
Identidade visual e UX

A identidade visual foi mantida consistente desde as primeiras versões. Tema dark com glassmorphism, tipografia Montserrat e amarelo primário.

Paleta de Cores

#0A0A0C
Background principal
#FFC20F
Amarelo WPM — highlight e CTAs
Glass Panel
backdrop-filter: blur + bordas sutis

Princípios UX

Feedback imediato

Toast notifications para salvamentos. Confirmações confirm() para ações destrutivas. Badges de status com cores semânticas.

Mobile-first degradation

Tabelas dentro de wrappers com overflow-x:auto. Sidebar como drawer em mobile. Modais em 90-100% da largura.

Acessibilidade básica

Atributos aria-label, role="tab", role="tabpanel" nas navegações principais. Contraste adequado entre texto e fundo.

Sidebar vs. Layout Convencional

Uma falha de layout crítica foi descoberta ao usar height:100vh; overflow:hidden em contêineres. Isso criava scroll traps e gaps de conteúdo. O padrão correto adotado: min-height:100vh no contêiner da app, scroll natural do body e position:sticky para elementos fixos.

07 — Evolução
Linha do tempo completa

33 versões produzidas ao longo da fase browser-only, cada uma com um objetivo específico.

v1 Base inicial
Conversão da planilha de controle para HTML. Implementação de Dashboard, Alunos Novos, Addons, Pendências, localStorage e backup JSON. Primeira versão funcional.
v2–v3 Refinamentos iniciais
Estabilização da base. Correções de layout e comportamento do localStorage. Sem artefatos preservados — reconstruídos nas versões seguintes.
v4 Kanban robusto
Implementação do Kanban de pendências com drag-and-drop, truncamento de textos longos, tooltip, rolagem suave, ESC para fechar modal e sincronização entre abas.
v5 Lógica operacional
Metas de NPS, conexão automática addon-aluno, refinamento do dashboard com insights executivos.
v6 ★ Base de referência sólida
Dashboard executivo completo com insights, persistência de aba/filtros e atalho de teclado "/". Tornou-se a base de rollback para quando v7 regrediu. Lição: versões estáveis devem ser marcadas explicitamente antes de evoluções arriscadas.
v7–v8 REGRESSÃO — Camada fora do layout
Adição de faixa extra abaixo das abas gerou interface bugada e disfuncional. A v8 tentou corrigir parcialmente mas manteve instabilidade. Primeira grande crise do projeto.
v9 Rollback consciente para v6
Decisão de retornar à v6 como base segura. Lição fundamental: rollback não é fracasso, é engenharia responsável.
v10–v11 Gestão mensal + módulos Escala e Eventos
Seletor de mês/ano, fechamento de período com backup JSON, navegação entre períodos, aba de Escala visual e aba de Eventos/Ações. Cards executivos no dashboard.
v12–v13 Escala visual + Calendário
Grade visual de escala por dia com legendas coloridas (vermelho/verde/neutro) para tipos de turno. Calendário visual de eventos. Estável com fragilidades de CSS identificadas.
v14–v15 Correções técnicas
Correção do grid fantasma na aba Eventos. Remoção de CSS duplicado. Endurecimento do fechamento mensal. Maturidade técnica crescente.
v16–v17 Maturidade operacional
Filtros avançados, busca, exportações CSV, persistência ampliada de estado de UI. Ações rápidas de filtros, helpers centrais de estado, validação de período em pendências.
v18–v20 Robustez incremental
Evoluções incrementais de funcionalidades e estabilidade. Fase de consolidação antes de mudanças de storage.
v21 REGRESSÃO SEVERA — Tela vazia
Migração de namespace de storage quebrou o estado. Sistema abria com tela completamente vazia sem mês ativo. Crise severa — usuário sem acesso a dados.
v22 Recuperação com namespace novo
Recuperação a partir da v20 com namespace isolado de storage. Lição: migrations de storage devem ter fallback automático e isolamento por versão.
v23–v26 Dados de teste + Hotfixes
Seed determinístico de 30 alunos, 20 pendências, 10 eventos por mês (baseado na chave do período). Hotfixes para storage isolado, sanitização de filtros persistidos e ajustes visuais no Kanban.
v27–v28 ★ Painel de segurança + Autotestes — Baseline
Snapshot local, backup com metadados, diagnóstico do sistema, painel de segurança. Autotestes na aba Configurações com cobertura dos fluxos críticos. Esta se torna a baseline funcional oficial.
v29–v32 Desenvolvimento paralelo Claude + GPT
Início da metodologia de desenvolvimento paralelo. Claude produz versões com foco em arquitetura de segurança (esc(), sanitizeDeep, safeLocalSet). GPT produz versões com foco em UX e lógica unificada de reset de período.
V33 ★★ FINAL Versão definitiva da fase browser-only
Merge deliberado: base V31 (Claude — arquitetura de segurança superior) + patches cirúrgicos da V32 (GPT — lógica de reset de período unificada). Passou todos os 12 critérios de validação. Branding WPM completo. Aprovada para testes operacionais reais.
08 — Crises
Regressões e o que causou cada uma

Cada crise foi documentada e gerou uma regra de arquitetura permanente.

v7–v8 — Camada fora do layout

O que aconteceu

Adição de uma faixa extra de botões abaixo das abas de navegação foi implementada fora da malha principal de layout. O resultado foi uma interface visual quebrada, com sobreposição de elementos e scroll comportando-se incorretamente.

Regra gerada

Qualquer expansão do layout deve ser testada em todas as viewports antes de entregar. Componentes novos fora da malha principal têm custo alto de estabilidade.

v21 — Tela vazia ao abrir

O que aconteceu

Mudança no namespace de storage quebrou silenciosamente o carregamento do estado. A aplicação abria, mas sem mês ativo e sem dados — completamente inutilizável. Usuário em produção afetado.

Regra gerada

Mudanças de storage precisam de fallback automático e migração com rollback. O carregamento deve detectar dados em chaves antigas e migrar antes de deletar.

v23–v24 — Dados de teste invisíveis

O que aconteceu

O localStorage reutilizava dados de versões anteriores. O seed determinístico da v23 gerava dados, mas eles não eram visíveis porque a chave de storage estava com namespace da versão antiga.

Regra gerada

Cada versão deve ter namespace isolado. Dados de teste devem ser gerados com RNG baseado na chave do período para garantir reprodutibilidade e isolamento.

v13–v17 — Degradação por patches iterativos

O que aconteceu

Aplicação sequencial de str_replace em arquivo de 5000+ linhas gerou funções duplicadas, CSS desconectado, IDs órfãos e bugs que se acumulavam. A qualidade do código degradou progressivamente a cada patch.

Regra gerada

Patches iterativos em arquivos massivos são anti-padrão. Prefira reescrita atômica via heredoc (cat > arquivo.html << 'EOF') para mudanças estruturais.

09 — Lições
O que o projeto ensinou

Aprendizados técnicos e de processo que guiarão a próxima fase do sistema.

Patches iterativos acumulam erros em arquivos grandes

A degradação de v13 a v17 foi causada por múltiplos str_replace em um arquivo de 5000+ linhas. Cada patch introduzia pequenas inconsistências que se acumulavam. A solução é a reescrita atômica completa do arquivo quando há mudanças estruturais, ou a adoção de arquitetura modular (a próxima fase).

CSS não tipado é fonte constante de falhas de layout

A tabela de alunos usava a classe .pending-table (projetada para 8 colunas) numa tabela de 11 colunas. O calendário tinha classes definidas em JS mas ausentes no stylesheet. Ambos causaram layout quebrado. Regra: cada componente precisa de CSS dedicado com definição explícita de colunas.

Nenhuma IA é incondicionalmente superior — metodologia dual é o padrão

Claude tendeu a arquiteturas de segurança mais robustas (cobertura de esc(), sanitizeDeep, safeLocalSet). GPT tendeu a fluxos UX mais coesos e lógica de reset unificada. Os melhores resultados vieram de merges deliberados com trilha de auditoria explícita.

Rollback consciente é engenharia responsável

A decisão de retornar à v6 quando v7-v8 falharam foi a decisão certa. Versões estáveis devem ser marcadas explicitamente antes de evoluções arriscadas. Rollback não é fracasso — é parte do processo de engenharia.

Validação antes de entregar é inegociável

O protocolo de validação da V33 — node --check para sintaxe JS, parser HTML Python para estrutura, detecção de IDs/funções duplicadas, auditoria de todos os localStorage.setItem — deve ser padrão em todas as entregas. Não existe "entrega rápida" sem validação.

Estado de período precisa de reset verdadeiramente limpo

As funções resetSelectedMonth() e closeCurrentMonth() precisam usar buildCleanPeriod() que preserva apenas a configuração da equipe — jamais dados de demo. Qualquer dado residual de um mês anterior contaminando um novo período era um bug crítico de negócio.

10 — Segurança
Hardening do sistema

Segurança ofensiva e defensiva implementada em todas as camadas do sistema.

Prevenção de XSS

Tolerância zero para injeção direta via innerHTML. Todos os 128 pontos de renderização dinâmica passam pela função esc() que escapa HTML antes de inserir no DOM.

Alternativas seguras usadas: document.createElement() + textContent e DocumentFragment para renderizações complexas.

SRI em Dependências

Todas as bibliotecas externas (Chart.js, jsPDF, SheetJS, Montserrat) são carregadas com atributos integrity="sha384-..." e crossorigin="anonymous".

Isso garante que, caso o CDN seja comprometido, o browser rejeite o script/fonte adulterado antes de executar.

Sanitização de Backups

A função importarBackup() executa um loop de higienização profunda via sanitizeDeep() em todas as chaves do JSON antes de fazer o merge com o estado local via Object.assign.

Isso previne injeção de código através de arquivos JSON adulterados.

Proteção do localStorage

Todos os localStorage.setItem() estão envolvidos em blocos try...catch via safeLocalSet() para capturar QuotaExceededError e notificar o usuário com uma mensagem clara em vez de falhar silenciosamente.

11 — Regras de Negócio
Regras invioláveis do sistema

Regras que não podem ser quebradas em nenhuma versão, presente ou futura do sistema.

1
Separação de roles — Recepcionistas vs. Professores

Alunos novos só podem ter um recepcionista como atendente (Wallace, PESSOA 2, PESSOA 3, PESSOA 4). Pendências só aceitam recepcionistas como hostess. Professores só aparecem na escala. Esta regra reflete a hierarquia operacional real da unidade.

2
Sincronização addon-aluno bidirecional

Ao cadastrar um aluno com addon, a venda é criada no módulo de Addons. Ao editar o aluno, o addon é atualizado. Ao excluir o aluno, o addon é removido. Não pode existir addon órfão.

3
Regra dos 7 Dias na Escala

Um funcionário não pode ser escalado no sábado E no domingo da mesma semana. Como trabalham de segunda a sexta (5 dias), trabalhar nos dois dias do fim de semana resultaria em 7 dias consecutivos — acima do limite legal de 6 dias.

4
Restrição de Abertura — PESSOA G

PESSOA G não pode pegar turnos de abertura (prof1) aos sábados ou feriados, por conta do descanso interjornada. A função podeAbertura() retorna false para PESSOA G nestas situações. Esta restrição deve ser preservada em todas as versões futuras.

5
Justiça Ponderada 70/30 na Escala

O cálculo de prioridade na escala automática pondera 70% do histórico recente (últimos 3 meses) e 30% do histórico total. Feriados têm peso maior que domingos curtos. Isso garante distribuição justa de turnos ao longo do tempo.

6
Datas em formato ISO — Sem bugs de fuso horário

Todos os campos de data no storage usam o formato YYYY-MM-DD. Nunca armazenar strings de data localizadas ou timestamps com timezone. Isso previne bugs de fuso horário onde uma data se torna o dia anterior ou posterior dependendo do browser.

7
Segregação total por período

Dados do período 03_2026 nunca devem vazar para 02_2026 ou 04_2026. Toda operação que escreve ou lê dados deve verificar se está operando no período ativo correto. Reset de mês limpa apenas o período selecionado.

12 — Validação
Auditoria da versão final V33

12 critérios de validação obrigatórios, todos passados antes da aprovação para testes operacionais.

Critério Ferramenta / Método Resultado Status
Sintaxe JavaScript node --check WPMRECEPV33.html Zero erros ✓ PASS
Estrutura HTML Parser HTML Python — tags abertas/fechadas Zero tags não fechadas ✓ PASS
Funções duplicadas grep -n "function " + análise manual Zero duplicatas ✓ PASS
IDs duplicados grep + detecção automatizada Zero IDs duplicados ✓ PASS
Cobertura esc() Auditoria de todos os innerHTML dinâmicos 128 pontos cobertos ✓ PASS
Confirmações destrutivas Contagem de confirm() + análise de fluxo 13 confirmações ✓ PASS
Cleanup de Blob grep revokeObjectURL 4 chamadas presentes ✓ PASS
Version string grep stale references Zero referências antigas ✓ PASS
Chart.js destroy() Análise de todos os new Chart() destroyChart() precedendo todos ✓ PASS
safeLocalSet() cobertura grep localStorage.setItem Zero set diretos ✓ PASS
SRI em CDNs Inspeção de todos os script/link externos integrity + crossorigin em todos ✓ PASS
Reset de período Teste funcional — reset + validação de dados buildCleanPeriod() preserva só equipe ✓ PASS
12/12
Critérios de Validação Aprovados
WPMRECEPV33.html aprovada para testes operacionais reais
13 — Metodologia
Desenvolvimento com IA dual

Uma abordagem diferenciada: desenvolvimento paralelo com Claude (Anthropic) e GPT (OpenAI), comparando outputs e fazendo merges deliberados.

Claude (Anthropic)

Pontos fortes identificados

Arquitetura de segurança consistentemente mais robusta. Cobertura sistemática de esc() em todos os pontos de injeção. Implementação padronizada de sanitizeDeep() e safeLocalSet(). Auditoria detalhada pós-entrega.

Área de melhoria

Algumas escolhas de arquitetura UX menos intuitivas. Padrão de reset de período com lógica mais fragmentada.

GPT (OpenAI)

Pontos fortes identificados

Fluxos UX mais coesos e intuitivos. Lógica unificada de reset de período com buildCleanPeriod() mais elegante. Menor fragmentação do estado de UI.

Área de melhoria

Cobertura de segurança menos sistemática. Tendência a simplificar sanitização em favor de brevidade de código.

Como o merge foi feito na V33

A versão final não foi uma escolha entre uma IA ou outra — foi uma síntese deliberada com trilha de auditoria:

Base: V31 (Claude)

Toda a arquitetura de segurança — esc(), sanitizeDeep(), safeLocalSet(), confirmações destrutivas, SRI em CDNs. O esqueleto do sistema.

Patches: V32 (GPT)

Lógica unificada de resetSelectedMonth() e closeCurrentMonth() usando buildCleanPeriod(). Melhorias no fluxo de navegação entre períodos.

Resultado: V33 (Merge)

Melhor arquitetura de segurança + melhor lógica de período. Validada pelos 12 critérios. Aprovada por Maclayne após inspeção manual.

Princípio da Avaliação Crítica Bilateral

Maclayne avalia ambas as IAs criticamente e espera que cada IA faça o mesmo com a outra. Não existe "a IA certa". Existe a análise técnica do output de cada uma, identificação dos pontos fortes de cada versão, e a síntese deliberada na versão final. Esta metodologia produziu resultados consistentemente superiores às versões produzidas por uma única IA em isolamento.

14 — Próxima Fase
A evolução para full-stack

A fase browser-only foi o laboratório de regras de negócio. A próxima fase é a migração para arquitetura profissional com banco de dados, API e frontend componentizado.

Visão da Nova Arquitetura

O sistema browser-only provou as regras de negócio em condições reais. Agora o objetivo é evoluir para uma arquitetura que suporte múltiplos usuários simultâneos, banco de dados relacional, autenticação, CI/CD e testes automatizados E2E.

O WPMRECEPV33.html passa a ser a referência funcional oficial (legacy-reference/) — jamais reescrito, mas lido como fonte da verdade de comportamento e regras.

Frontend

React + TypeScript + Vite
SPA componentizada, type-safe, hot reload
🎨
Tailwind CSS
Design system atomic, mesma paleta WPM
🔗
React Query / TanStack
Cache, sincronização e estado do servidor

Backend

Node.js + Fastify + TypeScript
API REST de alta performance, validação Zod
🐘
PostgreSQL + Prisma
Banco relacional, migrations, type-safe ORM
🧪
Vitest + Playwright
Unit tests API + E2E dos fluxos críticos

Roadmap por Sprints

Sprint 0 — Fundação

Monorepo, Docker PostgreSQL, TypeScript configurado, ESLint/Prettier, README de setup local.

Sprint 1 — Modelagem

Schema Prisma com todas as entidades, migrations, seed de funcionários fixos e 12 períodos mensais.

Sprint 2 — API Backend

Fastify com CRUD de todos os módulos, validação Zod, testes com 80% de cobertura.

Sprint 3 — Frontend Base

React + Vite, identidade WPM, 8 abas, seletor de período, Dashboard e Alunos end-to-end.

Sprint 4 — Módulos Restantes

NPS, Escala, Eventos, Addons, Configurações com backup/export/import. Gestão mensal completa.

Sprint 5 — Deploy

E2E com Playwright, CI GitHub Actions, deploy Vercel (web) + Railway (API) + Neon (banco).

O que o sistema browser-only validou para a próxima fase

28+ meses de operação real com a equipe. Todas as regras de negócio foram testadas e refinadas em condições reais. Os bugs encontrados geraram regras permanentes. A próxima fase não começa do zero — começa com um legado funcional sólido, documentado e auditado.