5.4 KiB
FASE 6 — Painel administrativo
Objetivo
Painel web completo para síndico e administradora: gestão do condomínio, auditoria de visitas com mídia e mapa, importação de moradores, reconciliação e feature flags.
Pré-requisitos
FASES 0–5 concluídas. Ler docs/04-DESIGN-SYSTEM-UX.md §6 e docs/03-FLUXOS-E-CONTRATOS.md §6.
Contexto
Ao contrário da tela do visitante, aqui densidade é virtude: usuário recorrente, em desktop, que precisa de tabela grande, filtro fino e comparação. O orçamento de bundle não se aplica.
Tarefas
1. Base
Vite + React 19 + TS em web/admin. TanStack Router e TanStack Query. TanStack Table para grades virtualizadas. Leaflet para mapa (tiles OSM). Tokens de shared-ui.
Login OIDC com MFA obrigatório — este perfil vê fotos de todos os visitantes e a localização de todos os acessos; é o alvo mais valioso do sistema.
2. Auditoria de visitas — a tela mais importante
Tabela virtualizada com filtros persistidos na URL: período, condomínio, bloco, unidade, tipo, estado, dentro/fora do geofence, quem resolveu, e "unidade não cadastrada" (visitas-sombra: erro de digitação legítimo ou tentativa de enumeração — recorrência do mesmo dispositivo em unidades diferentes é padrão de varredura e deve gerar destaque).
Colunas: data/hora, tipo, visitante, unidade, estado, quem resolveu, duração, selo de geofence.
Detalhe da visita:
- Foto do visitante ou do pacote (URL assinada de 5 min)
- Mapa com o ponto do visitante e o raio do portão desenhado — é aqui que uma tentativa remota fica óbvia
- Timeline de
visit_attempts: quem foi notificado, por qual canal, entregue ou não, quem atendeu. É o que responde "por que ninguém atendeu?" — a pergunta mais comum do síndico - Player do recado, se houver
- Registro de exibição do aviso (
privacy_notices) com a versão do texto - Hash
sha256da mídia, para valor probatório
Exportação CSV e PDF do resultado filtrado, com marca d'água de quem exportou e quando.
Todo acesso a mídia gera linha em audit_log — inclusive o do admin. Isso não é opcional.
3. Gestão do condomínio
CRUD de condomínios, blocos, unidades, pessoas, vínculos, portarias e responsáveis pela abertura.
Importação CSV de unidades e moradores com dry-run obrigatório: mostra o que será criado, alterado e rejeitado, e só grava após confirmação. Importar uma base errada em cima de outra correta é dano difícil de reverter.
Convite de morador por link, com acompanhamento (enviado / aberto / aceito).
Configuração da portaria: posição no mapa, geofence_meters com o raio desenhado para calibragem visual, qr_version com botão de invalidar-e-reimprimir, e geração do PDF do QR pronto para impressão (fosco, 15×15cm, conforme 07-REQUISITOS-DE-CAMPO.md).
4. Reconciliação
Tela dedicada ao relatório de GET /admin/reconciliation:
- Moradores com
valid_untilvencido - Unidades sem nenhum dispositivo ativo — estas nunca atendem
- Dispositivos com push falhando há mais de 7 dias (token morto = desinstalou)
- Unidades com taxa de atendimento abaixo de 30% no mês
- Convites nunca aceitos
Cada item com ação direta: reenviar convite, marcar como saído, contatar.
Esta tela é o que mantém o produto vivo depois do primeiro mês — base desatualizada quebra tudo silenciosamente.
5. Configuração do app do morador
O que o síndico controla no app dos moradores: regra padrão de entrega por unidade, ring_order, quiet_hours do condomínio, e quais funcionalidades aparecem.
6. Planos e módulos
Visualização do plano do tenant e toggles de tenant_features: whatsapp_notifications, operator_queue, video_recording, access_control_hardware, recurring_authorizations.
Cada toggle mostra o efeito prático em uma frase — "Sem operador, visitas não atendidas viram recado em vídeo" — e registra a mudança em audit_log com autor.
7. SLOs e saúde
Dashboard de GET /admin/slo com as métricas de 00-VISAO-E-PRODUTO.md §6: latência QR→toque, taxa de atendimento, latência de entrega, abandono.
Modo degradado vigente exibido com destaque. O síndico precisa saber que o sistema está reduzido antes de receber a reclamação.
8. LGPD
Atendimento a titulares: busca por CPF ou telefone, exportação JSON, e eliminação — que apaga mídia e anonimiza nome preservando a linha da visita (06-LGPD-E-SEGURANCA.md §3).
Cadastro do encarregado (DPO), exibido no aviso de privacidade. Editor do texto do aviso com versionamento — mudar o texto cria nova versão, e as visitas antigas continuam referenciando a versão que foi realmente exibida.
Critérios de aceite
- Login exige MFA
- Tabela de auditoria fluida com 100 mil visitas (virtualização)
- Mapa mostra ponto do visitante e raio do portão
- Timeline de tentativas explica por que ninguém atendeu
- Acesso a mídia usa URL assinada e gera auditoria
- Importação CSV com dry-run funcional
- Relatório de reconciliação identifica unidades sem dispositivo ativo
- PDF do QR sai no tamanho e formato de
07-REQUISITOS-DE-CAMPO.md - Toggle de módulo registra autor em
audit_log - Eliminação LGPD preserva a linha anonimizada
- Acessibilidade: navegação completa por teclado, contraste ≥ 4.5:1
Não faça nesta fase
- Billing automatizado (v2)
- Gestão de tenants (multi-tenancy segue desativada)
- App do operador (FASE 7)