110 lines
11 KiB
Markdown
110 lines
11 KiB
Markdown
# 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.
|