Files
reservas/CHANGELOG.md
João Miranda fb04d71a8d
Some checks failed
tests / ci (push) Has been cancelled
first commit
2026-10-27 11:01:11 +00:00

11 KiB

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.
  • Endpoint /requisicoes/verificar-disponibilidade-semanal para verificar disponibilidade de equipamentos baseado em slots semanais para reservas recorrentes.
  • Botão "Verificar equipamentos livres" visível quando a repetição semanal está ativa, permitindo filtrar o catálogo pela próxima ocorrência semanal.

Alterado

  • Validação de formulário de requisição: erros de validação agora aparecem individualmente por baixo de cada campo em vez de num toast/alert genérico.
  • Removido listener global de erros do Inertia que interferia com o fluxo normal de validação.
  • Adicionado preserveState: true e preserveScroll: true aos POSTs do formulário para manter o estado após erros de validação.
  • Modal de detalhes do dia nos calendários pessoal e global, mostrando todas as requisições de um dia com estado, horário, equipamentos e requisitante (no calendário global).
  • Fuso horário da aplicação alterado de UTC para Europe/Lisbon para garantir consistência com o PHP e evitar discrepâncias de horário entre frontend e backend.
  • Botão "Verificar equipamentos livres" no formulário de requisição quando a repetição semanal está ativa, permitindo filtrar o catálogo pela próxima ocorrência semanal.

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.