feat: complete administration and reporting

This commit is contained in:
2026-08-04 17:40:52 +01:00
parent d829f34580
commit 7a4ac48aaf
42 changed files with 2595 additions and 76 deletions

View File

@@ -1,7 +1,7 @@
# Estado do projeto e handoff
**Atualizado em:** 4 de agosto de 2026
**Fase:** Fases 1 a 5 concluídas; próxima entrega: Fase 6
**Fase:** Fases 1 a 6 concluídas; próxima entrega: Fase 7
**Último agente:** Codex
## Resultado disponível
@@ -40,6 +40,15 @@
- Associação persistente entre o utilizador do portal e o respetivo ID no Snipe-IT, confirmada durante uma entrega bem-sucedida.
- Tratamento explícito de falhas parciais: movimentos já aceites são preservados, a requisição passa a `incident` e a falha fica em `audit_logs` para reconciliação.
- Registo de falta, atraso e incidente; um incidente pode criar um bloqueio temporal do equipamento que entra imediatamente no motor de disponibilidade.
- Gestão administrativa de utilizadores com pesquisa, perfis múltiplos, estado ativo, departamento, ID Snipe-IT e reposição de palavra-passe.
- Proteção contra desativação da própria conta administrativa e contra remoção do último administrador ativo.
- Políticas de reserva editáveis para antecedência, duração, margem operacional, prazo de aprovação e limite de equipamentos.
- Margens temporais persistidas por item e garantidas pela restrição de exclusão PostgreSQL, sem reescrever reservas existentes quando a política muda.
- Calendário institucional global para aprovadores, operadores, administradores e auditores.
- Relatórios por período com totais, horas de utilização, incidentes, atrasos, estados, categorias, departamentos e equipamentos mais requisitados.
- Exportação CSV protegida contra formula injection e limitada a períodos de 366 dias.
- Consulta paginada e filtrável de `audit_logs`, apenas para administradores e auditores.
- Modelos editáveis de assunto/mensagem para os seis eventos de notificação, com variáveis validadas e auditoria das alterações.
## Limites conhecidos
@@ -49,36 +58,38 @@
- O calendário atual é a vista mensal pessoal do MVP; vistas diária, semanal, global e por equipamento/categoria/localização ficam para as áreas operacional e administrativa.
- O leitor operacional aceita scanners QR/código de barras que funcionem como teclado. A leitura direta pela câmara do navegador ainda não foi adicionada.
- Uma falha depois de o Snipe-IT confirmar um movimento e antes do commit local é uma transação distribuída ambígua; não existe retry automático de escritas. O operador deve reconciliar pelos registos Snipe-IT e `audit_logs` conforme o runbook.
- As exportações administrativas estão disponíveis em CSV; XLSX poderá ser acrescentado se o processo institucional o exigir.
## Próxima tarefa recomendada
Implementar a **Fase 6 — administração e relatórios**:
Implementar a **Fase 7 — hardening e entrada em produção**:
1. criar a área administrativa de utilizadores, perfis e associação ao ID Snipe-IT;
2. tornar configuráveis as políticas de antecedência, duração, margens, estados e categorias;
3. criar calendário global e relatórios de utilização, atrasos, incidentes e ativos mais requisitados;
4. adicionar exportação CSV/XLSX e filtros por período, categoria, departamento e estado;
5. criar consulta de auditoria apenas de leitura para o perfil `auditor`;
6. adicionar métricas operacionais e gestão de modelos de email;
7. cobrir autorização, exportações e agregações com testes e atualizar toda a documentação.
1. implementar Microsoft Entra ID/OIDC e associação segura a contas locais;
2. validar a integração contra o Snipe-IT institucional e configurar tokens reais de menor privilégio;
3. configurar SMTP institucional, domínio, HTTPS e gestão externa de segredos;
4. adicionar health checks, monitorização, alertas, backups e teste de restauro;
5. executar testes de segurança, concorrência, desempenho e end-to-end com equipamentos reais;
6. preparar formação, dados iniciais e piloto com um grupo reduzido;
7. corrigir resultados do piloto e preparar a disponibilização geral.
## Testes da última sessão
Validação concluída em 4 de agosto de 2026:
- `docker compose exec -T app composer test`: passou;
- Laravel Pint: 117 ficheiros sem desvios;
- PHPStan/Larastan nível 7: 89 ficheiros, zero erros;
- Pest: 79 testes passaram, 412 asserções e 2 testes de registo ignorados por a funcionalidade estar deliberadamente desativada;
- Laravel Pint: 132 ficheiros sem desvios;
- PHPStan/Larastan nível 7: 100 ficheiros, zero erros;
- Pest: 92 testes passaram, 522 asserções e 2 testes de registo ignorados por a funcionalidade estar deliberadamente desativada;
- TypeScript (`tsc --noEmit`): passou;
- ESLint: passou;
- Prettier: passou;
- Vite: builds cliente e SSR concluídos, 2309 módulos cliente e 98 módulos SSR transformados;
- Vite: builds cliente e SSR concluídos, 2314 módulos cliente e 103 módulos SSR transformados;
- PostgreSQL 17: `migrate:fresh --seed` concluído, incluindo extensão `btree_gist` e restrição de exclusão temporal;
- PostgreSQL 17: migration incremental do marcador `last_seen_sync_run_id` aplicada com sucesso;
- PostgreSQL 17: nenhuma migration pendente; comando de expiração executado e agendamentos horário/a cada cinco minutos confirmados;
- PostgreSQL 17: migration `notifications` aplicada com sucesso;
- PostgreSQL 17: migration `snipe_user_id` aplicada e fluxo operacional exercitado contra API simulada;
- PostgreSQL 17: migration de `portal_settings` e buffers temporais aplicada; restrição GiST recriada sobre o intervalo com margem;
- smoke test HTTP: `/login` respondeu com estado 200 através do Nginx;
- Vite em Docker: URL pública, HMR e CORS verificados em `localhost:5173`; corrigida a página em branco causada pela publicação anterior de `0.0.0.0:5173`;
- Inertia SSR: renderização do login validada através do serviço `node`; corrigido o componente de mensagens flash que usava `usePage()` fora do contexto Inertia;