Implementa recomendação formal com adopção e conferência independente

This commit is contained in:
2026-10-28 20:49:30 +02:00
parent 29cd859385
commit ee17ff7764
33 changed files with 2233 additions and 37 deletions
+98
View File
@@ -1,5 +1,103 @@
# Validação técnica do SGC — 28 de Outubro de 2026
## Incremento: recomendação formal antes da adjudicação
O âmbito de `docs/proposta-recomendacao.md` foi validado pelo utilizador e
implementado. A Administração configura uma política própria de recomendação
em `/politica-recomendacao`, com perfis Finanças e/ou chefia do departamento,
quantidade de pessoas distintas, activação e fundamento expressos. Não há
perfis ou quantidade inicialmente seleccionados. O máximo de 50 confirmações
é um limite técnico e não define um quórum empresarial.
Compras adopta a versão activa em `/requisicoes/{requisition}/recomendacao`,
num pedido aprovado que já adoptou o regime de admissão, antes de adjudicar.
Sem essa adopção, mantém-se o circuito existente. Uma versão geral nova ou
desactivada não reescreve processos; a desactivação impede novas adopções.
Trocar a versão aplicável exige adopção expressa e novas tentativas e
conferências. Uma política de admissão não autoriza, por si, a recomendação.
A recomendação exige matriz pronta, admissões confirmadas na base actual,
três fornecedores distintos elegíveis e duas avaliações por proposta, sem
alteração do cálculo ponderado existente. Compras, diferente do solicitante,
escolhe expressamente entre as maiores pontuações e fundamenta, incluindo em
empate. Não há desempate automático, dispensa do mínimo, escolha abaixo da
maior pontuação ou autorização para corrigir preços.
Cada tentativa preserva matriz, propostas/linhas, avaliações, referências e
bases das admissões/requisitos/análises, conferências, política e proponente.
Os dados de contacto ou documentos privados dos fornecedores não entram na
matriz preservada. Uma nova tentativa é imutável e não herda confirmações.
Uma devolução encerra a tentativa sem excluir o concorrente ou cancelar o
processo. Conferências repetidas idênticas são idempotentes e contam uma vez.
Identidades, empresa, perfil, departamento, segregação e conflitos são
revalidados dentro da transacção, após o bloqueio da empresa. As confirmações
anteriores são revalidadas até concluir o quórum; a história concluída conserva
a elegibilidade verificada na sua data, sem autorizar futuras operações com
perfil revogado. Uma pessoa não conta duas vezes após mudar de perfil.
Nos processos com adopção, a adjudicação só selecciona a mesma proposta de
uma recomendação confirmada na base actual. A referência e a base ficam
preservadas na adjudicação e na ordem; são revalidadas antes de aprovar/emitir.
Uma alteração de avaliação ou uma nova admissão pode invalidar a recomendação
mesmo mantendo preços e pontuações. Não se reescrevem adjudicações/ordens
anteriores. Existindo adjudicação, a adopção e as tentativas/conferências
ficam fechadas; alterações exigem o circuito de revisão já suportado, quando
autorizado. A repetição de uma emissão concluída devolve a mesma ordem.
Recomendar não movimenta orçamento nem substitui as aprovações do valor final,
regras de investimento, conflitos, facturas ou pagamentos.
As páginas usam o cabeçalho, rodapé, menus e identificação Sistema de Gestão
de Compras (SGC). Comparação, adjudicação e processo completo ligam ao novo
circuito; o processo apresenta os eventos de auditoria. O relatório de
conferência assinala a adopção e remete para o relatório preservado da
recomendação. A impressão autenticada em `/recomendacoes/{attempt}/imprimir`
mostra matriz/base originais, candidata, fundamentos, conferências, devoluções
e tentativas anteriores da mesma adopção, distinguindo dados históricos da
situação actual. As restantes adopções são consultáveis na página do processo.
O conteúdo é escapado e a resposta é `private, no-store`. Em PostgreSQL, a
impressão usa `REPEATABLE READ, READ ONLY`, relendo o operador; não cria
auditoria nem outros registos. Não é uma assinatura digital ou certificação
das evidências. A revisão visual da paginação continua pendente.
Resultado da bateria completa: **498 testes aprovados, 2 ignorados, 4141
asserções**. Inclui **17 cenários de recomendação**, com percurso genuíno até
adjudicação/emissão, empate e escolha da proposta empatada, escolha abaixo
da maior pontuação, matriz incompleta, admissão pendente/nova, mudanças de
base, devolução, repetição, perfis/departamentos revogados, mesma identidade
em perfis diferentes, política preservada, circuito sem adopção, segregação,
isolamento, relatório histórico sem escrita, escape de conteúdo e rollback
de auditoria de tentativa/conferência.
Passaram **8 cenários PostgreSQL**, com processos PHP e ligações independentes
e dois bloqueios simultâneos observados em cada cenário: mesma pessoa,
pessoas distintas, respostas opostas, perfil revogado, avaliação alterada,
nova adopção durante a espera, tentativas concorrentes e nova recomendação
versus adjudicação. Conferiram-se quórum, versões, auditoria e vínculo à
tentativa; a base de teste foi eliminada. O resultado está em
`docs/recomendacao-concorrencia-postgresql.json`. Não se afirma que foram
observadas todas as ordens possíveis de escalonamento ou testada corrida de
impressão/emissão nesta bateria.
Migração `000020`, lote **21**, aplicada em `compras_dev` após backup privado
de **326150 bytes**, verificado por restauro numa base separada e eliminada
depois da conferência. As **61 tabelas anteriores**, os registos de negócio
por projecção das colunas originais, restrições existentes, histórico de
migrações e `.env` foram preservados. São quatro tabelas novas e um campo
JSON anulável na adjudicação. As quatro tabelas reais de recomendação estão
vazias; não houve publicação de políticas, seeds ou compras reais. O relatório
sanitizado está em `docs/recomendacao-migracao-000020.json`; backup e manifesto
continuam privados e fora do Git. O rollback destrutivo automático é impedido.
Pint, PHPStan, TypeScript, build e lint/formatação do âmbito passaram. A
formatação global de `docs/compatibilidade.md`, alteração local alheia, continua
pendente e fora do commit, juntamente com as alterações de desenvolvimento e
continuidade preservadas. O navegador voltou a devolver `The browser access
host is unavailable`: permanecem pendentes revisão visual pública, autenticada,
de impressão e interacções no navegador. Validação operacional integral das
empresas, novas modalidades/métodos de avaliação, dispensas, comunicação
externa, cancelamento de ordens emitidas, estornos/devoluções e agregação por
projecto/fraccionamento não são declarados concluídos por esta entrega.
## Preparação: proposta de recomendação formal
Após `d020be5`, foi preparada `/proposta/recomendacao`, ligada ao menu