This commit is contained in:
2026-10-27 13:57:09 +02:00
parent d10ba06edc
commit 9962084087
27 changed files with 823 additions and 3 deletions
+68
View File
@@ -250,3 +250,71 @@ Guardar a origem e versão da taxa, a unidade, moeda, composição e pendências
**Osmane prepara; Samira valida a versão dos custos e das taxas.** Samira pode validar/recusar a proposta de custos, sem editar os apontamentos técnicos ou receber supervisão técnica por consequência. Testes futuros com identidades sintéticas distintas entre preparação e validação. Nenhuma nova concessão real é autorizada por estas decisões.
Lote industrial e custos indirectos ficam para incremento seguinte. Sem stock, compras, salários reais, facturação, IVA, recebimentos, lançamentos, fecho ou publicação. Manter bloqueios operacionais/fiscais e isolamento em `sgf_tempo_test` nas futuras provas. Esta confirmação fecha as decisões do recorte; não constitui ordem de implementação, migração, concessão ou activação operacional.
## 15. Retoma do ensaio industrial — recorte para aprovação
27/10/2026. O utilizador propôs retomar um lote/produto com custos indirectos, primeiro em especificação. O custo directo da secção 14 já foi entregue, encerrado e instalado tecnicamente: ver [entrega](WORKSHOP_DIRECT_COST_DELIVERY.md), [encerramento](WORKSHOP_DIRECT_COST_ACCEPTANCE.md) e checkpoint `d10ba06`. `090000` e quatro direitos foram aplicados por autorização posterior, sem taxas/cálculos em desenvolvimento ou activação real. Oficinas e recebimentos mantêm as suas entregas e instalações; não se reabrem aprovações.
### 15.1 Proposta mínima INDUSTRIAL-COST-SIM-v1
Uma empresa/unidade sintéticas, um período de teste identificado, MZN explícito, um centro sintético, um produto em UN, um lote concluído de etapa única e 10 UN boas verificadas. Sem produção em curso, perdas/retrabalho, vendas ou segundo lote. É prova de gestão; não escolhe indústria, método de custeio, referencial ou política de inventário para empresa real.
Recomenda-se reutilizar os valores já especificados na secção 8, sem recalibrar o ensaio aceite de 275 MZN:
| Componente / origem própria identificada | Dados sintéticos explícitos | Resultado esperado |
| --- | --- | ---: |
| Material directo | Consumo líquido 20 KG × 50 MZN/KG | 1 000 MZN |
| Trabalho directo | 300 MIN efectivos ÷ 60 × 100 MZN/H | 500 MZN |
| Conjunto CIF do período | Uma origem de 600 MZN, declarada elegível apenas no ensaio | 600 MZN de origem |
| Critério CIF v1 | Capacidade sintética do período 10 HM; lote usa 5 HM; taxa exacta 600/10 | 60 MZN/HM |
| CIF imputados ao lote | 5 HM × 60 MZN/HM | 300 MZN |
| Custo atribuído ao lote no perímetro do ensaio | 1 000 + 500 + 300 | **1 800 MZN** |
| Custo por UN boa no mesmo perímetro | 1 800 ÷ 10 UN | **180 MZN/UN** |
| Residual CIF | 600 − 300 | **300 MZN por imputar** |
As 5 HM são uma medição sintética própria de utilização da máquina, não inferidas das 5 H de trabalho humano. Capacidade normal de 10 HM é pressuposto de teste explícito, sem alegar validação legal ou empresarial. O residual decorre da base não utilizada sob esse pressuposto; não é falha de arredondamento e não é convertido automaticamente em custo do produto ou despesa contabilística.
Reconciliação do conjunto: **600 = 300 imputados + 300 por imputar**. Reconciliação global: **2 100 de origens = 1 800 atribuídos + 300 por imputar**. Os 300 imputados não são uma nova origem a somar aos 600. Não elevar a taxa para absorver o residual nem alterar capacidade para fechar a soma.
Variante obrigatória: taxa do material ausente, quantidade 20 KG preservada. Mostrar **800 MZN atribuídos conhecidos** (500 + 300), material pendente e custo total/unitário completo indisponíveis. Reconciliação parcial identificada: **1 100 conhecidos = 800 atribuídos conhecidos + 300 por imputar**; componente material excluída dessa igualdade por falta de valor. Zero indicado e validado é distinto de ausência.
Previsto versus realizado da secção 8 fica para evolução posterior, para manter este primeiro incremento pequeno. Não se acrescentam preços, margens, depreciações reais ou documentos de compra/salário. Produção concluída aqui é estado físico de teste, não fecho contabilístico.
### 15.2 Reutilização concreta e delta necessário
| Base já entregue | Reutilização delimitada | Trabalho novo mínimo |
| --- | --- | --- |
| Contexto, pertenças, concessões e guardas | Mesmo isolamento por empresa/unidade e bloqueio real | Direitos industriais explícitos, sem herança dos direitos `direct_costs.*` |
| Exactidão racional do custo directo, MIN/H e estados de completude | Mesmo comportamento sem float, truncagem de IVA ou divisão arredondada silenciosamente | Composição industrial, CIF/HM e custo por UN; fracção exacta se não finita |
| Origem/versão, taxa/versão, decisões distintas e fotografia de composição | Referências e dependências preservadas; mudança sinaliza resultado antigo, não o reescreve | Produto/lote, produção boa, conjunto CIF, critério e execução de imputação versionados |
| Comandos transaccionais, auditoria, eventos/outbox, replay e concorrência | Reutilizar padrões e verificações, sem activar consumidores contabilísticos | Impedir dupla elegibilidade/directo-CIF e dupla imputação, controlar residual |
| Apontamentos técnicos de oficina | Se forem efectivamente a origem de uma parcela autorizada, referenciar o mesmo ID/versão, sem recaptura | Vínculo de destino explícito; nenhuma conversão automática de oficina em lote |
O código actual `DirectCosts` é delimitado a duas origens verificadas de oficina e não é já um motor industrial genérico. A futura implementação deve extrair/reutilizar apenas a aritmética pura necessária e preservar o contrato/testes aceites, acrescentando um adaptador de origens industriais. Não alargar silenciosamente as regras ou tabelas `wo_*`/`dc_*` para fingir produção.
As novas quantidades industriais acima representam acontecimentos sintéticos diferentes dos apontamentos de 2 UN/105 MIN da oficina. Não copiar esses apontamentos como se fossem os consumos de 20 KG/300 MIN do lote. Cada origem tem tipo, ID, versão, unidade, âmbito e propósito. Se uma mesma parcela real/sintética for usada por ligação autorizada, é uma só origem, com saldo elegível controlado entre destinos, sem nova captura. Não somar o resultado agregado de 275 e as suas componentes como origens independentes.
Primeiro recorte: origens, valorização, conjunto e critério preparados → submetidos → validados/recusados por identidade distinta; cálculo sob versões validadas → resultado com composição e residual → validação da versão exacta. Dados em falta permanecem condicionados; uma validação não inventa a informação ausente. Alterações exigem nova versão/revisão, preservando resultados aprovados anteriores e sinalizando desactualização.
### 15.3 Provas mínimas para futura execução
- Demonstrar 1 800 atribuídos, 180/UN e residual 300, com as duas reconciliações acima e a variante incompleta de 800.
- Seleccionar explicitamente versões de origens, taxas, conjunto e critério. Sem critério/taxa/unidade/moeda/capacidade demonstrados, recusar imputação integral; não assumir zero ou configuração mais recente.
- Quantidade boa zero/desconhecida não produz custo unitário. Base do lote superior ao denominador/capacidade aprovada é conflito, não autorização de residual negativo. Denominador zero/ausente impede dividir.
- Impedir que a mesma parcela seja directa e CIF, imputada duas vezes ou usada além do elegível. Não criar dois eventos de consumo para oficina/indústria. Distinguir quantidade física de parcela monetária de custo.
- Correcção de origem/taxa/capacidade/critério exige nova revisão; aprovação antiga e repetição/concorrência não duplicam efeitos ou reescrevem história. Falha de evento/outbox desfaz o comando; resposta perdida recupera resultado idempotente.
- Login real e separação de preparador/validador com identidades sintéticas distintas, sem concessões reais; negar acesso entre empresas/unidades e custos a quem só consulta apontamentos técnicos. Revogação tem efeito no pedido seguinte.
- Testes e navegador só em `sgf_tempo_test`, com aplicação normal inalterada. Qualquer migração em desenvolvimento e novas concessões reais terão delta/proposta separados e confirmação específica. Manter bloqueios de custos, emissão, recebimentos, stock e lançamentos reais.
### 15.4 Decisões novas para fechar o recorte
1. **Aceitar os números e limites do ensaio acima**, incluindo 10 UN, uma etapa, CIF sintéticos de 600 MZN, capacidade 10 HM, utilização 5 HM e residual 300, sem adoptar estes pressupostos como política real. Previsto/realizado fica fora deste primeiro recorte.
2. **Responsabilidade industrial proposta:** Osmane prepara origens/valorizações, conjunto, critério e cálculo; Samira valida/recusa as versões de custos, critério e resultado, sem editar execução técnica. É extensão a confirmar para este ensaio, não consequência automática do papel já aprovado no custo directo. Provas apenas com equivalentes sintéticos; nenhuma concessão real por esta decisão.
Exactidão, ausência diferente de zero, origem única, histórico, isolamento e bloqueios já estão definidos e não são pedidos novamente. Não é preciso identificar uma indústria real ou reabrir o cotejo fiscal para provar estes pressupostos sintéticos. A futura activação real exige âmbito e suporte próprios. **Esta secção continua documental: não autoriza implementação ou execução do ensaio.**
### 15.5 Confirmação do recorte pelo utilizador
Em 27/10/2026, após a confirmação dos números e limites, o utilizador respondeu «sim». Ficam aprovadas as duas decisões da secção 15.4: números e perímetro sintéticos da secção 15.1, com residual separado e variante incompleta; Osmane prepara e Samira valida/recusa versões do critério e do resultado, apenas com identidades sintéticas distintas nas provas e sem concessões reais.
O critério de capacidade/imputação continua hipótese de ensaio, não método contabilístico real aprovado. Previsto/realizado fica para depois. Não se reabrem estas decisões; a autorização para implementar código/testes, futuras migrações em desenvolvimento, concessões ou activação real continua separada. Este registo não executa o ensaio.
+89
View File
@@ -0,0 +1,89 @@
# INDUSTRIAL-COST-SIM-v1 — entrega técnica isolada
27/10/2026, Africa/Johannesburg. Implementação delimitada pelas secções 15 e 15.5 de [INDUSTRIAL_COST_ACCOUNTING_SCOPE.md](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](proofs/industrial-cost-tests.json); [seis provas concorrentes](proofs/industrial-cost-concurrency.json), [resultados do navegador](proofs/industrial-cost-browser-results.json), [cenário de 1 800](proofs/industrial-cost-1800-browser.png) e [cenário incompleto](proofs/industrial-cost-800-browser.png).
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
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.
+12
View File
@@ -78,6 +78,18 @@ São **quatro concessões propostas**, não autorização de aplicação ou acti
Em 27/10/2026, o utilizador autorizou o encerramento após conferência técnica do percurso e preservação de checkpoint local. Ver [registo de encerramento e limites](WORKSHOP_DIRECT_COST_ACCEPTANCE.md). As referências anteriores a ausência de aceitação presumida descrevem a entrega antes desta autorização; `090000`, quatro concessões e uso operacional real continuam por autorizar/aplicar.
## Instalação técnica especificamente autorizada — 27/10/2026
Após autorização expressa, aplicada **apenas** `2026_10_27_090000_create_workshop_direct_costs` em `sgf_tempo_dev`, por caminho explícito com `sgf_dev_owner`, separado da aplicação `sgf_dev_app`. Acrescentou-se exactamente essa entrada no registo de migrações; instalações anteriores preservadas, sem reaplicar `070000` ou `080000`.
Aplicadas e auditadas exactamente quatro concessões, todas tenant #1 / Tempo Lda #1 / SEGI #1: Osmane #1 `direct_costs.view` e `direct_costs.prepare`; Samira #2 `direct_costs.view` e `direct_costs.validate`. Nenhuma outra conta/unidade ou função técnica recebeu direitos.
O procedimento `scripts/direct-cost-dev-install.php` comparou em memória os registos das **60 tabelas preexistentes**, incluindo acessos, auditoria, oficinas, recebimentos e cálculo fiscal. Dados/acessos anteriores preservados. Os únicos novos registos são uma entrada de migração, quatro concessões e quatro eventos de auditoria. As **seis tabelas de custo continuam vazias**: nenhuma taxa, cálculo, decisão de custos ou demonstração na base normal.
As listagens de custos das duas contas continuam bloqueadas/vazias. Guarda, proposta de taxa, cálculo e decisão recusados com 403; guardas de oficinas, recebimentos e emissão real também recusadas. As funções SQL de ambiente de custos, recebimentos e oficinas recusaram `sgf_tempo_dev`. Fontes funcionais e guardas não foram alteradas. Resumo local em `storage/app/private/direct-cost-dev-install-proof.json`, excluído do Git, sem exportar conteúdos dos registos ou credenciais.
As referências anteriores a migração/concessões pendentes descrevem o estado anterior a esta autorização. Esta instalação não activa custeio operacional, não resolve pendências de conformidade e não autoriza publicação, custos indirectos ou lote industrial. O checkpoint `d10ba06` permanece preservado. Sem alteração funcional, não foram repetidos testes destrutivos, compilação ou a demonstração aceite.
## Ficheiros e limites
Núcleo `app/Modules/Workshop/DirectCosts.php`, controlador `Http/DirectCostsController.php`, interface `resources/js/DirectCostsWorkspace.jsx`, integrações em `app.jsx` e `routes/web.php`; migração/SQL acima; `tests/Feature/DirectCostsTest.php`, `tests/Support/DirectCostFixture.php`; scripts `direct-cost-fixture.php`, `direct-cost-worker.php`, `direct-cost-concurrency.php`, `direct-cost-proof.php`, `direct-cost-permissions-preview.php`; esta documentação e provas. Não se alteraram ferramentas/dependências ou o motor fiscal.
Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

@@ -0,0 +1,35 @@
{
"policy": "INDUSTRIAL-COST-SIM-v1",
"database": "sgf_tempo_test",
"synthetic_only": true,
"real_browser_login": true,
"csrf_enabled": true,
"distinct_roles": true,
"full": {
"material": "1000",
"labour": "500",
"pool": "600",
"capacity_hm": "10",
"used_hm": "5",
"rate": "60",
"allocated": "300",
"residual": "300",
"cost": "1800",
"good_units": "10",
"unit_cost": "180",
"origins": "2100"
},
"partial": {
"known": "800",
"total": null,
"unit_cost": null,
"incomplete": true,
"known_origins": "1100",
"residual": "300"
},
"workshop_events_created": 0,
"hypothesis_only": true,
"development_migration_applied": false,
"real_grants_applied": false,
"user_acceptance": false
}
@@ -0,0 +1,14 @@
{
"policy": "INDUSTRIAL-COST-SIM-v1",
"database": "sgf_tempo_test",
"overlapping_processes_per_case": 2,
"checks": {
"criterion_repetition_one_version": true,
"decision_repetition_one_effect": true,
"competing_criteria_one_successor": true,
"calculation_repetition_one_snapshot": true,
"competing_calculations_one_current_allocation": true,
"new_result_refuses_old_approval": true
},
"synthetic_only": true
}
+22
View File
@@ -0,0 +1,22 @@
{
"policy": "INDUSTRIAL-COST-SIM-v1",
"date": "2026-10-27",
"database": "sgf_tempo_test",
"filter": "IndustrialCostsTest|DirectCostsTest|WorkshopTest|ServiceReceivablesTest|InternalConfirmationTest|DatabaseSafetyTest",
"tests": 58,
"assertions": 1185,
"failures": 0,
"errors": 0,
"industrial_test_cases": 9,
"overlapping_process_cases": 6,
"junit_local_ignored": "storage/app/industrial-cost-tests.xml",
"build": {"command": "scripts/sgf.ps1 npm run build", "vite": "8.3.5", "passed": true},
"shared_exact_cost_math_regression_passed": true,
"real_browser_login": true,
"browser_server_stopped_before_final_tests": true,
"development_migration_100000_applied": false,
"real_industrial_grants_applied": false,
"industrial_and_other_real_operational_blocks_preserved": true,
"user_acceptance": false,
"closing_checkpoint_created": false
}