Files
Projeto-Portaria/prompts/FASE-6-painel-admin.md

107 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 05 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 `sha256` da 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_until` vencido
- **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)