Files
SGF/docs/SERVICE_INVOICE_TEST_DELIVERY.md
T

14 KiB

Emissão documental técnica — demonstração isolada

26/10/2026, Africa/Johannesburg. Implementação do âmbito autorizado, preservando 9f48004 e as alterações posteriores. Não é habilitação para emissão real nem aceitação automática da entrega.

Funcional e provado

  • Séries sintéticas novas com proposta, versão anterior explícita e validação por identidade distinta. Série encerrada/futura/desactualizada não substitui silenciosamente configuração vigente; o contador não pode ser reiniciado por uma nova versão. Só códigos TEST-... são aceites neste incremento.
  • Regra temporal prospectiva separada do perfil de cálculo, ligada à versão do rascunho/preparação e à cobertura. Proponente prepara; validador fiscal aprova/recusa. O modo suportado na prova é emissão dentro de uma janela explicitamente fundamentada. A data efectiva nasce na confirmação, com UTC/zona/data civil separados; revisão de outro dia é recusada.
  • Revisão de prontidão sem número. Confirmação com sessão/CSRF, token de contexto, permissões próprias, hash da revisão e idempotência. Verifica dados do emitente/cliente, período, unidade de medida, cálculo actual e perfil vigente na data do acontecimento. São condições técnicas do cenário de teste, não declaração de catálogo legal universal.
  • Contador, identidade, fotografia, PDF preservado, auditoria, evento e outbox numa transacção. Unicidade por empresa/série/número e por rascunho/prestação no recorte. Repetição após resposta perdida devolve o documento existente; nova chave não cria segunda factura do mesmo rascunho.
  • Consulta do navegador e PDF partilham a mesma lista documental produzida da fotografia; essa lista também é fixada no snapshot para não depender de alterações futuras do renderizador. Mudança posterior de cadastros não altera o documento. O PDF é guardado com SHA-256 e devolvido pelos mesmos bytes; não se regenera do cadastro actual. Hash não é certificação ou assinatura fiscal.
  • Pedido de correcção com motivo e autor, ligado ao original, sem mudar o documento e sem efeito monetário/fiscal. Sem nota de crédito/débito, anulação fiscal ou reabertura.
  • Aviso TESTE — SEM VALIDADE FISCAL no navegador e no cabeçalho/rodapé de cada página PDF. A data de exigibilidade e o período da demonstração são explicitamente simulados; não alteram as pendências do caso real já aceite.

Bloqueio real e preservação

ServiceInvoicing::guard() recusa todas as mutações e a via de documento/PDF fora de testing/browser-testing; dentro destes ambientes executa também TestingDatabaseGuard. Não existe flag para habilitar emissão real. A consulta normal apresenta o bloqueio e não depende das novas tabelas já existirem. Alterar a variável de ambiente sem trocar para o destino de testes seguro não ultrapassa a guarda.

Nenhuma migração, série, concessão, prestação, factura ou demonstração foi criada na base normal por esta entrega. O caso real e o cálculo condicionado permanecem como estavam; B1 e aprovações existentes preservados. Não se alterou o InvesteMoz, não houve comunicação à AT, publicação, recebimento ou lançamento. Nenhum novo checkpoint criado sem pedido.

PDF: opção técnica e limites

InvoicePdf é um renderizador interno pequeno para este documento textual, sem bibliotecas/ferramentas ou versões novas. A versão final é sgf-test-invoice-text-v2. Suporta texto WinAnsi/Windows-1252, incluindo os caracteres portugueses usados no cenário; caracteres não representáveis causam recusa explícita na prontidão, sem substituição silenciosa. Não é um motor geral de HTML/PDF: não inclui logótipo/imagens, assinatura, QR ou anexos. A consulta emitida também usa o formato documental textual, sem procurar esses recursos no cadastro actual.

O PDF sintético final tem uma página. Caso de esforço com texto extenso e palavras longas produziu quatro páginas, com cabeçalho/rodapé e margens protegidos. O PDF foi extraído e renderizado para conferência; o hash da descarga final no navegador coincide com o artefacto preservado. Documentos anteriores da prova continuam com os bytes e versão originais do renderizador.

Artefacto de demonstração: output/pdf/sgf-tempo-factura-teste.pdf; contém apenas identidades e pressupostos sintéticos. Prova agregada do PDF.

Verificações

53 testes, 924 asserções, todos passados, exclusivamente em sgf_tempo_test, com filtro ServiceInvoiceTest|ServiceFiscalTest|ServiceCalculationTest|DocumentPreviewTest|InternalConfirmationTest|DatabaseSafetyTest. Compilação Vite 8.3.5 passou; versões de ferramentas/dependências mantidas.

Cobertura: revisão sem consumo de número; dados incompletos e caracteres não suportados; falta de regra prospectiva compatível; edição indevida de campos protegidos; versão/revisão/data antigas; série encerrada; separação de funções e revogação; isolamento; B1 recusado como origem de emissão directa; imutabilidade por operações em massa; repetição da emissão/PDF; pedido de correcção sem efeito; falha injectada no outbox com rollback de contador/documento/evento/auditoria/comando; retry usando o primeiro número válido.

Dois processos PHP realmente sobrepostos provaram uma inserção e um replay com o mesmo ID, mantendo documentos anteriores e numeração distinta na série partilhada. Prova de concorrência. O teste não afirma ser prova de RLS ou de conformidade fiscal.

Navegador Edge: login real sintético, CSRF activo, sessão/cache isolados em http://127.0.0.1:8001, apenas sgf_tempo_test. Não foi usado actingAs como demonstração de login.

  1. Entrar com o gestor sintético; seleccionar Empresa Horizonte — Demonstração → Unidade Central — Demonstração → Facturas de teste.
  2. Consultar série TEST-SERIE-ISOLADA v1, número inicial 1, e regra TEST-ISSUE-RULE v1, aprovadas por validador distinto. IDs do rascunho aparecem na regra; não dependem de um ID fixo entre repetições.
  3. Seleccionar rascunho/série/regra → Rever prontidão. A revisão mostra 7850, IVA proposto 1256.00, total 9106.00 MZN e que o instante efectivo só será fixado ao confirmar.
  4. Confirmar emissão apenas de teste: atribuição única do número 1, consulta da fotografia e descarga PDF autenticada.
  5. Scripts concorrentes acrescentaram o documento 2; a revisão de paginação gerou o documento 3 no mesmo cenário, preservando os anteriores. Consultado o documento final e descarregado o respectivo PDF; hash igual ao artefacto entregue. Imagem do navegador.
  6. Instância de prova encerrada antes da execução final dos testes; a aplicação normal não mudou de ligação. Os testes finais recriaram apenas a base de testes; os artefactos sintéticos de prova permanecem.

Repetição técnica:

powershell -NoProfile -ExecutionPolicy Bypass -File scripts/sgf.ps1 test --stop-on-failure '--filter=ServiceInvoiceTest|ServiceFiscalTest|ServiceCalculationTest|DocumentPreviewTest|InternalConfirmationTest|DatabaseSafetyTest'
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/sgf.ps1 npm run build
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/browser-proof.ps1 start
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/sgf.ps1 php scripts/invoice-fixture.php --env=testing

Após o percurso no navegador: sgf.ps1 php scripts/invoice-concurrency.php --env=testing e, para o PDF de demonstração, sgf.ps1 php scripts/invoice-export-proof.php --env=testing. Parar com scripts/browser-proof.ps1 stop. O preparador recusa fixture preenchida; não apaga dados para prosseguir. Credenciais aleatórias ficam apenas no armazenamento local protegido, nunca neste relatório.

Delta para eventual aplicação em desenvolvimento — pendente

Migração 2026_10_26_060000_create_test_invoice_issuance.php, confirmada Pending por leitura de migrate:status na base normal. Cria oito tabelas:

  • si_proposals, si_decisions: configuração/regra e decisões imutáveis.
  • si_counters: contador protegido por empresa/série, âmbito imutável, incremento unitário, sem apagamento.
  • si_invoices: identidade, fotografia, PDF e hash; unicidades por origem e numeração, chaves e trigger de âmbito/configuração/regra.
  • si_events, si_outbox: captura durável sem processamento financeiro/contabilístico.
  • si_commands: recuperação/idempotência por empresa/chave/autor/unidade.
  • si_correction_requests: pedidos pendentes sem efeito fiscal.

Amplia o CHECK de permission_grants, preservando as alternativas anteriores; não atribui direitos. Tabelas de história/documentos são append-only. Sem modificação de B1/catálogos/cálculos, sem reset/fresh ou rollback destrutivo automático. Qualquer aplicação em sgf_tempo_dev exige confirmação específica deste delta; não foi executada. A migração sozinha não habilita emissão real.

Proposta separada de série real — não configurada

Decisão encerrada: série nova, sem continuidade da série anterior. Para discussão concreta, propõe-se código SGF-FT-A, primeiro número 1, limitado inicialmente à empresa/unidade autorizadas. São valores técnicos propostos, não regra legal, número reservado ou configuração aplicada. Não há reinício anual implícito. Antes de aplicar: confirmação específica, ausência de sobreposição, suporte de autorização/numeração e vigência efectiva. O código real não é aceite pela actual via de teste, que só admite TEST-....

Osmane prepara a proposta e pede correcções; Samira valida a configuração e o tratamento fiscal. A escolha dessas responsabilidades não atribui automaticamente permissões nem autoriza configurar a série real enquanto faltarem as condições.

Proposta separada de concessões — nenhuma aplicada

Para as contas existentes já identificadas no âmbito aprovado (conferência final antes de aplicar):

Conta/função acordada Novos direitos propostos Âmbito
Osmane, conta #1 invoice_series.view, invoice_series.propose Empresa #1; actuação apenas nas unidades já autorizadas
Osmane, conta #1 service_invoices.view, service_invoices.issue, service_invoices.correction_request Exclusivamente unidade SEGI #1 da empresa #1
Samira, conta #2 invoice_series.view, invoice_series.approve Empresa #1; validação apenas nas unidades já autorizadas
Samira, conta #2 service_invoices.view Exclusivamente unidade SEGI #1 da empresa #1

São oito concessões propostas. A proposta/validação da regra temporal reutiliza os direitos service_fiscal.propose/approve existentes e o modelo de identidades distintas; não exige nova aprovação do perfil fiscal aceite. Nenhuma concessão de emissão por Samira, validação por Osmane, administração, comunicação externa, lançamento ou correcção fiscal automática. Matriz real requer confirmação específica antes de aplicação. A emissão normal permanece bloqueada mesmo com estes direitos.

Condições antes de emissão real

Continuam as provas específicas da secção 9 de âmbito de emissão: autorização/certificação/dispensa aplicável ao software; suporte de série/numeração e eventual comunicação; procedimento fiscal válido de correcção; prontidão documental e regra temporal concretas. A janela de emissão e os dados completos da fixture são pressupostos sintéticos, não resolução dessas lacunas do caso real.

A activação real de emissão exigirá novo âmbito explícito e alteração revista do bloqueio; não é uma configuração disponível neste incremento. A aceitação anterior do cálculo condicionado e este desenvolvimento técnico não a autorizam.

Ficheiros principais

ServiceInvoicing.php, InvoicePdf.php, Http/ServiceInvoiceController.php, migração 060000, captura interna transaccional em DocumentPreview.php, rotas protegidas, ServiceInvoiceWorkspace.jsx, navegação/CSS, ServiceInvoiceTest.php, InvoiceFixture.php e scripts invoice-*. Artefactos/provas contêm apenas dados sintéticos. Sem novo checkpoint ou publicação.

Aceitação da entrega técnica

27/10/2026, Africa/Johannesburg. Após informar que já tinha verificado a demonstração, o utilizador confirmou «Aceitar a entrega técnica e criar checkpoint local». Fica aceite e encerrada a entrega técnica de navegador + PDF no âmbito isolado demonstrado, com os limites acima. As referências anteriores a aceitação/checkpoint ainda pendentes são históricas.

Autorizado registo e checkpoint Git exclusivamente local, sem credenciais ou dados reais. Incluídos código, testes, migração ainda não aplicada em desenvolvimento, especificação, relatório e provas sintéticas/agregadas; o PDF de demonstração contém só identidades sintéticas. Excluídos ficheiros de ambiente privados, manifestos, bases, logs, imagens reais e ficha nominativa local. Não se repetiram testes ou validações para este registo; resultados mantidos: 53 testes / 924 asserções e compilação aprovada.

A aceitação não aplica a migração 060000, as oito concessões ou a série real, não resolve as provas de conformidade nem as pendências temporais do caso real, e não autoriza habilitar emissão real, recebimentos, lançamentos ou publicação. O bloqueio no servidor permanece. As próximas operações continuam sujeitas às confirmações específicas já delimitadas.