Files
compras/docs/validacao-tecnica.md
T

683 lines
44 KiB
Markdown

# 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
**Compras** apenas na consulta demonstrativa. Usa a navegação, cabeçalho e
rodapé partilhados do Sistema de Gestão de Compras (SGC), com dados fictícios
locais. Permite experimentar configuração de perfis/quantidade sem valores
iniciais, adopção explícita, matriz pronta/impedida, empate, escolha manual,
fundamento, conferências, devolução e histórico. A alteração de base ou de
política adoptada torna a tentativa anterior histórica. A impressão é
identificada como simulação. Não há persistência no navegador ou no servidor.
O circuito real proposto está em `docs/proposta-recomendacao.md`. A sua
implementação aguarda validação: política própria por empresa, adopção
opcional após regime de admissão, conferência independente e vínculo da
adjudicação à recomendação confirmada na mesma base. Não se publicaram
políticas, acrescentaram migrações ou alteraram regras de adjudicação,
orçamento, facturação ou pagamento. Os exemplos históricos não fornecem
parâmetros obrigatórios às aderentes.
Passaram **18 testes de entrada e consulta pública, com 290 asserções**,
incluindo as demonstrações de qualificação/admissão/recomendação, identidade
pública nula sem terminar a sessão existente e ausência de endpoint público
de escrita. PHPStan, Pint, TypeScript, build e lint/formatação do âmbito passaram.
Confirmado HTTP 200 com componente `preview/recommendation`, utilizador nulo,
apenas propriedades gerais da consulta pública e título inicial Sistema de
Gestão de Compras (SGC).
A bateria completa do negócio não foi repetida neste incremento de
interface; os resultados de 478 aprovados e 2 ignorados abaixo pertencem à
entrega anterior de admissão. As alterações locais dos três documentos de
continuidade foram preservadas; a formatação global de `docs/compatibilidade.md`
continua fora do âmbito desta entrega.
O controlo do navegador voltou a devolver `The browser access host is
unavailable`. A revisão visual e de interacção, incluindo impressão, continua
pendente e não é substituída pelos testes automatizados.
## Incremento: admissão e exclusão por adopção expressa
O utilizador validou `docs/proposta-admissao-exclusao.md`. A Administração da
empresa pode registar versões da política em `/politica-admissao`, indicando
expressamente perfis de conferência (Finanças e/ou chefia do departamento),
quantidade de pessoas distintas e fundamento. Não há quantidade nem perfis
pré-seleccionados. O máximo de 50 no formulário é um limite técnico, não uma
regra empresarial. A disponibilidade de pessoas elegíveis deve acompanhar a
configuração da empresa.
Compras adopta a política activa em `/requisicoes/{requisition}/admissao`,
num pedido aprovado e antes de adjudicar. Sem adopção, mantém-se o circuito
existente. A política adoptada fica preservada; desactivar a política geral
impede novas adopções e não reescreve processos existentes. Aplicar outra
versão exige nova adopção expressa e novas decisões/conferências. Não há
regresso implícito ao circuito sem admissão.
Compras propõe admitir, excluir ou pedir esclarecimento interno por proposta,
com fundamento e base preservada de requisitos, propostas e últimas análises
de cada analista. O proponente não pode ser o solicitante. Admitir exige
análise existente sem pendências, respostas em falta ou divergências e com
todos os requisitos obrigatórios cumpridos. Um requisito facultativo
uniformemente não cumprido ou não aplicável não constitui, por si, uma
dispensa de requisito obrigatório.
Os conferentes são pessoas distintas, da mesma empresa, com perfil e
departamento ainda elegíveis, diferentes do solicitante e do proponente,
sem conflito de interesses. Uma conferência repetida com conteúdo idêntico
é idempotente e conta uma vez; outra resposta não reescreve a assinatura.
Uma devolução termina a tentativa sem excluir automaticamente o concorrente.
Corrigir cria nova tentativa, sem copiar confirmações. Antes de concluir o
quórum, as confirmações anteriores são revalidadas; uma decisão concluída
conserva a elegibilidade verificada na sua data. Uma alteração de base,
tentativa ou adopção invalida a utilização de conferências antigas.
A comparação usa o cálculo ponderado existente. Nos processos que adoptaram
o regime, só propostas com admissão confirmada e actual são elegíveis.
Mantêm-se os mínimos existentes de três fornecedores elegíveis e duas
avaliações por proposta, sem dispensas novas. A base da admissão fica na
adjudicação e na ordem; é revalidada antes de aprovar/emitir. Não se aplicam
regras retroactivas a adjudicações/ordens existentes nem se reemitem ordens
já emitidas. A admissão, sozinha, não movimenta orçamento, facturas ou
pagamentos. O relatório de conferência identifica o regime adoptado; o
processo completo liga às decisões e apresenta os eventos de auditoria.
As novas páginas usam o cabeçalho, rodapé e navegação partilhados. O título
HTML inicial foi corrigido de `ProcuraFlow` para **Sistema de Gestão de
Compras (SGC)**, sem modificar `.env`. O nome visível das novas páginas
segue a mesma identificação.
Migração `000019`, lote **20**, aplicada em `compras_dev` após backup privado
de **306342 bytes**, verificado por restauro numa base separada e eliminada
após a conferência. Foram verificadas **57 tabelas anteriores**, registos de
negócio por projecção das colunas originais, restrições existentes, histórico
de migrações e integridade de `.env`. A migração acrescenta quatro tabelas e
um campo JSON anulável na adjudicação. As quatro tabelas reais estão vazias;
nenhuma política foi publicada por conta das aderentes. O relatório sanitizado
está em `docs/admissao-migracao-000019.json`; o backup/manifesto permanecem
privados, fora do Git. O rollback automático destrutivo está impedido.
Os seis cenários em `docs/admissao-concorrencia-postgresql.json` passaram
com ligações/processos PHP independentes e dois bloqueios simultâneos
observados no PostgreSQL: mesma pessoa, pessoas distintas, respostas
opostas, perfil revogado, base alterada e nova adopção durante a espera.
Conferências, quórum e auditoria foram conferidos; a base de teste foi
eliminada. Não se apresenta esta bateria como um teste de corrida de emissão.
Resultado final do servidor: **478 testes aprovados, 2 ignorados e 3887
asserções**. A bateria inclui os 13 cenários novos de admissão e quatro de
integração real com adjudicação/emissão: base preservada na ordem,
pontuações mantidas, exclusão e mínimo de fornecedores, alterações antes da
emissão, repetição de emissão e adjudicação anterior sem adopção retroactiva.
Os 94 testes dos módulos directamente relacionados também passaram após a
integração do histórico e do campo preservado na ordem. PHPStan e Pint
passaram. TypeScript, build e lint/formatação dos ficheiros deste âmbito
passaram; a verificação global continua limitada pela formatação alheia
indicada abaixo. HTTP 200 confirmado para início, demonstração de admissão
e login, todos com o título inicial Sistema de Gestão de Compras (SGC).
O navegador continua a devolver `The browser access host is unavailable`.
Permanecem pendentes a revisão visual pública, autenticada e de impressão e
as interacções no navegador. As verificações HTTP e automatizadas não a
substituem. Recomendação formal em etapas, excepções/dispensas, comunicação
externa e cancelamento de ordens emitidas ficam fora desta entrega.
Os três documentos locais de continuidade foram preservados sem os incluir
no commit. A formatação global de `docs/compatibilidade.md`, alteração alheia,
continua pendente; a verificação de âmbito exclui esse ficheiro.
## Incremento: relatório de conferência e impressão
As propostas e a visão única do processo incluem o acesso a
`/requisicoes/{requisition}/relatorio`. O relatório reúne identificação do
pedido, matriz comparativa actual, última versão dos requisitos documentais,
último registo de cada analista por proposta e referências à acta,
adjudicação e ordem existentes. Não é uma recomendação formal nem uma nova
etapa obrigatória da compra.
As pontuações, ponderações e impedimentos são devolvidos pelo método de
comparação existente, sem recalcular outro modelo ou classificar por menor
preço. Uma matriz incompleta não apresenta maior pontuação como recomendação;
empates da matriz pronta são identificados sem desempate automático. As
propostas são apresentadas na ordem de registo. Valores de adjudicação e
ordem preservados são mostrados separadamente dos preços actuais.
Os resultados documentais pertencem à base preservada na versão dos
requisitos. Se essa base divergir da actual, o relatório assinala-o e mantém
nomes, referências e análises da versão original. Respostas por analisar e
propostas sem registos não são apresentadas como análise concluída. Não há
consolidação por maioria, quórum presumido, dispensa automática de requisito,
admissão/exclusão ou autorização financeira.
Em PostgreSQL, o relatório é construído numa transacção própria de leitura,
`REPEATABLE READ, READ ONLY`, sem criar auditoria ou outros registos de
negócio. O operador é relido antes de consultar dados, respeitando empresa,
departamento e perfis autorizados para propostas. Não são devolvidos dados
bancários, contactos, beneficiários ou documentação privada dos fornecedores.
A resposta usa `private, no-store` e histórico Inertia cifrado.
A impressão usa os dados já carregados no ecrã, sem nova consulta ao servidor
ao imprimir. Apresenta instante da consulta, fuso Africa/Johannesburg (UTC+2),
utilizador e identificação do processo. Actualizar a página é uma consulta
nova. O relatório não fica guardado como versão assinada, decisão ou prova
de validação de evidências. A impressão está preparada em A4 horizontal,
com cabeçalhos de tabela repetíveis, mas a revisão visual continua pendente.
Resultado: **461 testes aprovados, 2 ignorados, 3698 asserções**. Sete testes
novos verificam ausência de decisões inventadas e de escritas, dados antigos
separados dos actuais, registos independentes por analista, restrições de
perfil/empresa/departamento, revalidação do operador, minimização de dados e
empates/valores preservados de ordens efectivamente emitidas pelo circuito.
PHPStan, Pint, TypeScript, build e lint dos ficheiros alterados passaram.
Três verificações PostgreSQL passaram numa base temporária exclusiva:
consistência da consulta enquanto outra ligação corrige análise, altera
proposta e cria requisitos novos; perfil revogado depois de carregar o
operador; departamento alterado antes de iniciar a leitura. Foi observada a
espera concorrente por bloqueio consultivo. O primeiro cenário verificou
explicitamente `repeatable read` e `read_only=on` e devolveu apenas o estado
original, sem misturar versões posteriores. Não foram criados eventos de
negócio pelo leitor e a base temporária foi eliminada. Ver
`relatorio-concorrencia-postgresql.json`.
Não houve migração nem escrita na base de negócio. As alterações locais de
`compatibilidade.md`, `desenvolvimento.md` e `orientacoes-continuidade.md`
foram preservadas e excluídas desta entrega. A formatação global desse
primeiro documento permanece fora do âmbito. Revisão visual, decisão formal
de admissão/exclusão, recomendação formal e cancelamento de ordens emitidas
continuam pendentes nos respectivos âmbitos.
O navegador voltou a devolver `The browser access host is unavailable` nesta
verificação. Testes HTTP, compilação e a opção de imprimir não substituem a
revisão visual pública, autenticada e de impressão.
## Incremento: qualificação documental validada
O responsável validou o primeiro âmbito documental de
`proposta-qualificacao-propostas.md`. Nas propostas existe o acesso
«Qualificação documental», em `/requisicoes/{requisition}/qualificacao`.
Compras define requisitos por processo com descrição, categoria e indicação
de obrigatoriedade segundo a regra desse processo. Não há certificados,
montantes mínimos ou requisitos predefinidos importados dos exemplos.
Ao guardar os requisitos fica preservada uma versão imutável e a base das
propostas. Uma alteração cria outra versão, conservando os dados anteriores.
Compras, Finanças e chefia autorizada analisam, desde que o analista seja
distinto do solicitante e cumpra o âmbito departamental e os conflitos
existentes. Administração consulta. Cada utilizador conserva o seu próprio
registo por proposta e versão dos requisitos; não substitui o de outro analista.
Cada registo contém uma resposta para todos os requisitos: por analisar,
cumprido, não cumprido ou não aplicável. Resultados preenchidos exigem
fundamento; cumprido/não cumprido exigem também referência de evidência.
Não aplicável exige justificação e não dispensa automaticamente um requisito
obrigatório. Uma correcção acrescenta uma versão da análise e exige o
identificador do último registo do próprio analista.
Bases alteradas ou requisitos ultrapassados não aceitam novas análises.
Os registos antigos continuam consultáveis com indicação histórica, sem
copiar respostas para outra base. Os requisitos e a base são conferidos
novamente dentro de uma transacção que bloqueia primeiro a empresa e
revalida o operador. Após adjudicação, ou fora do estado aprovado do pedido,
os registos anteriores permanecem em consulta, sem novas escritas.
O módulo não decide admissão/exclusão e não usa os resultados para alterar
elegibilidade, pontuações, ordenação ou emissão. O método de comparação
permanece intacto; continuam aplicáveis os conflitos existentes. Um teste
de integração regista «não cumprido» num requisito obrigatório e confirma
que a matriz é idêntica e que uma adjudicação antes elegível segue o circuito
normal até à emissão, sem criar uma regra automática adicional.
Consulta exige os mesmos perfis e visibilidade das propostas, respeitando
empresa e departamento. Solicitantes e Armazém não ganham acesso. Respostas
usam `private, no-store` e histórico Inertia cifrado. O histórico é paginado
e o último registo de cada analista/proposta é obtido separadamente, sem
confundir uma página histórica com a versão actual de trabalho. A visão única
inclui ligação e eventos conforme o perfil.
A migração aditiva 000018 foi aplicada no batch 19, após backup privado de
296378 bytes e restauro verificado de 55 tabelas. Dados anteriores, restrições
e `.env` foram preservados; as tabelas de requisitos e análises ficaram
vazias na base de negócio. Ver `qualificacao-migracao-000018.json`. Backup e
manifesto permanecem fora do Git.
Seis cenários PostgreSQL passaram com duas ligações e duas esperas simultâneas
de bloqueio: requisitos concorrentes, duas escritas do mesmo analista,
analistas distintos, base alterada, perfil revogado e requisitos novos em
disputa com uma análise da versão anterior. Não houve substituição de
analistas, mistura de bases ou duplicação de versões. A base exclusiva de
testes foi eliminada. Ver `qualificacao-concorrencia-postgresql.json`.
As alterações locais em `compatibilidade.md`, `desenvolvimento.md` e
`orientacoes-continuidade.md` foram preservadas e não fazem parte deste
incremento. A revisão visual permanece pendente: o navegador devolveu
`The browser access host is unavailable`. Admissão/exclusão formal, circuitos
de conferência/quórum, novos métodos de avaliação, certificação de evidências
e cancelamento de ordens emitidas continuam sem activação neste âmbito.
Resultado deste incremento: **454 testes aprovados, 2 ignorados e 3601
asserções**. São 11 testes novos: dez específicos do módulo e um de integração
com adjudicação/emissão. PHPStan, Pint, TypeScript, build e lint/formatação
dos ficheiros alterados passaram. A formatação global continua a assinalar
`compatibilidade.md`, já modificado fora desta entrega; não foi alterado nem
incluído no commit. Os dois testes ignorados continuam condicionados a MFA.
## Incremento: sessão de abertura e actas por versão
Nas propostas existe o acesso «Sessão de abertura e actas», em
`/requisicoes/{requisition}/abertura`. Compras pode registar uma sessão num
pedido aprovado, antes de existir adjudicação. O registo é opcional; não
introduz um concurso público obrigatório, um número mínimo de propostas,
um júri obrigatório ou um novo circuito financeiro em todas as empresas.
O operador declara referência, local, data/hora, fuso horário, intervenientes,
qualidade em que participam, observações e referências de anexos, selecciona
as propostas e confirma a conferência. As propostas seleccionadas são
copiadas no servidor com fornecedor, referência, valores e linhas; não se
aceitam valores de uma acta enviados pelo cliente. Uma impressão autenticada
usa a cópia preservada, incluindo nome da empresa e autor do registo.
Não contém pontuações ou uma recomendação de adjudicação.
As datas são interpretadas no fuso declarado, guardadas em UTC e apresentadas
nesse fuso. Este primeiro âmbito suporta Africa/Johannesburg, Africa/Maputo e
UTC; a interface começa pelo fuso do contexto local. Sessões futuras e prazo
de apresentação posterior à sessão são recusados. O prazo é declarado; não
se presume que a data de criação de uma cotação no SGC seja a sua data real
de entrega pelo concorrente.
Correcções criam versões novas, com fundamento e referência à versão anterior
na auditoria. As versões guardadas não são editadas ou eliminadas pela
aplicação. Uma base de propostas alterada desde a consulta ou uma versão
anterior desactualizada é recusada. A interface permite conferir a base
actualizada sem apagar os textos introduzidos. Propostas posteriormente
adicionadas ou alteradas não entram nas actas anteriores; uma divergência é
assinalada na consulta. Não se alterou a política de recepção de cotações.
Os nomes dos intervenientes são declarações, não assinaturas digitais
verificadas. A impressão disponibiliza espaço para assinaturas manuscritas.
As referências de anexos não representam carregamento ou validação de
ficheiros. Registar uma acta não avalia propostas, não certifica a realização
da sessão, não adjudica, não reserva orçamento e não autoriza compras.
Alterações documentais depois da adjudicação exigem um circuito futuro;
este incremento conserva as actas anteriores para consulta, sem as reescrever.
Administração, Compras, Finanças e chefias autorizadas consultam; apenas
Compras regista. Mantêm-se isolamento entre empresas, âmbito departamental,
verificação de conflitos e revalidação do operador dentro da transacção.
Solicitantes e Armazém não ganham acesso a preços ou actas. Consulta e
impressão usam `private, no-store`; o histórico Inertia é cifrado. Os registos
aparecem nos documentos e eventos da visão única conforme o perfil.
A migração aditiva 000017 foi aplicada no batch 18 após backup privado de
291397 bytes e restauro verificado de 54 tabelas. Dados anteriores,
restrições e `.env` foram preservados; não foram criadas actas fictícias na
base de negócio. Ver `abertura-migracao-000017.json`. Backup e manifesto
ficam fora do Git.
Resultado: **443 testes aprovados, 2 ignorados, 3431 asserções**, incluindo
11 testes novos de snapshots, versões, base desactualizada, impressão,
fuso horário, validação, segregação, empresas/departamentos, revogação de
perfil, rollback de auditoria, imutabilidade e escape de texto. Quatro
cenários PostgreSQL passaram, cada um com duas ligações e duas esperas de
bloqueio simultâneas: versões iniciais concorrentes, correcções concorrentes,
perfil revogado e base alterada durante a espera. A base temporária exclusiva
foi eliminada. Ver `abertura-concorrencia-postgresql.json`.
PHPStan, Pint, TypeScript e build passaram. A revisão visual da interface e
da impressão permanece pendente pela indisponibilidade do navegador. Não se
declara validação operacional de concursos, assinaturas, orçamentos ou regras
de cancelamento de ordens emitidas. Publicação de concursos, propostas
seladas, qualificação por etapas e novos métodos de avaliação continuam
pendentes; os exemplos locais não os tornam obrigações universais.
## Incremento: planeamento por empresa
O menu Compras inclui `/planeamento`. Administração e Compras registam itens
para bens, obras, serviços ou consultoria, seleccionam departamento e
responsável da própria empresa e definem marcos com nomes e datas próprios.
Estas naturezas são classificações de acompanhamento, não novas modalidades
de contratação. Não existem marcos obrigatórios ou valores financeiros
predefinidos, e o plano não cria reservas ou aprovações.
Uma compra pode ser planeada antes da requisição. Administração ou Compras
podem depois ligar uma requisição visível, do mesmo departamento, com
fundamento. A ligação é única e não substitui uma anterior. A visão única do
processo oferece um atalho para o item do plano quando o utilizador também
tem acesso a esse item; o filtro `?item=` conserva as mesmas permissões.
O responsável atribuído regista ou corrige datas realizadas e indica o
fundamento. Administração e Compras também podem rever datas previstas e
reatribuir responsáveis. Datas realizadas futuras são recusadas. Todas as
alterações guardam autor, valores anteriores, novos valores e fundamento,
com versão optimista e bloqueio da empresa para impedir sobrescrita silenciosa.
Uma data realizada é uma declaração de acompanhamento: não confirma entregas,
facturas, pagamentos ou execução integral da compra.
Administração, Compras e Finanças consultam o plano da empresa. Chefias
consultam o departamento ou itens de que são responsáveis; os restantes
perfis consultam apenas os itens atribuídos. Só Administração e Compras
definem o plano e consultam o histórico geral. Finanças não ganha permissão
de edição por ser leitor; um responsável pode registar datas realizadas no
seu item. Uma atribuição não dá acesso à requisição ou aos seus documentos
se as permissões normais não o permitirem. Dados de outras empresas, opções
de equipa e histórico geral não são expostos a utilizadores sem acesso.
A migração aditiva 000016 foi aplicada no batch 17 após backup privado de
281059 bytes e restauro verificado de 52 tabelas. Dados anteriores, restrições
e `.env` foram preservados. As duas tabelas novas ficaram vazias: não foram
criadas compras ou datas fictícias na base de negócio. Ver relatório
`planeamento-migracao-000016.json`; os ficheiros privados de recuperação
permanecem fora do Git.
Treze testes específicos verificam criação, marcos livres, datas realizadas,
reprogramação e versão, rejeição de datas futuras e ausência de fundamento,
perfis, empresas, departamentos, ligação única e posterior, reatribuição,
revogação de perfil, rollback de auditoria e acesso ao processo ligado.
Quatro cenários PostgreSQL com duas ligações e duas esperas simultâneas
passaram: datas concorrentes, responsáveis concorrentes, marcos duplicados e
perfil revogado enquanto os operadores aguardam o bloqueio. Cada escrita
aceite produz um único evento; a base temporária exclusiva foi eliminada.
Ver `planeamento-concorrencia-postgresql.json`.
O histórico apresenta os 50 eventos de planeamento mais recentes da empresa.
Título, natureza e departamento são definidos na criação; as revisões deste
âmbito abrangem responsável, ligação posterior e datas dos marcos. Não há
eliminação de itens ou marcos. Estimativas financeiras do plano, aprovações
do plano, importação dos exemplos, alertas automáticos, dependências entre
marcos, actas e novas modalidades continuam fora deste primeiro incremento.
A revisão visual continua pendente, devido à indisponibilidade do navegador.
Resultado deste incremento: **432 testes aprovados, 2 ignorados, 3336 asserções**;
**4 cenários concorrentes PostgreSQL aprovados**. PHPStan, Pint, TypeScript,
lint/formatação e build passaram. O navegador voltou a responder
`The browser access host is unavailable`. Não se declara revisão visual
concluída nem validação operacional de regras ou orçamentos das empresas.
## Incremento: visão única do processo de compra
O detalhe de uma requisição inclui o acesso «Ver processo completo», em
`/requisicoes/{requisition}/processo`. A página reúne as etapas já suportadas,
os responsáveis por função, decisões com autores e datas, atalhos para os
registos e o histórico permitido ao perfil. Inclui ligação entre processos
originais e revisões quando ambos são visíveis ao utilizador. O cabeçalho e
rodapé partilhados mantêm-se neste ecrã.
Esta é uma consulta dos registos existentes. Não cria etapas obrigatórias,
aprovações, documentos, reservas ou pagamentos. Planeamento, acta de abertura,
qualificação específica do concurso e relatório por etapas aparecem apenas
como funcionalidades futuras, sem se presumirem aplicáveis a todas as compras.
Os quatro exemplos locais continuam a ser referências, não regras impostas.
O estado da requisição é separado dos restantes estados. Existência de propostas
não significa elegibilidade; histórico técnico não garante validade da base
actual; existência de lançamentos não certifica o orçamento; recepções podem
ser parciais; registo de factura não equivale a validação; pagamentos externos
confirmados não comprovam liquidação integral nem executam transferências.
A rota exige autenticação, empresa configurada e visibilidade da requisição.
Solicitantes não obtêm detalhes de propostas, adjudicações, ordens ou finanças
por esta consulta. Chefias conservam o âmbito departamental; Finanças e
Administração consultam os resumos financeiros. O Armazém não obtém acesso a
requisições de terceiros por esta nova rota. Documentos e eventos são filtrados
no servidor, sem snapshots privados, anexos ou dados bancários. A resposta usa
`private, no-store` e histórico Inertia cifrado.
Cinco testes específicos cobrem registos e estados parciais, ocultação de
compras/finanças ao solicitante, propriedade e departamento, isolamento entre
empresas e convidados, actualização da validação de factura e leitura sem
novos eventos de auditoria. Não há migração nem alteração de dados de negócio.
TypeScript, lint/formatação, build, PHPStan e Pint passaram.
Bateria completa deste incremento: **419 testes aprovados, 2 ignorados,
3180 asserções**. Os testes ignorados continuam condicionados à activação de
MFA; não são apresentados como aprovados. Os seis cenários concorrentes do
incremento anterior não foram repetidos, pois esta entrega não altera as
operações transaccionais que verificam.
O navegador voltou a devolver `The browser access host is unavailable`.
A revisão visual pública, autenticada e de impressão continua pendente;
testes HTTP e compilação não a substituem. O cancelamento de ordens emitidas
continua sujeito à proposta de regras ainda não validada.
## Incremento: navegação partilhada e revisão sem ordem emitida
O cabeçalho e rodapé do SGC são partilhados pelo acesso autenticado e pela
consulta pública, incluindo a proposta `/proposta/principal`. Os dropdowns
agrupam Compras, Finanças, Armazém e Gestão; preservam os acessos anteriores,
o menu da conta e a localização do ecrã. As opções autenticadas respeitam o
perfil; a autorização continua a ser verificada no servidor. A referência
visual foi consultada apenas em leitura no InvesteMoz: preto `#090909`,
vermelho `#ed1c24`, menus brancos. O projecto InvesteMoz não foi alterado.
Em `/revisao-compras`, cada empresa pode propor uma política datada para
cancelar adjudicações sem ordem emitida. Não existe activação por defeito.
A implementação usa duas assinaturas administrativas distintas do proponente
para publicar a regra e uma decisão Financeira independente para cada
cancelamento pedido por Compras. Estas são opções deste circuito implementado;
não constituem valores financeiros predefinidos para as empresas.
Um cancelamento pendente bloqueia novas decisões finais e emissão. Aprovação
encerra a adjudicação e requisição originais, mantendo cotações e decisões;
liberta apenas reserva não comprometida. Repetições idênticas não duplicam
lançamentos. Rejeição mantém a compra original. Uma decisão é imutável e,
neste primeiro âmbito, existe no máximo um pedido de cancelamento por
adjudicação, incluindo pedidos rejeitados. Uma alteração da política bloqueia
a aprovação de pedidos antigos; a rejeição continua disponível para retomar
o processo. Ordens emitidas e compromissos financeiros impedem este circuito.
Só o solicitante original, ainda no mesmo departamento, pode preparar um
único novo rascunho ligado ao cancelamento aprovado, com nova data e
justificação. Copiam-se artigos e estimativas, sem decisões, cotações,
validações técnicas ou reserva automática. O novo pedido segue o circuito
normal, incluindo validação técnica quando aplicável. As restrições únicas
de adjudicação e ordem por requisição foram conservadas.
A migração aditiva 000015 foi aplicada no batch 16 após backup privado de
259925 bytes e restauro verificado de 48 tabelas numa base temporária.
Dados de negócio anteriores, restrições e `.env` foram preservados; não foram
criadas políticas ou operações fictícias na base real. Ver relatório
`revisao-migracao-000015.json`. O backup e o manifesto ficam fora do Git.
Sete cenários novos verificam política obrigatória, bloqueio pendente,
rejeição e retoma, histórico e rascunho único, recusa após emissão,
segregação após mudança de perfil, libertação única da reserva e rollback
conjunto quando falha a auditoria. A validação concorrente deste circuito
foi acrescentada numa base PostgreSQL temporária: **6 cenários aprovados**,
cada um com duas ligações independentes e duas esperas de bloqueio simultâneas.
Abrange decisão repetida, decisões opostas, revisão repetida, emissão com
cancelamento pendente, emissão repetida e emissão em disputa com um pedido
de cancelamento. Nos três cenários de emissão, a adjudicação é seleccionada
e aprovada pelos serviços reais da aplicação. O controlo positivo emite uma
única ordem e um único compromisso; na disputa, apenas uma operação avança.
Os quatro primeiros cenários verificam também reserva e revisão únicas.
O relatório é `revisao-concorrencia-postgresql.json`; a base exclusiva de
testes foi eliminada no fim. Não houve alterações à base de negócio.
Resultado do incremento: **414 testes aprovados, 2 ignorados, 3099 asserções**.
PHPStan e Pint passaram; TypeScript, lint/formatação e build passaram.
As quatro verificações HTTP da proposta, requisições públicas, reforços e
aparência responderam 200. Estes pedidos HTTP não constituem revisão visual.
A revisão visual pública, autenticada e de impressão continua pendente:
o acesso ao navegador permanece indisponível. Compilação e testes não a
substituem. Ordens emitidas, estornos, notas de crédito, devoluções e
validação operacional das regras de cada empresa continuam fora deste âmbito.
Esta revisão cobre os módulos implementados e as pendências documentadas no
repositório. Não equivale a validação operacional integral ou certificação de
todos os requisitos do sistema. Valores e políticas reais continuam a pertencer
a cada empresa; nenhum foi criado nesta revisão.
## Correcções verificadas
- Operações que verificavam o perfil antes de esperar pelo bloqueio da empresa
passam a recarregar e bloquear o utilizador dentro da transacção. Abrange
facturas, dados bancários, stock, recepções, requisições, adjudicação, emissão,
validação técnica e dotação inicial. Mudança de perfil ou de empresa durante
a espera não é autorizada pelo perfil antigo em memória.
- Requisição volta a verificar departamento e centro de custo ao guardar e o
departamento do solicitante ao submeter. Decisões departamentais usam o perfil
actual; revisão técnica e aprovadores finais são bloqueados durante as
verificações transaccionais.
- Dotação pendente mostra **zero disponível e zero aprovado**, preservando o
valor proposto e o histórico. O servidor já bloqueava a reserva; a interface
deixou de apresentar verba proposta como disponível.
- Teste da página de segurança com MFA desligado deixou de ser indevidamente
ignorado. Textos dessa página e confirmação de alteração de palavra-passe
traduzidos para português. Nenhuma palavra-passe real foi alterada.
- Configuração de fontes passou a declarar desactivada a optimização opcional
que já não era gerada por ausência de `fontaine`. Mantém Instrument Sans e
elimina o aviso de dependência opcional sem instalar pacotes novos.
## Resultados
**407 testes aprovados, 2 ignorados, 2.964 asserções** na suite completa SQLite
em memória. Os dois ignorados dependem de MFA activado, actualmente desligado;
não são apresentados como funcionalidades validadas. PHPStan, Pint, TypeScript,
compilação e formatação/lint frontend verificados no fecho.
**32 cenários concorrentes PostgreSQL aprovados**, todos em bases exclusivas
de teste, eliminadas no final:
| Área | Cenários | Evidência |
| ------------------------------ | -------: | ------------------------------------------------------ |
| Recepções | 4 | [Relatório](recepcao-concorrencia-postgresql.json) |
| Stock e peças | 7 | [Relatório](stock-concorrencia-postgresql.json) |
| Reservas e compromissos | 5 | [Relatório](orcamento-concorrencia-postgresql.json) |
| Facturas e consumo | 3 | [Relatório](facturas-concorrencia-postgresql.json) |
| Dados bancários | 3 | [Relatório](bancos-concorrencia-postgresql.json) |
| Pagamentos externos | 3 | [Relatório](pagamentos-concorrencia-postgresql.json) |
| Reforços | 3 | [Relatório](reforcos-concorrencia-postgresql.json) |
| Regras de investimento | 3 | [Relatório](investimento-concorrencia-postgresql.json) |
| Perfil revogado durante espera | 1 | [Relatório](autorizacao-concorrencia-postgresql.json) |
O último ensaio bloqueia a empresa, observa duas ligações simultaneamente à
espera e revoga os dois perfis de Armazém antes de libertar o bloqueio. Os dois
pedidos pelo kernel HTTP retornam **403**; não criam recepções nem movimentos.
Os restantes ensaios verificam saldos, duplicações e integridade conforme os
respectivos relatórios. Não são testes de carga ou uma validação de todos os
possíveis cruzamentos concorrentes do sistema.
Sem migrações, seeds, criação de contas, alteração de configuração de ambiente
ou escritas de negócio na base real nesta revisão. Acesso HTTP pode actualizar
sessões. Nenhuma autorização de compra ou transferência bancária foi emitida.
## O que permanece por tratar
| Pendência | Situação |
| -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| Revisão visual pública, autenticada e impressão | Bloqueada pelo acesso ao navegador; testes HTTP não a substituem. |
| MFA obrigatório e ciclo completo de acessos | Não implementados/activados; dois testes condicionais continuam ignorados. |
| Revisão/cancelamento de adjudicações e ordens | Cancelamento de adjudicações sem ordem implementado no incremento abaixo; cancelamento de ordens emitidas continua ausente. |
| Reversões, estornos, notas de crédito e devoluções | Funcionalidades ainda não implementadas; não se apagam lançamentos existentes. |
| Regras empresariais | Escalões provisórios, regras fiscais, validade/levantamento de conflitos e excepções exigem decisão da empresa. |
| Investimento agregado e fraccionamento | Apenas tecto por processo suportado; sem agregação/detecção automática. |
| Outras etapas do roteiro | Multimoeda, reposição, tolerâncias/investigação de inventários, manutenção/activos e requisitos de subscrição/hosting continuam no roteiro. |
| Controlos operacionais | Carga, permissões contra SQL administrativo, retenção e recuperação por empresa ainda exigem validação própria. |
Estas pendências não foram marcadas como concluídas por compilação ou testes
funcionais. O próximo incremento de revisão/cancelamento deve definir e guardar
uma política explícita por empresa, conservar o passado e exigir novas decisões
para processos revistos; não pode autorizar por omissão a alteração de ordens
emitidas ou a libertação de compromissos já consumidos.
Verificação HTTP local no fecho: **18 páginas públicas responderam 200** e
**13 rotas protegidas responderam 302 sem sessão**. O navegador voltou a devolver
`The browser access host is unavailable`; a revisão visual continua pendente.