Files
reservas/docs/PROJECT_STATUS.md

76 lines
4.7 KiB
Markdown

# Estado do projeto e handoff
**Atualizado em:** 4 de agosto de 2026
**Fase:** Fases 1 e 2 concluídas; primeiro fluxo vertical da Fase 3 concluído
**Último agente:** Codex
## Resultado disponível
- Projeto oficial Laravel 13 React Starter Kit criado.
- Autenticação local via Fortify, recuperação de palavra-passe, verificação de email, 2FA e passkeys.
- Registo público desativado conforme o plano.
- Estrutura relacional de utilizadores, identidades externas, perfis e permissões.
- Cache local de ativos Snipe-IT.
- Modelo completo inicial para reservas, itens, aprovações, bloqueios, entrega/devolução, sincronizações e auditoria.
- Proteção PostgreSQL contra períodos sobrepostos para o mesmo equipamento através de `EXCLUDE USING gist` e intervalos `[início, fim)`.
- Serviço de disponibilidade que considera estado local, atribuição, reservas e bloqueios.
- Criação transacional de uma requisição pendente com vários equipamentos e registo de auditoria.
- Dashboard pessoal, catálogo com pesquisa/filtros, formulário de nova requisição e histórico.
- Docker Compose com Nginx, PHP-FPM, PostgreSQL, Redis, Node/Vite, filas, scheduler e Mailpit.
- Dados fictícios e duas contas locais para desenvolvimento.
- Cliente Snipe-IT autenticado com paginação, timeout, retry seletivo e validação de respostas.
- Sincronização convergente de ativos com histórico, hash de conteúdo, lock, job único e desativação apenas após execução completa.
- Comando `snipe:sync-assets`, execução horária e painel de diagnóstico exclusivo para administradores.
## Limites conhecidos
- A integração está implementada e testada contra respostas simuladas; falta configurar e validar URL, versão e token da instância institucional. Até lá, o catálogo utiliza dados fictícios do seeder.
- Microsoft Entra ID ainda não está implementado; as variáveis de ambiente já estão definidas.
- Aprovação, rejeição, entrega e devolução têm tabelas preparadas, mas ainda não possuem ações ou interface.
- As notificações e jobs de expiração ainda não foram implementados.
- As políticas de autorização finas ainda não foram ligadas às rotas; nesta fase todas as rotas funcionais exigem utilizador autenticado, verificado e ativo.
- A disponibilidade apresentada no catálogo ainda não recebe um período; a validação real ocorre ao submeter.
## Próxima tarefa recomendada
Completar a **Fase 3 — motor de reservas**:
1. abrir `app/Domain/Reservations/Services/AvailabilityService.php` e `ReservationService.php`;
2. acrescentar pesquisa do catálogo por período e apresentar disponibilidade real;
3. implementar cancelamento pelo requisitante com transição explícita e auditoria;
4. criar expiração automática de pré-reservas pendentes e libertação dos itens;
5. adicionar uma vista de calendário pessoal;
6. testar limites temporais, cancelamento, expiração e autorização;
7. atualizar este documento e o changelog.
## 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: 97 ficheiros sem desvios;
- PHPStan/Larastan nível 7: 75 ficheiros, zero erros;
- Pest: 53 testes passaram, 201 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, 2305 módulos cliente 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;
- 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;
- verificação visual no browser integrado: a inspeção controlada continua impedida por uma política administrativa temporariamente indisponível; o painel administrativo foi validado por teste Inertia, TypeScript e builds cliente/SSR.
## Decisões pendentes do contexto institucional
Estas decisões não bloqueiam o desenvolvimento com defaults seguros, mas devem ser confirmadas antes do piloto:
- versão e URL da instância Snipe-IT;
- categorias e estados requisitáveis;
- tenant, client ID e redirect URI do Entra ID;
- matriz final de aprovadores por categoria/departamento;
- duração máxima, antecedência e margens por categoria;
- domínio institucional e método de emissão TLS;
- SMTP institucional.