Estudo de Caso · WPM Pampulha · 2024–2026
v34
UX Case Study · WPM Pampulha · 2024–2026

QUANDO A
LINHA DE
FRENTE LIDERA

Um recepcionista identificou falhas operacionais reais, ouviu a equipe, e construiu do zero — sem budget, sem TI, sem pedir autorização — um sistema completo de gestão que eliminou perdas, criou visibilidade e mostrou o que acontece quando funcionários engajados têm ferramentas à altura do seu empenho.

Papel
Designer · Dev · Usuário
Plataforma
Browser-only HTML/JS
Duração
2024–2026 · 100+ horas
Versão atual
v34 · Abril 2026
Avaliação QA
9,5 / 10
01 — Introdução

Contexto do projeto

Meu papel, por que o sistema existe, e o que ele significa além do código.

Meu papel neste projeto

Fui o único responsável por tudo — identificação do problema, pesquisa com a equipe, definição de escopo, arquitetura da informação, design de interface, desenvolvimento front-end, testes e iterações contínuas. Não há equipe de UX, não há squad de produto. Há um recepcionista que ouviu a equipe, sentiu as mesmas frustrações, e decidiu transformar insatisfação coletiva em solução concreta.

Identidade visual

O sistema adota as cores oficiais da WPM (#FFC20F e #111111), tipografia Montserrat, e uma linguagem visual densa e executiva — pensada para monitores de recepção em ambiente de alta demanda.

O design comunica profissionalismo sem exigir designers. É a única ferramenta visual que a equipe usa no turno.

"Se você está em uma empresa onde não é reconhecido e é tratado da mesma forma que alguém que não está nem aí para nada — você desanima, você desiste, você vai embora."

Este projeto nasceu dessa realidade. Não apenas da minha — mas de conversas reais com colegas de recepção, de feedbacks que se repetiam em unidades diferentes, de uma insatisfação comum: funcionários que entregam mais não são visíveis. E o que não é visível, não é valorizado.

Trabalho na recepção da WPM Pampulha em Belo Horizonte. Sou responsável pelo atendimento de novos alunos, controle de pendências, acompanhamento de NPS e gestão operacional do dia a dia. Paralelamente, curso CST Gestão Comercial na UNINTER e carrego uma visão de liderança humanizada — a crença de que quem está na linha de frente tem os dados mais valiosos.

O sistema hoje está na v34, com arquitetura de camadas, IndexedDB dual, suíte de autotestes, backup JSON, exportação CSV, Painel de Recados e 9 módulos operacionais completos. Avaliado com 9,5/10 em avaliação de QA sênior (Gemini Pro).

Por que browser-only?

A escolha não foi limitação técnica — foi decisão de design. Um arquivo HTML que roda em qualquer navegador, sem instalação, sem login, sem servidor, é universalmente acessível pela equipe da unidade. É a solução mais democrática possível para o contexto de uma academia. O arquivo pode ser passado por pen-drive, WhatsApp ou e-mail — e funciona imediatamente.

02 — Problema

O caos operacional

Como a recepção funcionava antes do sistema — e o que estava sendo perdido todos os dias.

Antes do sistema

O controle operacional era feito de forma manual: planilhas fragmentadas, 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 turnos. Recados urgentes não chegavam a quem precisava.

Impacto quantificável

Vendas não registradas
Addons vendidos sem registro sistemático — receita não rastreável.
NPS sem visibilidade
Recepcionistas não sabiam sua taxa de feedback ou posição no ranking.
Passagem de turno falha
Recados urgentes entre turnos eram perdidos em conversas de WhatsApp.
Escala manual
Regras trabalhistas (7 dias, interjornada PESSOA G) gerenciadas na memória.
03 — Impacto Humano

O que está em jogo

Além dos dados — o que a falta de visibilidade faz com as pessoas que trabalham na linha de frente.

"Funcionários que entregam mais não são visíveis. E o que não é visível, não é valorizado."

Invisibilidade de performance

Sem dados, o esforço individual desaparece. Quem atende mais alunos, vende mais addons ou resolve mais pendências não tem como provar — e não é reconhecido por isso.

Desengajamento progressivo

A falta de ferramentas adequadas para o nível de responsabilidade exigido cria uma dissonância: você tem exigências de gestor com recursos de auxiliar.

Perda de conhecimento

Cada troca de turno sem registro formal é uma oportunidade de erro. Alunos importantes, pendências críticas e avisos operacionais se perdem entre conversas informais.

04 — Pesquisa

O que a equipe disse

Conversas reais, frustrações reais — a base para todas as decisões de design.

Recepcionista — Turno manhã
Usuária primária
Precisa saber quais pendências ficaram do turno anterior
Quer visualizar seu desempenho em addons sem perguntar
Precisa deixar recados para quem vai assumir o turno
Quer confirmar se o aluno já tem NPS pendente antes de abordar
Coordenador — Visão gerencial
Usuário secundário
Precisa de relatório mensal sem depender de planilhas manuais
Quer visualizar ranking de NPS e produtividade por recepcionista
Precisa monitorar escala cumprindo regras trabalhistas
Quer exportar dados para apresentações sem retrabalho

Principais descobertas

O que funcionava
A equipe já tinha disciplina operacional. Faltava ferramenta, não disposição.
Preferência por simplicidade
Qualquer solução que exigisse login, instalação ou internet seria descartada na prática.
Maior dor: passagem de turno
Recados importantes entre turnos se perdiam. Era a reclamação mais frequente.
Segundo maior: visibilidade de addons
Ninguém sabia seu total de vendas em tempo real. Dados só no fechamento mensal.
05 — Solução

O sistema construído

9 módulos operacionais, 34 versões, arquitetura de camadas — tudo em um único arquivo HTML.

Definição técnica

O sistema é uma Single Page Application (SPA) single-file — um único arquivo .html com ~11.500 linhas de HTML, CSS e JavaScript. O estado é armazenado em IndexedDB como backend primário e localStorage como espelho de fallback, segregado por período no formato YYYY-MM.

A arquitetura é dividida em 7 camadas explícitas: config → persistência → schema → domínio/seletores → renderização → UI/eventos → diagnósticos. Todo o contrato de atualização é explícito: Ação → Mutação → saveData() → requestRender().

📊
Dashboard
Indicadores derivados de todos os módulos. KPIs de NPS, feedback, addons, próxima escala e pendências críticas.
Completo
🎓
Alunos
Tabela com 11 colunas. Busca accent-insensitive. Filtros por atendente e feedback. Barra de resumo com 12 métricas agrupadas.
Completo
💊
Addons
Grid diário por recepcionista × tipo de addon. Totais memoizados. Liderança exibida no Dashboard em tempo real.
Completo
📋
Pendências
Kanban com 3 colunas e drag-and-drop nativo. Busca por nome, matrícula, pendência e hostess. Top 4 no Dashboard.
Completo
NPS
Score 0–100, metas mensal e semestral. Ranking com setas de tendência (↑↓) comparando com snapshot anterior.
Completo
📅
Escala
Controle por dia com recepcionista, swap e turnos de professores. Regras de 7 dias e restrição de abertura do PESSOA G.
Completo
🗓️
Eventos
Lista de cards + tabela + calendário mensal com pills por dia. Tipos: Ação, Campanha, Treinamento, Feriado, Evento.
Completo
📝
Painel de Recados
Mural de passagem de turno. Campos DE / PARA (recepcionista ou Todos). Recados persistidos por período. Contador de não lidos em tempo real.
Novo · v34
🔧
Configurações
Gestão de equipe, backup, import/export, diagnóstico técnico, autotestes rápidos e auditoria de períodos.
Completo

Painel de Recados — A maior demanda da equipe resolvida

A passagem de turno era a principal dor identificada na pesquisa. O Painel de Recados resolve isso diretamente: o recepcionista que encerra o turno deixa avisos para quem assume, com controle de destinatário (colega específico ou "Todos").

Os recados são persistidos por período no mesmo storage do sistema. Um contador de "recados não lidos" aparece na interface assim que a aba é acessada, criando urgência de leitura sem notificações externas.

Aba de Configurações — Central de controle completa

A aba de Configurações evoluiu para uma central de operações técnicas com 5 painéis independentes:

Gestão de equipe
Edição de recepcionistas, professores e categorias de addon com salvamento imediato e realocação automática.
Resumo da base ativa
12 períodos visíveis, volume de registros, snapshot local e aviso de uso de storage.
Movimentação de dados
Exportar backup, Importar backup (com auto-backup preventivo), Restaurar snapshot e Restaurar base de exemplo.
Diagnóstico técnico
Checklist estrutural com 7 verificações (OK/Alerta/Info). Painel de persistência em tempo real: modo híbrido IDB+cache+broadcast, status, backend, última gravação.
Suíte de autotestes rápidos
6 testes: Round-trip backup JSON, Exportação CSV de pendências/escala/eventos, Reset simulado, Cobertura anual mínima. Relatório com botão de execução e limpeza.
06 — UI Final

A interface entregue

Design system completo, acessibilidade real e UX pensada para uso em ambiente de alta demanda.

Design System

Custom properties CSS cobrindo toda a paleta: --primary (#FFC20F), variantes soft/strong, estados danger/ok/warning. Topbar sticky com backdrop-filter: blur(12px), sempre visível durante scroll.

Tipografia Montserrat + JetBrains Mono para valores numéricos. Cards com mouse glow via CSS custom properties. Transições em 180ms para feedback imediato.

Acessibilidade real

ARIA completo
Tabs com role=tablist/tab, aria-selected, tabindex dinâmico. Modais com role=dialog, aria-modal, foco gerenciado.
Navegação por teclado
Setas navegam abas. / foca busca da aba ativa. Esc fecha modais. Todos os botões com type="button".
Drag & Drop nativo
HTML5 D&D API no Kanban. Coluna de destino destacada. Classe dragging com transform durante o arraste.

Render sem framework

aplicarHtmlSeMudou() compara string HTML nova com o DOM atual antes de qualquer update. Zero reflow desnecessário. Patch por ID em listas via aplicarPatchCards().

Seletores memoizados

Toda derivação de dados passa por lerSelectorMemorizado() indexado por período + assinatura JSON. Cache com limite de 120 entradas antes de limpeza automática.

Storage dual

IndexedDB primário + localStorage espelho. Fila serializada via queueStorageOperation() elimina race conditions. Broadcast cross-tab sincroniza múltiplas abas abertas.

07 — Regras de Negócio

Regras invioláveis

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

1 — Separação de roles
Alunos só têm recepcionistas como atendentes. Pendências só aceitam recepcionistas como hostess. Professores só aparecem na escala.
2 — Sincronização addon-aluno bidirecional
Cadastrar aluno com addon cria a venda. Editar atualiza. Excluir remove. Não pode existir addon órfão.
3 — Regra dos 7 dias na escala
Funcionário não pode ser escalado sábado E domingo da mesma semana — resultaria em 7 dias consecutivos, acima do limite legal.
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.
5 — Datas em formato ISO
Todos os campos de data usam YYYY-MM-DD. Previne bugs de fuso horário onde uma data se torna o dia anterior ou posterior.
6 — Segregação total por período
Dados de 2026-03 nunca vazam para 2026-02 ou 2026-04. Reset limpa apenas o período selecionado, preservando só a configuração da equipe.
7 — Nenhuma escrita sem tratamento de quota
Toda persistência passa por persistStoredValue() que trata QuotaExceededError explicitamente — nunca falha silenciosamente.
08 — Evolução

34 versões

Cada versão com um objetivo. Cada regressão com uma lição. Cada milestone com um critério de aprovação.

v1Base inicial
Conversão da planilha para HTML. Dashboard, Alunos, Addons, Pendências, localStorage e backup JSON. Primeira versão funcional.
v2–v5Kanban, metas de NPS e dashboard executivo
D&D no Kanban, conexão addon-aluno, insights executivos no dashboard.
v6 ★Base de referência sólida
Dashboard executivo completo. Persistência de aba/filtros. Atalho "/" para busca. Tornou-se a base de rollback para v7.
v7–v8REGRESSÃO — Camada fora do layout
Faixa extra abaixo das abas gerou interface quebrada. Primeira grande crise do projeto.
v9Rollback consciente
Retorno à v6. Lição: rollback não é fracasso — é engenharia responsável.
v10–v17Gestão mensal, Escala, Eventos, filtros avançados
Módulos Escala e Eventos, seletor de mês/ano, fechamento de período com backup JSON, calendário visual, filtros e exportação CSV.
v21REGRESSÃO SEVERA — Tela vazia
Migração de namespace de storage quebrou o estado. Sistema abria sem mês ativo. Usuário em produção afetado.
v22Namespace isolado + readStoredJsonWithFallback
Fallback automático para chaves legadas. Migrations nunca mais quebrarão dados existentes.
v23–v26Seed determinístico via RNG com seed por período
30 alunos, 20 pendências, 10 eventos gerados deterministicamente por período. QA reproduzível entre sessões.
v27–v28 ★Snapshot local + Autotestes — Baseline
Diagnóstico do sistema, autotestes na aba Configurações, snapshot local automático. Baseline funcional oficial.
v29–v32Desenvolvimento paralelo Claude + GPT — Merge deliberado
Base v31 (Claude — segurança) + patches v32 (GPT — reset de período). Metodologia dual com trilha de auditoria.
v33 ★★Versão consolidada — aprovada para operação real
Merge deliberado com 12 critérios de validação aprovados. Passou todos os fluxos críticos. Aprovada por Maclayne após inspeção manual.
v34 ★★★ FINALMaturidade máxima da fase browser-only
IndexedDB dual, fila serializada (queueStorageOperation), broadcast cross-tab, APP_INTERNALS, pipeline de render otimizado, Painel de Recados, suíte de autotestes refinada. Avaliado com 9,5/10 por QA sênior.
09 — Resultado

O que foi entregue

Um sistema em produção, avaliado externamente e pronto para evoluir.

34
Versões produzidas
9,5
Nota QA sênior (Gemini Pro)
11.5k
Linhas na versão final
9
Módulos operacionais
7
Camadas de arquitetura
2
Backends de storage (IDB + LS)
6
Autotestes rápidos na suíte

O que o sistema entregou para a equipe

Visibilidade individual
Cada recepcionista vê seu desempenho em addons, NPS e feedback em tempo real.
Passagem de turno resolvida
Painel de Recados elimina perdas de informação entre turnos. Contador de não lidos garante leitura.
Dados para decisão
Relatórios mensais que antes levavam horas agora são exportados em segundos via CSV ou JSON.

O que o projeto provou

Que quem está na linha de frente tem os dados mais valiosos — e tem capacidade de transformá-los em sistema quando recebe a oportunidade.

Que uma SPA de 100+ horas, sem backend e sem equipe, pode atingir nível de qualidade avaliado em 9,5/10 por um QA sênior externo.

Que a próxima fase — full-stack com React, Fastify e PostgreSQL — não começa do zero. Começa com regras de negócio validadas em produção real.

Avaliação técnica externa — Gemini Pro QA Sênior

O sistema foi submetido a uma avaliação de QA sênior completa considerando: arquitetura de camadas, qualidade de código, robustez de persistência, pipeline de renderização, segurança XSS, acessibilidade e completude funcional. Resultado: 9,5/10, considerando as limitações inerentes à arquitetura browser-only single-file.

Próxima fase — Evolução 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: React + TypeScript + Vite no frontend, Node.js + Fastify + PostgreSQL + Prisma no backend, com CI/CD via GitHub Actions e deploy na Vercel + Railway + Neon.

O v34.html passa a ser a referência funcional oficial — jamais reescrito, mas lido como fonte da verdade de comportamento e regras de negócio para a nova arquitetura.

O que o sistema browser-only validou para a próxima fase
34 versões 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, auditado e avaliado com 9,5/10 por QA sênior.