prompt inicial do projeto

This commit is contained in:
2026-07-22 15:55:55 -03:00
commit 6fb920d333
19 changed files with 2937 additions and 0 deletions

View File

@@ -0,0 +1,106 @@
# 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**, e quem resolveu.
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)