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

8.2 KiB

Oficina → Stock: saída individual conferida

Continuação posterior: ligação integral a uma entrega já abatida, 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. 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 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.