# Estado do projeto e handoff **Atualizado em:** 4 de agosto de 2026 **Fase:** Fases 1, 2, 3 e 4 concluídas **Ú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. - Pesquisa do catálogo por início/fim que exclui atribuições atuais, reservas bloqueantes e bloqueios administrativos. - Propagação do período consultado do catálogo para o formulário e consulta atualizável de equipamentos livres. - Cancelamento pelo próprio requisitante, com validação de estado, libertação transacional dos itens e auditoria. - Expiração de pré-reservas vencidas através do comando `reservations:expire` e job único agendado a cada cinco minutos. - Calendário mensal pessoal, isolado por utilizador e com navegação entre meses. - Área de aprovação protegida por perfil, com pesquisa por referência/requisitante. - Aprovação, rejeição e pedido de esclarecimentos transacionais, registados em `approval_actions` e `audit_logs`. - Aprovação revalida disponibilidade e estado operacional do ativo antes de promover itens `held` para `reserved`. - Notificações assíncronas por email e base de dados para submissões, decisões, esclarecimentos e substituições. - Caixa interna de notificações, contador de não lidas, marcação individual/coletiva e isolamento por utilizador. - Resposta auditada do requisitante a esclarecimentos, com regresso a `pending_approval` e novo prazo de 48 horas. - Substituição de equipamento apenas por ativo livre da mesma categoria, mantendo a pré-reserva e todo o histórico. - Fila de aprovação com filtros por referência, requisitante, categoria e período, incluindo histórico de ações. ## 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. - Entrega e devolução têm tabelas preparadas, mas ainda não possuem ações ou interface. - As notificações estão implementadas com Mailpit em desenvolvimento; falta validar SMTP institucional antes do piloto. - 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. - 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. ## Próxima tarefa recomendada Implementar a **Fase 5 — entrega e devolução**: 1. abrir `app/Integrations/SnipeIt/SnipeItClient.php` e acrescentar checkout/check-in com o token operacional separado; 2. criar `app/Domain/Handovers/Services/HandoverService.php` com entrega e devolução transacionais; 3. criar área do operador para reservas do dia, pesquisa por referência/utilizador e confirmação do estado físico; 4. tratar falhas parciais da API Snipe-IT sem declarar entrega/devolução concluída; 5. implementar incidentes, atrasos e bloqueios associados a dano; 6. testar API simulada, autorização, idempotência e auditoria; 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: 111 ficheiros sem desvios; - PHPStan/Larastan nível 7: 84 ficheiros, zero erros; - Pest: 70 testes passaram, 340 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, 2308 módulos cliente e 97 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; - 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 de `localhost` continua impedida por uma política administrativa temporariamente indisponível; aprovações, esclarecimentos e notificações foram validados por testes 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.