Files
SGF/docs/INDUSTRIAL_COST_DELIVERY.md

16 KiB
Raw Permalink Blame History

INDUSTRIAL-COST-SIM-v1 — entrega técnica isolada

Aplicação técnica especificamente autorizada — 28/10/2026

Após apresentação do destino e das quatro concessões exactas, o utilizador autorizou apenas a migração 100000 em sgf_tempo_dev e essas concessões, preservando dados, acessos e bloqueios, sem utilização real ou publicação. As referências posteriores a migração/concessões não aplicadas descrevem o estado histórico de 27/10 e da aceitação anterior à autorização específica.

Executado scripts/sgf.ps1 php scripts/industrial-cost-dev-install.php --apply-confirmed-100000-and-four-grants. Instalador confere destino sgf_tempo_dev, porta 55432, proprietário sgf_dev_owner sem poderes de superutilizador/criação de bases/papéis/bypass RLS, e migra apenas o caminho database/migrations/2026_10_27_100000_create_industrial_cost_simulation.php. Aplicação permanece sgf_dev_app.

  • Apenas uma migração acrescentada; instalações anteriores 070000/080000/090000 preservadas.
  • 66 tabelas anteriores conferidas por contagem e impressão digital dos registos, sem exportar conteúdos; dados e acessos anteriores preservados. Só acrescentadas a migração, quatro concessões e quatro entradas de auditoria correspondentes.
  • Tenant #1 / Tempo Lda #1 / SEGI #1: conta #1, industrial_costs.view e industrial_costs.prepare; conta #2, industrial_costs.view e industrial_costs.validate. Identidades e pertenças existentes conferidas; sem direitos de gestão ou outras concessões.
  • Oito tabelas industriais vazias. Listagens das duas contas continuam bloqueadas, sem lotes.
  • Guarda, abertura, dados, cálculo e decisão industriais recusam com 403; também recusam as guardas de custo directo, oficinas, recebimentos e emissão. Funções SQL de ambiente industrial/directo/recebimentos/oficinas recusam a base de desenvolvimento. Fontes funcionais e guardas não alteradas.

Prova de execução mantida localmente em storage/app/private/industrial-cost-dev-install-proof.json, sem conteúdos dos registos ou credenciais. Validação de sintaxe PHP aprovada; verificações de preservação e bloqueios executadas pelo instalador. Não se repetiram as provas sintéticas aceites, nem se recriou a base de testes. Sem taxas, critérios, lotes, cálculos ou operações reais; nenhuma publicação. A aceitação técnica de cbdf2b4 permanece preservada.

Na revisão para o checkpoint local, o código do instalador foi desidentificado: nomes e emails usados na conferência inicial foram retirados, conservando IDs autorizados, existência das contas, pertenças e verificações de âmbito. Sintaxe novamente validada, sem reexecutar a instalação. Ficheiros privados, credenciais e conteúdos dos registos não integram o checkpoint.

Actualização de 28/10/2026: entrega aceite expressamente pelo utilizador, com autorização de checkpoint Git exclusivamente local. Ver INDUSTRIAL_COST_ACCEPTANCE.md. As referências abaixo a aceitação/encerramento pendentes descrevem o estado original da entrega de 27/10. Migração 100000, quatro concessões e utilização real permanecem por autorizar.

27/10/2026, Africa/Johannesburg. Implementação delimitada pelas secções 15 e 15.5 de INDUSTRIAL_COST_ACCOUNTING_SCOPE.md. Sem aceitação presumida ou checkpoint de encerramento. Preservados d10ba06, 7628645, alterações posteriores, oficinas, recebimentos, cálculo fiscal e aprovações existentes. Não se acedeu ao InvesteMoz nem se repetiu investigação fiscal.

O que funciona

Lote com identidade própria, produto sintético, centro, empresa/unidade, período e MZN explícitos. Origens industriais identificadas e versionadas para consumo de material, trabalho efectivo, conjunto indirecto, utilização da máquina e produção boa concluída; taxas de material/trabalho e critério com versões e fontes explícitas. As origens são novas ocorrências sintéticas do lote, não cópias dos apontamentos da oficina nem transformação de uma ordem técnica em produção.

Preparador propõe versões; validador distinto aprova/recusa dados/taxas/critério e resultado exactos. A validação dos dados sintéticos de custo não é verificação técnica de execução real. Alterações conservam a identidade da origem e exigem sucessora explícita; dados, taxas e critério desactualizados não são escolhidos automaticamente. Calcular exige referências exactas a versões actuais aprovadas; taxa de material pode ficar explicitamente ausente.

Resultado guarda composição, referências e versões, fórmula/base, moeda, residual, cobertura da reconciliação e pendências. Alteração de origem/taxa/critério invalida a actualidade dos dependentes, sem reescrever fotografias ou decisões anteriores. Novo cálculo cria versão com anterior explícita; composição idêntica à última pode recuperar o mesmo resultado. Só a última versão elegível representa a imputação actual; resultados históricos não se acumulam como novas utilizações do conjunto.

Números demonstrados

Componente Composição exacta Custo atribuído
Material 20 KG × 50 MZN/KG 1 000 MZN
Trabalho 300 MIN ÷ 60 × 100 MZN/H 500 MZN
Indirectos Conjunto 600 MZN ÷ capacidade 10 HM = 60 MZN/HM; 5 HM × 60 300 MZN
Lote / perímetro sintético 10 UN boas 1 800 MZN; 180 MZN/UN
Residual separado 600 − 300 300 MZN por imputar

Conjunto: 600 = 300 imputados + 300 por imputar. Perímetro: 2 100 origens = 1 800 atribuídos + 300 por imputar. As 5 HM são medição própria da máquina, não deduzidas das 5 H humanas. Capacidade e elegibilidade são pressupostos identificados apenas do ensaio, não método contabilístico real aprovado. O residual não é redistribuído, convertido em despesa ou lançado.

Sem taxa do material: 800 MZN conhecidos (500 + 300), total e custo unitário definitivo indisponíveis; quantidade 20 KG preservada, com pendência. Reconciliação parcial: 1 100 conhecidos = 800 atribuídos conhecidos + 300 por imputar, excluindo o material sem valor conhecido. Uma validação desse resultado valida só o perímetro conhecido e não elimina a pendência. Taxa zero indicada/aprovada é distinta de ausência, provada por teste.

Reutilização e segurança

Extraída app/Shared/Costs/ExactCostMath.php da representação racional/conversão MIN/H do custo directo, usada agora por ambos os percursos. Preservado o contrato da entrega de custo directo e executada a sua regressão. Não há float, redução silenciosa de precisão ou reutilização da política de truncagem do IVA. Decimais não negativos até 16 algarismos inteiros/8 decimais nas entradas; quantidades/capacidade positivas quando necessárias. Divisão não finita conserva fracção exacta (teste 800/3), sem escolher regra fiscal ou arredondamento implícito.

Direitos novos de unidade industrial_costs.view/prepare/validate, sem herança dos direitos de custo directo/contabilidade/gestão. Contexto, empresa/unidade, pertenças e acção revalidados no servidor, incluindo replay e dentro da transacção. Auto-aprovação recusada mesmo com ambos os poderes. Não há nomes/emails especiais no código funcional.

Bloqueio por empresa serializa comandos e revisões; idempotência inclui âmbito, autor, acção e conteúdo. Chave repetida com outro conteúdo é conflito. Comando, auditoria, evento e outbox atómicos: falha de outbox desfaz efeitos; resposta perdida recupera o ID. Outbox captured_no_stock_or_accounting, sem consumidor contabilístico ou integração externa.

Origem canónica única por empresa/referência/versão, com cadeia imutável ligada ao lote e tipo. Não pode mudar de material directo para conjunto indirecto ou reaparecer noutro lote/unidade com a mesma identidade. Cada lote tem no máximo uma cadeia por tipo neste recorte; o conjunto pertence exclusivamente ao lote, sem partilha entre lotes. Isso evita uma segunda imputação activa da mesma parcela sem construir um motor geral de repartições. Identidades diferentes não são deduplicadas por coincidência de descrição/valor.

FKs, versões únicas e triggers reforçam contexto, referências, decisões separadas, fontes aprovadas e imutabilidade contra operações em massa. A composição exacta e autorização autenticada são verificadas pela aplicação; os triggers não são RLS nem uma implementação independente de todo o motor. SQL administrativo é uma fronteira de confiança distinta.

IndustrialCosts::guard() exige ambiente isolado e TestingDatabaseGuard confirma sgf_tempo_test, porta 55432 e papel sgf_test_runner. INSERT nas oito tabelas industriais também exige a base de testes no SQL. Não existe opção de activação real. Guardas de oficinas, recebimentos, custo directo e emissão permanecem preservadas.

Testes e percurso no navegador

Resultados em industrial-cost-tests.json; seis provas concorrentes, resultados do navegador, cenário de 1 800 e cenário incompleto.

Resultado final: 58 testes / 1 185 asserções, zero erros/falhas, incluindo nove casos industriais e regressão do custo directo/oficinas/recebimentos/B1/guardas. Seis provas de concorrência aprovadas, com processos realmente sobrepostos. Compilação aprovada com Vite 8.3.5, sem alterações de dependências. Instância do navegador parada antes da regressão final. migrate:status normal confirmou 100000 pendente; não houve migração ou concessão em desenvolvimento.

Prova efectivamente realizada no Edge, http://127.0.0.1:8001, apenas sgf_tempo_test, sessões/cache isolados e CSRF activo. Login real, sem usar actingAs como demonstração:

  1. Fixture cria um lote/produto e sete dados/taxas pelas operações do módulo, com validação sintética distinta; não preenche critério ou cálculos e não cria wo_*/dc_*.
  2. Preparador gestor@example.test entra em Empresa Horizonte — Demonstração / Unidade Central — Demonstração → Custos industriais de teste. Prepara IND-TEST-CRITERIO-BROWSER v1, seleccionando conjunto/utilização exactos, capacidade 10 HM e evidência da hipótese.
  3. Validador consulta@example.test entra separadamente e valida a versão do critério; não recebe formulário de preparação nem poderes técnicos por consequência.
  4. Preparador selecciona explicitamente as oito referências validadas e calcula 1 800 MZN / 180 por UN. Validador revê composição, as duas reconciliações e residual 300, e aprova a versão exacta.
  5. Preparador cria nova versão com taxa material ausente; validador aprova apenas os 800 conhecidos, total/unitário indisponíveis e reconciliação parcial, sem esconder pendências. Resultado anterior preservado como histórico.

IDs desta execução: lote #10, origens/taxas #71–77 e critério #78; não são IDs fixos numa repetição. Credenciais aleatórias no manifesto local protegido, nunca mostradas/versionadas. A prova foi conferida por script guardado; zero eventos técnicos de oficina e zero cálculos de custo directo criados pelo ensaio industrial.

Seis cenários com dois processos sobrepostos: mesma revisão de critério; mesma decisão; critérios sucessores incompatíveis; mesmo cálculo; cálculos concorrentes com uma só revisão vencedora; resultado novo versus aprovação antiga. A recuperação após falha de outbox e perda de resposta está coberta por testes transaccionais. Outras provas: moedas/unidades/quantidades, denominador zero/ausente, utilização acima da capacidade, produção não concluída/zero, origem duplicada entre tipos/lotes, versão recusada/obsoleta, correcção de origem que exige taxa nova, revogação no pedido seguinte, empresa irmã/unidade sem acesso e imutabilidade SQL.

Repetição local, com a prova do navegador parada antes dos testes destrutivos:

powershell -NoProfile -ExecutionPolicy Bypass -File scripts/sgf.ps1 test '--filter=IndustrialCostsTest|DirectCostsTest|WorkshopTest|ServiceReceivablesTest|InternalConfirmationTest|DatabaseSafetyTest'
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/sgf.ps1 npm run build

Para navegador, preparar somente a base de testes vazia sob as guardas existentes; executar scripts/browser-proof.ps1 start e depois sgf.ps1 php scripts/industrial-cost-fixture.php --env=testing. Seguir os passos acima com a credencial do manifesto protegido. Os preparadores recusam estado preenchido, sem apagar dados para continuar. Após o percurso, sgf.ps1 php scripts/industrial-cost-proof.php --env=testing, depois sgf.ps1 php scripts/industrial-cost-concurrency.php --env=testing. Parar com scripts/browser-proof.ps1 stop. Não parar processos de outros projectos para libertar portas. As provas persistem em ficheiros; a regressão final recria apenas a base de testes.

Migração proposta — NÃO aplicada em desenvolvimento

2026_10_27_100000_create_industrial_cost_simulation.php, SQL database/sql/industrial-costs.sql, destino futuro proposto sgf_tempo_dev, exigindo confirmação específica antes de qualquer aplicação.

Cria oito tabelas: ic_products, ic_lots, ic_inputs, ic_results, ic_decisions, ic_commands, ic_events, ic_outbox, mais índices, FKs e funções/triggers próprios de integridade, ambiente e imutabilidade. Amplia o CHECK de concessões com três nomes industriais de unidade, preservando os anteriores. Não atribui direitos ou altera registos de oficinas/recebimentos/custos/fiscalidade existentes. down() recusa destruição de história. Sem reset/fresh em desenvolvimento; mesmo instalada futuramente, mantém custeio real bloqueado na aplicação/base.

Quatro concessões propostas — separadas, NÃO aplicadas

Conferência read-only por scripts/industrial-cost-permissions-preview.php, sem modo de aplicação. Tenant #1 / Tempo Lda #1 / SEGI #1. As quatro estavam ausentes; 100000 não aplicada e guarda industrial real recusada.

Conta existente Direitos propostos
Osmane Nala #1 — nala@tempo.co.mz industrial_costs.view, industrial_costs.prepare
Samira Nal #2 — onala@me.com industrial_costs.view, industrial_costs.validate

Preparação abrange dados/valorizações, critério e cálculo; validação abrange versões de dados de custo, critério e resultado, sem edição das fontes técnicas. Não inclui gestão de acessos, margens, stock, emissão ou activação real. Só equivalentes sintéticos receberam estes direitos nos testes. Não foram aplicados ou derivados dos quatro direitos de custo directo.

Ficheiros e limites

Novos: app/Modules/Industry/IndustrialCosts.php, Http/IndustrialCostsController.php, app/Shared/Costs/ExactCostMath.php, resources/js/IndustrialCostsWorkspace.jsx, migração/SQL acima, tests/Feature/IndustrialCostsTest.php, tests/Support/IndustrialCostFixture.php, scripts industrial-cost-fixture.php, industrial-cost-worker.php, industrial-cost-concurrency.php, industrial-cost-proof.php, industrial-cost-permissions-preview.php e documentação/provas. Integrações em resources/js/app.jsx, routes/web.php; DirectCosts.php passa a usar o pequeno auxiliar puro de exactidão/conversão, sem mudança de política ou âmbito.

Sem novo software, substituição de versões ou dependências. Sem dados de demonstração na aplicação normal ou alterações de ligação. Este recorte cria produto próprio por lote, uma cadeia por componente, unidade KG para material e uma etapa; não implementa catálogo industrial geral, integração de fontes de oficina, partilha de conjuntos entre lotes, stock/compras/salários/activos, previsto/realizado, WIP, perdas, preços/margens, facturação, recebimentos, reconhecimento, lançamentos ou fecho. Dados de origem e evidências são declarações sintéticas, sem comprovação externa de produção ou custo real. Conformidade/activação reais permanecem fora do âmbito. Nenhuma aceitação ou checkpoint de encerramento é declarado.