107 lines
5.4 KiB
Markdown
107 lines
5.4 KiB
Markdown
# 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 `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)
|