From d10ba06edca7447f5605d589c0bac1a4af09e50d Mon Sep 17 00:00:00 2001 From: nala Date: Tue, 27 Oct 2026 12:39:41 +0200 Subject: [PATCH] Close isolated direct cost trial by delegated technical acceptance Preserve verified 275 MZN and incomplete 175 MZN demonstrations. Keep 090000 and four real cost grants unapplied; real costing and fiscal blocks remain intact. --- AGENTS.md | 4 + README.md | 5 ++ docs/WORKSHOP_DIRECT_COST_ACCEPTANCE.md | 10 +++ docs/WORKSHOP_DIRECT_COST_DELIVERY.md | 85 +++++++++++++++++++ docs/proofs/direct-cost-275-browser.png | Bin 0 -> 39327 bytes docs/proofs/direct-cost-browser-results.json | 35 ++++++++ docs/proofs/direct-cost-concurrency.json | 13 +++ docs/proofs/direct-cost-partial-browser.png | Bin 0 -> 68742 bytes docs/proofs/direct-cost-tests.json | 21 +++++ scripts/direct-cost-concurrency.php | 26 ++++++ scripts/direct-cost-permissions-preview.php | 12 +++ scripts/direct-cost-proof.php | 10 +++ tests/Feature/DirectCostsTest.php | 9 +- 13 files changed, 226 insertions(+), 4 deletions(-) create mode 100644 docs/WORKSHOP_DIRECT_COST_ACCEPTANCE.md create mode 100644 docs/WORKSHOP_DIRECT_COST_DELIVERY.md create mode 100644 docs/proofs/direct-cost-275-browser.png create mode 100644 docs/proofs/direct-cost-browser-results.json create mode 100644 docs/proofs/direct-cost-concurrency.json create mode 100644 docs/proofs/direct-cost-partial-browser.png create mode 100644 docs/proofs/direct-cost-tests.json create mode 100644 scripts/direct-cost-concurrency.php create mode 100644 scripts/direct-cost-permissions-preview.php create mode 100644 scripts/direct-cost-proof.php diff --git a/AGENTS.md b/AGENTS.md index 428e561..0d9f31f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,5 +1,9 @@ # SGF Tempo — instruções locais +- Encerramento por delegação de 27/10/2026: o utilizador autorizou aceitar a entrega isolada de custos directos após conferência técnica do percurso e preservar checkpoint local. Ver `docs/WORKSHOP_DIRECT_COST_ACCEPTANCE.md`. Não se atribui nova verificação pessoal no navegador ao utilizador. `090000` e quatro concessões continuam NÃO aplicados; custeio real, emissão e restantes operações reais bloqueados. Sem CIF/lote industrial ou publicação. Esta autorização substitui apenas a pendência de encerramento técnico deste ensaio. + +- Autorização técnica de 27/10/2026: implementar apenas `WORKSHOP-DIRECT-COST-SIM-v1`, secção 14 de `docs/INDUSTRIAL_COST_ACCOUNTING_SCOPE.md`. Ver `docs/WORKSHOP_DIRECT_COST_DELIVERY.md`. Apenas sintético em `sgf_tempo_test`, origens de oficina verificadas por ID/versão, sem duplicar acontecimentos. 275 MZN conhecidos ou 175 incompletos sem taxa material; exactidão racional, nunca custo completo/margem. Preparação e validação de custos/taxas por identidades distintas, sem editar apontamentos. `090000` e quatro concessões reais apenas propostos, NÃO aplicados; confirmação específica antes de aplicação. Não activar custeio real ou publicar; preservar `7628645`, `ea9dcb3`, alterações posteriores, oficinas/recebimentos/fiscalidade e aprovações. Sem presumir aceitação, CIF ou lote industrial. + - Decisões de desenho confirmadas em 27/10/2026: primeiro ensaio de custo directo de uma ordem de oficina, reutilizando apontamentos verificados por ID/versão, sem duplicar origens. 2 UN × 50,00 + 105/60 H × 100,00 = 275,00 MZN de custo directo conhecido, nunca custo completo/margem; sem taxa material, 175,00 conhecidos e total incompleto. Osmane prepara; Samira valida versões de custos/taxas sem alterar apontamentos técnicos. Futuras provas sintéticas com identidades distintas, sem novas concessões reais. Ver secção 14 de `docs/INDUSTRIAL_COST_ACCOUNTING_SCOPE.md`. Apenas decisões registadas, sem ordem de implementação; lote industrial/CIF adiados. Preservar entregas aceites e bloqueios. - Autorização específica posterior de 27/10/2026 executada: apenas `070000` aplicada em `sgf_tempo_dev`, por caminho explícito com `sgf_dev_owner`, e oito concessões auditadas no tenant #1 / Tempo Lda #1 / SEGI #1: conta #1 `service_receivables.view/prepare/allocate/correction_request`; conta #2 `service_receivables.view/confirm/reconcile/correction_approve`. Ver actualização de `docs/SERVICE_RECEIVABLES_DELIVERY.md`. Preservadas 54 tabelas anteriores, acessos e instalação de oficinas `080000`; seis tabelas novas vazias. Aplicação mantém `sgf_dev_app`; recebimentos, reconciliação, oficinas e emissão reais continuam bloqueados na aplicação/base. Nenhuma operação real ou concessão para técnico/verificador. As indicações anteriores de `070000`/oito concessões pendentes são históricas; esta instalação não activa uso real ou publicação. diff --git a/README.md b/README.md index 2cf31df..249ccfa 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # SGF TEMPO +**Estado posterior em 27/10/2026:** oficinas e recebimentos sintéticos foram aceites; `080000`/quatro concessões de abertura e `070000`/oito concessões foram instaladas tecnicamente por autorizações específicas, sem retirar os bloqueios reais. As indicações de pendência nos parágrafos históricos abaixo foram substituídas pelos relatórios actualizados. O ensaio de custo directo e as suas pendências estão em [WORKSHOP_DIRECT_COST_DELIVERY.md](docs/WORKSHOP_DIRECT_COST_DELIVERY.md); `090000` e quatro concessões de custos não foram aplicadas. + **Oficina de teste (`WORKSHOP-RESOURCE-RECORD-v1`):** ordem, responsável, autorização por versão da tarefa, apontamentos de tempos/materiais e verificação distinta do autor. Só funciona em instância isolada ligada a `sgf_tempo_test`. Abrir a ordem não autoriza executar; ocorrência passada pode ser relatada e reconhecida apenas para auditoria, conservando a marca de fora do âmbito. Comandos, percurso e provas em [WORKSHOP_RESOURCE_DELIVERY.md](docs/WORKSHOP_RESOURCE_DELIVERY.md). Migração `080000` e concessões reais não aplicadas; técnico/verificador reais ainda não indicados. A migração `070000` também permanece pendente: não usar migração geral para aplicar ambas sem autorização específica. Sem stock, custos, facturação ou utilização operacional. Não confundir esta entrega técnica com aceitação do utilizador ou de recebimentos. **Recebimentos simulados (`SGF-RECEIVABLES-SIM-v1`):** implementação exclusivamente de teste, com obrigação explícita, recebimentos parciais, afectações, conferência simulada e correcções rastreáveis. Percurso, comandos e provas em [SERVICE_RECEIVABLES_DELIVERY.md](docs/SERVICE_RECEIVABLES_DELIVERY.md). Migração `070000` e oito concessões reais permanecem pendentes de confirmação específica; não executar a migração normal para as aplicar sem essa confirmação. A demonstração usa apenas `sgf_tempo_test`, login sintético e porta 8001; a aplicação normal não muda de ligação. Recuperação de resposta perdida usa a mesma chave de comando; não repetir criando outro acontecimento. Sem recebimentos reais, recibo fiscal, novo PDF, banco, lançamento ou fecho. Emissão/configuração real continuam bloqueadas. Entrega técnica ainda sujeita à revisão do utilizador. @@ -113,3 +115,6 @@ Para Vite, `sgf.ps1 frontend` (porta 5173, estrita). A aplicação continua a se O primeiro núcleo de cálculo de serviço e a política operacional de truncagem estão documentados em [cálculo de serviço: utilização, provas e limites](docs/SERVICE_CALCULATION_DELIVERY.md). A aplicação normal conserva pendências de aplicabilidade; cálculos de ensaio são exclusivos da instância isolada de testes. Não há activação de perfil fiscal real, emissão, recebimento ou contabilização. O menu **Classificação contabilística**, disponível após actualizar a sessão com os acessos especificamente concedidos, permite preparar e submeter versões PGC-NIRF, validar/recusar sem editar e consultar classificação por data. Categoria e excepções são empresariais; operações e respectivos históricos continuam limitados às unidades autorizadas. As tabelas reais começam vazias, sem contas de movimento ou regras aprovadas por omissão. Consultar [utilização, provas e limites da classificação](docs/CATALOGUE_ACCOUNTING_DELIVERY.md). +## Ensaio isolado de custo directo + +O percurso `WORKSHOP-DIRECT-COST-SIM-v1` e as instruções de prova estão em [WORKSHOP_DIRECT_COST_DELIVERY.md](docs/WORKSHOP_DIRECT_COST_DELIVERY.md). Reutiliza apontamentos verificados sem duplicar consumos; não activa custeio real. Migração `090000` e quatro concessões continuam propostas, não aplicadas. diff --git a/docs/WORKSHOP_DIRECT_COST_ACCEPTANCE.md b/docs/WORKSHOP_DIRECT_COST_ACCEPTANCE.md new file mode 100644 index 0000000..826da8e --- /dev/null +++ b/docs/WORKSHOP_DIRECT_COST_ACCEPTANCE.md @@ -0,0 +1,10 @@ +# Encerramento isolado — WORKSHOP-DIRECT-COST-SIM-v1 + +27/10/2026, Africa/Johannesburg. O utilizador autorizou o encerramento por delegação, condicionado à conferência do percurso e satisfação técnica, mantendo `090000` e quatro concessões por aplicar. O percurso foi conferido através da demonstração e provas já preservadas: 275 MZN de custo directo conhecido, variante de 175 MZN incompletos, identidades sintéticas distintas, histórico, concorrência e recuperação. Não se declara uma nova verificação pessoal do utilizador no navegador. + +Aceitação limitada à entrega isolada de [WORKSHOP_DIRECT_COST_DELIVERY.md](WORKSHOP_DIRECT_COST_DELIVERY.md), com 49 testes / 1 010 asserções aprovados, seis provas concorrentes e compilação concluída. Não se repetiram testes por esta alteração exclusivamente documental. O campo `user_acceptance: false` nas provas anteriores descreve o estado da entrega técnica antes deste encerramento e não é reescrito. + +- Migração `090000` não aplicada em `sgf_tempo_dev`; quatro concessões reais apenas propostas para confirmação específica. +- Custeio operacional real, emissão e restantes operações reais continuam bloqueados; sem stock, custos indirectos, lote industrial, lançamentos ou publicação. +- Preservados `7628645`, `ea9dcb3`, oficinas, recebimentos, cálculo fiscal e aprovações existentes. Não se reabre a aceitação dessas entregas. +- O commit que contém este registo é o checkpoint local. Inclui fontes, testes, documentação e provas sintéticas; não inclui credenciais ou dados operacionais reais novos. Não autoriza push ou outro incremento. diff --git a/docs/WORKSHOP_DIRECT_COST_DELIVERY.md b/docs/WORKSHOP_DIRECT_COST_DELIVERY.md new file mode 100644 index 0000000..152aec6 --- /dev/null +++ b/docs/WORKSHOP_DIRECT_COST_DELIVERY.md @@ -0,0 +1,85 @@ +# WORKSHOP-DIRECT-COST-SIM-v1 — entrega técnica isolada + +27/10/2026, Africa/Johannesburg. Implementa apenas o ensaio aprovado na secção 14 de [INDUSTRIAL_COST_ACCOUNTING_SCOPE.md](INDUSTRIAL_COST_ACCOUNTING_SCOPE.md). **Sem aceitação presumida, custeio real, publicação ou avanço para lote industrial/CIF.** Preservados `7628645`, oficinas, recebimentos, B1, motor exacto e aprovações. O commit posterior `ea9dcb3`, observado durante a execução e não criado por este procedimento, também foi preservado. + +## Funcionalidade + +- Reutiliza os apontamentos técnicos verificados de uma ordem por ID e versão. Não insere ou altera acontecimentos em `wo_*` ao propor/validar custos. A fotografia do cálculo preserva a composição derivada, não um segundo consumo ou tempo operacional. +- Taxas sintéticas com identificador, versão anterior explícita, origem técnica exacta, ordem/empresa/unidade, MZN, unidade e evidência. Zero expressamente indicado é válido; ausência é pendência. Não há procura automática da taxa mais recente: cada linha recebe ID e versão escolhidos ou ausência explícita. Identificadores alternativos podem coexistir e exigem escolha explícita. +- Preparador propõe taxas e cálculos; validador distinto aprova/recusa a versão exacta. Uma aprovação de cálculo incompleto valida só a composição declarada e conserva pendências, nunca a transforma em custo completo. A validação não altera decisões ou apontamentos técnicos. +- Cálculo limitado a duas origens seleccionadas: um consumo efectivo da empresa e um apontamento de trabalho efectivo. Entrega/devolução/requisição, deslocação, material do cliente, origem fora do âmbito ou não verificada são recusados. Não desconta novamente a devolução do consumo já observado. +- Aritmética `Brick\Math` exacta existente; conversão de MIN para H por divisão explícita por 60. Decimais finitos são apresentados exactamente; divisão não finita conserva fracção racional, sem impor arredondamento. Não se reutiliza a política de IVA. Entradas de taxa são cadeias decimais não negativas, até 16 algarismos inteiros/8 decimais, sem float ou notação exponencial. +- Versões novas preservam histórico. Correcção de origem/tarefa ou nova versão da taxa usada torna o cálculo desactualizado; nova versão de cálculo torna a anterior histórica. O conjunto de IDs de tempo/material da ordem também integra a dependência: acréscimos exigem revisão. Taxa de outro identificador não substitui a escolhida silenciosamente. Propostas/refusas de taxa sucessora suspendem conservadoramente o uso actual da versão anterior, sem alterar o seu histórico. + +## Resultados demonstrados + +| Caso | Composição | Resultado e limite | +| --- | --- | --- | +| Taxas identificadas e validadas | 2 UN × 50 + 105 MIN ÷ 60 × 100 | 100 + 175 = **275 MZN de custo directo conhecido**, nunca custo completo/margem | +| Taxa material ausente | Material pendente; 105/60 × 100 | **175 MZN conhecidos**, total seleccionado indisponível/incompleto e pendência explícita | +| Taxa material zero explícita, teste automatizado | 2 × 0 + 105/60 × 100 | 175 no perímetro directo, taxa zero distinguida de ausência | +| Divisão não finita, teste automatizado | 1 MIN ÷ 60 × 1 MZN/H | **1/60 MZN exacto**, sem truncagem ou cêntimo inventado | + +Valorizado o perímetro seleccionado não significa que todos os custos da ordem estejam conhecidos. Sem salários reais, preços de venda, margens, custos indirectos, reconhecimento, stock ou valorização legal de inventário. + +## Segurança, versões e recuperação + +Novos direitos explícitos `direct_costs.view/prepare/validate`, sempre na unidade; não herdados de oficinas, emissão ou administração. Consulta de custos é separada do acesso técnico. Contexto, pertenças e direito específico são revalidados em cada comando e replay, inclusive dentro da transacção. Auto-aprovação é recusada mesmo com ambas as permissões. Identidades reais nunca são reconhecidas por nome/email no código funcional. + +Transacção e bloqueio da empresa serializam preparação/validação/alterações técnicas; versões anteriores explícitas impedem duas sucessoras incompatíveis. A chave idempotente inclui actor/acção/contexto/conteúdo; resposta perdida recupera o ID, conteúdo diferente é conflito. Recalcular composição idêntica à última versão pode devolver o mesmo resultado, sem duplicar fotografia. Comando, auditoria, evento versionado e outbox são atómicos; falha de outbox desfaz a operação. Não há consumidor contabilístico. A outbox permanece `captured_no_accounting`. + +FKs/CHECKs/triggers validam contexto, referências, verificação técnica, unidades, cadeias de versões, taxas aprovadas e separação de autores. As seis tabelas são append-only, incluindo contra UPDATE/DELETE em massa. O núcleo de composição exacta e a autorização autenticada são da aplicação; os triggers não são RLS nem substituem essas verificações. SQL administrativo é uma fronteira de confiança distinta. O bloqueio SQL de ambiente só admite `sgf_tempo_test` na porta 55432; a aplicação exige ainda ambiente isolado e `TestingDatabaseGuard` com papel `sgf_test_runner`. + +## Provas e repetição + +Provas: [resultados do navegador](proofs/direct-cost-browser-results.json), [275 MZN](proofs/direct-cost-275-browser.png), [175 MZN incompletos](proofs/direct-cost-partial-browser.png), [concorrência](proofs/direct-cost-concurrency.json) e [testes finais](proofs/direct-cost-tests.json). + +Resultado final: **49 testes / 1 010 asserções, zero erros/falhas**, incluindo oito casos de custos directos. **Seis provas concorrentes aprovadas**. Compilação aprovada com Vite 8.3.5 e versões/dependências preservadas. Não foi necessária repetição da investigação fiscal. A instância do navegador foi parada antes da regressão final. + +Percurso efectivamente realizado no Edge, `http://127.0.0.1:8001`, sessão/cache isolados e CSRF activo: + +1. Preparador `gestor@example.test`: login real, Empresa Horizonte — Demonstração / Unidade Central — Demonstração → **Custos directos de teste**. Referências técnicas #4 v1 (105 MIN) e #6 v1 (2 UN) nesta execução; IDs não são fixos. +2. Propôs `TEST-TRABALHO` v1 a 100 MZN/H e `TEST-MATERIAL` v1 a 50 MZN/UN, com evidência sintética. +3. Validador `consulta@example.test`: login real distinto, mesmo contexto; validou as duas taxas. Não dispõe de formulário de preparação nem acesso técnico por consequência. +4. Preparador entrou novamente, escolheu explicitamente as duas taxas e calculou 275 MZN. Validador aprovou a versão exacta com fundamento de custo directo conhecido. +5. Preparador criou nova versão sem taxa material. Validador aprovou só os 175 MZN conhecidos com pendência. O resultado de 275 continuou preservado e identificado como histórico. + +A fixture apenas criou/verificou fontes técnicas pelos comandos existentes da oficina, com relógio sintético local no processo para a autorização histórica e restaurado no fim. Não mudou relógio do sistema, ligação normal ou regras técnicas. Sete apontamentos de origem permaneceram sete após os cálculos. Palavras-passe aleatórias não são apresentadas ou versionadas. + +Seis cenários com dois processos realmente sobrepostos: mesma taxa; mesma decisão; taxas sucessoras concorrentes; mesmo cálculo; cálculos concorrentes incompatíveis; cálculo novo versus aprovação antiga. Provas adicionais automatizadas: revogação no pedido seguinte/replay, identidades/contextos/versões manipulados, moedas/unidades/precisão, origem corrigida e ainda não verificada, imutabilidade SQL, recusa, falta versus zero e falha/recuperação de outbox. A regressão relevante inclui oficinas, recebimentos, B1 e guardas de testes. + +Repetir exclusivamente em testes, sem instância de prova em execução durante os testes destrutivos: + +```powershell +powershell -NoProfile -ExecutionPolicy Bypass -File scripts/sgf.ps1 test '--filter=DirectCostsTest|WorkshopTest|ServiceReceivablesTest|InternalConfirmationTest|DatabaseSafetyTest' +powershell -NoProfile -ExecutionPolicy Bypass -File scripts/sgf.ps1 npm run build +``` + +Para o navegador, preparar uma base de testes vazia sob as guardas existentes, executar `scripts/browser-proof.ps1 start` (prepara a fundação sintética), depois `sgf.ps1 php scripts/direct-cost-fixture.php --env=testing`. O preparador recusa estado preenchido e não apaga dados. Seguir o percurso acima com a credencial no manifesto local protegido. Depois do percurso, `sgf.ps1 php scripts/direct-cost-proof.php --env=testing` e `sgf.ps1 php scripts/direct-cost-concurrency.php --env=testing`. Parar com `scripts/browser-proof.ps1 stop`; não terminar processos alheios para libertar portas. Os testes finais recriam só `sgf_tempo_test`, preservando as provas em ficheiros. + +## Migração proposta — NÃO aplicada em desenvolvimento + +**`2026_10_27_090000_create_workshop_direct_costs.php`**, SQL `database/sql/direct-costs.sql`, destino futuro **`sgf_tempo_dev`**, apenas após confirmação específica. + +Seis tabelas novas: `dc_rates`, `dc_calculations`, `dc_decisions`, `dc_commands`, `dc_events`, `dc_outbox`; FKs, índices, versões únicas, funções/triggers de integridade, ambiente e imutabilidade. Amplia o CHECK de concessões com três nomes de unidade, preservando alternativas existentes. Não concede acessos, não altera apontamentos ou tabelas de recebimentos/fiscalidade. `down()` recusa apagar história. Sem reset/fresh em desenvolvimento. Mesmo instalada futuramente, a aplicação e SQL continuam a impedir custeio operacional nessa base. + +## Concessões propostas — separadas, NÃO aplicadas + +Conferidas por leitura em `scripts/direct-cost-permissions-preview.php`, sem modo de aplicação. Todas ausentes na conferência de 27/10/2026. Âmbito exacto: **tenant #1 / Tempo Lda #1 / SEGI #1**. + +| Conta existente | Proposta | +| --- | --- | +| Osmane Nala #1, nala@tempo.co.mz | `direct_costs.view`, `direct_costs.prepare` | +| Samira Nal #2, onala@me.com | `direct_costs.view`, `direct_costs.validate` | + +São **quatro concessões propostas**, não autorização de aplicação ou activação real. Sem gestão de acessos, supervisão técnica, alteração dos apontamentos, salários, margem, stock ou emissão. Só as identidades equivalentes sintéticas receberam estes direitos nos testes. Técnico/verificador reais continuam sem concessões novas. + +## Encerramento posterior por delegação + +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. + +## 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. + +Recorte deliberado de duas origens, uma moeda e uma ordem, sem partilhas entre ordens, custos indirectos, lote, produção em curso, margens, stock ou facturação. Taxas ligadas à versão exacta da origem exigem nova taxa validada para uma correcção técnica; não há tabela universal de salários/custos. Sem PDF/exportação, assinatura digital, activação real ou aceitação presumida. As fotografias/eventos anteriores e todos os bloqueios permanecem preservados. diff --git a/docs/proofs/direct-cost-275-browser.png b/docs/proofs/direct-cost-275-browser.png new file mode 100644 index 0000000000000000000000000000000000000000..0acd80eb826f9819f59230b47504616ddf138d53 GIT binary patch literal 39327 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 literal 0 HcmV?d00001 diff --git a/docs/proofs/direct-cost-tests.json b/docs/proofs/direct-cost-tests.json new file mode 100644 index 0000000..a0d71a2 --- /dev/null +++ b/docs/proofs/direct-cost-tests.json @@ -0,0 +1,21 @@ +{ + "policy": "WORKSHOP-DIRECT-COST-SIM-v1", + "date": "2026-10-27", + "database": "sgf_tempo_test", + "filter": "DirectCostsTest|WorkshopTest|ServiceReceivablesTest|InternalConfirmationTest|DatabaseSafetyTest", + "tests": 49, + "assertions": 1010, + "failures": 0, + "errors": 0, + "direct_cost_test_cases": 8, + "overlapping_process_cases": 6, + "junit_local_ignored": "storage/app/direct-cost-tests.xml", + "build": {"command": "scripts/sgf.ps1 npm run build", "vite": "8.3.5", "passed": true}, + "browser_real_login": true, + "browser_server_stopped_before_final_tests": true, + "development_migration_090000_applied": false, + "real_cost_grants_applied": false, + "operational_and_fiscal_blocks_preserved": true, + "fiscal_and_workshop_core_unchanged_from": "7628645", + "user_acceptance": false +} diff --git a/scripts/direct-cost-concurrency.php b/scripts/direct-cost-concurrency.php new file mode 100644 index 0000000..d5a188e --- /dev/null +++ b/scripts/direct-cost-concurrency.php @@ -0,0 +1,26 @@ +make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap(); +use App\Modules\Workshop\DirectCosts; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Str; +use Symfony\Component\Process\Process; +DirectCosts::guard();$f=json_decode(file_get_contents('C:/laragon/data/sgf-tempo/secrets/browser-fixture.json'),true,32,JSON_THROW_ON_ERROR);$fx=$f['direct_costs'];$proof=[];$key=fn()=>(string)Str::uuid(); +$base=['tenant'=>$f['tenant'],'company'=>$f['company'],'unit'=>$f['unit'],'order'=>$fx['order']]; +$pair=function($one,$two)use($base){ + $a=new Process([PHP_BINARY,'scripts/direct-cost-worker.php','--env=testing'],base_path(),null,json_encode($one+$base+['pause'=>true]));$b=new Process([PHP_BINARY,'scripts/direct-cost-worker.php','--env=testing'],base_path(),null,json_encode($two+$base)); + $a->start();if(!$a->waitUntil(fn($t,$v)=>str_contains($v,'LOCK_HELD')))throw new RuntimeException('Concurrent lock not observed.');$b->start();$a->wait();$b->wait();$out=[]; + foreach([$a,$b] as $p){if(!$p->isSuccessful())throw new RuntimeException('Cost worker failed.');$lines=array_values(array_filter(explode("\n",trim($p->getOutput())),fn($v)=>str_starts_with($v,'{')));$out[]=json_decode(end($lines),true,32,JSON_THROW_ON_ERROR);}return $out; +}; +$check=function($out,bool $replay){if($out[0]['status']!==200||$out[1]['status']!==($replay?200:409)||($replay&&(!$out[1]['result']['replayed']||$out[0]['result']['id']!==$out[1]['result']['id'])))throw new RuntimeException('Unexpected concurrent outcome.');}; +$rate=['method'=>'rate','actor'=>$f['manager_id'],'key'=>$key(),'input'=>['entry_id'=>$fx['material'],'entry_version'=>1,'identifier'=>'TEST-CONCURRENT-'.Str::uuid(),'version'=>1,'previous_id'=>null,'currency'=>'MZN','unit'=>'UN','amount'=>'1','evidence'=>'Taxa sintética concorrente.']]; +$out=$pair($rate,$rate);$check($out,true);$proof['rate_repetition_one_version']=true;$rid=$out[0]['result']['id']; +$decision=['method'=>'decide','actor'=>$f['reader_id'],'key'=>$key(),'input'=>['kind'=>'rate','id'=>$rid,'version'=>1,'decision'=>'approved','reason'=>'Validação sintética concorrente.']];$check($pair($decision,$decision),true);$proof['decision_repetition_one_effect']=true; +$one=$rate;$one['key']=$key();$one['input']['version']=2;$one['input']['previous_id']=$rid;$two=$one;$two['key']=$key();$two['input']['amount']='2';$check($pair($one,$two),false);$proof['competing_rate_versions_one_winner']=true; +$rates=DB::table('dc_rates')->where('order_id',$fx['order'])->whereIn('identifier',['TEST-TRABALHO','TEST-MATERIAL'])->get()->keyBy('identifier'); +$lines=[['entry_id'=>$fx['time'],'entry_version'=>1,'rate_id'=>$rates['TEST-TRABALHO']->id,'rate_version'=>1],['entry_id'=>$fx['material'],'entry_version'=>1,'rate_id'=>$rates['TEST-MATERIAL']->id,'rate_version'=>1]]; +$last=DB::table('dc_calculations')->where('order_id',$fx['order'])->orderByDesc('version')->first(); +$calc=['method'=>'calculate','actor'=>$f['manager_id'],'key'=>$key(),'input'=>['currency'=>'MZN','version'=>$last->version+1,'previous_id'=>$last->id,'lines'=>$lines]];$out=$pair($calc,$calc);$check($out,true);$proof['calculation_repetition_one_snapshot']=true; +$last=DB::table('dc_calculations')->where('order_id',$fx['order'])->orderByDesc('version')->first();$calc['key']=$key();$calc['input']['version']=$last->version+1;$calc['input']['previous_id']=$last->id;$calc['input']['lines'][1]['rate_id']=null;$calc['input']['lines'][1]['rate_version']=null;$two=$calc;$two['key']=$key();$two['input']['lines']=$lines;$two['input']['lines'][0]['rate_id']=null;$two['input']['lines'][0]['rate_version']=null;$out=$pair($calc,$two);$check($out,false);$proof['competing_calculations_one_revision']=true; +$last=DB::table('dc_calculations')->where('order_id',$fx['order'])->orderByDesc('version')->first();$calc['key']=$key();$calc['input']['version']=$last->version+1;$calc['input']['previous_id']=$last->id;$calc['input']['lines']=$lines; +$oldDecision=['method'=>'decide','actor'=>$f['reader_id'],'key'=>$key(),'input'=>['kind'=>'calculation','id'=>$last->id,'version'=>$last->version,'decision'=>'approved','reason'=>'Decisão de uma versão agora antiga.']];$check($pair($calc,$oldDecision),false);$proof['new_calculation_refuses_old_approval']=true; +file_put_contents(base_path('docs/proofs/direct-cost-concurrency.json'),json_encode(['database'=>'sgf_tempo_test','overlapping_processes_per_case'=>2,'checks'=>$proof,'synthetic_only'=>true],JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));echo "Six overlapping-process direct cost scenarios passed.\n"; diff --git a/scripts/direct-cost-permissions-preview.php b/scripts/direct-cost-permissions-preview.php new file mode 100644 index 0000000..ab0a21d --- /dev/null +++ b/scripts/direct-cost-permissions-preview.php @@ -0,0 +1,12 @@ +make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap(); +if(!\App\Modules\Identity\Services\LocalDatabaseGuard::allows())throw new RuntimeException('Own SGF development database required.'); +$db=\Illuminate\Support\Facades\DB::class;$grants=[]; +foreach([1=>['view','prepare'],2=>['view','validate']] as $user=>$rights){ + $u=$db::table('users')->where('id',$user)->first(['id','name','email']);if(!$u||!$db::table('company_memberships')->where(['user_id'=>$user,'tenant_id'=>1,'company_id'=>1])->exists())throw new RuntimeException('Existing account/member required.'); + foreach($rights as $r){$permission='direct_costs.'.$r;$scope=['user_id'=>$user,'tenant_id'=>1,'company_id'=>1,'unit_id'=>1,'permission'=>$permission];$grants[]=$scope+['account'=>$u,'already_granted'=>$db::table('permission_grants')->where($scope)->exists()];} +} +$company=$db::table('companies')->where(['id'=>1,'tenant_id'=>1])->value('name');$unit=$db::table('units')->where(['id'=>1,'company_id'=>1,'tenant_id'=>1])->value('name');if($company!=='Tempo Lda'||$unit!=='SEGI')throw new RuntimeException('Expected scope differs.'); +try{\App\Modules\Workshop\DirectCosts::guard();throw new RuntimeException('Real costing not blocked.');}catch(\Symfony\Component\HttpKernel\Exception\HttpException $e){if($e->getStatusCode()!==403)throw $e;} +echo json_encode(['mode'=>'preview_only','company'=>$company,'unit'=>$unit,'proposed_grants'=>$grants,'applied'=>false,'real_costing_blocked'=>true,'migration_090000_applied'=>$db::table('migrations')->where('migration','2026_10_27_090000_create_workshop_direct_costs')->exists()],JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_THROW_ON_ERROR).PHP_EOL; diff --git a/scripts/direct-cost-proof.php b/scripts/direct-cost-proof.php new file mode 100644 index 0000000..c856516 --- /dev/null +++ b/scripts/direct-cost-proof.php @@ -0,0 +1,10 @@ +make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap(); +\App\Modules\Workshop\DirectCosts::guard();$f=json_decode(file_get_contents('C:/laragon/data/sgf-tempo/secrets/browser-fixture.json'),true,32,JSON_THROW_ON_ERROR);$fx=$f['direct_costs'];$db=\Illuminate\Support\Facades\DB::class; +$rows=$db::table('dc_calculations')->where('order_id',$fx['order'])->orderBy('id')->get();if($rows->count()<2)throw new RuntimeException('Two browser calculations required.'); +$full=json_decode($rows[0]->snapshot,true);$partial=json_decode($rows[1]->snapshot,true); +if($full['known_subtotal_exact']!=='275'||$full['incomplete']||$partial['known_subtotal_exact']!=='175'||!$partial['incomplete']||$partial['selected_direct_total_exact']!==null||count($partial['pending'])!==1)throw new RuntimeException('Browser arithmetic/completeness differs.'); +foreach([$rows[0],$rows[1]] as $c){$decision=$db::table('dc_decisions')->where(['calculation_id'=>$c->id,'decision'=>'approved'])->first();if(!$decision||$decision->actor_id===$c->actor_id)throw new RuntimeException('Distinct approval required.');} +if($db::table('wo_entries')->where('order_id',$fx['order'])->count()!==7)throw new RuntimeException('Technical events duplicated.'); +$proof=['policy'=>\App\Modules\Workshop\DirectCosts::POLICY,'database'=>'sgf_tempo_test','synthetic_only'=>true,'real_browser_login'=>true,'csrf_enabled'=>true,'distinct_cost_roles'=>true,'original_workshop_entries'=>7,'technical_events_not_duplicated'=>true,'entry_versions'=>[['id'=>$fx['time'],'version'=>1],['id'=>$fx['material'],'version'=>1]],'full_selected_direct'=>['material'=>'100','labour'=>'175','known_subtotal'=>'275','complete_cost_claimed'=>false],'missing_material_rate'=>['known_subtotal'=>'175','selected_total'=>null,'incomplete'=>true,'pending'=>true],'both_exact_versions_approved'=>true,'real_grants_applied'=>false,'development_migration_applied'=>false]; +file_put_contents(base_path('docs/proofs/direct-cost-browser-results.json'),json_encode($proof,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));echo "Browser results verified: 275 known, 175 incomplete, distinct approval, seven original technical entries unchanged in number.\n"; diff --git a/tests/Feature/DirectCostsTest.php b/tests/Feature/DirectCostsTest.php index d62218c..3301ef6 100644 --- a/tests/Feature/DirectCostsTest.php +++ b/tests/Feature/DirectCostsTest.php @@ -15,8 +15,8 @@ final class DirectCostsTest extends TestCase { protected function setUp(): void {parent::setUp();$this->f=DirectCostFixture::create();$this->login();} private function login(string $who='manager'): void {$this->postJson('/api/login',['email'=>$this->f[$who]->email,'password'=>$this->f['password']])->assertOk();$this->token=$this->postJson('/api/context',['tenant_id'=>$this->f['tenant'],'company_id'=>$this->f['company'],'unit_id'=>$this->f['unit']])->assertOk()->json('context.token');} private function send(string $action,array $d,?string $key=null,?int $order=null){return $this->withHeaders(['X-SGF-Context'=>$this->token,'Idempotency-Key'=>$key??(string)Str::uuid()])->postJson('/api/direct-costs/orders/'.($order??$this->f['order']).'/'.$action,$d);} - private function rate(string $kind,string $amount='50',array $extra=[]){return $this->send('rates',array_replace(['entry_id'=>$this->f[$kind],'entry_version'=>1,'identifier'=>'TEST-'.$kind,'version'=>1,'previous_id'=>null,'currency'=>'MZN','unit'=>$kind==='time'?'H':'UN','amount'=>$amount,'evidence'=>'Taxa sintética, não custo real.'],$extra));} - private function decide(string $kind,int $id,array $extra=[]){$r=DB::table($kind==='rate'?'dc_rates':'dc_calculations')->find($id);return $this->send('decisions',array_replace(['kind'=>$kind,'id'=>$id,'version'=>$r->version,'decision'=>'approved','reason'=>'Revisão sintética de custos e taxas.'],$extra));} + private function rate(string $kind,string $amount='50',array $extra=[]){return $this->send('rates',array_replace(['entry_id'=>$this->f[$kind],'entry_version'=>1,'identifier'=>'TEST-'.$kind,'version'=>1,'previous_id'=>null,'currency'=>'MZN','unit'=>$kind==='time'?'H':'UN','amount'=>$amount,'evidence'=>'Taxa sintética, não custo real.'],$extra));} + private function decide(string $kind,int $id,array $extra=[]){$r=DB::table($kind==='rate'?'dc_rates':'dc_calculations')->find($id);return $this->send('decisions',array_replace(['kind'=>$kind,'id'=>$id,'version'=>$r->version,'decision'=>'approved','reason'=>'Revisão sintética de custos e taxas.'],$extra));} private function rates(): array {$m=$this->rate('material')->assertOk()->json('id');$t=$this->rate('time','100')->assertOk()->json('id');$this->login('reader');$this->decide('rate',$m)->assertOk();$this->decide('rate',$t)->assertOk();$this->login();return [$m,$t];} private function input(?int $m,?int $t,array $extra=[]): array {return array_replace(['currency'=>'MZN','version'=>1,'previous_id'=>null,'lines'=>[['entry_id'=>$this->f['material'],'entry_version'=>1,'rate_id'=>$m,'rate_version'=>$m?1:null],['entry_id'=>$this->f['time'],'entry_version'=>1,'rate_id'=>$t,'rate_version'=>$t?1:null]]],$extra);} private function listing(){return $this->getJson('/api/direct-costs')->assertOk();} @@ -24,6 +24,7 @@ final class DirectCostsTest extends TestCase { public function test_exact_known_cost_and_distinct_validation_without_new_consumption(): void { $before=DB::table('wo_entries')->get()->toJson();[$m,$t]=$this->rates();$id=$this->send('calculations',$this->input($m,$t))->assertOk()->json('id');$s=$this->snapshot($id); $this->assertSame('275',$s['known_subtotal_exact']);$this->assertSame('275',$s['selected_direct_total_exact']);$this->assertFalse($s['incomplete']);$this->assertSame(['175','100'],array_column($s['lines'],'cost_exact'));$this->assertSame('1.75',$s['lines'][0]['cost_quantity_exact']); + IdentityFixture::grant($this->f['manager']->id,$this->f['tenant'],$this->f['company'],'direct_costs.validate',$this->f['unit']); $this->decide('calculation',$id)->assertForbidden();$this->login('reader');$this->decide('calculation',$id)->assertOk();$this->assertSame($before,DB::table('wo_entries')->get()->toJson()); $this->assertSame(DB::table('dc_commands')->count(),DB::table('dc_events')->count());$this->assertSame(DB::table('dc_events')->count(),DB::table('dc_outbox')->count()); } @@ -44,7 +45,7 @@ final class DirectCostsTest extends TestCase { foreach(['','1.000000001','-1','1e2','1,00'] as $value)$this->rate('material',$value)->assertStatus(422); $this->rate('material','50',['amount'=>50])->assertStatus(422); $e=DB::table('wo_entries')->find($this->f['material']);$d=json_decode($e->data,true);unset($d['policy']);$rev=(int)DB::selectOne('SELECT sgf_wo_revision(?) AS v',[$e->order_id])->v; - app(CompanyContext::class)->selectFor($this->f['technician']->id,$this->f['tenant'],$this->f['company'],$this->f['unit']);app(WorkshopWorkflow::class)->record($e->order_id,$this->f['technician']->id,array_replace($d,['version'=>2,'previous_id'=>$e->id,'revision'=>$rev,'quantity'=>'2.1','correction_reason'=>'Correcção sintética de quantidade.']),(string)Str::uuid());$this->login();$this->rate('material')->assertStatus(409);$latest=DB::table('wo_entries')->where('previous_id',$e->id)->first();$this->rate('material','50',['entry_id'=>$latest->id,'entry_version'=>2])->assertStatus(409); + app(CompanyContext::class)->selectFor($this->f['technician']->id,$this->f['tenant'],$this->f['company'],$this->f['unit']);app(WorkshopWorkflow::class)->record($e->order_id,$this->f['technician']->id,array_replace($d,['version'=>2,'previous_id'=>$e->id,'revision'=>$rev,'quantity'=>'2.1','correction_reason'=>'Correcção sintética de quantidade.']),(string)Str::uuid());$this->login();$this->rate('material')->assertStatus(409);$latest=DB::table('wo_entries')->where('previous_id',$e->id)->first();$this->rate('material','50',['entry_id'=>$latest->id,'entry_version'=>2])->assertStatus(409); } public function test_roles_scope_revocation_and_idempotent_response_recovery(): void { $key=(string)Str::uuid();$d=['entry_id'=>$this->f['material'],'entry_version'=>1,'identifier'=>'TEST-REPLAY','version'=>1,'previous_id'=>null,'currency'=>'MZN','unit'=>'UN','amount'=>'50','evidence'=>'TEST-REPLAY'];$id=$this->send('rates',$d,$key)->assertOk()->json('id');$this->send('rates',$d,$key)->assertOk()->assertJsonPath('replayed',true)->assertJsonPath('id',$id);$this->send('rates',array_replace($d,['amount'=>'51']),$key)->assertStatus(409); @@ -64,7 +65,7 @@ final class DirectCostsTest extends TestCase { $e=DB::table('wo_entries')->find($this->f['time']);$d=json_decode($e->data,true);unset($d['policy']);$d=array_replace($d,['version'=>2,'previous_id'=>$e->id,'revision'=>(int)DB::selectOne('SELECT sgf_wo_revision(?) AS v',[$e->order_id])->v,'ends_at'=>$this->f['day'].'T09:01:00+02:00','pauses'=>[],'correction_reason'=>'Um minuto no novo ensaio exacto.']); app(CompanyContext::class)->selectFor($this->f['technician']->id,$this->f['tenant'],$this->f['company'],$this->f['unit']);$w=app(WorkshopWorkflow::class);$next=$w->record($e->order_id,$this->f['technician']->id,$d,(string)Str::uuid())['id']; $this->login('reader');$this->decide('calculation',$id)->assertStatus(409); - app(CompanyContext::class)->selectFor($this->f['reviewer']->id,$this->f['tenant'],$this->f['company'],$this->f['unit']);$w->verify($next,$this->f['reviewer']->id,['version'=>2,'revision'=>(int)DB::selectOne('SELECT sgf_wo_revision(?) AS v',[$e->order_id])->v,'decision'=>'verified','reason'=>'Verificação técnica da correcção.'],(string)Str::uuid());$this->login(); + app(CompanyContext::class)->selectFor($this->f['reviewer']->id,$this->f['tenant'],$this->f['company'],$this->f['unit']);$w->verify($next,$this->f['reviewer']->id,['version'=>2,'revision'=>(int)DB::selectOne('SELECT sgf_wo_revision(?) AS v',[$e->order_id])->v,'decision'=>'verified','reason'=>'Verificação técnica da correcção.'],(string)Str::uuid());$this->login(); $newRate=$this->rate('time','1',['entry_id'=>$next,'entry_version'=>2,'version'=>2,'previous_id'=>$t])->assertOk()->json('id');$this->login('reader');$this->decide('rate',$newRate)->assertOk();$this->login();$in=$this->input(null,$newRate,['version'=>2,'previous_id'=>$id]);$in['lines'][1]=['entry_id'=>$next,'entry_version'=>2,'rate_id'=>$newRate,'rate_version'=>2];$result=$this->send('calculations',$in)->assertOk()->json('id');$this->assertSame('1/60',$this->snapshot($result)['known_subtotal_exact']);$this->assertSame($original,DB::table('dc_calculations')->find($id)->snapshot); // Own tenant does not imply sibling company or hidden unit access. IdentityFixture::grant($this->f['manager']->id,$this->f['tenant'],$this->f['company'],'unit.view',$this->f['hidden']);IdentityFixture::grant($this->f['manager']->id,$this->f['tenant'],$this->f['company'],'direct_costs.view',$this->f['hidden']);IdentityFixture::grant($this->f['manager']->id,$this->f['tenant'],$this->f['company'],'direct_costs.prepare',$this->f['hidden']);