commit5
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-10-30 10:55:18 +02:00
parent 0235c7609e
commit 48347e2d3a
161 changed files with 11814 additions and 265 deletions
+104
View File
@@ -1,5 +1,109 @@
# Desenvolvimento do SGC
## Administração, dois administradores e perfis da empresa — 30 de Outubro de 2026
Orientação do proprietário: Administração deve incluir parametrização; dois administradores serão definidos na configuração/entrega e poderão criar utilizadores e outorgar perfis/permissões escolhidos pela empresa. Substituir regras/perfis de desenvolvimento, conservando manutenção TEMPO. Implementado menu **Administração → Parametrização da aplicação**, `/administracao/parametrizacao`, com perfis de nomes próprios, combinação de permissões funcionais, múltiplos perfis por utilizador, criação de contas nominativas e atribuição/revogação justificada. Configuração versionada, isolada por empresa e auditada; alterações concorrentes antigas recusadas. Uma alteração não pode reduzir o conjunto a menos de dois administradores permanentes, incluindo por edição de perfil ou expiração de uma atribuição.
Novas empresas: a conta que configura a empresa e uma segunda pessoa identificada formam os dois administradores iniciais, com contas distintas e palavras-passe normais. Limites de aprovação e aplicação sobre valor com/sem imposto são expressamente preenchidos pela empresa, em valores decimais MZN convertidos exactamente para centavos; não entram como regras provisórias. O seeder normal deixa de criar `Test User`/`test@example.com` ou outra conta de exemplo. Os dois administradores iniciais recebem um perfil configurável da empresa. O campo antigo de perfil fica com marcador `configured`, sem autoridade própria; a validação usa as atribuições efectivas. O marcador não é um perfil concedível nem uma permissão funcional. Contas preparadas antes da activação não recebem poderes implícitos de desenvolvimento.
Empresas existentes: configuração em preparação conserva o funcionamento anterior até activação explícita, após definir as regras e associar pelo menos dois administradores. A página explica o efeito sobre utilizadores sem atribuições. Após activação, os perfis antigos deixam de autorizar; nomes/permissões dos perfis da empresa e respectivas vigências são a fonte efectiva. Não há comando de retorno silencioso ao modo anterior. Não foram apagadas contas, decisões, documentos ou referências históricas. Os processos já submetidos conservam as regras monetárias registadas; novos limites aplicam-se a novas submissões.
Integração transversal: verificações de perfil em controladores, políticas e serviços passam pela resolução comum `OrganizationAccess`/`User::hasFunctions`, incluindo revalidação transaccional de operadores, elegibilidade de aprovação, leitura por departamento, preparação/conferência, stock, equipamentos, bancos, facturas, pagamentos e relatórios. Menus e botões usam as permissões efectivas, incluindo múltiplos perfis; preparar requisições exige a respectiva função no modo configurado. Novas snapshots de qualificação/admissão/recomendação registam a designação do perfil da empresa; snapshots anteriores permanecem intactas. As permissões específicas/identidade de pessoa do núcleo financeiro comum continuam a ser conferidas pelo núcleo, com a autorização configurada como requisito adicional; não foram inventadas identidades financeiras ou concessões desse núcleo.
Manutenção TEMPO: implementada como atribuição a conta nominativa existente da empresa, autenticação normal, perfis sem administração, expiração obrigatória, revogação e auditoria das consultas. O modo temporário é somente diagnóstico/consulta; comandos de negócio e administração de acessos são recusados. Não existe rota secreta, conta global, palavra-passe universal ou autenticação contornada. O prazo termina no servidor; editar um perfil de manutenção para o transformar em administrador também é recusado. Esta é a concretização técnica do objectivo de manutenção referido como «backdoor», não uma confirmação de que foi criada uma entrada oculta. A entrega de credenciais de pessoas reais permanece no fluxo da empresa, sem palavras-passe nesta conversa.
Instalação local: somente migração aditiva **000027**, com três tabelas de configuração inicialmente vazias, depois de backup fresco/restauro descartável por hashes iguais e preservação das **84 tabelas** anteriores. Avaliação 8005 disponível, ainda sem activação da nova configuração, contas criadas ou permissões alteradas. As identidades dos dois administradores da entrega serão introduzidas na configuração; não foram inferidas de perfis sintéticos. A instalação habitual/domínio não foi migrada nem publicada. Provas e resultados finais em `proofs/organization-configuration.json`, `organization-install.json`, `organization-pg.json`, `organization-access-http.json` e `menu-code-contract.json`.
Verificação final: suíte integral com **603 testes: 601 aprovados, dois ignorados já existentes e 5 157 asserções**, sem falhas; ensaio próprio de parametrização em PostgreSQL descartável com **13 testes/96 asserções**, incluindo criação dos dois administradores, perfis efectivos, ausência de direitos implícitos antes da activação, mínimo de dois administradores, revogação/expiração da manutenção, isolamento, concorrência, rollback de auditoria, regras monetárias exactas e seeder sem contas sintéticas. A base descartável foi removida, sem alteração de privilégios do role reutilizado. PHPStan sem erros, TypeScript, lint/formatação dirigidos, Pint, build e `git diff --check` aprovados. Runtime: 18 ficheiros conferidos por SHA-256; pacotes fixados preservados. HTTP em 8005 conferiu os seis perfis de avaliação e a parametrização acessível apenas ao proprietário, sem retornar passwords e sem comandos de configuração. Menu: 107 entradas na matriz de compatibilidade e casos adicionais de permissões combinadas; catálogo: 23 páginas. Visual/impressão continuam sem execução nesta entrega.
Âmbito e evolução: esta entrega introduz a gestão efectiva de perfis por empresa e a configuração dos limites existentes. O catálogo inicial agrupa as funções operacionais actuais; o editor universal de etapas/condições, a decomposição das permissões por operação e a gestão das associações específicas do núcleo financeiro comum continuam incrementos próprios. Portanto não se declara toda a aplicação integralmente parametrizável. Fluxos de independência, integridade, histórico e isolamento continuam activos. Visual/impressão manual pendentes pela limitação do controlo de URL Windows já registada. A prioridade seguinte é ampliar a parametrização dos fluxos e das permissões mantendo esta fonte comum, em vez de voltar a listas de perfis dispersas.
## Instrução permanente: aplicação integralmente parametrizável — 30 de Outubro de 2026
O proprietário determinou que os utilizadores possam definir quem é quem, quando usar cada função/regra e como fazer as associações em toda a aplicação. Registado em `AGENTS.md` e na continuidade como requisito transversal dos módulos existentes e futuros. A configuração deve permitir funções/cargos e designações próprias, capacidades/permissões, pessoas/equipas/unidades, múltiplas responsabilidades, delegações/substituições, encaminhamentos, etapas, prazos, condições/limites, vigência e ligações a processos/documentos/fornecedores/relatórios, pela interface e sem alterações de código por cliente. A competência de configurar também deve poder ser atribuída/delegada de forma autorizada, evitando dependência permanente de um único perfil fixo.
Conferência inicial do estado actual: `PurchasingRole` contém seis perfis fixos; `CompanyController` permite cadastrar departamentos, centros e pessoas escolhendo esse enum e restringe a configuração ao perfil Admin; `SupplierEvaluationWorkflow::ROLES` e os fluxos de medidas/contraditório reutilizam uma lista fixa de quatro perfis; os menus também declaram listas de perfis. A requisição já regista parâmetros empresariais numa snapshot, uma prática a preservar e generalizar. Portanto, a aplicação ainda não satisfaz a parametrização integral; a existência de alguns parâmetros de empresa não equivale ao requisito transversal agora definido.
Sequência de implementação actualizada: estabelecer catálogo comum de capacidades, funções/perfis configuráveis por empresa e associações de pessoas/unidades com vigência; fornecer gestão na interface e migrar os perfis actuais como configuração inicial compatível. Depois substituir gradualmente as verificações organizacionais fixas nos controladores/serviços, menus, formulários e relatórios pela mesma resolução de capacidades/âmbito. Parametrizar condições e encaminhamentos com versões, publicação/activação validada e simulação do efeito sobre processos novos/em curso. Preservar as versões aplicadas aos processos e as decisões históricas, validar falta de responsáveis, incompatibilidades e dependências, e manter isolamento, autorização e auditoria efectivos. Não remover verificações dispersas antes de existir a substituição comum testada.
Esta passagem regista a decisão e o levantamento inicial; não altera permissões, contas, processos, schema ou dados. Não declara já disponível um editor de perfis/fluxos. A base de parametrização passa à frente da extensão isolada do consolidado de contraditórios indicado no registo anterior; essas funcionalidades permanecem no âmbito do produto. Critério de entrega: a organização consegue configurar os seus intervenientes, responsabilidades, condições e associações pela interface, com aplicação coerente no servidor e nos percursos/relatórios, sem intervenção do programador para essas adaptações organizacionais.
## Contraditório documentado do fornecedor — 30 de Outubro de 2026
Na revisão aprovada da avaliação, implementado o registo pela equipa dos documentos/argumentos recebidos: assunto, data de recepção, referência da origem e transcrição dos argumentos. Rascunhos recuperáveis, gravação idempotente e versionada, submissão para análise, devolução para completar e conclusão por pessoa independente de todos os editores/submetentes do registo. Recepção futura ou dados incompletos impedem a submissão, sem impedir guardar o rascunho. A conclusão fundamentada pode acolher, acolher parcialmente ou não acolher os argumentos; acolhimento exige seguimento documentado. Referência da resposta preparada é opcional. Não há envio automático, comunicação externa ou autenticação do fornecedor neste incremento; a equipa regista o recebido e prepara a comunicação.
Empresa/departamento, perfil recarregado e conflitos de fornecedor/processo são conferidos no servidor. Cada contraditório pertence à revisão exacta. Conteúdo anterior/posterior e decisões ficam no histórico próprio paginado, com autores e datas. Conclusões finais imutáveis no modelo e por trigger SQL; não há apagamento. O relatório individual inclui o contraditório como acompanhamento datado, sem reescrever a avaliação aprovada. Argumentos acolhidos não rectificam automaticamente avaliações, medidas, elegibilidade ou saldos; eventual rectificação usa o mecanismo existente de nova revisão. Fontes documentais são referências textuais; upload de anexos e prova de comunicação não estão incluídos.
Verificações: **39 testes/505 asserções**, incluindo 11 novos do contraditório e regressões das avaliações, medidas e consolidado. Cobertos dados incompletos/futuros, idempotência/canonicalização, autores/editores impedidos de concluir, devolução/correcção, seguimento obrigatório, preservação das versões, concorrência, perfis/empresa/departamento, conflitos novos, metadados forjados, imutabilidade SQL e rollback de falha da auditoria. PHPStan sem erros, tipos, lint/formatação dirigidos, Pint, build e `git diff --check` aprovados. HTTP com dois perfis existentes na base PostgreSQL conferiu o ciclo completo e o relatório; teste SQL recusou UPDATE/DELETE da conclusão final em transacções revertidas. Menu permanece com 106 entradas/seis perfis. Provas `proofs/supplier-responses-http.json`, `supplier-responses-pg.json`, `supplier-responses-install.json` e `supplier-responses.json`.
Aplicada apenas a migração aditiva **000026** na avaliação persistente 8005, com backup fresco e restauro descartável por hashes iguais, preservando **83 tabelas** anteriores e deixando a nova tabela inicialmente vazia. Exemplo fictício CTR-1 concluído na AVF-1, com argumentos parcialmente acolhidos, sem modificar essa avaliação. Nenhuma conta/concessão ou migração adicional; sem instalação habitual ou publicação no domínio. Visual/impressão manual continuam pendentes pela limitação do controlo de URL Windows anteriormente registada; sem nova aceitação visual presumida. Este incremento conclui o registo do contraditório proposto abaixo. Próxima evolução: consulta consolidada dos contraditórios por fornecedor/estado/recepção/conclusão, com ligação aos relatórios; anexos e registo da comunicação exigem o seu incremento próprio.
## Consulta consolidada e CSV das medidas — 30 de Outubro de 2026
Entregue `/relatorios/medidas-fornecedores`, em Relatórios → Medidas de melhoria e por atalho nas avaliações. Filtros combináveis por fornecedor, responsável, estado, título e intervalo de prazo, mais «só prazos ultrapassados». Inclui medidas de revisões anteriores: uma rectificação da avaliação não faz desaparecer uma medida pendente. Resumo calculado sobre todos os resultados autorizados dos filtros, paginação de 25 medidas, ligações directas à medida na avaliação e no relatório individual e impressão explicitamente da página visível.
Exportação `/relatorios/medidas-fornecedores.csv` inclui todos os resultados dos mesmos filtros, independentemente da página, em lotes de 200. Conserva título/objectivo, fornecedor preservado na avaliação, revisão, responsável, prazo, estado, resultado/evidência, última conferência, versão e ligações. Textos que podem ser interpretados como fórmula são protegidos. Inclui filtros e data de referência; a flag de atraso exclui medidas encerradas e prazos da própria data de referência, sem inferir atraso histórico à data do encerramento. Sem cálculo de elegibilidade ou efeitos financeiros.
Consulta e CSV reutilizam o âmbito da avaliação por empresa/departamento e recarregam o perfil no servidor; opções de fornecedor/responsável derivam apenas de medidas visíveis. Leituras PostgreSQL usam transacção própria repeatable-read/read-only; data de referência única por leitura. Consulta conserva histórico Inertia cifrado e resposta privada sem cache. A listagem envia apenas campos do relatório, sem chaves de idempotência ou hashes internos. Nenhuma migração, nova conta/concessão ou comando de negócio; a avaliação local 8005 já disponibiliza o código e os assets.
Verificações: **36 testes/542 asserções**, incluindo seis testes novos do consolidado e regressões de avaliações, medidas e relatórios. Exportação com 207 medidas conferida em dois lotes, filtros, limites de datas, versões anteriores, estados/atrasos, perfis actuais, isolamento por empresa/departamento, opções não expostas, texto CSV seguro e ausência de escritas sobre avaliação/fornecedor/auditoria. PHPStan sem erros, TypeScript, lint/formatação dirigidos, Pint, build e `git diff --check` aprovados. Prova HTTP na base de avaliação com seis perfis: quatro leitores autorizados e dois recusados; filtros/resumo/CSV e ligações conferidos. Contrato do menu actualizado para **106 entradas/seis perfis**; catálogo de avaliação para **22 páginas**, com acesso, CSRF e regresso sem credenciais conferidos. Provas em `proofs/supplier-improvement-report-http.json`, `supplier-improvement-report.json`, `menu-code-contract.json` e `evaluation-access.json`.
Visual/impressão manual continuam pendentes desde o encerramento do controlo da ferramenta por não conseguir confirmar o URL Windows; não se apresenta HTTP como prova visual. Não houve publicação no domínio. Esta entrega conclui a consulta consolidada proposta abaixo. Próximo âmbito funcional: registo do contraditório do fornecedor, com referências documentais e resposta fundamentada, preservando a avaliação original; a política quantitativa permanece por implementar.
## Medidas de melhoria das avaliações — 30 de Outubro de 2026
Implementado o acompanhamento na própria avaliação e no relatório: medidas associadas à revisão aprovada, objectivo, responsável interno autorizado e prazo; progresso e referência de evidência registados pelo responsável; pedido de encerramento, devolução/correcção e encerramento independente fundamentado. Autor, editores do plano e todos os responsáveis anteriores ficam excluídos do encerramento. Transferências de responsabilidade e alterações do prazo exigem justificação; o histórico conserva os valores anteriores e posteriores. O prazo ultrapassado é um aviso, sem encerramento ou penalização automática. Não há pontuação, suspensão, alteração de elegibilidade ou operação financeira.
Reutilizados os quatro perfis existentes autorizados a consultar fornecedores, isolamento de empresa/departamento, recarga do perfil e conflitos de fornecedor/processo. Operações versionadas, criação idempotente e auditoria atómica. Medidas encerradas imutáveis no modelo e por trigger SQL; não existe apagamento. Acompanhamento aparece como anexo datado no relatório, sem alterar o conteúdo da avaliação aprovada. As medidas pertencem à revisão exacta; não são copiadas ou encerradas automaticamente ao rectificar a avaliação. Histórico paginado próprio, com decisões e alterações justificadas.
Verificações: **72 testes/768 asserções**, abrangendo medidas, avaliações, conflitos e relatórios; PHPStan sem erros, TypeScript, lint/formatação dirigidos, Pint e build aprovados. Ensaio HTTP com três perfis na avaliação real conferiu repetição idempotente, evidência em falta recusada, auto-encerramento/encerramento pelo autor recusados, devolução, reagendamento, versão antiga recusada, correcção, encerramento independente e relatório. PostgreSQL recusou UPDATE/DELETE da medida encerrada em transacções revertidas, preservando a linha. Provas em `proofs/supplier-improvements-http.json`, `supplier-improvements-pg.json` e `supplier-improvements-install.json`.
Aplicada somente a migração aditiva **000025** na avaliação persistente 8005, com backup fresco/restauro descartável e hashes iguais, preservando **82 tabelas** anteriores; nova tabela inicialmente vazia. O exemplo QA MM-1 ficou encerrado na AVF-1, sem modificar essa avaliação. Sem contas/concessões novas, migração habitual ou publicação no domínio. A tentativa de conferência visual foi encerrada pela ferramenta por não conseguir confirmar o URL do navegador Windows com confiança suficiente para aplicar a política; não foram tentadas vias alternativas de controlo. Visual e impressão continuam pendentes, sem invalidar os ensaios HTTP nem equivaler a falha do portal. O estado anterior de formatação global fora do incremento permanece documentado abaixo.
Este incremento conclui o acompanhamento proposto no registo anterior. Próximo passo funcional: visão consolidada de medidas por fornecedor, responsável, prazo e estado, ligada aos relatórios, reutilizando estes registos; contraditório do fornecedor e política quantitativa continuam por desenvolver.
## Avaliações qualitativas de fornecedores — 30 de Outubro de 2026
Implementado `/fornecedores/avaliacoes`: criação e recuperação de rascunhos, filtros, âmbito/período, ordens autorizadas, critérios com justificação/evidência, ocorrências críticas e conclusão. Ciclo rascunho → revisão → devolução/correcção ou aprovação independente. Todos os editores e o submetente ficam excluídos da aprovação dessa revisão; perfis e conflitos são reconferidos no servidor. Empresa e departamento restringem as consultas. Reutilizados os quatro perfis existentes de fornecedores, sem contas ou concessões novas. O departamento deriva das ordens seleccionadas; avaliações de vários departamentos ficam no âmbito empresarial.
Gravação idempotente, versões contra sobreposição concorrente e auditoria atómica com conteúdo anterior/posterior. Aprovações imutáveis também por trigger SQL; rectificação cria revisão ligada, conservando o relatório aprovado. Relatório imprimível, estado explícito e histórico paginado. A proposta quantitativa continua apenas proposta: sem pesos, pontuação/classificação automática ou alteração da elegibilidade. Medidas de melhoria e contraditório do fornecedor continuam para incremento próprio.
Verificações: 61 testes/655 asserções (avaliações, conflitos e relatórios), PHPStan sem erros, TypeScript, Pint dirigido, lint dos novos ecrãs e build aprovados. Contrato do menu: 102 entradas/seis perfis; acesso: 21 páginas/seis perfis. HTTP no PostgreSQL local conferiu criação, submissão, auto-aprovação recusada, devolução, correcção, versão desactualizada recusada, aprovação independente, relatório e revisão posterior. Provas em `proofs/supplier-evaluations-http.json`, `supplier-evaluations-install.json` e `supplier-evaluations-pg.json`. Ensaio retomado após corrigir expectativas do script sobre redireccionamentos Inertia, conservando o mesmo exemplo QA e o histórico.
Aplicada **apenas** a migração aditiva 000024 na avaliação 8005, após backup fresco e restauro descartável com conteúdos/hashes iguais. Preservadas as 81 tabelas anteriores; nova tabela inicialmente vazia. Sem contas, concessões ou migrações adicionais. AVF-1 é exemplo fictício aprovado; AVF-2 é rascunho de rectificação; nenhuma operação financeira. Instalação habitual e domínio não migrados/publicados. Visual/impressão manual por executar. O `npm run check` global acusa formatação anterior fora deste incremento; não foi declarado aprovado nem foram reformatados ficheiros alheios por arrasto.
Esta entrega substitui a indicação abaixo de que a avaliação era apenas proposta. Próximo incremento: medidas de melhoria com responsáveis, prazos, evidências e encerramento independente, antes de converter a proposta quantitativa em política operacional.
## Entrada sem credenciais ao abrir links da avaliação — 30 de Outubro de 2026
O utilizador encontrou o formulário de credenciais ao abrir directamente `/relatorios` sem sessão. Corrigido o encaminhamento dos hóspedes no host local de avaliação: o link protegido e `/login` conduzem a `/avaliar`; após escolher o perfil existente, a entrada preserva o destino e os filtros antes de regenerar a sessão. A navegação de regresso só aceita caminhos locais ou URLs da mesma origem/porta; destinos externos, esquemas estranhos, caracteres de controlo e ciclos de login são recusados em favor do painel. As guardas de base/role QA, CSRF, perfis permitidos e isolamento foram preservadas. A instalação habitual continua a usar a autenticação própria.
Incluídos Relatórios no catálogo da avaliação (21 páginas) e testes de navegação/âmbito. Aprovações: 23 testes Feature/172 asserções (15 casos de navegação e oito dos relatórios), PHPStan e Pint dirigidos; prova HTTP repetível na avaliação real com 21 páginas, seis perfis, regresso ao relatório com filtros, CSRF/identificadores inválidos recusados e logout. `scripts/evaluation-access-check.mjs` e `docs/proofs/evaluation-access.json` actualizados. O ensaio usou uma sessão de teste própria, sem encerrar a sessão do navegador do utilizador e sem comandos de negócio. Sem redefinição de credenciais ou instalação no domínio.
## Compatibilização do menu e fluxo até aos relatórios — 30 de Outubro de 2026
Pedido do proprietário: continuar a aplicação, ligar funções do menu ao código necessário e optimizar os percursos até à geração de relatórios. Reutilizados os controllers, políticas, processo e relatório de conferência existentes. Inventário por grupo e lacunas concretas em `menus-benchmark-20261029.md`; prova repetível de 102 entradas/6 perfis em `scripts/menu-code-check.mjs` e `proofs/menu-code-contract.json`. A avaliação de fornecedores foi identificada como proposta de UI, não processo persistente; mantém-se explicitamente por desenvolver.
Implementação: grupo «Relatórios» com `/relatorios`, controller próprio e página Inertia, com filtro por número, estado da requisição, intervalo de criação e departamento autorizado; resumo de todos os resultados e paginação de 25 linhas. Exportação CSV em `/relatorios/compras.csv` aplica os mesmos filtros e âmbito, percorre lotes de 200, inclui metadados/filtros e valores monetários em centavos inteiros sem conversão para float. Textos potencialmente interpretáveis como fórmula são protegidos. O valor estimado não é apresentado como adjudicação, dívida ou pagamento. Leituras PostgreSQL usam snapshot repeatable-read/read-only, conforme o relatório existente; essa cláusula não equivale a novo ensaio de concorrência PostgreSQL nesta passagem.
Percurso entregue: menu → central/filtros → requisição e acompanhamento do processo → relatório de conferência/impressão já existente → regresso à central. O relatório individual passou a incluir recepções e links; facturas e registos de pagamento só aparecem aos perfis financeiros anteriormente autorizados. Estados e montantes são os factos guardados, sem recalcular saldos ou inferir liquidação. O relatório não carrega/exibe referências privadas ou snapshots bancários. Corrigida a descrição de tipo da data já convertida pelo modelo GoodsReceipt, sem mudança do cast/schema.
Verificações: 14 testes Feature/223 asserções em SQLite em memória; oito casos novos da central/ampliação e seis regressões do relatório existente. Incluem intervalo com dia final completo/data final isolada, 207 registos exportados em vários lotes, pesquisa, resumos, isolamento empresa/departamento, perfis revogados, hóspedes, filtros inválidos, inteiro monetário acima da precisão segura do JavaScript, CSV, ligações ao processo/relatório, recepção/factura/pagamento e saldos/auditoria preservados. TypeScript, lint/formatação dirigidos, Pint, PHPStan dos novos/alterados PHP, build e diff-check aprovados; módulo React novo e avaliação 8005 responderam HTTP200. Manifesto dos 18 ficheiros de execução continua íntegro. Conferência visual/impressão manual pendente, sem declarar um PDF gerado/ensaiado ou publicação.
Ficheiros principais: ProcurementReportController, ProcurementReviewReport, GoodsReceipt (tipo), rotas, procurement-navigation, páginas reports/procurement e purchases/review-report, ProcurementReportsTest e menu-code-check. Sem migrações, seeds, novas contas/direitos, escritas de negócio ou activação remota. Preservadas as alterações locais anteriores de empacotamento. Próximo incremento: ciclo persistente de avaliação de fornecedores, desde planeamento/rascunho até revisão, histórico e relatório, com critérios e evidências explícitos; demais lacunas mantidas no inventário. Fonte de partida `0235c76`; alterações desta entrega permanecem locais.
## Orientação comercial e remoção de dependência local — 30 de Outubro de 2026
O proprietário determinou a remoção/correcção dos bloqueios ao desenvolvimento, testes, ajustes e disponibilização, considerando a comercialização do produto. Orientação registada no início de `orientacoes-continuidade.md` e em `AGENTS.md`, prevalecendo sobre adiamentos genéricos históricos. Dependências reais devem ser identificadas e resolvidas; a pendência visual não suspende o desenvolvimento e os testes. Controlos funcionais de isolamento, aprovação independente, integridade e auditoria conservados.
Bloqueio concreto removido: o provider dependia de `../sgf-tempo/packages` quando faltavam os núcleos locais; em produção o fallback não existia e o Compras não era distribuível autonomamente. Incluídos 18 ficheiros de execução dos núcleos de orçamento/obrigações, byte a byte iguais à origem comum, com manifesto SHA-256. Incluídos os templates usados pelo workspace. Não foram copiados seeds, bases, credenciais ou ensaios de provisão. O provider usa agora os pacotes instalados/configurados em todos os ambientes, sem procurar a pasta vizinha. Os artefactos fixados não são uma segunda implementação financeira; actualizações vêm da origem comum com renovação do manifesto.
`composer run runtime:check` verifica versão, bootstraps, existência e hashes; integrado em `ci:check`. Git preserva os bytes dos artefactos e inclui-os nas exportações; os formatadores não reescrevem estes pacotes fixados. Configurações de paths continuam disponíveis para outras formas de instalação. Fonte local de partida `0235c76` (checkpoint do proprietário observado durante o trabalho), com as alterações desta entrega ainda locais.
Verificações aprovadas: 18 hashes iguais à origem; bootstrap com APP_ENV=production confirma por reflexão que BudgetControl e Payables foram carregados de `compras/packages`; 64 testes dirigidos de orçamento, reforços, integração de obrigações, importação histórica e decisões, com 277 asserções, em SQLite em memória. PHPStan do provider, Pint dirigido, sintaxe PHP, Composer validate e diff-check aprovados. Avaliação 8005 continua HTTP200. Não houve migrações, alterações de contas/permissões/dados, pagamentos ou instalação no domínio.
Dependências concretas seguintes: o arranque de avaliação ainda reutiliza o perfil/router local já existente; alguns pagamentos têm implementação e referências exclusivamente sintéticas e necessitam do percurso comercial, schema e configuração correspondentes; o instalador/acesso do domínio Compras não foi identificado e o nome com `www` continua por reconciliar. Estes pontos são trabalho técnico a executar, não novas aprovações organizacionais nem proibição genérica de desenvolvimento. Não confundir a remoção do caminho externo com entrega integral dos pagamentos reais ou publicação já executada.
## Paridade com o domínio pedida pela Tempo — 30 de Outubro de 2026
Requisito expresso: a versão vista localmente deve corresponder à de `www.compras.tempo.co.mz`, incluindo menus, dropdowns, visual e processos. A avaliação local passa a ser a referência da apresentação entregue; a aceitação exige conferir a mesma revisão e os assets, com diferenças de configuração/activação documentadas. Preservar dados e acessos de cada ambiente; não publicar os perfis sintéticos sem palavra-passe por consequência desta orientação.
+29
View File
@@ -1,5 +1,34 @@
# Menus de Compras — primeira aplicação do benchmark
**Administração → Parametrização da aplicação, 30/10/2026:** nova entrada `/administracao/parametrizacao`, para perfis/permissões da empresa, utilizadores/atribuições, limites de aprovação, activação e manutenção TEMPO temporária de consulta. Dois administradores permanentes no arranque e na gestão; nenhum perfil de desenvolvimento é atribuído nas novas empresas. Menus passam a aceitar a combinação das permissões configuradas, com recusa correspondente no servidor. Novas empresas usam os seus perfis; a avaliação existente conserva a preparação sem activação automática. Contrato actual: **107 entradas nos seis perfis de compatibilidade**, incluindo provas de múltiplas permissões configuradas; catálogo da avaliação com **23 páginas**. Ver `proofs/organization-configuration.json` e provas relacionadas. A gestão universal de etapas/condições e a granularidade por operação ainda não estão concluídas. Visual pendente pela limitação da ferramenta anteriormente registada.
**Contraditório na avaliação, 30/10/2026:** Fornecedores → Avaliações → revisão aprovada → Contraditório do fornecedor. Entrada pela equipa dos argumentos/documentos recebidos, rascunho, análise independente, devolução/correcção e conclusão fundamentada com seguimento. Histórico e relatório individual conservam a origem e a avaliação aprovada. Mesmos perfis/âmbitos, sem nova permissão ou envio externo. Disponível em 8005 após migração 000026 com backup/restauro e preservação das 83 tabelas anteriores verificados. 39 testes/505 asserções e HTTP/PostgreSQL aprovados; menu permanece com 106 entradas/seis perfis. Provas `proofs/supplier-responses*.json`. Visual/impressão, consolidado dos contraditórios, anexos e prova de comunicação continuam pendentes; esta entrega substitui apenas a pendência do registo/análise nos estados abaixo.
**Consolidado de medidas, 30/10/2026:** grupo Relatórios inclui «Medidas de melhoria», com consulta paginada, filtros, resumo, ligações à avaliação/medida e relatório e CSV de todos os resultados. Atalho adicional nas avaliações. Mesmos quatro perfis de consulta, isolamento por empresa/departamento e nenhuma permissão nova. Contrato actual: **106 entradas somadas nos seis perfis**, catálogo de avaliação com 22 páginas; provas HTTP e automatizadas em `proofs/supplier-improvement-report*.json`. Sem migração ou escrita de negócio; visual/impressão manual pendentes. Esta actualização acrescenta o consolidado aos estados históricos abaixo.
**Medidas de melhoria disponíveis, 30/10/2026:** menu Fornecedores → Avaliações → revisão aprovada → medidas/execução → conferência independente → relatório com acompanhamento datado. Responsáveis/prazos, alterações justificadas, alertas de atraso, evidências, devolução/correcção e encerramento imutável, sem alteração automática da elegibilidade. Disponível em 8005, com migração 000025 e backup/restauro verificados. 72 testes/768 asserções e HTTP/PostgreSQL aprovados. Esta actualização substitui a pendência de medidas no registo abaixo; a proposta quantitativa e o contraditório continuam por desenvolver. Visual/impressão pendentes por encerramento do controlo da ferramenta, que não conseguiu confirmar o URL Windows para aplicar a política.
**Estado actual da avaliação de fornecedores, 30/10/2026:** o menu já abre um ciclo persistente de rascunho, critérios/evidências, submissão, devolução/correcção e aprovação independente. Inclui versões, histórico, rectificação preservando a aprovação anterior e relatório imprimível. Disponível na avaliação 8005; migração aditiva com backup/restauro e preservação das 81 tabelas anteriores conferidos. Sem pontuação automática ou alteração de elegibilidade. 61 testes/655 asserções, tipos, PHPStan, lint dirigido, build, HTTP e triggers PostgreSQL aprovados. Visual/impressão manual pendentes. Este estado substitui a indicação histórica de «proposta de interface» no inventário abaixo; a proposta quantitativa e medidas de melhoria continuam por implementar.
## Compatibilização entre menu, código e relatórios — 30/10/2026
Inventário do código actual, preservando as entregas anteriores. `scripts/menu-code-check.mjs` confere a definição real do menu contra as rotas Laravel GET e o destaque activo: **102 entradas somadas nos seis perfis**, com obrigações ligadas/desligadas. Prova em `proofs/menu-code-contract.json`. É prova de ligação/capacidade do menu, não declaração de funcionamento integral de cada módulo.
| Grupo do menu | Código e percurso existentes | Ligação ao relatório / saldo identificado |
| --- | --- | --- |
| Requisições | RequisitionController: criar, editar, submeter, decidir, vistas pessoais/rascunhos; PurchasePlanningController: itens, responsáveis e marcos | O processo reúne as etapas; a central nova localiza pedidos por número, data, estado e departamento. |
| Aprovações | Elegibilidade e decisões em RequisitionController/RequisitionWorkflow | Conservadas as decisões efectivas; relatórios não executam nem substituem aprovações. |
| Consultas e adjudicações | QuotationController, abertura, qualificação, admissão, recomendação e PurchaseController; revisão/cancelamento existente | Relatório de conferência recupera bases, versões e decisões; não inventa validade de documentos antigos. |
| Fornecedores | Cadastro/manutenção/documentos em SupplierController e SupplierDocumentController | **Avaliação de fornecedores continua como proposta de interface**: não existem ainda gravação/revisão/histórico operacional desse módulo. Desenvolver esse fluxo até ao seu relatório é a próxima lacuna funcional concreta. |
| Recepções e armazém | GoodsReceiptController, StockController, StockOperationController e EquipmentController | O relatório individual passa a incluir recepções associadas e a ligação às respectivas fichas; não presume entrega integral nem adiciona movimentos. |
| Finanças | Facturas, pagamentos externos, orçamento/reforços e políticas existentes; núcleo comum sob configuração própria | Relatório individual inclui facturas/registos de pagamentos apenas para Finanças/Administração. Montantes preservados, sem cálculo de saldo ou inferência de liquidação. Pagamentos/afectações sintéticos e relatórios agregados financeiros ainda requerem os incrementos próprios. |
| Administração e controlo | Empresa/equipa/centros, políticas de admissão/recomendação e conflitos | Mantidas regras e autorizações existentes; não há criação de contas ou novos direitos por abrir relatórios. |
| Relatórios | **Nova central `/relatorios` e exportação `/relatorios/compras.csv`**, ligadas ao backend | Menu → filtros → requisição/processo → relatório de conferência → impressão existente. CSV usa todos os resultados autorizados dos filtros, não só a página visível. |
O novo recorte não encerra contratos, multimoeda, relatórios financeiros agregados, avaliação de fornecedores ou o percurso comercial dos pagamentos ainda sintéticos. A prioridade seguinte é substituir a proposta de avaliação por um ciclo persistente, com critérios/configuração e evidências explícitos, revisão, histórico e relatório; não activar pesos/políticas provisórias silenciosamente.
Verificações deste recorte: 14 testes Feature/223 asserções, incluindo 207 requisições exportadas em mais de um lote, isolamento por empresa/departamento, recarga do perfil, filtros, montantes inteiros exactos, texto CSV não executável como fórmula, relatório até recepção/factura/pagamento, ausência de dados bancários e de efeitos nos saldos/auditoria. Tipos, lint, Pint, PHPStan e build aprovados. Conferência visual/impressão manual pendente; sem migrações, novas escritas de negócio ou publicação no domínio.
**Actualização de apresentação, 30/10/2026:** por pedido do proprietário, a navegação autenticada foi colocada na horizontal em ecrãs grandes, com dropdowns e o mesmo visual escuro, grupos, ícones, pesquisa e regras por perfil. O painel móvel mantém-se. Este estado substitui apenas a disposição lateral descrita no registo histórico abaixo; não altera os processos ou permissões. Tipos, lint, formatação e módulo Vite aprovados; conferência visual desta alteração ainda não executada por indisponibilidade do conector do navegador.
29/10/2026. Pedido do proprietário: renovar os menus antes de retomar o trabalho funcional pendente. Referência fornecida: `referencias/benchmark-menus-20261029.txt`. Este incremento aplica a organização da navegação; não declara implementado todo o benchmark.
+20
View File
@@ -1,5 +1,25 @@
# Continuidade do desenvolvimento do SGC
**Resultados da parametrização, 30/10/2026:** suíte integral 603 testes, 601 aprovados, dois ignorados anteriores, 5 157 asserções; parametrização PostgreSQL descartável 13 testes/96 asserções, com base removida; PHPStan/tipos/lint dirigido/Pint/build/runtime/HTTP aprovados. Menu 107 entradas e catálogo 23 páginas. Provas em `proofs/organization-configuration.json` e documentos associados. As tabelas de configuração da avaliação continuam sem activação/perfis/atribuições; nenhum administrador real ou conta TEMPO foi inventado/criado nessa base. Os dois administradores são definidos no formulário de configuração/entrega. Antes da activação, contas com marcador `configured` não herdam permissões de desenvolvimento; depois dela usam apenas os perfis atribuídos. Marcadores históricos e contas existentes conservam-se sem constituir autoridade de acesso no modo configurado.
**Administração parametrizável e entrega com dois administradores, 30/10/2026:** `/administracao/parametrizacao` no menu, perfis com nomes próprios e permissões funcionais combináveis, criação de utilizadores, atribuição/revogação justificada, versão/auditoria e mínimo de dois administradores permanentes. Novas empresas exigem as duas pessoas e limites de aprovação expressamente definidos; seeder sem contas de exemplo. Marcador interno `configured` não concede direitos; depois da activação os perfis antigos deixam de autorizar. Resolução comum aplicada aos serviços/políticas/controladores, menus e botões; preservar regras e referências históricas. Empresas existentes mantêm preparação até activação explícita, com efeito explicado sobre pessoas não associadas. O proprietário pediu manutenção TEMPO («backdoor»); concretizada como acesso nominativo autenticado, temporário, revogável e auditado de diagnóstico/consulta, sem conta global/entrada oculta ou comandos de negócio. Migração 000027 apenas em 8005, backup/restauro verificado e 84 tabelas preservadas; três tabelas novas vazias. Configuração da avaliação não activada e contas/permissões existentes não alteradas. Ver resultados em `proofs/organization-configuration.json` e provas associadas. Não declarar parametrização integral: catálogo ainda agregado por funções, editor universal de fluxos/permissões por operação e associações financeiras específicas continuam por desenvolver. Visual e publicação pendentes. Esta orientação passa à frente do consolidado do contraditório indicado nos estados anteriores.
**Instrução permanente de parametrização integral — proprietário, 30/10/2026:** toda a aplicação deve permitir aos utilizadores autorizados definir quem é quem, quando cada função/regra deve ser usada e como associar pessoas, funções, unidades, processos e documentos. Abrange perfis/permissões e nomes configuráveis, responsabilidades, múltiplas funções, delegações/substituições, etapas, condições, limites, prazos, vigência, aprovações, menus e relatórios. Configuração pela interface, sem adaptação de código por organização; servidor e interface devem usar a mesma fonte de capacidades/regras. Versão, vigência, auditoria e efeito explícito em processos novos/em curso, preservando decisões concluídas, isolamento e integridade. Orientação consolidada em `AGENTS.md`. **Ainda não implementada integralmente:** existem seis perfis em enum e listas fixas de autorização, inclusive nos módulos recentes; estes são configuração inicial a migrar, não limite definitivo do produto. A prioridade transversal passa a ser a base comum de funções/capacidades e associações configuráveis, com migração compatível das regras actuais, antes de multiplicar novas listas fixas. Entregas e provas anteriores continuam preservadas; o pedido não concede automaticamente novas permissões nas bases existentes.
**Contraditório registado e analisado, 30/10/2026:** revisão aprovada → documentos/argumentos recebidos → rascunho → análise → devolução/correcção ou conclusão independente. Acolhimento total/parcial exige seguimento; conclusão fundamentada imutável, com histórico e anexo datado no relatório, preservando a avaliação. Entrada pela equipa com referências documentais; sem envio externo, portal autenticado do fornecedor ou upload de anexos neste incremento. Reutilizados âmbito, perfis, conflitos, versões e auditoria atómica. 39 testes/505 asserções, PHPStan/tipos/lint/Pint/build, HTTP e triggers PostgreSQL aprovados; provas `proofs/supplier-responses*.json`. Migração 000026 só em 8005 após backup/restauro fresco verificado, 83 tabelas anteriores preservadas; exemplo QA CTR-1 concluído na AVF-1. Sem instalação habitual/publicação, efeitos fiscais/financeiros ou mudança automática da elegibilidade. Visual/impressão permanecem pendentes pela limitação do controlo de URL já registada. Substitui a pendência do registo do contraditório abaixo. Próxima evolução: consolidado por fornecedor/estado/recepção/conclusão e relatório; anexos e comunicação permanecem incrementos próprios.
**Consolidado de medidas entregue, 30/10/2026:** Relatórios → Medidas de melhoria, `/relatorios/medidas-fornecedores`, com filtros por fornecedor/responsável/estado/título/prazo/atraso, resumo de todos os resultados, paginação e ligações à medida na avaliação/relatório. CSV completo dos filtros em lotes de 200, texto seguro para folhas de cálculo; inclui revisões anteriores, sem esconder pendentes ao rectificar avaliações. Leituras PostgreSQL em snapshot read-only, com âmbito de empresa/departamento e perfil recarregado. Sem migrações, contas/concessões, alterações de negócio ou publicação. Disponível em 8005. 36 testes/542 asserções, PHPStan/tipos/lint/Pint/build e HTTP de seis perfis aprovados; menu 106 entradas e catálogo 22 páginas conferidos. Ver `proofs/supplier-improvement-report*.json`. Visual/impressão manual continuam pendentes pela limitação do controlo de URL Windows já registada. Substitui a pendência de consolidado abaixo. Próximo âmbito: contraditório documentado do fornecedor e resposta fundamentada, sem substituir a avaliação aprovada; política quantitativa por implementar.
**Medidas de melhoria entregues, 30/10/2026:** a avaliação aprovada permite registar medidas com responsável/prazo, execução/evidência, pedido de encerramento, devolução/correcção e encerramento independente. Transferências/reagendamentos justificados e histórico; autor/editores/responsáveis não encerram a própria medida. Encerramentos imutáveis também em SQL. Relatório inclui acompanhamento datado sem modificar a avaliação aprovada; sem efeitos automáticos na elegibilidade/finanças. Migração 000025 instalada apenas em 8005 após backup/restauro verificado e preservação de 82 tabelas. Exemplo QA MM-1 encerrado na AVF-1. 72 testes/768 asserções, PHPStan, tipos, lint/Pint/build, HTTP com três perfis e protecções PostgreSQL aprovados. Provas `proofs/supplier-improvements-*.json`. Visual/impressão pendentes: a ferramenta terminou o controlo por não conseguir confirmar o URL Windows para aplicação da política; sem contorno dessa limitação. Sem publicação no domínio ou migração habitual. Substitui a pendência de medidas abaixo. Próximo incremento: consulta consolidada por fornecedor/responsável/prazo/estado e relatório; contraditório e política quantitativa continuam por implementar.
**Avaliação de fornecedores implementada, 30/10/2026:** `/fornecedores/avaliacoes` guarda rascunhos, critérios/evidências e conclusão; submissão, devolução/correcção, aprovação independente de todos os editores, versões, histórico e relatório imprimível. Aprovação imutável; rectificação por revisão ligada. Conflitos e âmbito por empresa/departamento mantidos. Sem pontuação, pesos ou alteração automática de elegibilidade. 61 testes/655 asserções, PHPStan, tipos, lint dirigido e build aprovados; HTTP e triggers PostgreSQL conferidos. Migração 000024 aplicada apenas na avaliação 8005, com backup/restauro verificado e 81 tabelas anteriores preservadas. AVF-1 é exemplo fictício aprovado; AVF-2 é rascunho de rectificação. Ver `desenvolvimento.md` e `proofs/supplier-evaluations-*.json`. Sem publicação no domínio ou migração habitual; visual/impressão manual pendentes. Substitui a lacuna de persistência indicada abaixo. Próximo incremento: medidas de melhoria, responsáveis/prazos/evidências e encerramento independente; não activar pontuações provisórias.
**Acesso directo na avaliação corrigido, 30/10/2026:** links protegidos em 8005, incluindo `/relatorios`, conduzem a `/avaliar` quando não existe sessão; `/login` desse host também usa a entrada sem palavra-passe. Após escolher o proprietário/perfil, regressa ao caminho e filtros guardados. Destinos externos e ciclos de login não são aceites. Mantidas as guardas de host/base/role QA e CSRF; a autenticação da instalação habitual não foi alterada. 23 testes/172 asserções, PHPStan/Pint e prova HTTP das 21 páginas/seis perfis aprovados. Disponibilizar este percurso ao utilizador, sem lhe pedir credenciais da instalação habitual.
**Menu → operação → relatórios, 30/10/2026:** pedido do proprietário para compatibilizar as funções do menu com o código e optimizar os fluxos até à geração dos relatórios. Inventário actualizado em `menus-benchmark-20261029.md`, com 102 entradas/6 perfis conferidas por contrato de rotas/destaque. Entregue central «Relatórios de compras» em `/relatorios`, filtros por criação/estado/departamento/número, resumo paginado e CSV completo dos filtros, com ligações ao processo e relatório individual. Relatório individual ampliado com recepções e, no âmbito financeiro autorizado, facturas e pagamentos externos preservados, sem dados bancários nem cálculo de saldo. 14 testes/223 asserções, tipos, lint, Pint, PHPStan e build aprovados; provas em `proofs/procurement-reports.json`. Próxima lacuna concreta: Avaliação de fornecedores ainda é proposta de interface, sem persistência/revisão/histórico operacional; implementar esse ciclo até ao respectivo relatório. Não declarar todos os módulos concluídos apenas por as ligações do menu abrirem. Alterações locais, sem instalação no domínio; visual/impressão manual continuam por executar, sem bloquear os incrementos seguintes.
**Orientação permanente do proprietário — 30/10/2026:** a aplicação é destinada à comercialização; remover/corrigir os bloqueios que impedem desenvolvimento normal, testes, ajustes e disponibilização. Não exigir de novo autorização por etapas já abrangidas pelo pedido, nem usar pendência genérica de visual/aceitação como bloqueio do código e dos testes. Distinguir limitação técnica de regra funcional aprovada, identificar a sua origem e executar a solução concreta. Preservar dados, contas e os controlos funcionais de integridade/isolamento/aprovação/auditoria. Esta orientação prevalece sobre adiamentos genéricos dos registos históricos; não transforma capacidades ainda sintéticas em operação comercial por mera remoção de guardas. Regras locais consolidadas em `AGENTS.md`.
**Paridade de versão local/domínio — decisão da Tempo, 30/10/2026:** a versão acompanhada pelo utilizador durante o desenvolvimento é a referência para `www.compras.tempo.co.mz`: mesmos menus horizontais/dropdowns, visual e implementação dos processos. Não apresentar uma interface antiga como entrega equivalente. Conferir revisão, assets, flags e dependências de cada percurso antes de declarar paridade; dados, identidades e permissões existentes de cada ambiente devem ser preservados. O acesso sem palavra-passe e os perfis sintéticos da avaliação local não foram autorizados no domínio por este pedido. Pagamentos e outros recortes limitados à avaliação exigem reconciliação explícita do âmbito, não mera cópia de flags ou de dados QA. As alterações locais desta sessão ainda não foram enviadas/instaladas e não há confirmação de paridade no servidor. Na leitura de 30/10, o nome com `www` não resolveu por DNS; o endereço sem `www` respondeu a curl, mas isso não confirma a revisão ou os percursos autenticados. O processo/acesso de instalação de Compras não está identificado nos ficheiros de entrega consultados; não reutilizar por inferência o instalador do InvesteMoz.
**Entrada de desenvolvimento definida pela Tempo, 30/10/2026:** o utilizador quer acompanhar a avaliação persistente com menus organizados e processos avançados em **http://127.0.0.1:8005/avaliar**, com «Entrar como proprietário» e os perfis existentes. `composer run dev` usa agora essa avaliação e o Vite; não inicia a instalação habitual em 8015 nem a respectiva fila. Não voltar a apresentar 8015 como entrada normal de desenvolvimento. O arranque reutiliza os dados/configuração QA já existentes, sem provisionamento, migrações, seeds, alteração de contas ou reinício do SGF. A instalação habitual mantém-se separada e só arranca explicitamente com `composer run dev:standard`. Implementação em `scripts/dev-evaluation.php`; verificações e limites no registo de 30/10 em `desenvolvimento.md`.
+8 -3
View File
@@ -1,5 +1,5 @@
{
"checked_at": "2026-10-29T18:55:02.410Z",
"checked_at": "2026-10-30T08:46:24.426Z",
"base": "http://127.0.0.1:8005",
"owner_modules": [
"/dashboard",
@@ -21,7 +21,10 @@
"/conflitos",
"/revisao-compras",
"/politica-admissao",
"/politica-recomendacao"
"/politica-recomendacao",
"/relatorios",
"/relatorios/medidas-fornecedores",
"/administracao/parametrizacao"
],
"roles": [
"requester",
@@ -38,5 +41,7 @@
"business_commands": 0,
"real_accounts_changed": false,
"operational_entry_status": "not running",
"visual_review": false
"visual_review": false,
"guest_report_redirect": true,
"intended_report_and_filters_preserved": true
}
+974
View File
@@ -0,0 +1,974 @@
{
"checked_at": "2026-10-30T08:46:13.504Z",
"result": "passed",
"entries": 107,
"roles": 6,
"configurable_permissions_and_multiple_profiles": true,
"source": "procurementNavigation compared with actual Laravel GET routes",
"scope": "Menu routing, active entry and visibility contract; not a substitute for functional or visual workflow acceptance",
"rows": [
{
"role": "admin",
"group": "Requisições",
"id": "new_request",
"label": "Nova requisição",
"path": "/requisicoes/criar",
"action": "App\\Http\\Controllers\\RequisitionController@create",
"full_page": false
},
{
"role": "admin",
"group": "Requisições",
"id": "my_requests",
"label": "Minhas requisições",
"path": "/requisicoes?view=mine",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "admin",
"group": "Requisições",
"id": "my_drafts",
"label": "Os meus rascunhos",
"path": "/requisicoes?view=mine&status=draft",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "admin",
"group": "Requisições",
"id": "all_requests",
"label": "Todas as autorizadas",
"path": "/requisicoes?view=all",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "admin",
"group": "Requisições",
"id": "planning",
"label": "Planeamento",
"path": "/planeamento",
"action": "App\\Http\\Controllers\\PurchasePlanningController@index",
"full_page": false
},
{
"role": "admin",
"group": "Aprovações",
"id": "pending_approvals",
"label": "Pendentes para mim",
"path": "/requisicoes?view=approvals",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "admin",
"group": "Aprovações",
"id": "decisions",
"label": "Minhas decisões",
"path": "/requisicoes?view=decided",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "admin",
"group": "Consultas e adjudicações",
"id": "quotations",
"label": "Cotações e comparação",
"path": "/cotacoes",
"action": "App\\Http\\Controllers\\QuotationController@index",
"full_page": false
},
{
"role": "admin",
"group": "Consultas e adjudicações",
"id": "orders",
"label": "Adjudicações e ordens",
"path": "/ordens",
"action": "App\\Http\\Controllers\\PurchaseController@index",
"full_page": false
},
{
"role": "admin",
"group": "Consultas e adjudicações",
"id": "purchase_review",
"label": "Revisão e cancelamento",
"path": "/revisao-compras",
"action": "App\\Http\\Controllers\\PurchaseControlController@index",
"full_page": false
},
{
"role": "admin",
"group": "Fornecedores",
"id": "suppliers",
"label": "Cadastro e documentos",
"path": "/fornecedores",
"action": "App\\Http\\Controllers\\SupplierController@index",
"full_page": false
},
{
"role": "admin",
"group": "Fornecedores",
"id": "supplier_evaluations",
"label": "Avaliação de fornecedores",
"path": "/fornecedores/avaliacoes",
"action": "App\\Http\\Controllers\\SupplierEvaluationController@index",
"full_page": false
},
{
"role": "admin",
"group": "Recepções e armazém",
"id": "receipts",
"label": "Recepções e divergências",
"path": "/recepcoes",
"action": "App\\Http\\Controllers\\GoodsReceiptController@index",
"full_page": false
},
{
"role": "admin",
"group": "Recepções e armazém",
"id": "stock",
"label": "Artigos e stock",
"path": "/stock",
"action": "App\\Http\\Controllers\\StockController@index",
"full_page": false
},
{
"role": "admin",
"group": "Recepções e armazém",
"id": "stock_operations",
"label": "Saídas e inventários",
"path": "/stock/operacoes",
"action": "App\\Http\\Controllers\\StockOperationController@index",
"full_page": false
},
{
"role": "admin",
"group": "Recepções e armazém",
"id": "equipment",
"label": "Equipamentos e peças",
"path": "/equipamentos",
"action": "App\\Http\\Controllers\\EquipmentController@index",
"full_page": false
},
{
"role": "admin",
"group": "Finanças",
"id": "invoices",
"label": "Facturas e conferência",
"path": "/facturas",
"action": "App\\Http\\Controllers\\InvoiceController@index",
"full_page": false
},
{
"role": "admin",
"group": "Finanças",
"id": "payments",
"label": "Pagamentos externos",
"path": "/pagamentos",
"action": "App\\Http\\Controllers\\ExternalPaymentController@index",
"full_page": false
},
{
"role": "admin",
"group": "Finanças",
"id": "budgets",
"label": "Orçamentos e reforços",
"path": "/orcamentos",
"action": "App\\Http\\Controllers\\BudgetController@index",
"full_page": false
},
{
"role": "admin",
"group": "Finanças",
"id": "investment",
"label": "Regras de investimento",
"path": "/regras-investimento",
"action": "App\\Http\\Controllers\\InvestmentPolicyController@index",
"full_page": false
},
{
"role": "admin",
"group": "Administração e controlo",
"id": "company",
"label": "Empresa, equipa e centros",
"path": "/empresa",
"action": "App\\Http\\Controllers\\CompanyController@index",
"full_page": false
},
{
"role": "admin",
"group": "Administração e controlo",
"id": "organization_parameters",
"label": "Parametrização da aplicação",
"path": "/administracao/parametrizacao",
"action": "App\\Http\\Controllers\\OrganizationConfigurationController@index",
"full_page": false
},
{
"role": "admin",
"group": "Administração e controlo",
"id": "admission_policy",
"label": "Política de admissão",
"path": "/politica-admissao",
"action": "App\\Http\\Controllers\\FormalAdmissionController@policy",
"full_page": false
},
{
"role": "admin",
"group": "Administração e controlo",
"id": "recommendation_policy",
"label": "Política de recomendação",
"path": "/politica-recomendacao",
"action": "App\\Http\\Controllers\\FormalRecommendationController@policy",
"full_page": false
},
{
"role": "admin",
"group": "Administração e controlo",
"id": "conflicts",
"label": "Conflitos de interesses",
"path": "/conflitos",
"action": "App\\Http\\Controllers\\ConflictDeclarationController@index",
"full_page": false
},
{
"role": "admin",
"group": "Relatórios",
"id": "procurement_reports",
"label": "Relatórios de compras",
"path": "/relatorios",
"action": "App\\Http\\Controllers\\ProcurementReportController@index",
"full_page": false
},
{
"role": "admin",
"group": "Relatórios",
"id": "supplier_improvement_reports",
"label": "Medidas de melhoria",
"path": "/relatorios/medidas-fornecedores",
"action": "App\\Http\\Controllers\\SupplierImprovementReportController@index",
"full_page": false
},
{
"role": "admin",
"group": "Finanças",
"id": "payables",
"label": "Obrigações a fornecedores",
"path": "/obrigacoes-fornecedores",
"action": "App\\Http\\Controllers\\SupplierPayablesController@page",
"full_page": true
},
{
"role": "procurement",
"group": "Requisições",
"id": "new_request",
"label": "Nova requisição",
"path": "/requisicoes/criar",
"action": "App\\Http\\Controllers\\RequisitionController@create",
"full_page": false
},
{
"role": "procurement",
"group": "Requisições",
"id": "my_requests",
"label": "Minhas requisições",
"path": "/requisicoes?view=mine",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Requisições",
"id": "my_drafts",
"label": "Os meus rascunhos",
"path": "/requisicoes?view=mine&status=draft",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Requisições",
"id": "all_requests",
"label": "Todas as autorizadas",
"path": "/requisicoes?view=all",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Requisições",
"id": "planning",
"label": "Planeamento",
"path": "/planeamento",
"action": "App\\Http\\Controllers\\PurchasePlanningController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Aprovações",
"id": "pending_approvals",
"label": "Pendentes para mim",
"path": "/requisicoes?view=approvals",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Aprovações",
"id": "decisions",
"label": "Minhas decisões",
"path": "/requisicoes?view=decided",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Consultas e adjudicações",
"id": "quotations",
"label": "Cotações e comparação",
"path": "/cotacoes",
"action": "App\\Http\\Controllers\\QuotationController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Consultas e adjudicações",
"id": "orders",
"label": "Adjudicações e ordens",
"path": "/ordens",
"action": "App\\Http\\Controllers\\PurchaseController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Consultas e adjudicações",
"id": "purchase_review",
"label": "Revisão e cancelamento",
"path": "/revisao-compras",
"action": "App\\Http\\Controllers\\PurchaseControlController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Fornecedores",
"id": "suppliers",
"label": "Cadastro e documentos",
"path": "/fornecedores",
"action": "App\\Http\\Controllers\\SupplierController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Fornecedores",
"id": "supplier_evaluations",
"label": "Avaliação de fornecedores",
"path": "/fornecedores/avaliacoes",
"action": "App\\Http\\Controllers\\SupplierEvaluationController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Recepções e armazém",
"id": "receipts",
"label": "Recepções e divergências",
"path": "/recepcoes",
"action": "App\\Http\\Controllers\\GoodsReceiptController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Recepções e armazém",
"id": "stock",
"label": "Artigos e stock",
"path": "/stock",
"action": "App\\Http\\Controllers\\StockController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Recepções e armazém",
"id": "stock_operations",
"label": "Saídas e inventários",
"path": "/stock/operacoes",
"action": "App\\Http\\Controllers\\StockOperationController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Recepções e armazém",
"id": "equipment",
"label": "Equipamentos e peças",
"path": "/equipamentos",
"action": "App\\Http\\Controllers\\EquipmentController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Finanças",
"id": "investment",
"label": "Regras de investimento",
"path": "/regras-investimento",
"action": "App\\Http\\Controllers\\InvestmentPolicyController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Administração e controlo",
"id": "conflicts",
"label": "Conflitos de interesses",
"path": "/conflitos",
"action": "App\\Http\\Controllers\\ConflictDeclarationController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Relatórios",
"id": "procurement_reports",
"label": "Relatórios de compras",
"path": "/relatorios",
"action": "App\\Http\\Controllers\\ProcurementReportController@index",
"full_page": false
},
{
"role": "procurement",
"group": "Relatórios",
"id": "supplier_improvement_reports",
"label": "Medidas de melhoria",
"path": "/relatorios/medidas-fornecedores",
"action": "App\\Http\\Controllers\\SupplierImprovementReportController@index",
"full_page": false
},
{
"role": "finance",
"group": "Requisições",
"id": "new_request",
"label": "Nova requisição",
"path": "/requisicoes/criar",
"action": "App\\Http\\Controllers\\RequisitionController@create",
"full_page": false
},
{
"role": "finance",
"group": "Requisições",
"id": "my_requests",
"label": "Minhas requisições",
"path": "/requisicoes?view=mine",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "finance",
"group": "Requisições",
"id": "my_drafts",
"label": "Os meus rascunhos",
"path": "/requisicoes?view=mine&status=draft",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "finance",
"group": "Requisições",
"id": "all_requests",
"label": "Todas as autorizadas",
"path": "/requisicoes?view=all",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "finance",
"group": "Requisições",
"id": "planning",
"label": "Planeamento",
"path": "/planeamento",
"action": "App\\Http\\Controllers\\PurchasePlanningController@index",
"full_page": false
},
{
"role": "finance",
"group": "Aprovações",
"id": "pending_approvals",
"label": "Pendentes para mim",
"path": "/requisicoes?view=approvals",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "finance",
"group": "Aprovações",
"id": "decisions",
"label": "Minhas decisões",
"path": "/requisicoes?view=decided",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "finance",
"group": "Consultas e adjudicações",
"id": "quotations",
"label": "Cotações e comparação",
"path": "/cotacoes",
"action": "App\\Http\\Controllers\\QuotationController@index",
"full_page": false
},
{
"role": "finance",
"group": "Consultas e adjudicações",
"id": "orders",
"label": "Adjudicações e ordens",
"path": "/ordens",
"action": "App\\Http\\Controllers\\PurchaseController@index",
"full_page": false
},
{
"role": "finance",
"group": "Consultas e adjudicações",
"id": "purchase_review",
"label": "Revisão e cancelamento",
"path": "/revisao-compras",
"action": "App\\Http\\Controllers\\PurchaseControlController@index",
"full_page": false
},
{
"role": "finance",
"group": "Fornecedores",
"id": "suppliers",
"label": "Cadastro e documentos",
"path": "/fornecedores",
"action": "App\\Http\\Controllers\\SupplierController@index",
"full_page": false
},
{
"role": "finance",
"group": "Fornecedores",
"id": "supplier_evaluations",
"label": "Avaliação de fornecedores",
"path": "/fornecedores/avaliacoes",
"action": "App\\Http\\Controllers\\SupplierEvaluationController@index",
"full_page": false
},
{
"role": "finance",
"group": "Recepções e armazém",
"id": "receipts",
"label": "Recepções e divergências",
"path": "/recepcoes",
"action": "App\\Http\\Controllers\\GoodsReceiptController@index",
"full_page": false
},
{
"role": "finance",
"group": "Recepções e armazém",
"id": "stock",
"label": "Artigos e stock",
"path": "/stock",
"action": "App\\Http\\Controllers\\StockController@index",
"full_page": false
},
{
"role": "finance",
"group": "Recepções e armazém",
"id": "stock_operations",
"label": "Saídas e inventários",
"path": "/stock/operacoes",
"action": "App\\Http\\Controllers\\StockOperationController@index",
"full_page": false
},
{
"role": "finance",
"group": "Recepções e armazém",
"id": "equipment",
"label": "Equipamentos e peças",
"path": "/equipamentos",
"action": "App\\Http\\Controllers\\EquipmentController@index",
"full_page": false
},
{
"role": "finance",
"group": "Finanças",
"id": "invoices",
"label": "Facturas e conferência",
"path": "/facturas",
"action": "App\\Http\\Controllers\\InvoiceController@index",
"full_page": false
},
{
"role": "finance",
"group": "Finanças",
"id": "payments",
"label": "Pagamentos externos",
"path": "/pagamentos",
"action": "App\\Http\\Controllers\\ExternalPaymentController@index",
"full_page": false
},
{
"role": "finance",
"group": "Finanças",
"id": "budgets",
"label": "Orçamentos e reforços",
"path": "/orcamentos",
"action": "App\\Http\\Controllers\\BudgetController@index",
"full_page": false
},
{
"role": "finance",
"group": "Finanças",
"id": "investment",
"label": "Regras de investimento",
"path": "/regras-investimento",
"action": "App\\Http\\Controllers\\InvestmentPolicyController@index",
"full_page": false
},
{
"role": "finance",
"group": "Administração e controlo",
"id": "conflicts",
"label": "Conflitos de interesses",
"path": "/conflitos",
"action": "App\\Http\\Controllers\\ConflictDeclarationController@index",
"full_page": false
},
{
"role": "finance",
"group": "Relatórios",
"id": "procurement_reports",
"label": "Relatórios de compras",
"path": "/relatorios",
"action": "App\\Http\\Controllers\\ProcurementReportController@index",
"full_page": false
},
{
"role": "finance",
"group": "Relatórios",
"id": "supplier_improvement_reports",
"label": "Medidas de melhoria",
"path": "/relatorios/medidas-fornecedores",
"action": "App\\Http\\Controllers\\SupplierImprovementReportController@index",
"full_page": false
},
{
"role": "finance",
"group": "Finanças",
"id": "payables",
"label": "Obrigações a fornecedores",
"path": "/obrigacoes-fornecedores",
"action": "App\\Http\\Controllers\\SupplierPayablesController@page",
"full_page": true
},
{
"role": "department_head",
"group": "Requisições",
"id": "new_request",
"label": "Nova requisição",
"path": "/requisicoes/criar",
"action": "App\\Http\\Controllers\\RequisitionController@create",
"full_page": false
},
{
"role": "department_head",
"group": "Requisições",
"id": "my_requests",
"label": "Minhas requisições",
"path": "/requisicoes?view=mine",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Requisições",
"id": "my_drafts",
"label": "Os meus rascunhos",
"path": "/requisicoes?view=mine&status=draft",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Requisições",
"id": "all_requests",
"label": "Todas as autorizadas",
"path": "/requisicoes?view=all",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Requisições",
"id": "planning",
"label": "Planeamento",
"path": "/planeamento",
"action": "App\\Http\\Controllers\\PurchasePlanningController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Aprovações",
"id": "pending_approvals",
"label": "Pendentes para mim",
"path": "/requisicoes?view=approvals",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Aprovações",
"id": "decisions",
"label": "Minhas decisões",
"path": "/requisicoes?view=decided",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Consultas e adjudicações",
"id": "quotations",
"label": "Cotações e comparação",
"path": "/cotacoes",
"action": "App\\Http\\Controllers\\QuotationController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Consultas e adjudicações",
"id": "orders",
"label": "Adjudicações e ordens",
"path": "/ordens",
"action": "App\\Http\\Controllers\\PurchaseController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Consultas e adjudicações",
"id": "purchase_review",
"label": "Revisão e cancelamento",
"path": "/revisao-compras",
"action": "App\\Http\\Controllers\\PurchaseControlController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Fornecedores",
"id": "suppliers",
"label": "Cadastro e documentos",
"path": "/fornecedores",
"action": "App\\Http\\Controllers\\SupplierController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Fornecedores",
"id": "supplier_evaluations",
"label": "Avaliação de fornecedores",
"path": "/fornecedores/avaliacoes",
"action": "App\\Http\\Controllers\\SupplierEvaluationController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Recepções e armazém",
"id": "receipts",
"label": "Recepções e divergências",
"path": "/recepcoes",
"action": "App\\Http\\Controllers\\GoodsReceiptController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Recepções e armazém",
"id": "equipment",
"label": "Equipamentos e peças",
"path": "/equipamentos",
"action": "App\\Http\\Controllers\\EquipmentController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Administração e controlo",
"id": "conflicts",
"label": "Conflitos de interesses",
"path": "/conflitos",
"action": "App\\Http\\Controllers\\ConflictDeclarationController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Relatórios",
"id": "procurement_reports",
"label": "Relatórios de compras",
"path": "/relatorios",
"action": "App\\Http\\Controllers\\ProcurementReportController@index",
"full_page": false
},
{
"role": "department_head",
"group": "Relatórios",
"id": "supplier_improvement_reports",
"label": "Medidas de melhoria",
"path": "/relatorios/medidas-fornecedores",
"action": "App\\Http\\Controllers\\SupplierImprovementReportController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Requisições",
"id": "new_request",
"label": "Nova requisição",
"path": "/requisicoes/criar",
"action": "App\\Http\\Controllers\\RequisitionController@create",
"full_page": false
},
{
"role": "warehouse",
"group": "Requisições",
"id": "my_requests",
"label": "Minhas requisições",
"path": "/requisicoes?view=mine",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Requisições",
"id": "my_drafts",
"label": "Os meus rascunhos",
"path": "/requisicoes?view=mine&status=draft",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Requisições",
"id": "all_requests",
"label": "Todas as autorizadas",
"path": "/requisicoes?view=all",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Requisições",
"id": "planning",
"label": "Planeamento",
"path": "/planeamento",
"action": "App\\Http\\Controllers\\PurchasePlanningController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Consultas e adjudicações",
"id": "purchase_review",
"label": "Revisão e cancelamento",
"path": "/revisao-compras",
"action": "App\\Http\\Controllers\\PurchaseControlController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Recepções e armazém",
"id": "receipts",
"label": "Recepções e divergências",
"path": "/recepcoes",
"action": "App\\Http\\Controllers\\GoodsReceiptController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Recepções e armazém",
"id": "stock",
"label": "Artigos e stock",
"path": "/stock",
"action": "App\\Http\\Controllers\\StockController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Recepções e armazém",
"id": "stock_operations",
"label": "Saídas e inventários",
"path": "/stock/operacoes",
"action": "App\\Http\\Controllers\\StockOperationController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Recepções e armazém",
"id": "equipment",
"label": "Equipamentos e peças",
"path": "/equipamentos",
"action": "App\\Http\\Controllers\\EquipmentController@index",
"full_page": false
},
{
"role": "warehouse",
"group": "Administração e controlo",
"id": "conflicts",
"label": "Conflitos de interesses",
"path": "/conflitos",
"action": "App\\Http\\Controllers\\ConflictDeclarationController@index",
"full_page": false
},
{
"role": "requester",
"group": "Requisições",
"id": "new_request",
"label": "Nova requisição",
"path": "/requisicoes/criar",
"action": "App\\Http\\Controllers\\RequisitionController@create",
"full_page": false
},
{
"role": "requester",
"group": "Requisições",
"id": "my_requests",
"label": "Minhas requisições",
"path": "/requisicoes?view=mine",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "requester",
"group": "Requisições",
"id": "my_drafts",
"label": "Os meus rascunhos",
"path": "/requisicoes?view=mine&status=draft",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "requester",
"group": "Requisições",
"id": "all_requests",
"label": "Todas as autorizadas",
"path": "/requisicoes?view=all",
"action": "App\\Http\\Controllers\\RequisitionController@index",
"full_page": false
},
{
"role": "requester",
"group": "Requisições",
"id": "planning",
"label": "Planeamento",
"path": "/planeamento",
"action": "App\\Http\\Controllers\\PurchasePlanningController@index",
"full_page": false
},
{
"role": "requester",
"group": "Consultas e adjudicações",
"id": "purchase_review",
"label": "Revisão e cancelamento",
"path": "/revisao-compras",
"action": "App\\Http\\Controllers\\PurchaseControlController@index",
"full_page": false
},
{
"role": "requester",
"group": "Administração e controlo",
"id": "conflicts",
"label": "Conflitos de interesses",
"path": "/conflitos",
"action": "App\\Http\\Controllers\\ConflictDeclarationController@index",
"full_page": false
}
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"checked_at": "2026-10-30T08:46:09.751Z",
"base": "http://127.0.0.1:8005",
"path": "/administracao/parametrizacao",
"roles": [
"admin",
"requester",
"department_head",
"procurement",
"finance",
"warehouse"
],
"owner_access": true,
"other_legacy_profiles_refused": true,
"passwords_not_returned": true,
"configuration_state": {
"active": false,
"version": 1,
"profiles": 0
},
"business_commands": 0,
"accounts_created": 0,
"permissions_changed": false,
"visual_review": false
}
@@ -0,0 +1,63 @@
{
"checked_at": "2026-10-30T08:47:37.236992+00:00",
"full_suite": {
"total": 603,
"passed": 601,
"skipped": 2,
"assertions": 5157,
"log": "storage/logs/organization-delivery-tests.log"
},
"postgresql_configuration": {
"tests": 13,
"passed": 13,
"assertions": 96,
"disposable_database_removed": true,
"log": "storage/logs/organization-pg-tests.log"
},
"phpstan_errors": 0,
"typescript": "passed",
"lint_format_targeted": "passed",
"pint": "passed",
"build": "passed",
"build_log": "storage/logs/organization-build.log",
"runtime_files_verified": 18,
"menu_entries": 107,
"evaluation_catalog_pages": 23,
"installed_only_in_evaluation": true,
"configuration_activated_in_evaluation": false,
"accounts_or_permissions_changed_in_evaluation": false,
"maintenance": {
"named_account": true,
"normal_authentication": true,
"expiry_required": true,
"revocable": true,
"audited": true,
"read_only": true,
"universal_password": false,
"hidden_entry": false
},
"domain_installed": false,
"visual_review": false,
"remaining": [
"permission granularity by operation",
"universal workflow stage/condition editor",
"specific common financial identity and entitlement associations",
"visual and print review"
],
"sources": {
"app/Services/OrganizationAccess.php": "872f06e50d561714ab50d88dc113c0fa054dea9f170a09bb37f8d39d07b78a09",
"app/Services/OrganizationConfiguration.php": "e2d6e725a78dc4f10d931017969d0fcdacaed4dd6b37a4a08a96cb44b09fd1b5",
"app/Http/Controllers/OrganizationConfigurationController.php": "9765cee7b1770f48fde4affcefc518a36576190bbaeac8bce079655353377c72",
"app/Http/Controllers/CompanyController.php": "5a8112e0f1535f90aeb8cf9785259da8d713d1bfcd3ad908aa3eabd161dba8a3",
"app/Http/Middleware/EnsureOrganizationAccess.php": "6782164f18f982fedb91dfb4fb2365895c757d776d7bf1728a91682fa95b8b02",
"app/Models/User.php": "835c119c097e7927136e8c7775ebb5ed677f964e766a213ec3c04e0b7388e740",
"app/Enums/PurchasingRole.php": "91da2d40bf11988fd6324aba8e5068e6be7c92222be31baf83844c134affe1c4",
"database/migrations/2026_10_30_000027_create_organization_access.php": "130d92ba8a093a8f77678e1ce4c1a90125bb996e88ed81633359d224fe77a853",
"database/seeders/DatabaseSeeder.php": "2aaea71ca2eba604abd5723e95cd1a99521c61b6f00b70dfedba246f3dcfae48",
"resources/js/pages/company/parameters.tsx": "c0760c50d100c8b2dfb3d3ad3b2a05fae14eed7900e95461c766a885d07677d1",
"resources/js/pages/company/setup.tsx": "614000ad22692ea3e707a00103227953d95f32fd7d9a7fc031bdbba7a1ccdb48",
"resources/js/lib/procurement-navigation.ts": "d7a42ec76e0166e4783bb496834325ad583b903ebf8c999c2ba5a2307431d56d",
"tests/Feature/OrganizationConfigurationTest.php": "eef7e82a6efc8ebad46cea8752861c01bec53c552874d72120a6e982f0114d73",
"scripts/organization-access-check.mjs": "1ca7cd2bdafa5f62afb26fa0b074d879273cda27c8350b968de54c8f53328bb0"
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"checked_at": "2026-10-30T08:28:25+00:00",
"migration": "2026_10_30_000027_create_organization_access",
"environment": "local evaluation 8005",
"backup_file": "C:\/laragon\/data\/sgf-tempo\/backups\/compras-organization-20261030-082820\/before.dump",
"backup_sha256": "5ae87fd10b3c7cde3021a8d0976f281a41db32d45e6d7f658de7e20e89e854f6",
"backup_bytes": 391786,
"restore_verified": true,
"existing_tables_preserved": 84,
"new_tables": {
"organization_access": 0,
"organization_profiles": 0,
"organization_memberships": 0
},
"accounts_or_grants_changed": false,
"other_migrations_applied": false,
"domain_installed": false
}
+9
View File
@@ -0,0 +1,9 @@
{
"checked_at": "2026-10-30T08:40:09+00:00",
"database": "disposable PostgreSQL",
"application_role_reused_without_privilege_change": true,
"result": "passed",
"test_file": "tests\/Feature\/OrganizationConfigurationTest.php",
"original_evaluation_untouched": true,
"database_removed": true
}
+50
View File
@@ -0,0 +1,50 @@
{
"date": "2026-10-30",
"base_commit": "0235c7609ed52345e91ae1a6b268e45e1eb991af",
"scope": "Menu routing inventory, central filtered procurement reports/CSV and existing individual report extended to receipt/invoice/external-payment records.",
"checks": {
"feature_passed": 14,
"assertions": 223,
"new_cases": 8,
"existing_report_regressions": 6,
"export_fixture_records": 207,
"menu_entries_across_roles": 102,
"roles": 6,
"types": "passed",
"lint": "passed",
"format": "passed",
"pint": "passed",
"phpstan": "passed after correcting the documented date cast type",
"build": "passed",
"new_module_http": 200,
"evaluation_entry_http": 200,
"runtime_manifest_files": 18
},
"source_sha256": {
"app/Http/Controllers/ProcurementReportController.php": "5161063f8f9684595c83300f22e6516e03700917e3b578651dee7254ee5f6a55",
"app/Services/ProcurementReviewReport.php": "1d5a41b59c471ad1db5e7f39eb15ac4b080239968341ccdf9a78ce17a301144c",
"app/Models/GoodsReceipt.php": "ec9b86ca625a8d4d8972ba1d91636bf37475f680f2212faa1e31c44709660a5a",
"routes/web.php": "1014ea42f0544428df49304c16cc55fb0632188ac0ad1940ba6a637b9f228be0",
"resources/js/lib/procurement-navigation.ts": "f250199564cd56e73ff5d5851a19dcbbe41df6da7b5c2cb9024c0965b8e087dc",
"resources/js/pages/reports/procurement.tsx": "a4ec4c51a8b7b8012852f1ad1d36ac931fec25c41a383c10a9449fddc3bd23d5",
"resources/js/pages/purchases/review-report.tsx": "8a5a02d99b5dd5d6f50a41e6e76711b15e578fd09dc039e2b6defc64d20abe04",
"tests/Feature/ProcurementReportsTest.php": "fc88ceef66d419ef72e9231e8273da20f2e1f400ad9610ad5ff85cadeb2259b2",
"scripts/menu-code-check.mjs": "8480ec5b1f3fd26aa7ff7cbc52c304a632b11e0eaa5a4cacadab0e119ceac236"
},
"menu_proof": "docs/proofs/menu-code-contract.json",
"build_log_local": "storage/logs/development-reports-build.log",
"build_log_sha256": "2709a9c383c3110469d6aa08a1efc8b821e24c3b7b8f9a5d3552e403ea9f5ad6",
"preservation": {
"migrations": 0,
"active_business_writes": 0,
"new_accounts_or_grants": 0,
"balance_or_tax_recalculation": false,
"remote_deployment": false
},
"limits": [
"Visual and manual printing not executed.",
"PostgreSQL snapshot clause implemented using the existing report pattern; new tests used isolated SQLite, not a PostgreSQL concurrency proof.",
"Supplier evaluations remain an interface proposal pending its operational implementation.",
"Not a consolidated debt/bank/accounting report; common settlements keep their own history."
]
}
@@ -0,0 +1,15 @@
{
"checked_at": "2026-10-30T07:33:29.638Z",
"base": "http://127.0.0.1:8005",
"report_path": "/fornecedores/avaliacoes/1/relatorio",
"revision_path": "/fornecedores/avaliacoes/2",
"create_submit_return_correct_approve": true,
"self_approval_refused": true,
"stale_write_refused": true,
"approved_edit_refused": true,
"prior_approved_revision_preserved": true,
"history_events": 6,
"synthetic_example_only": true,
"financial_commands": 0,
"visual_review": false
}
@@ -0,0 +1,16 @@
{
"checked_at": "2026-10-30T07:31:39+00:00",
"migration": "2026_10_30_000024_create_supplier_evaluations",
"environment": "local evaluation 8005",
"backup_file": "C:\/laragon\/data\/sgf-tempo\/backups\/compras-evaluations-20261030-073134\/before.dump",
"backup_sha256": "a919349718964be17fafbe4ec407dc7ec5b096c9c1f961db42cb34dfe3ba1123",
"backup_bytes": 364285,
"restore_verified": true,
"existing_tables_preserved": 81,
"new_tables": {
"supplier_evaluations": 0
},
"accounts_or_grants_changed": false,
"other_migrations_applied": false,
"domain_installed": false
}
+8
View File
@@ -0,0 +1,8 @@
{
"checked_at": "2026-10-30T07:34:52+00:00",
"environment": "local evaluation 8005",
"approved_update": "refused by PostgreSQL trigger",
"approved_delete": "refused by PostgreSQL trigger",
"approved_row_unchanged": true,
"probe_transactions_rolled_back": true
}
@@ -0,0 +1,24 @@
{
"checked_at": "2026-10-30T07:51:21.312Z",
"base": "http://127.0.0.1:8005",
"path": "/relatorios/medidas-fornecedores",
"readers": [
"admin",
"procurement",
"finance",
"department_head"
],
"denied": [
"requester",
"warehouse"
],
"total": 1,
"filtered_total": 1,
"filters_and_csv_match": true,
"csv_ignores_page": true,
"closed_not_overdue": true,
"invalid_range_refused": true,
"linked_evaluation_and_report": true,
"business_commands": 0,
"visual_review": false
}
@@ -0,0 +1,29 @@
{
"checked_at": "2026-10-30T07:52:09.806123+00:00",
"targeted_tests": 36,
"assertions": 542,
"new_report_test_cases": 6,
"csv_batch_test_rows": 207,
"phpstan_errors": 0,
"typescript": "passed",
"lint_and_format_targeted": "passed",
"pint_targeted": "passed",
"build": "passed",
"build_log": "storage/logs/supplier-improvement-report-build.log",
"menu_entries": 106,
"roles": 6,
"evaluation_catalog_pages": 22,
"schema_changes": false,
"business_commands": 0,
"domain_installed": false,
"visual_review": false,
"sources": {
"app/Http/Controllers/SupplierImprovementReportController.php": "fdaf0d5484e91481cdd5d676eb6951f8575bcc328961e993acf3290f5d8343cc",
"app/Models/SupplierImprovement.php": "762af10d9c14d70dd03e51ef6d9a80efe36171a9a0121a985ae0c17f06f03d4e",
"resources/js/pages/reports/supplier-improvements.tsx": "070d4c5eaf0a75439751504b21262df1c2f0e60d59e93538ff5d9c5959fe6398",
"resources/js/components/supplier-improvements.tsx": "7add7f51d907943682d3f132dc135f0e41b726dd67ddf2478852cf30ba5a21dd",
"resources/js/lib/procurement-navigation.ts": "a2a26bbd50c288e7cde589c7d8c2aaa3929f5ae20fc8b01c502db031d95085d4",
"tests/Feature/SupplierImprovementReportTest.php": "daf90f8da729a489bdc5116b318514c82a91b89ffbfb2c082b11457661544985",
"scripts/supplier-improvement-report-check.mjs": "60c57d36ebc83928198734573b5072240291504b57f2b88be3167f8f7c40c906"
}
}
@@ -0,0 +1,19 @@
{
"checked_at": "2026-10-30T07:41:16.109Z",
"base": "http://127.0.0.1:8005",
"evaluation_path": "/fornecedores/avaliacoes/1",
"measure_id": 1,
"create_retry_idempotent": true,
"missing_evidence_refused": true,
"self_closure_refused": true,
"planner_closure_refused": true,
"return_replan_correct_submit_close": true,
"stale_plan_refused": true,
"closed_edit_refused": true,
"parent_evaluation_unchanged": true,
"history_events": 7,
"report_includes_closed_measure": true,
"synthetic_example_only": true,
"financial_commands": 0,
"visual_review": false
}
@@ -0,0 +1,16 @@
{
"checked_at": "2026-10-30T07:40:33+00:00",
"migration": "2026_10_30_000025_create_supplier_improvements",
"environment": "local evaluation 8005",
"backup_file": "C:\/laragon\/data\/sgf-tempo\/backups\/compras-improvements-20261030-074028\/before.dump",
"backup_sha256": "57ae564afea50f15700003de3aeb7a8f2a9ecd72c76d545f9687cbe91d051811",
"backup_bytes": 375123,
"restore_verified": true,
"existing_tables_preserved": 82,
"new_tables": {
"supplier_improvements": 0
},
"accounts_or_grants_changed": false,
"other_migrations_applied": false,
"domain_installed": false
}
@@ -0,0 +1,8 @@
{
"checked_at": "2026-10-30T07:41:48+00:00",
"environment": "local evaluation 8005",
"closed_update": "refused by PostgreSQL trigger",
"closed_delete": "refused by PostgreSQL trigger",
"closed_row_unchanged": true,
"probe_transactions_rolled_back": true
}
+20
View File
@@ -0,0 +1,20 @@
{
"checked_at": "2026-10-30T07:57:43.108Z",
"base": "http://127.0.0.1:8005",
"evaluation_path": "/fornecedores/avaliacoes/1",
"response_id": 1,
"idempotent_creation": true,
"incomplete_submit_refused": true,
"stale_save_refused": true,
"self_decision_refused": true,
"return_correction_independent_conclusion": true,
"accepted_follow_up_required": true,
"concluded_edit_refused": true,
"parent_evaluation_unchanged": true,
"history_events": 7,
"individual_report": true,
"synthetic_example_only": true,
"external_messages_sent": 0,
"financial_commands": 0,
"visual_review": false
}
@@ -0,0 +1,16 @@
{
"checked_at": "2026-10-30T07:56:47+00:00",
"migration": "2026_10_30_000026_create_supplier_responses",
"environment": "local evaluation 8005",
"backup_file": "C:\/laragon\/data\/sgf-tempo\/backups\/compras-responses-20261030-075643\/before.dump",
"backup_sha256": "278b88b2f46d9b80df3de878c3964a7f7ab62022bd082ce6a26fdd0e2ccccb54",
"backup_bytes": 383864,
"restore_verified": true,
"existing_tables_preserved": 83,
"new_tables": {
"supplier_responses": 0
},
"accounts_or_grants_changed": false,
"other_migrations_applied": false,
"domain_installed": false
}
+8
View File
@@ -0,0 +1,8 @@
{
"checked_at": "2026-10-30T07:58:09+00:00",
"environment": "local evaluation 8005",
"decided_update": "refused by PostgreSQL trigger",
"decided_delete": "refused by PostgreSQL trigger",
"decided_row_unchanged": true,
"probe_transactions_rolled_back": true
}
+28
View File
@@ -0,0 +1,28 @@
{
"checked_at": "2026-10-30T07:59:03.931961+00:00",
"targeted_tests": 39,
"assertions": 505,
"new_test_cases": 11,
"phpstan_errors": 0,
"typescript": "passed",
"lint_format_pint_targeted": "passed",
"build": "passed",
"build_log": "storage/logs/supplier-responses-build.log",
"menu_entries": 106,
"roles": 6,
"installed_in_local_evaluation": true,
"domain_installed": false,
"external_messages_sent": 0,
"visual_review": false,
"source_hashes": {
"app/Models/SupplierResponse.php": "fc3877f2e787483cb56f31ca877eb2dc4f2d266c2eefa47dab1b1ae3ecf163fc",
"app/Services/SupplierResponseWorkflow.php": "772af0878f55cd9818cddec62aca3850ae4868c13acf86fe7dd003bac1fbb0b5",
"app/Http/Controllers/SupplierResponseController.php": "6960500484974f6ba2be1c63bb1156abde976c9e42837f6d3101a1f8a73092d3",
"app/Http/Controllers/SupplierEvaluationController.php": "2523eb6a858fdb62c494d74a8ce7988e7f29d4e0c51c53d3f0899de02987f17d",
"database/migrations/2026_10_30_000026_create_supplier_responses.php": "d414f637587088e589d886f792d678674337707e8391a0ab0fcf86dc9ebfaaf4",
"resources/js/components/supplier-responses.tsx": "ec0becd110e879f5929a7179c61352e1f31478674e654a41b1f85c64ecd1adf1",
"resources/js/pages/suppliers/evaluation.tsx": "509d27438a2a3b5337572357b9c69a2703201789ea75a487b36dfc301f65c8db",
"tests/Feature/SupplierResponseTest.php": "00faa0131f7335e1d2f18d781aa16cb914bf13acb1090ab902269f737b87c3c6",
"scripts/supplier-response-check.mjs": "31c7b741bbb0becc0426d0437a1d9853616199a86730831dc09b902e66f469c2"
}
}