# Registo de alterações Todas as alterações materiais são registadas neste ficheiro. O formato segue Keep a Changelog sem exigir versionamento formal durante o desenvolvimento inicial. ## Não publicado ### Adicionado - Fundação Laravel 13 com React 19, Inertia 3, TypeScript, Tailwind 4 e Fortify. - Infraestrutura Docker Compose para Nginx, PHP-FPM, PostgreSQL, Redis, Vite, filas, scheduler e Mailpit. - Modelos e migrations de identidades, perfis, permissões, ativos, reservas, aprovações, bloqueios, entregas, sincronizações e auditoria. - Restrição PostgreSQL para impedir reservas bloqueantes sobrepostas. - Serviços transacionais de disponibilidade e criação de pré-reserva. - Dashboard, catálogo filtrável, formulário de requisição multi-equipamento e histórico pessoal. - Seeders com perfis, ativos fictícios e contas de demonstração. - Documentação de arquitetura, requisitos, decisões, operação, estado e handoff. - Cliente de leitura Snipe-IT com autenticação Bearer, paginação, timeout, retries seletivos, DTOs e mapper defensivo. - Sincronização horária e manual de equipamentos, job único, lock distribuído, histórico de execuções e desativação segura de ausentes. - Área administrativa de diagnóstico Snipe-IT com teste de conectividade, métricas do cache e histórico de sincronizações. - Autorização administrativa através de Gate e navegação condicional por perfil. - Pesquisa de disponibilidade por período no catálogo e formulário, incluindo reservas, atribuições atuais e bloqueios administrativos. - Cancelamento pelo requisitante com validação da máquina de estados, libertação transacional dos equipamentos e auditoria. - Expiração automática e manual de pré-reservas, com job único agendado a cada cinco minutos e comando `reservations:expire`. - Calendário mensal pessoal com isolamento por utilizador e navegação entre meses. - Núcleo de aprovações com fila pesquisável, Gate por perfil, aprovação, rejeição e pedido de esclarecimentos. - Revalidação transacional da disponibilidade antes da aprovação, promoção de itens para `reserved` e histórico em `approval_actions`/auditoria. - Notificações assíncronas por email e caixa interna para submissões, decisões, esclarecimentos e substituições. - Centro de notificações isolado por utilizador, com contador e marcação de leitura. - Resposta auditada a pedidos de esclarecimento e renovação do prazo de decisão. - Substituição controlada por equipamento disponível da mesma categoria, preservando o item original no histórico. - Filtros da fila de aprovação por categoria/período e histórico de ações apresentado na interface. - Cliente operacional Snipe-IT com token separado, checkout para utilizador, check-in para localização habitual e validação defensiva de respostas. - Domínio `Operations` com registos de entrega/devolução, condição física, operador, destinatário e resposta externa. - Área diária do operador com pesquisa/leitura por scanner, preparação, entrega, devolução, conclusão, faltas, atrasos e incidentes. - Associação do utilizador local ao ID Snipe-IT confirmada durante a entrega. - Bloqueios temporais de equipamento criados a partir de incidentes e considerados pelo motor de disponibilidade. - Tratamento e auditoria de falhas parciais em movimentos com vários equipamentos. - Gestão administrativa de utilizadores, perfis, estado, departamento, associação Snipe-IT e palavra-passe. - Regras de reserva editáveis com antecedência, duração, margem, prazo de aprovação e limite de equipamentos. - Buffers temporais por item e restrição GiST atualizada para garantir margens também sob concorrência. - Calendário global com identificação do requisitante e autorização por perfil. - Relatórios operacionais, métricas por dimensão e exportação CSV detalhada. - Consulta de auditoria filtrável e paginada para administradores e auditores. - Modelos editáveis para email e notificações internas com variáveis funcionais. - Login Microsoft Entra/OIDC de tenant único com descoberta dinâmica, PKCE, `state`, `nonce` e validação RS256 do `id_token`. - Associação e remoção explícitas da identidade Microsoft nas definições de segurança, com histórico de login e auditoria. - Endpoints públicos de liveness/readiness sem divulgação de detalhes internos e health check do Nginx. - Scripts operacionais para backup PostgreSQL custom, checksum e teste de restauro numa base temporária isolada. - Checklist versionado de entrada em produção com evidências e critérios de go/no-go. ### Alterado - Nome, identidade visual e idioma orientados ao Portal de Reservas. - Configuração padrão alterada para PostgreSQL, Redis, SMTP/Mailpit e Europa/Lisboa. - Configuração de desenvolvimento Vite passa a publicar módulos e HMR em `localhost:5173` e a aceitar explicitamente a origem do portal em `localhost:8000`, corrigindo a página em branco em Docker. - As mensagens flash globais recebem agora as propriedades diretamente de `withApp`, evitando o uso de `usePage()` fora do contexto Inertia que interrompia o arranque do React. - SSR de desenvolvimento ligado internamente de PHP para o serviço `node`, com o hostname Docker autorizado no Vite. - Catálogo sem período passa a distinguir equipamentos apenas requisitáveis; quando um período é selecionado, apresenta exclusivamente equipamentos livres nesse intervalo. - Máquina de estados passa a admitir incidentes durante preparação/utilização, atrasos e resolução por devolução. - Formulário de requisição apresenta as políticas atuais e o serviço de domínio volta a validá-las antes da transação. - Notificações passam a obter assunto e mensagem dos modelos administrativos, preservando defaults seguros. - Checkout Snipe-IT passa a consultar o estado remoto imediatamente antes do movimento e recusa ativos já atribuídos sem enviar escrita. - Check-in Snipe-IT passa a exigir checkout comprovado pelo portal para o mesmo requisitante e atribuição remota atual ao destinatário esperado. - Seeder de desenvolvimento passa a ser idempotente, limitado a `local`/`testing` e a não criar ativos fictícios quando existe configuração ou cache Snipe-IT. ### Segurança - Registo público desativado. - Variáveis para tokens Snipe-IT separados e credenciais Entra ID documentadas sem valores. - A associação Microsoft exige autenticação local e confirmação recente da palavra-passe; coincidências de email nunca associam contas automaticamente. - Tokens OIDC não são persistidos ou registados e o redirect URI tem de usar HTTPS em produção. - Rotas operacionais protegidas por Gate e verificação de perfil também no serviço de domínio; escritas externas não fazem retry automático. - Exportação CSV neutraliza células iniciadas por caracteres de fórmula e limita cada relatório a 366 dias. - Gestão administrativa impede auto-desativação e garante pelo menos um administrador ativo. - Instância Snipe-IT declarada como produção imutável: são proibidas criações, edições, eliminações e testes de escrita; apenas checkout/check-in operacionais permanecem permitidos. ### Verificado - Migrations e seeders executados em PostgreSQL 17 real. - Suite backend: Pint em 141 ficheiros, PHPStan nível 7 em 107 ficheiros e 103 testes Pest (585 asserções; 2 testes de registo deliberadamente ignorados). - Frontend: TypeScript, ESLint, Prettier e build Vite de produção. - Stack Docker operacional e endpoint de login acessível através do Nginx. - Renderização SSR real do login validada, incluindo o conteúdo “Entrar no Portal de Reservas”. - API Snipe-IT simulada em testes: paginação, headers, retry, erro em HTTP 200, falha parcial, idempotência e desativação de ausentes. - Migration `last_seen_sync_run_id` aplicada em PostgreSQL 17. - Comando de expiração executado em PostgreSQL e agendamento a cada cinco minutos confirmado. - Builds Vite cliente e SSR com as páginas de disponibilidade, cancelamento e calendário concluídos. - Migration da caixa interna de notificações aplicada em PostgreSQL 17. - Fluxo operacional: autorização, checkout/check-in, entrega parcial, auditoria, incidentes e bloqueios validados com API Snipe-IT simulada. - Administração: utilizadores, políticas, buffers, calendário global, relatórios, CSV, auditoria e modelos de notificação validados por testes funcionais. - Autenticação Microsoft simulada criptograficamente: associação explícita, login, `state`, PKCE, tenant e recusa de autoassociação validados. - Backup real criado e restaurado em PostgreSQL 17 temporário, com 12 migrations confirmadas; liveness/readiness validados através do Nginx. - Login local exercitado de ponta a ponta no browser após deteção e reposição documentada de uma base de desenvolvimento migrada mas sem seeders. - Suite backend após as salvaguardas de produção: 108 testes, 609 asserções, Pint e PHPStan sem erros. - Tokens Snipe-IT distintos validados apenas com `GET`; sincronização real de leitura processou 2367 ativos para o cache local sem escrita remota. - TypeScript, ESLint, Prettier, build Vite, Composer Audit, migrations, liveness, readiness e login HTTP validados novamente. - Recuperação do login administrativo validada de ponta a ponta no browser; 2 utilizadores e 5 perfis repostos sem alterar os 2367 ativos sincronizados. - Suite após o hardening do seeder: 110 testes, 617 asserções, 142 ficheiros Pint e PHPStan sem erros.