Files
SGF/docs/WORKSHOP_STOCK_PROPOSAL_CLOSURE.md
2026-11-02 20:29:34 +02:00

6.8 KiB

Oficina → Stock: retirada e recusa de propostas

02/11/2026 — WORKSHOP-STOCK-PROPOSAL-CLOSURE-SIM-v1. Implementação local sintética que completa o ciclo de propostas de saída, associação a entrega, repartição e devolução. Continua o ciclo de material, preservando os efeitos físicos e a devolução nativa anterior.

Problema resolvido

Uma proposta desactualizada podia permanecer indefinidamente pendente. Agora o preparador pode retirá-la e outra identidade com competência de confirmação pode recusá-la, com fundamento individual. A página mostra antecipadamente efeito físico zero, nenhuma associação/libertação de origem e necessidade de nova conferência para tratar novamente a origem. A prévia original permanece arquivada; o encerramento não executa a quantidade que ela mostrava.

Reutilizam-se os direitos existentes: workshop_stock.prepare para retirar a própria proposta; workshop_stock.confirm para recusar proposta de outro preparador. Os direitos de consulta Oficina/Stock e o contexto da unidade continuam necessários. Não foi criado ou concedido um novo direito real.

Comandos, decisões e concorrência

POST /api/workshop-stock/{id}/withdraw e .../{id}/reject recebem state_version, source_hash e reason. A proposta original é imutável: a revisão pendente é 1 e a decisão terminal tem revisão 2. Após bloquear a empresa e a proposta, o serviço revalida contexto, permissões e identidade, confere a versão/hash apresentados e a inexistência de confirmação anterior. As decisões append-only guardam âmbito, proposta, autor, data, fundamento, hash e estado anterior/posterior; a auditoria referencia proposta, decisão e revisão na mesma transacção.

Encerrar uma prévia obsoleta não exige que o seu efeito físico ainda seja executável. Isso permite retirar uma proposta cujo livro mudou, sem mexer nesse livro. Proposta já confirmada exige circuito de correcção física próprio e não pode ser retirada/recusada por este comando. Uma proposta encerrada não pode ser confirmada ou reaberta.

Uma repetição com a mesma proposta, decisão, autor e fundamento devolve a decisão original. Conteúdo ou actor incompatíveis recusam 409; versão/hash antigos recusam 409. Repetir a preparação original devolve a proposta com o estado terminal actual, sem a apresentar como nova pendência. Uma nova conferência gera outra proposta, sem apagar a anterior ou duplicar o efeito.

O bloqueio por empresa já existente serializa confirmação e encerramento. Com processos independentes e bloqueador confirmado por pg_blocking_pids:

  • Retirada primeiro: confirmação espera e depois recusa 409; nenhum movimento.
  • Confirmação primeiro: retirada espera e depois recusa 409; conserva-se um único movimento.
  • Duas retiradas idênticas: a segunda espera e recupera a mesma decisão; uma só linha terminal.

Uma falha ao gravar a auditoria desfaz também a decisão. A repetição posterior termina com uma decisão e sem movimento. Um trigger da fixture recusa alterações à decisão já gravada.

Histórico e interface

O histórico distingue pendentes, confirmadas, retiradas e recusadas, com paginação de 25 no servidor. Apresenta preparador/data, evidência e fundamento originais, autor/data/fundamento do encerramento e a indicação de prévia arquivada, não executada. Os controlos próprios/de revisão respeitam as identidades e direitos; o servidor continua a ser a autoridade.

A leitura HTTP usa transacção REPEATABLE READ READ ONLY, conservando uma fotografia coerente dos totais, página, confirmações e encerramentos. Na fixture de 51 propostas, três encerradas deixam 48 pendentes. Páginas são disjuntas. A página faz uma consulta de descoberta da tabela e uma consulta conjunta das decisões, limitada aos IDs da página; não há consulta por proposta ou leitura de todo o universo. Isso comprova a forma da consulta, não capacidade de carga.

Troca de contexto limpa a prévia/chave local. Respostas de comandos do contexto anterior não substituem o estado visível do contexto novo. Não há repetição automática de decisões.

Provas e preservação

Relatório e hashes: 33 testes distintos / 1.181 asserções, sendo 11 casos novos/361 e os 22 casos afectados existentes/820. Não foram repetidas suites nativas, da fila de associações ou outras suites alheias. Os casos novos cobrem também revogação de direito, contexto antigo, acesso noutra empresa/unidade, ausência de instalação, versões/hashes, repetição com conteúdo alterado, preservação da proposta, encerramento de repartições/devoluções sem associações e recuperação após falha.

A primeira expectativa do teste de consultas ignorava a descoberta de schema. A falha permanece registada e foi substituída somente pela repetição dirigida desse caso, distinguindo a descoberta da leitura de dados. Os nove restantes casos válidos dessa execução foram reutilizados. O consolidado selecciona casos aprovados por nome, sem somar repetições ou contar a falha como prova válida.

Build Vite completo passou (46 módulos), bem como sintaxe PHP e renderização estática dirigida do impacto e das guardas da interface. O verificador adicional antigo da página inicial não terminou; apenas os processos próprios, previamente identificados, foram interrompidos. Não houve alteração da navegação nem nova aceitação visual. O build directo e a prova da interface deste incremento passaram. Não se repetiu a via bloqueada de navegador.

Schema/tabela/índice/triggers novos existem apenas nas novas fixtures sintéticas, na base de regressão sgf_tempo_test do cluster isolado 55439. Não há migração aplicada à instalação. Uma fonte sintética anterior sem ws_closures conserva consulta/confirmação; não oferece encerramento na interface e o comando responde 503. A confirmação continua comprovada nesse cenário. Não se cria tabela por acesso ou se interpreta indisponibilidade como estado encerrado.

O postcheck confirmou zero direitos temporários, a constraint original restaurada e zero bindings operacionais de Oficina/Stock. As provas anteriores da fila, leitor de stock e escritor comum conservam os hashes. Os seis registos protegidos, cache bloqueada, demonstrações, dados/acessos reais e trabalho em curso permanecem preservados. Sem publicação, activação de Compras, checkpoint ou aceitação presumidos.

Continuam separadas: revisão visual/interacção no navegador, instalação operacional, carga de escrita e capacidade de implantação. Encerramento de proposta não corrige material consumido nem um movimento confirmado; não acrescenta lotes, reservas, previsão líquida ou efeitos financeiros/contabilísticos.