64 lines
8.2 KiB
Markdown
64 lines
8.2 KiB
Markdown
# Oficina → Stock: saída individual conferida
|
|
|
|
Continuação posterior: [ligação integral a uma entrega já abatida](WORKSHOP_DELIVERY_LINK.md), sem novo movimento. As limitações abaixo descrevem esta entrega inicial; a continuação não inclui repartições, devoluções ou compensações.
|
|
|
|
02/11/2026 — `WORKSHOP-STOCK-ISSUE-SIM-v1`. Implementação local sintética: um consumo de material da empresa, tecnicamente verificado, pode dar origem a uma proposta com impacto físico e a uma confirmação independente. A origem, quantidade e versão são reutilizadas; não se redigita o consumo nem se executa uma saída automática ao registar o apontamento.
|
|
|
|
## Código e responsabilidade única
|
|
|
|
`packages/inventory-issue` contém o escritor de saída comum. O circuito nativo `StockWorkflow` de Compras delega apenas a sua saída normal neste escritor, através de `StockIssueMovement`. Permanecem no circuito original as políticas, reservas, lotes/FEFO, peças/equipamentos, sinais e auditoria. Transferências, contagens e estornos mantêm os seus caminhos anteriores.
|
|
|
|
Artefacto local imutável em Compras: `packages/inventory-issue/releases/0.1.0`, manifesto SHA-256 `3c24d9e9fb99bfbb274077495c3a42ddb7eccab06b5c6a956cd739b2bc9b56f0`. É verificado contra a fonte; não depende do repositório SGF durante a execução de Compras. O escritor exige autorização do host e transacção já aberta, bloqueia armazém/artigo, revalida a fotografia da operação e a revisão do livro, recusa quantidade insuficiente e grava um único movimento negativo. Não faz commit próprio.
|
|
|
|
No SGF, `WorkshopStock` e `WorkshopStockController` disponibilizam consulta paginada de origens, preparação e confirmação. A interface está no submenu de Stock de Oficina. A navegação de seis módulos permanece. Não se fez instalação nas demonstrações existentes.
|
|
|
|
## Conferência e integridade
|
|
|
|
- Acesso exige contexto actual de Oficina, unidade, `workshop.view`, `stock.view` e direitos próprios da ligação. Todos são novamente exigidos na confirmação.
|
|
- Só ordens explicitamente elegíveis e recursos/unidades/armazéns explicitamente mapeados entram no ensaio. A fonte deve ser consumo autorizado de material da empresa, versão actual e verificação técnica por outra identidade. Não há conversão de unidade ou arredondamento de quantidade.
|
|
- Preparação exige fundamento, evidência e UUID de repetição. A mesma chave/conteúdo recupera a proposta; conteúdo diferente recusa com 409. O impacto preserva antes/depois, origem/versão, artigo e armazém.
|
|
- Confirmação exige outra identidade e fundamento. A fotografia é comparada novamente com a origem, verificação, mapa e livro actuais. Alteração exige nova conferência; a mesma origem estável só pode produzir um efeito, incluindo após correcções técnicas.
|
|
- Operação, movimento, associação à origem e auditoria fazem parte da mesma transacção. O histórico conserva preparador, confirmador, datas, fundamentos, evidência, origem/versão e estado anterior/posterior. Propostas e associações do ensaio são append-only.
|
|
- Uma saída anterior sem correspondência reconciliada bloqueia outro abatimento desse artigo/armazém. Uma entrega física já debitada não pode ser novamente debitada como consumo. Isto é uma recusa conservadora; a ligação a entregas existentes ainda não foi implementada.
|
|
|
|
A listagem lê 25 origens por página e associa os movimentos em conjunto. Mostra as últimas 25 propostas do contexto; não é ainda uma consulta paginada de todo o histórico de propostas. A confirmação consulta sempre o estado actual. Não há alegação de desempenho desta escrita em volume.
|
|
|
|
## Direitos e bases
|
|
|
|
Direitos novos propostos, de unidade: **`workshop_stock.view`**, **`workshop_stock.prepare`**, **`workshop_stock.confirm`**. Consulta de Oficina ou Stock não os concede implicitamente. Não foram adicionados ao catálogo/concessões reais nem concedidos publicamente. Os testes alargam temporariamente a constraint apenas na base isolada, criam identidades QA novas e removem essas concessões/restauram a constraint no final.
|
|
|
|
O código mantém a guarda sintética de Oficina, sem fonte configurada por omissão. A escrita usa apenas um esquema QA explícito na mesma base `sgf_tempo_test`, no cluster de regressão/porta 55439. Não existe adaptador de escrita externa ou configuração empresarial real desta ligação. As tabelas de conferência são criadas pela fixture sintética; não foi entregue um instalador/migração operacional.
|
|
|
|
## Provas
|
|
|
|
Provas consolidadas, hashes e resultados: [workshop-stock-20261102.json](proofs/workshop-stock-20261102.json). A evidência distingue os casos já válidos da repetição apenas do caso corrigido; uma execução intermédia teve uma falha de formato de data na fixture e não é tratada como suite integral aprovada.
|
|
|
|
| Verificação afectada | Testes aprovados | Asserções |
|
|
| --- | ---: | ---: |
|
|
| SGF: quatro casos válidos reutilizados | 4 | 154 |
|
|
| SGF: correcção de versão | 1 | 39 |
|
|
| SGF: outra empresa, contexto de módulo e chave alterada | 1 | 29 |
|
|
| Compras: operações de Stock afectadas | 25 | 125 |
|
|
| Compras: lotes seleccionados | 2 | 10 |
|
|
| Navegação existente | 8 | 90 |
|
|
| Total de casos seleccionados, sem contar falhas intermédias | **41** | **447** |
|
|
|
|
Na empresa distinta, mesmo com direitos QA explícitos e o mesmo livro de ensaio mapeado, a consulta não revela origens/propostas e os IDs da primeira empresa são recusados com 403. A chamada no módulo Stock ao endpoint de Oficina recusa o contexto com 409. O pós-ensaio confirmou zero concessões temporárias restantes, zero bindings operacionais e a constraint original com SHA-256 `40046092cba51f1b46d26d5f0da8af47e8336e90a8d50b8de3a8c390758f1783`.
|
|
|
|
O cenário HTTP real de Oficina abre/autoriza uma ordem, regista 2 UN, verifica tecnicamente, prepara e confirma: **10 → 8 UN**, um movimento e uma associação. Stock consulta o mesmo livro e observa 8. A repetição recupera o movimento original. Material de cliente, entrega, ausência de verificação, fracção não representável, insuficiência, mudança de livro/mapa/direitos/contexto e autoconfirmação são recusados.
|
|
|
|
A falha injectada depois do INSERT da associação desfaz também a operação e a saída; a retoma produz um único efeito. Na concorrência real de dois processos PHP, a primeira transacção mantém a linha da empresa bloqueada; o segundo processo é observado em `pg_stat_activity`, bloqueado pelo PID da primeira. Depois do commit, termina com 200/replay e o mesmo movimento. Não se inferiu o resultado apenas de um timeout.
|
|
|
|
Correcção antes da confirmação invalida a proposta antiga; a versão 2 verificada pode ser novamente conferida (10 → 7). A versão 3 da mesma origem, posterior ao abatimento, não produz nova saída. A correcção da quantidade técnica não representa automaticamente uma compensação física.
|
|
|
|
O render estático confirma separação de direitos, estado de carregamento sem saldo fictício e substituição do aviso de capacidade pendente apenas para quem tem acesso. Build Vite aprovado. Isto não é revisão visual nem ensaio de interacção no navegador. Não se repetiu a via bloqueada.
|
|
|
|
## Limitações e continuação
|
|
|
|
1. Apenas artigos de quantidade, sem lotes, reservas ou peças/equipamentos de stock. O binding recusa essas capacidades; as regras nativas não são contornadas.
|
|
2. Devoluções, compensações, consumo parcial de entregas existentes e reconciliação de saídas antigas continuam por implementar. São o próximo incremento necessário antes de incorporar origens antigas.
|
|
3. O livro inicial de 10 UN desta fixture é sintético. A [prova anterior de recepção nativa → consulta SGF](STOCK_RECEIPT_LINK_DELIVERY.md) permanece válida e separada. Não se demonstrou aqui um percurso único instalado desde procurement/recepção até consumo de Oficina no mesmo cenário.
|
|
4. PostgreSQL validado; outros drivers, implantação, carga da escrita e revisão visual permanecem separados. Os ensaios anteriores de carga da leitura não demonstram capacidade de implantação desta ligação.
|
|
|
|
Preservados os seis registos sem associação, cache bloqueada, demonstrações e trabalho alheio. Nenhuma candidata Compras activada, publicação, concessão real, operação real, aceitação ou checkpoint presumido.
|