Record explicit workshop acceptance and preserve subsequent synthetic work without accepting receivables. Keep 080000/070000 unapplied, real workshop grants pending and operational issuance blocks intact. Exclude local credentials and real-data preservation reports.
18 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.
- Entrar com o gestor sintético; seleccionar Empresa Horizonte — Demonstração → Unidade Central — Demonstração → Facturas de teste.
- 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.
- 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.
- Confirmar emissão apenas de teste: atribuição única do número 1, consulta da fotografia e descarga PDF autenticada.
- 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.
- 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.
Aplicação da migração e das concessões especificamente autorizada
27/10/2026, Africa/Johannesburg. Posteriormente à aceitação, o utilizador autorizou expressamente: aplicar a migração e as oito concessões exactamente propostas, verificar preservação e manter emissão real bloqueada, sem criar/configurar série real, emitir ou publicar. Esta secção substitui o estado pendente das secções históricas acima apenas quanto à migração/concessões.
- Confirmados directório SGF, contas existentes #1/#2, empresa #1 e unidade #1; nenhuma conta ou pertença criada. Leitura de
migrate:statusconfirmou só a migração060000pendente. - Antes da aplicação,
scripts/invoice-dev-preservation.php --beforerecolheu contagens e impressões digitais de 31 tabelas preexistentes, incluindosf_*, B1, cálculos, catálogo, identidades, acessos e auditoria. Só os agregados/hashes ficaram em armazenamento local ignorado; nenhum conteúdo de registo foi apresentado. scripts/sgf.ps1 migrateaplicou exclusivamente2026_10_26_060000_create_test_invoice_issuance.phpna basesgf_tempo_dev, com proprietário separado. A verificação imediatamente posterior confirmou dados/acessos intactos e oito tabelas novas vazias. Prova da migração.scripts/invoice-access.php 1 2 1 1 --applyaplicou exactamente oito concessões, sem novos direitos fora da matriz aprovada. Auditoria: oito entradasservice_invoice.initial_grant.scripts/invoice-dev-preservation.php --after-grantsconfirmou a matriz exacta e a preservação dos registos, acessos e auditoria anteriores; o único delta de acessos são as oito concessões autorizadas. Prova após concessões.- O ficheiro que contém a guarda de emissão ficou com hash inalterado. Verificadas recusa 403 nas entradas
guard,issueeproposeno ambiente normal, antes de qualquer operação documental. A consulta normal com os novos direitos confirmareal_blocked=true,test_enabled=false, listas vazias.
Estado final: si_proposals, si_decisions, si_counters, si_invoices, si_events, si_outbox, si_commands e si_correction_requests com zero registos. Sem série real, contador, reserva de número, documento ou pedido de correcção criado. A instalação e concessões não habilitam emissão, configuração real ou comunicação externa. O perfil/cálculo condicionado anterior e as suas pendências temporais permanecem preservados.
Não foram repetidos testes destrutivos aceites para aplicar esta migração já testada. Não houve alteração de código funcional, ferramentas, publicação ou novo checkpoint. Os dois scripts administrativos novos documentam/reproduzem a verificação; repetir aplicação de concessões exige respeitar o âmbito confirmado, sem ampliar a matriz.
Para consultar o bloqueio: actualizar a página ou voltar a entrar, seleccionar empresa/unidade autorizadas e Facturas de teste. O ecrã normal deve apresentar Emissão real indisponível, mesmo para a conta com o novo direito de emissão. As provas de conformidade e a configuração da série real continuam separadas e por resolver/aplicar.
Actualização documental de conformidade — 27/10/2026
O cotejo dirigido e a lista reduzida de provas estão na secção 11 do âmbito de emissão. Foram conferidos nos exemplares já arquivados o requisito de programa autorizado pela AT (CIVA 27(9)), a numeração/séries e conservação (CIVA 27; RIVA 24(2)), a obrigação de submissão remetida para regulamentação (Lei 10/2025, CIVA 27(10)) e os ramos de rectificação (CIVA 51). Isto reduz lacunas de fundamento; não fornece autorização do SGF, o protocolo executório vigente ou uma via concreta validada de correcção. A emissão real continua bloqueada e nenhuma série foi configurada. Sem nova alteração funcional, base, concessão ou repetição dos testes aceites.