Implementa recomendação formal com adopção e conferência independente
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user