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

52 lines
6.6 KiB
Markdown

# Oficina → entrega já abatida: ligação sem novo movimento
Continuação posterior: [repartição de entregas, devolução não consumida e histórico paginado](WORKSHOP_MATERIAL_CYCLE.md). As pendências descritas abaixo registam o âmbito inicial; a continuação tem provas e limites próprios.
02/11/2026. `WORKSHOP-DELIVERY-LINK-SIM-v1`. Continuação da [saída individual conferida](WORKSHOP_STOCK_DELIVERY.md): um consumo verificado pode agora ser ligado individualmente a uma saída física já existente. **O efeito físico da confirmação é zero.** A saída anterior e a respectiva fotografia permanecem intactas.
## Tratamento entregue
A interface permite escolher explicitamente entre saída nova e ligação de uma entrega já registada. Não há opção escolhida por omissão. A preparação de ligação exige movimento, armazém, origem/versão, fundamento e evidência. A prévia identifica o movimento original, a quantidade ligada, o saldo antes/depois e a nova saída igual a zero. Outra identidade confirma o tratamento no endpoint existente, com novo fundamento.
`POST /api/workshop-stock/prepare-delivery` reutiliza as propostas imutáveis, os direitos `workshop_stock.view/prepare/confirm`, o isolamento e o circuito de confirmação. Não cria outro motor de Stock nem altera o pacote escritor ou o circuito nativo de Compras. Não foram necessários direitos novos. Nenhuma concessão real foi aplicada.
A elegibilidade é uma configuração QA explícita de movimento → ordem, além da correspondência de recurso/unidade/armazém e da elegibilidade da ordem já exigidas. Não se inferem vínculos a partir de nomes, referências ou proximidade de datas. Isto **não constitui importação de histórico** ou reconciliação automática de entregas antigas.
## Revalidação e unicidade
Para a ligação, a origem continua a exigir consumo autorizado de material da empresa, versão actual e verificação técnica independente. A entrega deve ser uma saída simples anterior ao consumo, da mesma fonte/artigo/armazém e com a quantidade integral exactamente igual. A fotografia do movimento deve conter o hash íntegro da operação gerada pelo escritor comum. Sem essa evidência, exige-se um percurso histórico próprio.
O livro admitido neste recorte contém entradas `receipt_in` e saídas `issue`. Estornos, ajustes e transferências recusam a ligação: não se presume que uma saída revertida continua disponível para consumo. Lotes, reservas, peças e conversões continuam fora do recorte. Não é exigido saldo suficiente para uma nova saída, porque a entrega já foi abatida; foi comprovado o caso de saldo esgotado.
Na confirmação, o servidor volta a conferir direitos/contexto, fonte/versão/verificação, mapa, elegibilidade, operação/movimento e revisão/saldo do livro. A alteração exige nova conferência. Usa a transacção e o bloqueio de empresa existentes; bloqueia também os registos de origem e entrega. A unicidade da origem, movimento, operação e proposta impede uma segunda associação. O replay devolve a associação/movimento original.
Só é inserida a associação append-only, com autor da preparação/confirmação, datas, versão, fundamentos, evidência preservada na proposta, hash e antes/depois iguais. A auditoria distingue `delivery_prepared` e `delivery_linked`. Não se inserem operações/movimentos nem se editam os anteriores. Uma falha na associação desfaz a decisão e permite retoma sem duplicação.
## Provas e preservação
Resultados e hashes: [workshop-delivery-link-20261102.json](proofs/workshop-delivery-link-20261102.json). A regressão usa apenas novas ordens, identidades e esquemas em `sgf_tempo_test`, no cluster isolado/porta 55439. Sem reset. A entrega anterior e os ensaios nativos de Compras são provas separadas; não foram repetidas suites nativas porque o pacote e o adaptador nativo não mudaram.
| Casos afectados aprovados | Testes | Asserções |
| --- | ---: | ---: |
| Saída nova, versões, isolamento e concorrência existentes | 6 | 222 |
| Ligação integral, recusas, saldo zero, retoma e concorrência | 5 | 163 |
| Fotografia original e acesso por outra empresa | 2 | 47 |
| Total seleccionado | **13** | **432** |
Uma passagem intermédia teve três erros de carregamento do pacote na fixture dos casos novos. Esses casos não foram contados como provas aprovadas; corrigiu-se o carregamento explícito, executaram-se os casos de ligação afectados e reutilizaram-se apenas os casos anteriores aprovados. O relatório identifica os XML e os hashes, sem declarar uma suite intermédia integralmente aprovada.
O caso principal usa o escritor comum para criar uma entrega sintética de 2 UN: saldo 10 → 8. A confirmação liga o consumo à entrega e mantém **8 → 8**, os dois movimentos totais (entrada e saída), uma operação e uma associação. O mesmo movimento e a sua fotografia permanecem intactos. A consulta de Stock observa 8 no mesmo livro.
Os casos afectados abrangem repetição, autoconfirmação recusada, propostas concorrentes sobre a mesma entrega, quantidade diferente, movimento não elegível, livro alterado, elegibilidade/direitos revogados, falha/retoma e saldo zero. Dois processos PHP foram observados em bloqueio real: após a primeira transacção libertar a linha da empresa, a segunda termina com replay e o mesmo movimento, sem segunda associação. As provas anteriores de versões, isolamento e saída nova foram executadas na passagem afectada e os casos aprovados reutilizados.
O render estático verifica a apresentação de efeito zero e do movimento/quantidade ligados; a verificação de fonte confirma escolha explícita de tratamento. Build aprovado. Isto não demonstra interacção no navegador nem substitui a revisão visual.
O pós-ensaio verifica que os direitos temporários foram removidos, a constraint original foi restaurada e nenhuma fonte operacional ficou configurada. Seis registos protegidos, cache bloqueada, dados/acessos reais, demonstrações e alterações alheias preservados. Sem activação de Compras, publicação ou checkpoint.
## Pendências
- Repartição de uma entrega entre vários consumos, consumo parcial e entrega com quantidade diferente: recusados; ainda não entregues.
- Devoluções, compensações físicas e revisão de uma ligação já confirmada: continuam separadas. Corrigir a origem não gera movimento nem desfaz a ligação automaticamente.
- Configuração/instalação operacional das tabelas e fontes, composição única desde procurement/recepção até consumo, outros drivers, carga da escrita e capacidade de implantação: não validados por estes ensaios.
- Revisão visual permanece pendente; não se repetiu a via de navegador bloqueada.