From d18ff0f0499337579569fab2773f1769b5fd1ea6 Mon Sep 17 00:00:00 2001 From: nala Date: Sat, 24 Oct 2026 12:13:57 +0200 Subject: [PATCH] feat: implement opportunity-scoped Modelo A acquisitions in QA --- .../StoreSimulationFormDraftRequest.php | 3 +- ...-review-continuation-20261020-receipt.json | 240 ++++++++++++++++++ .../modelo-a-reconciliacao-20261021.md | 66 +++++ .../unification/traceability-and-manual.md | 10 + .../v2/auditoria-portal/matriz-requisitos.csv | 2 +- .../js/components/simulation-acquisitions.tsx | 62 +++++ .../js/components/simulation-modelo-a.tsx | 2 +- .../js/components/simulation-monthly-iva.tsx | 2 + resources/js/lib/iva-acquisitions.ts | 182 +++++++++++++ resources/js/lib/iva-modelo-a.ts | 2 +- resources/js/lib/project-dossier.ts | 2 + .../Feature/ModeloAAcquisitionsDraftTest.php | 69 +++++ .../fixtures/modelo-a-acquisitions.json | 15 ++ tests/frontend/iva-acquisitions.test.mjs | 78 ++++++ 14 files changed, 731 insertions(+), 4 deletions(-) create mode 100644 resources/js/components/simulation-acquisitions.tsx create mode 100644 resources/js/lib/iva-acquisitions.ts create mode 100644 tests/Feature/ModeloAAcquisitionsDraftTest.php create mode 100644 tests/frontend/fixtures/modelo-a-acquisitions.json create mode 100644 tests/frontend/iva-acquisitions.test.mjs diff --git a/app/Http/Requests/StoreSimulationFormDraftRequest.php b/app/Http/Requests/StoreSimulationFormDraftRequest.php index 2ac875ab..46a7f547 100644 --- a/app/Http/Requests/StoreSimulationFormDraftRequest.php +++ b/app/Http/Requests/StoreSimulationFormDraftRequest.php @@ -37,7 +37,7 @@ class StoreSimulationFormDraftRequest extends FormRequest 'contact_province', 'contact_district', 'preferred_channel', ]; $economic = [ - 'context_opportunity', 'context_applicability_snapshot', 'investment_regime', 'context_reuse', 'compatible_fields_snapshot', 'published_iva_base', 'published_iva_currency', 'published_iva_date', 'published_iva_scope', 'monthly_iva_settings', 'monthly_iva_snapshot', 'journey_type', 'detail_level', 'business_plan_snapshot', 'financial_tools_snapshot', 'cashflow_snapshot', 'project_team_snapshot', 'project_execution_snapshot', 'purpose', 'manifestation_type', 'preferred_language', 'project_title', 'project_summary', 'project_problem', 'target_customers', 'value_proposition', 'market_assumption', 'market_source', 'project_milestones', 'selection_labels', 'project_type', + 'context_opportunity', 'context_applicability_snapshot', 'investment_regime', 'context_reuse', 'compatible_fields_snapshot', 'published_iva_base', 'published_iva_currency', 'published_iva_date', 'published_iva_scope', 'monthly_iva_settings', 'monthly_iva_snapshot', 'modelo_a_snapshot', 'journey_type', 'detail_level', 'business_plan_snapshot', 'financial_tools_snapshot', 'cashflow_snapshot', 'project_team_snapshot', 'project_execution_snapshot', 'purpose', 'manifestation_type', 'preferred_language', 'project_title', 'project_summary', 'project_problem', 'target_customers', 'value_proposition', 'market_assumption', 'market_source', 'project_milestones', 'selection_labels', 'project_type', 'competitor_assumption', 'sales_channel_assumption', 'marketing_approach', 'location_rationale', 'project_risk_responses_snapshot', 'project_questionnaire_version', 'customer_validation_status', 'cost_estimate_status', 'location_assessment_status', 'funding_status', 'receivables_timing_status', 'project_type_other', 'sector_id', 'activity_id', 'products_services', 'maturity_stage', 'expected_start_date', @@ -83,6 +83,7 @@ class StoreSimulationFormDraftRequest extends FormRequest 'economic_snapshot.published_iva_scope' => ['nullable', 'string', 'in:yes,no'], 'economic_snapshot.monthly_iva_settings' => ['nullable', 'string', 'max:2000'], 'economic_snapshot.monthly_iva_snapshot' => ['nullable', 'string', 'max:60000'], + 'economic_snapshot.modelo_a_snapshot' => ['nullable', 'string', 'json', 'max:1000000'], 'economic_snapshot.project_team_snapshot' => ['nullable', 'string', 'max:30000'], 'economic_snapshot.project_execution_snapshot' => ['nullable', 'string', 'max:30000'], 'economic_snapshot.project_risk_responses_snapshot' => ['nullable', 'string', 'max:30000'], diff --git a/docs/investmoz/simulations/integrated-review-continuation-20261020-receipt.json b/docs/investmoz/simulations/integrated-review-continuation-20261020-receipt.json index 6584f620..c88311f9 100644 --- a/docs/investmoz/simulations/integrated-review-continuation-20261020-receipt.json +++ b/docs/investmoz/simulations/integrated-review-continuation-20261020-receipt.json @@ -2375,5 +2375,245 @@ "not_full_all_tax_completion": true, "next_fiscal_batch": "Scope from attached models; no automatic new tax/rule activation", "statistics_and_AI": "remain deferred" + }, + "modelo_a_next_scope_20261024": { + "status": "analysis and proposal only", + "preserved_closure": { + "revision": "cd10cccb", + "receipt": "355656b5", + "balance": 0 + }, + "inventory": [ + { + "folder": "Notas", + "name": "Estamos a gerar um problema.docx", + "bytes": 28938, + "sha256": "aa589574f7e581ca0e41df1a690a60379062879fed04ce765b827b9965047e44", + "use": "inventory only" + }, + { + "folder": "Notas", + "name": "INVESTEMOZ Ibane.docx", + "bytes": 144410, + "sha256": "c5252af6dfa38558b638fafcf726658bb10edabe92939a2f97f5862003f6bed9", + "use": "inventory only" + }, + { + "folder": "Notas", + "name": "investimentos nos corredores.docx", + "bytes": 21595, + "sha256": "1473b06c48aa234e771660e3f2a51b9d2e4e1943bd52d878e0ae854ee6657055", + "use": "inventory only" + }, + { + "folder": "Notas", + "name": "Neste momento.docx", + "bytes": 19639, + "sha256": "e6166411122a12089da1cb4436c6a2322338467dbd46ea4e57aee0015a49902c", + "use": "inventory only" + }, + { + "folder": "Notas", + "name": "nota 1.docx", + "bytes": 25488, + "sha256": "7037ff6d968aa8f756a74adad76758b64ba54d786726aac9e0c7a54ecdc225da", + "use": "inventory only" + }, + { + "folder": "Notas", + "name": "Novo Modelo A v1.docx", + "bytes": 532100, + "sha256": "63d45fa80db17a60b43619d55a25813229d670d14c758273f86316285db8e02b", + "use": "comparison with accepted reconciliation and current code", + "embedded_form_sha256": "7ae7f02efca96323087d0dfa5f3078b4ae724318edd5b6c4802c863d840bdf66" + }, + { + "folder": "Notas", + "name": "Novo Modelo A.docx", + "bytes": 532008, + "sha256": "62c198e90d8c6792f7d5ccefc6386df2e4b6089573067d3a6e1eae7fc2b9572b", + "use": "comparison with accepted reconciliation and current code", + "embedded_form_sha256": "7ae7f02efca96323087d0dfa5f3078b4ae724318edd5b6c4802c863d840bdf66" + }, + { + "folder": "Notas", + "name": "PROVÍNCIA DE INHAMBANE v1.docx", + "bytes": 109317, + "sha256": "32c6ab160c5028f3084d23b2173ce3cfe6dddba0715d1228da6bd9380247f486", + "use": "inventory only" + }, + { + "folder": "Notas", + "name": "PROVÍNCIA DE INHAMBANE.docx", + "bytes": 108584, + "sha256": "9f628cd57eb860433f36058b299660834e9052d07e1f7ca99f68f1d1cfdc9d72", + "use": "inventory only" + }, + { + "folder": "Notas", + "name": "~$OVÍNCIA DE INHAMBANE.docx", + "bytes": 162, + "sha256": "7c2c7731b5ef1023fa980c582051296bf2b5e75a8645113368c2aa9bf34cf12f", + "use": "temporary or lock file; not a source exemplar" + }, + { + "folder": "Notas", + "name": "~$tamos a gerar um problema.docx", + "bytes": 162, + "sha256": "e726ad6723df9f664121d97e18854466b30efd24a1f8efab0a7945cbecf7059b", + "use": "temporary or lock file; not a source exemplar" + }, + { + "folder": "Notas", + "name": "~$VESTEMOZ Ibane.docx", + "bytes": 162, + "sha256": "9e71bcb8ded90236b2ca70f10937b758eacc0e924cf89d46ba73f1540d6f3132", + "use": "temporary or lock file; not a source exemplar" + }, + { + "folder": "Notas", + "name": "~$vestimentos nos corredores.docx", + "bytes": 162, + "sha256": "2b19e4a708c934710926f0dc5da74b785787d4818500e9c1d43359e06ffb9b57", + "use": "temporary or lock file; not a source exemplar" + }, + { + "folder": "Notas", + "name": "~WRL2857.tmp", + "bytes": 143261, + "sha256": "85ed72087b6b670292e81c83a455a264a9c4cf2b36ee12807379d475358b3577", + "use": "temporary or lock file; not a source exemplar" + }, + { + "folder": "Modelos", + "name": "Cópia de IRPS-IMOP.xlsx", + "bytes": 277846, + "sha256": "1ceca6f4c6d77853c1b2b445876599b42093175fa89eecf40590180956d83a9e", + "use": "inventory only" + }, + { + "folder": "Modelos", + "name": "IRPC M-22- DECLARACAO DE RENDIMENTOS.pdf", + "bytes": 109727, + "sha256": "4b61bd83d1fbcfd3b7b5c5523cea5923f7d0f65dc4c004eff58e5db38f763c88", + "use": "inventory only" + }, + { + "folder": "Modelos", + "name": "IRPC_IRPS.xlsx", + "bytes": 115701, + "sha256": "fd5ddb07392bcad1313a76ae85603169a56eeecd9ac6fa4a1be12cee909c6260", + "use": "inventory only" + }, + { + "folder": "Modelos", + "name": "VAT Return.pdf", + "bytes": 285479, + "sha256": "9c0b99a810c7db53eb75d63c22ee22fb86a50ba57bd5509041ed80ee10f75741", + "use": "compared visually against both DOCX, 24/10; originals unchanged" + }, + { + "folder": "Modelos", + "name": "~$IRPC_IRPS.xlsx", + "bytes": 165, + "sha256": "5a6f905aea475f25f054b0e13e4b2c8b955b7097789fcc3ca24ac2dd0b0bb284", + "use": "temporary or lock file; not a source exemplar" + } + ], + "source_folders": "Tempo portal Notes and Modelos; originals read only, no import or publication", + "comparison": "docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md", + "new_calculations_activated": false, + "irpc_irps": "inventoried, not implemented or validated as rules" + }, + "modelo_a_acquisitions_qa_20261024": { + "status": "implemented and demonstrated in isolated QA; not integrated/deployed", + "base": "355656b5", + "preserved_homologation": "cd10cccb", + "preserved_receipt": "355656b5", + "stabilization_reference": "276d833a", + "scope": [ + "domestic general MZN 2026 acquisitions08-10", + "conditional totals14-18", + "private opportunity-scoped draft and frozen report" + ], + "document_comparison": { + "file": "VAT Return.pdf", + "sha256": "9c0b99a810c7db53eb75d63c22ee22fb86a50ba57bd5509041ed80ee10f75741", + "pages": 2, + "08_10_14_18": "same fields and formulas as both DOCX; no substantive difference identified in this scope", + "prefilled_values": "initial/within deadline and Maputo, not inherited", + "remaining_divergences": "regularization and credit numbering; refund article; only dependent future rules affected" + }, + "proofs": { + "frontend_tests": 11, + "api_tests": 2, + "api_assertions": 19, + "database": "simulator_fiscal_delta_20261021_test:55441", + "qa_transactions": "rolled back", + "tax_rule_fingerprint": "unchanged", + "ui_second_field17": "128.0048", + "ui_first_field17_preserved": "144.0048", + "ui_to_api_report": "exact calculated payload downloaded from UI, saved/recovered through real private QA API; report without recalculation", + "types": "passed", + "build": "passed", + "pdf_pages": 6, + "pdf_visual": "all six reviewed, no clipping or overlap", + "files": { + "acquisitions-final.csv": { + "bytes": 15092, + "sha256": "3a988f8c097a0e0b8364f09b8451347679447f0cf0866485530881e229e3b511" + }, + "acquisitions-final.docx": { + "bytes": 14283, + "sha256": "3aa9a9e45adaaae86368b2aa39d621b3fef82c2384759e5cb1618ffe360ea6af" + }, + "acquisitions-final.html": { + "bytes": 14995, + "sha256": "966e5d89916f6e51ad916cbb42e5d363e6ca55d595bb6ac440a3517c879076a2" + }, + "acquisitions-final.pdf": { + "bytes": 121359, + "sha256": "4b42456d5b2f52c48c7a08dda6c37c82bedfb653850864f902731845b28c34ba" + } + }, + "order_vs_invoice_period": "order month preserved as origin, invoice/deduction month independent; directed test passed" + }, + "limits": [ + "projection and effective data are user-declared, not certification or AT submission", + "full taxable use and same invoice/deduction period only", + "outside-scope fields remain indeterminate unless explicit absence of operations", + "visual harness stores locally; real private server persistence proven separately with identical payload", + "IRPC/IRPS inventory only; no implementation" + ], + "source_files": [ + { + "path": "resources/js/lib/iva-acquisitions.ts", + "sha256": "c437ae4f218e6be1131fe05cd4bba0b7cc9c8d605803a418a9a035af32fb8432" + }, + { + "path": "resources/js/components/simulation-acquisitions.tsx", + "sha256": "bb1c5dbecb2e00f1711397291b44b8bd78f8ae8f56c02c580f4fa68156a52013" + }, + { + "path": "resources/js/lib/iva-modelo-a.ts", + "sha256": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846" + }, + { + "path": "resources/js/components/simulation-monthly-iva.tsx", + "sha256": "db04651d99293b61dec9b94e9aaef28df5cb8d3cefc5e2cb3ebd2fe01ebd33d3" + }, + { + "path": "resources/js/lib/project-dossier.ts", + "sha256": "22348747ce791f378dc42def531e6a0c22dea917f9ed0ccae4880fac104b0c09" + }, + { + "path": "app/Http/Requests/StoreSimulationFormDraftRequest.php", + "sha256": "a75ed84f613a061775383836d9e0999a78b5ee150f548c9ee4313a795f4fff6b" + }, + { + "path": "resources/js/components/simulation-modelo-a.tsx", + "sha256": "cf5b09b125fc7cd4c53105c2e67acf39d0e998a6c46c2f447a9f716445994e84" + } + ] } } diff --git a/docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md b/docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md index 926253a2..5b1c630f 100644 --- a/docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md +++ b/docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md @@ -1,5 +1,71 @@ # Reconciliação do IVA com o Novo Modelo A +## 24/10/2026 — aquisições08–10 e totais14–18 implementados e demonstrados em QA + +**Estado actual: lote concluído em QA, ainda não integrado/disponibilizado na homologação.** S1–S3 continuam encerrados em `cd10cccb`, recibo `355656b5`; referência `276d833a` preservada. Esta secção sucede à proposta e ao cotejo parcial históricos abaixo. Sem IRPC/IRPS, publicação de regras, migração, mudança de permissões ou escrita em dados activos. + +### Cotejo concluído antes da codificação + +`VAT Return.pdf`: 285479bytes, SHA256 `9c0b99a810c7db53eb75d63c22ee22fb86a50ba57bd5509041ed80ee10f75741`, duas páginas lidas e renderizadas. Comparação com a imagem dos dois DOCX sobre fundo branco e instruções já reconciliadas. Originais intactos. O PDF não fornece critérios adicionais de elegibilidade por aquisição, nem prova nova edição/vigência pela sua existência. + +| Campo/instrução | PDF versus DOCX | Tratamento executável | +|---|---|---| +|08–10|Mesma numeração: imobilizado, existências, outros bens/serviços; coluna de imposto a favor do sujeito passivo|Somar apenas IVA elegível das linhas, não orçamento, custo ou valor bruto de compras| +|14|Mesma soma `01+03+05+06+07`|Determinar apenas com parcelas conhecidas| +|15|Mesma soma `08+09+10+11+12`|Aquisições08–10 completas e11/12 determinados; sem operações deve ser declaração expressa| +|16|Mesma soma `02+04+13`|Reutilizar02 da execução mensal actual;04/13 não são zero implícito| +|17/18|Mesmas diferenças `16−15` / `15−16`, conforme o sentido|Diferenças antes de créditos anteriores; não são pagamento ou reembolso reconhecido| +|Regularizações|Ambos dizem11/12 no texto, mas as caixas são12/13|Regularizações fora deste lote; divergência não bloqueia08–10 nem somas inequívocas| +|Créditos/reembolso|Mantêm-se as remissões18/19 versus19/20 e art.20 no rodapé|Afectam o futuro tratamento19–27; não são activadas por esta passagem| +|Preenchimentos/layout|PDF tem cabeçalho completo, duas páginas, inicial/dentro do prazo assinalados, UGC/Província/Localidade Maputo; DOCX tem caixas vazias e imagem do corpo, com fluxo de leitura diferente|Não herdar selecções, prazo ou Maputo para qualquer investimento; não corrigir ou substituir originais| + +### Correspondência e percurso executáveis + +Componente existente de IVA mensal conserva a execução01/02 no servidor. Novo bloco ligado ao mesmo formulário e relatório guarda `modelo_a_snapshot` no mecanismo privado/versionado existente, com livros separados pela oportunidade em tratamento. Sem escolha numa entrada com várias oportunidades, pede a escolha; nunca assume a primeira. A API conserva as permissões de proprietário e a concorrência por ETag. + +Compras/encomendas são reutilizadas com valor/moeda/mês de origem, por classificar como líquido ou bruto. O mês de encomenda/orçamento é conservado separadamente do mês do documento e da dedução; adoptar uma origem actualizada não altera silenciosamente o período fiscal editado. Para08/10 é possível escolher explicitamente o orçamento de activos/despesas operacionais já existente como referência, sem o converter em factura. Só se pede a diferença fiscal/documental. Mudança da origem é sinalizada e exige adopção explícita; não substitui edições deliberadas. Moeda conhecida é conservada; moeda ausente exige confirmação expressa, sem conversão de montantes. + +Por linha: líquido/IVA/bruto (dois valores permitem obter o terceiro por soma/diferença, sem taxa de compra inventada), documento/referência/linha/data, fornecedor/inscrição, posse/forma legal, período, natureza projectada ou efectiva declarada, aquisição interna, afectação e exclusões. O adquirente confirma regime normal de IVA. Documento repetido sem linha distinta é recusado. Uma compra só registada, orçamento, documento incompleto, uso misto/especial ou período divergente não gera dedução. IVA expressamente zero e despesas expressamente não elegíveis ficam distintos de informação em falta. + +Fundamento dirigido: CIVA republicado pela Lei13/2016, PDF14–16, arts.18(1)(a),18(3–5),19(1)(a),20 e21(1–3); Lei22/2022, art.20 (exclusões/17-A/excepções); Lei10/2025, PDF13, arts.18(2)/(6) e19(2). Reutilização das fontes oficiais aceites, sem nova validação de credibilidade. Âmbito executado: interno geral, MZN, 2026, afectação exclusiva a operações tributadas, mesmo período de emissão/dedução, sem exclusões/especialidades/dedução parcial. É o recorte técnico solicitado, não prazo de vigência legal nem nova regra organizacional. Em projecções, as condições são pressupostos explícitos, sem certificação documental. + +Por mês, confirmação expressa de lista completa08–10 e de inexistência de operações nos campos fora deste lote. Sem confirmação, as parcelas e totais dependentes permanecem indeterminados; declarações em conflito com importações/vendas de outros enquadramentos registadas são recusadas.14–18 usam aritmética decimal exacta. Resultados, condições e origem ficam congelados; alterações tornam a versão histórica visivelmente desactualizada. O relatório reutiliza o resultado guardado sem recalcular e identifica oportunidade, localização, período, moeda, fontes, versão e declarações de ausência. A nota da execução isolada01/02 remete agora para o bloco separado, evitando apresentar dois estados contraditórios. + +### Provas dirigidas e saldo + +- **11 testes frontend aprovados:** oito do novo lote e três da correspondência afectada. Condições incompletas, exclusões, uso misto, documento/fornecedor, data/moeda, duplicações, ausência versus zero, origem alterada, orçamentos reutilizados, fórmulas08–10/14–18, histórico e segunda oportunidade. Exemplo com08=32,09=16,10=8:15=56;16=160.0048;17=104.0048. Também diferença credora18 e vendas em falta. +- **API real QA: dois testes/19 asserções aprovados**, base isolada `simulator_fiscal_delta_20261021_test:55441`, guarda de identidade e transacções revertidas. Payload calculado na interface da segunda oportunidade exportado por acção própria de QA → gravação privada real → recuperação exacta → relatório. Outra conta recusada; primeira oportunidade preservada; fingerprint de todas as regras igual. Nenhuma regra criada/publicada/suspensa. +- **Visual Edge, componentes reais numa interface isolada:** compra sem condições fica indeterminada; edição/cálculo da segunda produz17=`128.0048`; actualizar a página conserva a segunda; regressar à primeira conserva17=`144.0048`. O armazenamento da interface visual é local ao browser; a persistência no servidor foi comprovada separadamente com o mesmo payload na API real de QA. +- **Relatório da segunda oportunidade recuperada pela API:** CSV, Word e PDF apresentam `128.0048`, `160.0048`, MZN, Manica, oportunidade310, período e versão correspondentes, sem valores do livro309. PDF final com seis páginas conferidas visualmente, sem cortes/sobreposição. Abril deliberadamente sem vendas mantém01/02/14/16/17/18 indeterminados; a projecção financeira incompleta é identificada, sem fabricar resultado. Nenhum PDF ou exportação aceite de S1–S3 foi substituído. +- **TypeScript e build aprovados.** Provas privadas em `outputs/iva-operations-qa-20261024`; relatório `acquisitions-final.pdf`, hashes no recibo integrado. A interface de ensaio não é incluída nos assets do portal. + +Saldo deste recorte em QA: zero. Integração e disponibilização na homologação continuam por executar. Futuro fora deste recorte: activação de taxa reduzida/isenções, mistos/pro rata/excepções, importações, regularizações, créditos19–27, juros/pagamento/reembolso e submissão AT. IRPC/IRPS permanecem apenas inventariados. Estatísticas e IA adiadas. O histórico abaixo não reabre S1–S3 nem converte esta entrega QA em homologação. + +## Actualização de 24/10/2026 — comparação e próximo lote proposto + +S1–S3 permanecem encerrados na homologação em `cd10cccb`, recibo `355656b5`, saldo zero. Esta passagem é reconciliação documental/código e proposta; não altera regras, dados activos ou impostos. Reutiliza a leitura visual e as provas aceites de 21/10, sem repetir ensaios. + +Os dois originais nas Notas foram relidos por bytes: tamanhos, SHA256 e imagem incorporada coincidem com os valores documentados abaixo. Inventário actual completo das duas pastas: nove documentos nas Notas e quatro em Modelos, além de seis ficheiros temporários/de bloqueio inventariados separadamente, registados com nome, tamanho e hash no recibo integrado, chave `modelo_a_next_scope_20261024`. Os quatro modelos são `VAT Return.pdf`, `IRPC_IRPS.xlsx`, `Cópia de IRPS-IMOP.xlsx` e `IRPC M-22- DECLARACAO DE RENDIMENTOS.pdf`. Os três de IRPC/IRPS entram apenas no inventário; conteúdo fiscal/fórmulas ainda não analisados. `VAT Return.pdf` é exemplar adicional inventariado, ainda por cotejar com os dois DOCX antes de afirmar equivalência ou diferença. Nenhum original alterado, importado ou publicado nesta passagem. + +| Bloco | Já suportado / reutilizável | Falta concreta | +|---|---|---| +| Identificação e período, quadros 1–6 | Oportunidade escolhida, dossier, organização, contactos, meses, moeda e origem | Ligar os campos fiscais; confirmar apenas diferenças de NUIT/sucursal/área fiscal/CAE/domicílio fiscal. Sector e localização do projecto não provam CAE ou domicílio fiscal. Tipo de declaração não é versão de projecção. | +| Campos 01/02 | Vendas mensais líquidas e IVA calculado pela versão publicada, recuperação pelo ID, moeda original e exportações aceites | Sem lacuna neste âmbito aceite; continua componente de planeamento, não imposto final a pagar. | +| Campos 03–07 | Calendário de vendas como origem | Classificação por operação, bases separadas, âmbito temporal das categorias e regras correspondentes; mapeamento não é cálculo implementado. | +| Campos 08–11 | Compras/encomendas mensais e pressupostos do plano | Valores líquido/IVA/bruto discriminados, documentos, fornecedor, afectação, exclusões e elegibilidade. Compras e investimento global não são IVA dedutível. | +| Campos 12/13 | Correspondência documental | Regularizações individualizadas, motivo, documento e período; resolver a remissão interna divergente. | +| Campos 14–18 | Fórmulas impressas mapeadas | Consolidação: 14=01+03+05+06+07; 15=08+09+10+11+12; 16=02+04+13; diferenças devedora/credora 17/18. Actualmente indeterminadas: parcelas ausentes não são zero. | +| Campos 19–27 | Planeamento pode conservar estimativas separadas | Créditos efectivos/comunicados, substituição, juros, pagamento, reporte e pedido de reembolso. Não implementados como apuramento declarativo. | +| Quadros 7, 12 e 13 | Autenticação e histórico do portal | Inexistência de operações exige informação completa; assinatura/submissão fiscal e campos reservados à AT não decorrem do login ou da simulação. | + +**Diferenças e instruções:** os DOCX diferem por bytes e segmentação textual, com a mesma imagem do formulário; não está demonstrada alteração fiscal entre eles. Mantêm-se as divergências já documentadas: regularizações 11/12 no texto versus caixas 12/13; créditos 18/19 versus caixas 19/20; remissão de reembolso art.20 versus alteração de 2025 no art.21; remissões ambíguas ao quadro8. A duplicação de25 era artefacto de extracção, já resolvido. A edição/período aplicável e os dispositivos pertinentes devem ser cotejados para cada regra nova, reutilizando as fontes oficiais aceites. + +**Proposta de lote seguinte — IVA por operação, primeiro âmbito interno geral em MZN:** reutilizar vendas e aquisições do plano por oportunidade/período; guardar origem/versionamento, previsto ou efectivo e classificação explícita. Implementar a discriminação líquido/IVA/bruto e a elegibilidade documentada das aquisições internas de imobilizado, existências e outros bens/serviços (08–10), após cotejo dirigido das condições e exclusões nas fontes existentes. Manter 01/02 e o motor publicado. Ligar 14–18 apenas quando todas as parcelas necessárias estiverem conhecidas ou expressamente declaradas sem operações, sem permitir que essa declaração apague operações existentes. Mostrar a parcela em falta quando o total não puder ser determinado. + +Ficam fora deste lote proposto: activação de taxa reduzida, isenções/mistas/pro rata, importações, regularizações, créditos anteriores, substituições, juros, pagamentos, reembolsos e submissão à AT. Podem ser identificados na classificação, mas mantêm resultado indeterminado e explicação quando aplicáveis. IRPC/IRPS permanecem inventário. A proposta estreita o lote histórico abaixo; a estimativa histórica de28–52h não é orçamento deste novo recorte. + +Fecho dirigido do lote proposto: reutilização sem preenchimento repetido; aquisição elegível/excluída/sem documento; zero versus ausência; alteração da segunda oportunidade preservando a primeira; mudança de origem cria versão sem reescrever histórico; gravação/recuperação e ecrã/exportações com iguais montantes, moeda, período, oportunidade, fonte e regra. Consolidar apenas os dispositivos efectivamente usados, sem nova validação genérica das fontes. Nenhuma implementação iniciada nesta reconciliação. + 21/10/2026. Referência AUD-SIM-INT02, sem nova matriz/backlog. Preparação progressiva em QA; não é apuramento completo, submissão ou aceitação pela AT. A componente16% existente continua independente das restantes componentes por cadastrar/desenvolver. A leitura e aceitação documental da Tempo não é apresentada como validação jurídica independente. ## Exemplar e preservação diff --git a/docs/investmoz/unification/traceability-and-manual.md b/docs/investmoz/unification/traceability-and-manual.md index 969a1acb..a4c4cb62 100644 --- a/docs/investmoz/unification/traceability-and-manual.md +++ b/docs/investmoz/unification/traceability-and-manual.md @@ -1,5 +1,15 @@ # Rastreabilidade, utilização e formação +## 24/10/2026 — lote de aquisições Modelo A concluído em QA + +S1–S3 mantidos na homologação em `cd10cccb`/`355656b5`. Cotejo do `VAT Return.pdf` concluído:08–10 e14–18 correspondem aos DOCX; selecções/Maputo do PDF não são dados do investidor. Novo bloco no simulador: reutilizar compras/orçamentos explicitamente, completar documento/IVA/afectação/condições, confirmar cobertura por mês, calcular e guardar; a recuperação e o relatório usam a oportunidade escolhida. Ausência de condições/parcelas mantém resultado indeterminado. Mudanças conservam o resultado histórico e explicam a divergência. Regime e moeda não são inferidos da organização. + +QA:11 testes frontend, dois testes de API/19 asserções, types/build e cadeia interface → API isolada → recuperação → relatório demonstrados. Segunda oportunidade17=128.0048, primeira144.0048 preservada. PDF novo de seis páginas revisto; provas S1–S3 reutilizadas. Detalhes e limites em `../simulations/modelo-a-reconciliacao-20261021.md`, recibo integrado `modelo_a_acquisitions_qa_20261024`, mesma linhaAUD-SIM-INT02. **Ainda não entregue na homologação.** IRPC/IRPS apenas inventário; estatísticas/IA adiadas. + +## 24/10/2026 — próximo âmbito do Modelo A, apenas proposto + +S1–S3 encerrados em `cd10cccb`, recibo `355656b5`. Reconciliação actualizada em `../simulations/modelo-a-reconciliacao-20261021.md`: campos01/02 suportados; restantes componentes discriminadas; proposta limitada a operações internas gerais, aquisições08–10 e totais condicionados14–18. Inventário completo das pastas Notas/Modelos no recibo integrado, incluindo IRPC/IRPS sem implementação. Sem novos impostos, regras activadas ou repetição de provas aceites. AUD-SIM-INT02 mantém o saldo de desenvolvimento do Modelo A distinto do lote S1–S3 encerrado. + ## Simulador S1–S3 — entregue na homologação em `cd10cccb`, 24/10/2026 Por autorização expressa da Tempo após o fecho QA, integrado pelo Git existente, de `276d833a` para **`cd10cccbf45f53836d8bf7b2bd90794d99602cb9`**, que contém a correcção funcional `65b87819`. `git fetch` não encontrou alterações concorrentes em main; avanço normal, sem force. A referência `276d833a`/`reference/stabilization-20261024` permanece ancestral. Não houve edição da pasta servida nem migração/importação solicitada. diff --git a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv index 3c9a1047..f18d0b4d 100644 --- a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv +++ b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv @@ -10652,7 +10652,7 @@ AUD-SEARCH-T10,Consistência transversal da pesquisa e navegação — Bibliotec AUD-SEARCH-T11,Consistência transversal da pesquisa e navegação — Legislação,Instruções expressas da Tempo na conversa de 20/10/2026; AGENTS.md; RF-MN-010 e AUD-GEO-01 preservados.,navegação/pesquisa,/legislacao,portal/services; portal/document — Reutiliza a correcção da biblioteca e preserva filtros jurídicos/documentais pertinentes.,Sem alteração remota nesta execução; revisão apenas na branch codex/opportunity-search.,HTTP/Inertia: resources.total=0; consumidor e query pública partilhados.,QA — delta delimitado; revisão Tempo pendente,"Situação jurídica, consulta e cálculo continuam independentes.",,"Filtros, contagem, resultados e URL coerentes; universos identificados; erro distinto de vazio; permissões e contexto conservados.",P1,,RF-MN-010; AUD-GEO-01,,,,,,,,,,,Mesmo padrão da biblioteca; não deve expor um universo concorrente.,"Situação jurídica, consulta e cálculo continuam independentes.",portal/services; portal/document; SearchState; SearchFeedback; TerritoryFields; portalNavigation,,"Integração em main apenas após revisão; assistência NLP, contratos e P7 separados.",Correcção/simplificação em QA,,HTTP/Inertia: resources.total=0; consumidor e query pública partilhados.,Pesquisa transversal QA 20/10/2026,20/10/2026,,,,,,,,,,"Provas comuns cobrem o componente reutilizado; HTTP vazio não demonstra operações de gestão ou publicação. Situação jurídica, consulta e cálculo continuam independentes.",,falha funcional; navegação; apresentação visual,,Disponível para revisão na aplicação QA local. AUD-GUIDE-CARD-20261020,"Related educational cards: image, source summary, clear actions",Tempo 20/10/2026; independent delta after 0e7d51f18fb4,educational presentation,/sectores/{slug}; /explorar/{group}; articles; /oportunidades and detail,EducationalArticleCard; EducationalGuides; LegacyContent; SectorInvestment,QA only,1 test / 8 assertions; PHP syntax; TypeScript/build; desktop2048/mobile390; keyboard,QA review pending,Normal QA sector and article verified against existing library resource 10 and local image 25; previous dossier proof retained,,Source-derived summary; public images; conditional opportunity action; context preserved,P1,,,,,,,,,,,,,,,,,,presentation,,,,20/10/2026,,,,,,,,,,,,content; navigation; visual presentation,,Ready for QA review AUD-SIM-INT01,Invalid one-off fiscal date can throw instead of returning validation state,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Fixed in QA; invalid-date checks; 38 directed frontend tests passed,Previous inline-date proof retained; unchanged delta not repeated,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P0,,,,,,,,,,,,,,,,,,diagnosis and targeted corrections,, | [Saldo consolidado21/10/2026] Concluído no recorte. Nenhum delta de validação de data por demonstrar; prova anterior preservada. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação.,,20/10/2026,,,,,,,,,,,,,, -AUD-SIM-INT02,Review actual fiscal parameters sources periods and eligibility,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,"QA only | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas.","Verification pending; no parameter activation | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal.",S1/S2/S3 entregues na homologacao em cd10cccb; delta instalado conferido,Saldo deste lote S1-S3: zero. Nao representa simulador de todos os impostos; proximo lote fiscal sera delimitado pelos modelos anexados. Variantes fora deste recorte conservam criterios proprios.,,,P0,,,,,,,,,,, | Estado antes da delimitacao 24/10/2026: Recorte IVA geral sobre base declarada disponibilizado: 4a4d1212 integrado na revisao servida d3fe8a02; regra real v1 publicada e consumidor activo. Nao conclui o simulador fiscal integral. | Antes da execucao QA 24/10/2026: IVA publicado/mensal existente; lacunas S1/S2 delimitadas; sem outros impostos | Antes da conferencia final S3: S1/S2 corrigidos e demonstrados QA; S3 aguarda PDF nativo; candidata 65b87819 | Antes da entrega S1-S3: S1/S2/S3 concluidos em QA; candidata 65b87819 pronta para integracao,,"24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. IVA publicado e mensal existentes; availability publico enabled=true, cobertura 2026; provas de regra/precisao/zero-falta reutilizadas. S1 afecta moeda do fallback de vendas de tesouraria; S2 afecta retoma mensal, nao o avaliador. Sem outros impostos, regras novas ou apuramento final. | Historico preservado: 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal.","24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. IVA publicado e mensal existentes; availability publico enabled=true, cobertura 2026; provas de regra/precisao/zero-falta reutilizadas. S1 afecta moeda do fallback de vendas de tesouraria; S2 afecta retoma mensal, nao o avaliador. Sem outros impostos, regras novas ou apuramento final. | Historico preservado: Nenhuma operacao de disponibilizacao pendente neste lote delimitado. Outras componentes, regimes e coberturas fiscais permanecem fora do recorte; nao repetir provas aceites. | Recorte executável C concluído em QA. Restantes coberturas sectoriais/benefícios e encaminhamento visual de zona real têm limites concretos no manual; não bloqueiam os ramos já documentados. Integração/habilitação no destino não executadas. | Integração/habilitação deste recorte executadas em22/10/2026; referências anteriores a operação pendente são históricas. Não reabrir as provas aceites.",,,"Tempo autorizou incorporacao de 4a4d1212, cadastro/publicacao da regra real e activacao. Mesma administracao real nala@tempo.co.mz, login normal e MFA, sem quatro designacoes; sem parecer juridico ou revisao independente atribuidos a Tempo.",Ligacao de consumidor publicada concluida em QA; decisoes operacionais separadas.,Recorte executado; sem saldo de implementacao ou disponibilizacao identificado neste lote. Nao converter estimativas anteriores em implementacao fiscal integral.,"24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. IVA publicado e mensal existentes; availability publico enabled=true, cobertura 2026; provas de regra/precisao/zero-falta reutilizadas. S1 afecta moeda do fallback de vendas de tesouraria; S2 afecta retoma mensal, nao o avaliador. Sem outros impostos, regras novas ou apuramento final. | Historico preservado: [Leitura SSH 21/10/2026 08:17 Maputo] Zero regras em simulation_tax_rule_versions na homologação, incluindo todos os estados por leitura administrativa sem ocultação RLS. Seis referências em investment_legal_sources; não são parâmetros executáveis. QA também tinha zero regras. BEGIN READ ONLY/SELECT/ROLLBACK; zero escritas. Prova homologation-fiscal-readonly.json. O git HEAD registado é do checkout consultado, não certifica a revisão do build servido. A ausência de cadastro não é ausência de fontes oficiais nem reabre a aceitação da Tempo de 08/10. Não implementa a ligação funcional ao motor fiscal. | [Saldo consolidado21/10/2026] Parcial. Leitura remota concluída: zero regras de todos os estados na homologação, tal como QA; seis referências jurídicas não são parâmetros executáveis. Falta cadastro fundamentado por componente/âmbito/período e ligação funcional ao motor fiscal. Fontes e análises existentes reutilizáveis; aceitação oficial da Tempo de08/10 preservada. Não activar taxas nem importar/publicar por esta reconciliação. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação. | [Candidata21/10/2026] Diagnóstico fiscal separado no manual existente: fontes/analises já disponíveis; zero parâmetros executáveis na QA e homologação por leitura de todos os estados; governação/resolvedor temporal/DSL existentes; RunSimulation ainda aritmética personalizada sem consumir regras fiscais. Saldo: cadastro fundamentado, orquestração, contrato de resultado/histórico e ligação ao dossier/relatório, com casos por componente/período. Nenhuma regra criada nem activada; implementação fiscal integral aberta e excluída das1–2h de exportações. | [Proposta21/10/2026] Primeiro lote proposto: uma regra IVA geral sobre base liquida/MZN, cobertura demonstrada2026 sem inventar caducidade legal. Reutilizar fontes/analises/governacao/resolvedor/avaliador existentes; arredondamento e ambito aplicavel explicitamente por fundamentar antes de publicar. Cadastro4-8h e codigo/aceitacao12-20h, total16-28h condicionado ao acervo, separado das1-2h de exportacao. Criterios e exclusoes no manual existente. Nenhuma regra cadastrada/activada; nao e implementacao fiscal integral. | [QA IVA v1.2 21/10/2026] Orientacao posterior Tempo: calcular com precisao decimal exacta sem arredondamento automatico, separando apresentacao monetaria; arredondamento generico deixa de ser bloqueio deste lote. Cadastro draft versionado em clone QA; resolvedor/avaliador existentes; proveniencia, historico e relatorio imutavel ligados. 5 feature (51 assercoes), 7 unit (25), 3 frontend; types/build/Pint aprovados. Contexto declarado; nao e saldo a pagar. Zero regras publicadas; sem main/activacao. Recorte QA autorizado verificado (0h engenharia identificada restante); produto fiscal integral continua parcial. Limites e provas no mesmo manual e ficha v1.2; sem atribuicao de validacao juridica ao utilizador. | [Revisao 83d2f97d] Ambito/periodo/exclusoes e procedimentos de integracao, publicacao, activacao e suspensao consolidados no mesmo manual. Lacuna concreta de ecra QA fechada: entradas 1000.03/MZN/2026-10-21; calculo exacto 160.0048; gravacao fa6d17f2-5f47-4cb6-b8cb-40850c12505f; recarga; recuperacao do mesmo ID; relatorio d13e2ad5-3ba8-4d01-9d30-5815496da774 com mesmo valor/proveniencia e hash igual ao resultado. Uma execucao persistida, draft e zero regras publicadas. 1 teste novo de rota/17 assercoes, TypeScript/build e browser aprovados; restantes provas reutilizadas. Interrupcao inicial da ferramenta resolvida, sem atribuicao de falha ao simulador. Revisao do recorte demonstrada; sem nova preparacao generica identificada, main ou activacao; nao fecha aplicabilidade fiscal universal nem simulador integral. | 21/10/2026: proposta do consumidor IVA no simulador existente no manual: falta ligacao a regra publicada e activacao explicita. Integrar codigo desligado, publicar versao e activar consumidor sao tres operacoes distintas. Reutiliza permissoes, governanca, historico e provas aceites; sem ampliar cobertura ou executar estas operacoes. | 21/10/2026: implementado delta de 2ced7b79 no simulador normal QA, activacao desligada por omissao. 8 testes/75 assercoes, 2 testes frontend novos, TypeScript/build/Pint. Edge: indeterminacao, calculo, repeticao sem duplicar, fila admitida antes de suspensao concluida depois, nova execucao recusada e historicos/relatorios preservados. Mesmo manual e recibo consolidam provas e tres operacoes. Fixture isolada suspensa; sem merge ou publicacao/activacao na homologacao. | 21/10/2026: origem da condicao fiscal localizada em e65cb269/servico/CHECKs de 03/10 e nota de implementacao; sem decisao expressa aplicavel encontrada. Correccao QA: administracao existente, mesma pessoa, fonte oficial identificada e eventos preservados. 6 testes/86 assercoes apenas do controlo, sem calculos/exportadores; constraints de outras tabelas iguais. Esquema activo nao alterado; backup/restauro de 171 tabelas confirmado; sem fixture ou publicacao real. | [Execucao autorizada 21/10/2026 10:56 UTC] Servido d3fe8a02ec7f5dcd01984c4f4a1eba18b5a0cf19 contendo 4a4d1212; DDL fiscal aplicado autenticadamente com backup/restauro de171tabelas e registos preservados. Tres fontes reais v1 com hashes/citacoes e aceitacao fiscal Tempo08/10/2026, sem validacao geral automatica. Regra IVA-GERAL-BASE-LIQUIDA rule_version1, ID01a15e1a-5338-700f-8a45-f87707d696a7, published, version_no5, actor15 emtodasetapas;5eventos. Activacao separada ligada a esseID/versao; APIHTTP200 enabled=true e resolvedor16percent no contexto delimitado sem calculo novo. FixtureQA nao importada; calculos/exportadores/PDF aceites nao repetidos. Suspensao de novas admissoes conserva snapshots/historicos/relatorios. Recibo e manual existentes actualizados; limitacoes de abertura de consola/extensao registadas como ferramenta. | [Diagnostico IVA QA21/10/2026] Falha estrutural reproduzida na consulta anual: fiscal_operation nao satisfaz operation e moeda nao era comunicada. Sem presumir respostas originais. Cada condicao tem campo/recebido/esperado/categoria; notas junto ao campo, resumo com foco e Ver fundamento semDSL/codigo. Moeda fiscal explicita, sem conversao/copia.5unitarios24assercoes+1API16assercoes, Edge comUSD dirigido preservado apos recuperacao; fixtureQA v3suspensa, consumidorQAoff. Nao altera regra/activacao da homologacao; calculos e exportadores nao repetidos. Branch codex/iva-diagnostics-QA. | [IVA mensal QA21/10/2026] Vendas por produto/mes reutilizadas; base liquida explicita; versao publicada seleccionada no servidor, sem taxa/manual no formulario. Zero distinto de falta; preco com IVA indeterminado. Actualizacao dependente cria versao, historicos/relatorios preservados. IVA separado de recebimentos/custos/imposto final; manual apenas cenario personalizado. 3API/46assercoes+4frontend e Edge: vendas alteradas, bruto, zero, falta, recuperacao e relatorio. Fixture sintetica v4 ligada apenas no clone QA para revisao. Sem main/HML ou alargamento fiscal; provas anteriores reutilizadas. Mesmo manual/recibo; branch codex/iva-monthly-projection-QA. | [Modelo A QA21/10/2026] Exemplar Tempo e imagem incorporada conferidos/preservados privados na biblioteca QA, hashes/scans/idempotencia; quadros e campos01-27 mapeados no mesmo registo. Componente01/02 existente; apuramento14-18 indeterminado. Correspondencia consultavel e compras/encomendas reutilizadas sem fabricar base/IVA/deducao. Divergencias de remissao registadas; edicao vigente nao afirmada.3testes novos/types/build/Edge; calculo/exportadores aceites reutilizados. Delta seguinte8-16h cadastro+20-36h codigo, condicionado e sem creditos/substituicao/pagamento/reembolso; nao e cobertura integral. Sem main/HML, nova regra publicada ou activacao. Ver docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md. | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral. | 22/10: revisão de a76369eb concluída no âmbito aceite por prova equivalente do regresso; A/B não repetidos. Tabela do primeiro percurso de investimento privado no manual: condições, artigos/período e efeitos; preparação documental, sem ligação executável nova. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal. | 22/10/2026 — prova complementar exclusiva do relatório: recuperação UI do contexto v4, rascunho v5 e Word novo por mero registo; estudo/capacidade não aplicáveis. Word v3 preservado/identificado como histórico, hash inalterado. Sem alteração funcional ou repetição dos ensaios aceites. Dependências Git: a76369eb → 52fbb146 documental → a1fbda06; integrar após decisão, preservando main concorrente. | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas.",,20/10/2026,,," | Antes da delimitacao do simulador 24/10/2026: QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining | Antes da execucao QA 24/10/2026: IVA publicado e mensal existentes; availability publico enabled=true, cobertura 2026; provas de regra/precisao/zero-falta reutilizadas. S1 afecta moeda do fallback de vendas de tesouraria; S2 afecta retoma mensal, nao o avaliador. Sem outros impostos, regras novas ou apuramento final. | Antes da conferencia final S3: Saldo deste lote: apenas conferencia de paginacao do bloco IVA mensal no PDF nativo guardado; CSV/Word conferidos. S1/S2 corrigidos em QA, sem entrega na homologacao. | Antes da entrega S1-S3: Saldo QA deste lote: zero. Falta integracao/disponibilizacao pelo Git e conferencia do delta instalado; nao e entrega na homologacao nem simulador fiscal integral.",,,,,,,"Catálogo visual sintético QA; ZEE/ZFI apenas controlos HTTP revertidos; condições/benefícios não executáveis indeterminados; sem ensaio visual integral dos outros consumidores. | C exclusivamente sintético; ZEE/ZFI encaminhamento por predicados, sem reconhecimento de zona real; download concluído apesar de perda da ferramenta. Provas A/B/cálculos/exportadores aceites não repetidas.",,,,"Recorte adaptativo de preparação disponibilizado/habilitado na homologação, revisão042ffbde. Limitações globais/sectoriais/fiscais mantêm âmbito próprio." +AUD-SIM-INT02,Review actual fiscal parameters sources periods and eligibility,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,"QA only | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas.","Verification pending; no parameter activation | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal.",S1-S3 entregues cd10cccb/355656b5; aquisicoes08-10 e totais14-18 implementados e demonstrados em QA,Saldo S1-S3 zero. Novo lote08-10/14-18: saldo QA zero; integracao/disponibilizacao na homologacao pendentes. Demais categorias/creditos/submissao e IRPC/IRPS fora deste recorte.,,,P0,,,,,,,,,,,S1/S2/S3 entregues na homologacao em cd10cccb; delta instalado conferido,,"24/10: VAT Return.pdf cotejado; campos/formulas coincidentes; seleccoes/Maputo nao herdados. Compras/orcamentos reutilizados explicitamente por oportunidade, condicoes de deducao e totais com propagacao de indeterminacao; API privada e relatorio congelado. 24/10/2026: S1-S3 encerrados cd10cccb/355656b5. Modelo A reconciliado com codigo actual; proposta de operacoes internas gerais, aquisicoes08-10 e totais14-18 condicionados, sem activar regras. 24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. IVA publicado e mensal existentes; availability publico enabled=true, cobertura 2026; provas de regra/precisao/zero-falta reutilizadas. S1 afecta moeda do fallback de vendas de tesouraria; S2 afecta retoma mensal, nao o avaliador. Sem outros impostos, regras novas ou apuramento final. | Historico preservado: 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal.","Novo lote demonstrado em QA: integracao pelo Git e conferencia apenas do delta instalado ainda pendentes. Taxa reduzida/isenções, mistos/excepcoes, importacoes, regularizacoes, creditos19-27 e submissao AT fora deste lote. Proximo lote apenas proposto: reutilizacao por oportunidade, classificacao e elegibilidade documentada; desconhecido nao e zero. IRPC/IRPS inventariados, sem implementacao. 24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. IVA publicado e mensal existentes; availability publico enabled=true, cobertura 2026; provas de regra/precisao/zero-falta reutilizadas. S1 afecta moeda do fallback de vendas de tesouraria; S2 afecta retoma mensal, nao o avaliador. Sem outros impostos, regras novas ou apuramento final. | Historico preservado: Nenhuma operacao de disponibilizacao pendente neste lote delimitado. Outras componentes, regimes e coberturas fiscais permanecem fora do recorte; nao repetir provas aceites. | Recorte executável C concluído em QA. Restantes coberturas sectoriais/benefícios e encaminhamento visual de zona real têm limites concretos no manual; não bloqueiam os ramos já documentados. Integração/habilitação no destino não executadas. | Integração/habilitação deste recorte executadas em22/10/2026; referências anteriores a operação pendente são históricas. Não reabrir as provas aceites.",,,"Tempo autorizou incorporacao de 4a4d1212, cadastro/publicacao da regra real e activacao. Mesma administracao real nala@tempo.co.mz, login normal e MFA, sem quatro designacoes; sem parecer juridico ou revisao independente atribuidos a Tempo.",Ligacao de consumidor publicada concluida em QA; decisoes operacionais separadas.,Recorte executado; sem saldo de implementacao ou disponibilizacao identificado neste lote. Nao converter estimativas anteriores em implementacao fiscal integral.,"docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md (QA24/10); recibo integrado modelo_a_acquisitions_qa_20261024; 11 frontend + 2 API/19 assercoes; tipos/build; UI->API->relatorio, PDF6paginas. docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md (actualizacao24/10); recibo integrado modelo_a_next_scope_20261024. 24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. IVA publicado e mensal existentes; availability publico enabled=true, cobertura 2026; provas de regra/precisao/zero-falta reutilizadas. S1 afecta moeda do fallback de vendas de tesouraria; S2 afecta retoma mensal, nao o avaliador. Sem outros impostos, regras novas ou apuramento final. | Historico preservado: [Leitura SSH 21/10/2026 08:17 Maputo] Zero regras em simulation_tax_rule_versions na homologação, incluindo todos os estados por leitura administrativa sem ocultação RLS. Seis referências em investment_legal_sources; não são parâmetros executáveis. QA também tinha zero regras. BEGIN READ ONLY/SELECT/ROLLBACK; zero escritas. Prova homologation-fiscal-readonly.json. O git HEAD registado é do checkout consultado, não certifica a revisão do build servido. A ausência de cadastro não é ausência de fontes oficiais nem reabre a aceitação da Tempo de 08/10. Não implementa a ligação funcional ao motor fiscal. | [Saldo consolidado21/10/2026] Parcial. Leitura remota concluída: zero regras de todos os estados na homologação, tal como QA; seis referências jurídicas não são parâmetros executáveis. Falta cadastro fundamentado por componente/âmbito/período e ligação funcional ao motor fiscal. Fontes e análises existentes reutilizáveis; aceitação oficial da Tempo de08/10 preservada. Não activar taxas nem importar/publicar por esta reconciliação. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação. | [Candidata21/10/2026] Diagnóstico fiscal separado no manual existente: fontes/analises já disponíveis; zero parâmetros executáveis na QA e homologação por leitura de todos os estados; governação/resolvedor temporal/DSL existentes; RunSimulation ainda aritmética personalizada sem consumir regras fiscais. Saldo: cadastro fundamentado, orquestração, contrato de resultado/histórico e ligação ao dossier/relatório, com casos por componente/período. Nenhuma regra criada nem activada; implementação fiscal integral aberta e excluída das1–2h de exportações. | [Proposta21/10/2026] Primeiro lote proposto: uma regra IVA geral sobre base liquida/MZN, cobertura demonstrada2026 sem inventar caducidade legal. Reutilizar fontes/analises/governacao/resolvedor/avaliador existentes; arredondamento e ambito aplicavel explicitamente por fundamentar antes de publicar. Cadastro4-8h e codigo/aceitacao12-20h, total16-28h condicionado ao acervo, separado das1-2h de exportacao. Criterios e exclusoes no manual existente. Nenhuma regra cadastrada/activada; nao e implementacao fiscal integral. | [QA IVA v1.2 21/10/2026] Orientacao posterior Tempo: calcular com precisao decimal exacta sem arredondamento automatico, separando apresentacao monetaria; arredondamento generico deixa de ser bloqueio deste lote. Cadastro draft versionado em clone QA; resolvedor/avaliador existentes; proveniencia, historico e relatorio imutavel ligados. 5 feature (51 assercoes), 7 unit (25), 3 frontend; types/build/Pint aprovados. Contexto declarado; nao e saldo a pagar. Zero regras publicadas; sem main/activacao. Recorte QA autorizado verificado (0h engenharia identificada restante); produto fiscal integral continua parcial. Limites e provas no mesmo manual e ficha v1.2; sem atribuicao de validacao juridica ao utilizador. | [Revisao 83d2f97d] Ambito/periodo/exclusoes e procedimentos de integracao, publicacao, activacao e suspensao consolidados no mesmo manual. Lacuna concreta de ecra QA fechada: entradas 1000.03/MZN/2026-10-21; calculo exacto 160.0048; gravacao fa6d17f2-5f47-4cb6-b8cb-40850c12505f; recarga; recuperacao do mesmo ID; relatorio d13e2ad5-3ba8-4d01-9d30-5815496da774 com mesmo valor/proveniencia e hash igual ao resultado. Uma execucao persistida, draft e zero regras publicadas. 1 teste novo de rota/17 assercoes, TypeScript/build e browser aprovados; restantes provas reutilizadas. Interrupcao inicial da ferramenta resolvida, sem atribuicao de falha ao simulador. Revisao do recorte demonstrada; sem nova preparacao generica identificada, main ou activacao; nao fecha aplicabilidade fiscal universal nem simulador integral. | 21/10/2026: proposta do consumidor IVA no simulador existente no manual: falta ligacao a regra publicada e activacao explicita. Integrar codigo desligado, publicar versao e activar consumidor sao tres operacoes distintas. Reutiliza permissoes, governanca, historico e provas aceites; sem ampliar cobertura ou executar estas operacoes. | 21/10/2026: implementado delta de 2ced7b79 no simulador normal QA, activacao desligada por omissao. 8 testes/75 assercoes, 2 testes frontend novos, TypeScript/build/Pint. Edge: indeterminacao, calculo, repeticao sem duplicar, fila admitida antes de suspensao concluida depois, nova execucao recusada e historicos/relatorios preservados. Mesmo manual e recibo consolidam provas e tres operacoes. Fixture isolada suspensa; sem merge ou publicacao/activacao na homologacao. | 21/10/2026: origem da condicao fiscal localizada em e65cb269/servico/CHECKs de 03/10 e nota de implementacao; sem decisao expressa aplicavel encontrada. Correccao QA: administracao existente, mesma pessoa, fonte oficial identificada e eventos preservados. 6 testes/86 assercoes apenas do controlo, sem calculos/exportadores; constraints de outras tabelas iguais. Esquema activo nao alterado; backup/restauro de 171 tabelas confirmado; sem fixture ou publicacao real. | [Execucao autorizada 21/10/2026 10:56 UTC] Servido d3fe8a02ec7f5dcd01984c4f4a1eba18b5a0cf19 contendo 4a4d1212; DDL fiscal aplicado autenticadamente com backup/restauro de171tabelas e registos preservados. Tres fontes reais v1 com hashes/citacoes e aceitacao fiscal Tempo08/10/2026, sem validacao geral automatica. Regra IVA-GERAL-BASE-LIQUIDA rule_version1, ID01a15e1a-5338-700f-8a45-f87707d696a7, published, version_no5, actor15 emtodasetapas;5eventos. Activacao separada ligada a esseID/versao; APIHTTP200 enabled=true e resolvedor16percent no contexto delimitado sem calculo novo. FixtureQA nao importada; calculos/exportadores/PDF aceites nao repetidos. Suspensao de novas admissoes conserva snapshots/historicos/relatorios. Recibo e manual existentes actualizados; limitacoes de abertura de consola/extensao registadas como ferramenta. | [Diagnostico IVA QA21/10/2026] Falha estrutural reproduzida na consulta anual: fiscal_operation nao satisfaz operation e moeda nao era comunicada. Sem presumir respostas originais. Cada condicao tem campo/recebido/esperado/categoria; notas junto ao campo, resumo com foco e Ver fundamento semDSL/codigo. Moeda fiscal explicita, sem conversao/copia.5unitarios24assercoes+1API16assercoes, Edge comUSD dirigido preservado apos recuperacao; fixtureQA v3suspensa, consumidorQAoff. Nao altera regra/activacao da homologacao; calculos e exportadores nao repetidos. Branch codex/iva-diagnostics-QA. | [IVA mensal QA21/10/2026] Vendas por produto/mes reutilizadas; base liquida explicita; versao publicada seleccionada no servidor, sem taxa/manual no formulario. Zero distinto de falta; preco com IVA indeterminado. Actualizacao dependente cria versao, historicos/relatorios preservados. IVA separado de recebimentos/custos/imposto final; manual apenas cenario personalizado. 3API/46assercoes+4frontend e Edge: vendas alteradas, bruto, zero, falta, recuperacao e relatorio. Fixture sintetica v4 ligada apenas no clone QA para revisao. Sem main/HML ou alargamento fiscal; provas anteriores reutilizadas. Mesmo manual/recibo; branch codex/iva-monthly-projection-QA. | [Modelo A QA21/10/2026] Exemplar Tempo e imagem incorporada conferidos/preservados privados na biblioteca QA, hashes/scans/idempotencia; quadros e campos01-27 mapeados no mesmo registo. Componente01/02 existente; apuramento14-18 indeterminado. Correspondencia consultavel e compras/encomendas reutilizadas sem fabricar base/IVA/deducao. Divergencias de remissao registadas; edicao vigente nao afirmada.3testes novos/types/build/Edge; calculo/exportadores aceites reutilizados. Delta seguinte8-16h cadastro+20-36h codigo, condicionado e sem creditos/substituicao/pagamento/reembolso; nao e cobertura integral. Sem main/HML, nova regra publicada ou activacao. Ver docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md. | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral. | 22/10: revisão de a76369eb concluída no âmbito aceite por prova equivalente do regresso; A/B não repetidos. Tabela do primeiro percurso de investimento privado no manual: condições, artigos/período e efeitos; preparação documental, sem ligação executável nova. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal. | 22/10/2026 — prova complementar exclusiva do relatório: recuperação UI do contexto v4, rascunho v5 e Word novo por mero registo; estudo/capacidade não aplicáveis. Word v3 preservado/identificado como histórico, hash inalterado. Sem alteração funcional ou repetição dos ensaios aceites. Dependências Git: a76369eb → 52fbb146 documental → a1fbda06; integrar após decisão, preservando main concorrente. | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas.",,20/10/2026,,,Saldo deste lote S1-S3: zero. Nao representa simulador de todos os impostos; proximo lote fiscal sera delimitado pelos modelos anexados. Variantes fora deste recorte conservam criterios proprios.,,,,,,,"Catálogo visual sintético QA; ZEE/ZFI apenas controlos HTTP revertidos; condições/benefícios não executáveis indeterminados; sem ensaio visual integral dos outros consumidores. | C exclusivamente sintético; ZEE/ZFI encaminhamento por predicados, sem reconhecimento de zona real; download concluído apesar de perda da ferramenta. Provas A/B/cálculos/exportadores aceites não repetidas.",,,,"Recorte adaptativo de preparação disponibilizado/habilitado na homologação, revisão042ffbde. Limitações globais/sectoriais/fiscais mantêm âmbito próprio." AUD-SIM-INT03,Review isolation recovery across projects and sessions,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Existing controls and accepted proofs to reconcile; no leak established,S1/S2/S3 entregues na homologacao em cd10cccb; delta instalado conferido,Saldo deste lote S1-S3: zero. Nao representa simulador de todos os impostos; proximo lote fiscal sera delimitado pelos modelos anexados. Variantes fora deste recorte conservam criterios proprios.,,,P0,,,,,,,,,,, | Estado antes da delimitacao 24/10/2026: Two dossiers and new login recovered in browser; cashflow persistence corrected and HTTP-tested; new visual cashflow delta pending | Antes da execucao QA 24/10/2026: Provas de isolamento/recuperacao aceites reutilizadas; deltas S1/S2 propostos | Antes da conferencia final S3: S1/S2 corrigidos e demonstrados QA; S3 aguarda PDF nativo; candidata 65b87819 | Antes da entrega S1-S3: S1/S2/S3 concluidos em QA; candidata 65b87819 pronta para integracao,,"24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. Isolamento e recuperacao de dois dossiers/nova sessao aceites, nao repetidos. Restam deltas S1 de moeda guardada e S2 de recuperacao por ID com admissoes suspensas; nao presumir fuga nem repetir todos os logins. | Historico preservado: ","24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. Isolamento e recuperacao de dois dossiers/nova sessao aceites, nao repetidos. Restam deltas S1 de moeda guardada e S2 de recuperacao por ID com admissoes suspensas; nao presumir fuga nem repetir todos os logins. | Historico preservado: | [Saldo corrente 23/10/2026] São três lacunas de integração constatadas por leitura e quatro verificações delimitadas, não sete falhas de execução. Os itens 1–3 determinam a correcção executável seguinte; 4–6 podem ser conferidos independentemente em QA isolado; 7 depende apenas do âmbito corrigido. A contagem refere-se a estes sete recortes, não a cada formato ou campo. Uma verificação que passe encerra o item; uma que falhe regista o defeito concreto na mesma linha da matriz. Não criar outra matriz/backlog nem converter ausência de prova em regressão. Fechos preservados: 6b544548/4098192a; d8224ba8/af926180; 55136b44/b6a626c9. Notas historicas de falta de entrega destes recortes estao superadas. Ver sete recortes no inicio do manual existente. | [QA conjunta 23/10/2026] Itens 1-3 corrigidos: escolha de oportunidade no simulador, aplicabilidade/estados por oportunidade, atalho Terra pelo pedido associado. Provas dirigidas novas nos itens 4-6: retirada da primeira, contactos autorizados, entradas ideia/sector/territorio e login. Word/ZIP gerados; composicao de impressao conferida. Resta PDF nativo efectivamente guardado/paginacao e recorte ancora por analisar. Sem entrega na homologacao desta candidata. Ver estado corrente no inicio do manual; sete itens historicos abaixo nao sao o saldo corrente. Fechos 6b544548, d8224ba8, 55136b44 preservados. Estatisticas e IA adiadas. | [PDF nativo 23/10/2026] Falhas observadas na saida real: not_started e detalhe dos requisitos ausente. Correcao 2856240c sobre candidata 1afdfee8: estados humanos e requisitos apenas da oportunidade aplicavel. Teste novo native-pdf-scope passou; tipos/build passaram; sem repetir Word/ZIP. Saida real revista13, oportunidade309/Manica, valores QA123456/45678/diferenca77778MZN, pronta para gravacao manual. PDF guardado/paginacao pendentes por falta de controlo do dialogo nativo. Integracao/disponibilizacao ja autorizada pela Tempo apos conferencia, ainda nao executada; origin/main55136b44. Estatisticas e IA adiadas. | [PDF nativo guardado conferido 23/10/2026] Original encontrado na pasta indicada com titulo automatico Relatorio SYNTHETIC QA, extensao .pdf, maquina ONALA/macbook/Console. SHA256010eb4ea12015563c1b2f8bc255b1078c276f824c50690732541d5bffe34b8a6. Dez paginas renderizadas e conferidas: oportunidade309/Manica, cinco requisitos especificos, valores123456/45678/diferenca77778MZN; paginacao e legibilidade aprovadas. Sem regenerar PDF ou repetir Word/ZIP/provas aceites. Condicao satisfeita para1afdfee8+2856240c; disponibilizacao Git autorizada em execucao, ainda a confirmar instalada. Ver inicio do manual e native-pdf-and-anchor-review-20261023.json. Pendencias historicas de ficheiro em falta superadas; saldo de ancoras6985f82e preservado; Estatisticas/IA adiadas. | [Entrega confirmada 23/10/2026] 1afdfee8+2856240c entregues na homologacao8036b9b0. PDF original encontrado pelo titulo automatico na mesma pasta/maquina/sessao: dez paginas e ambito/requisitos/valores/paginacao conferidos, SHA256010eb4ea12015563c1b2f8bc255b1078c276f824c50690732541d5bffe34b8a6, sem regeneracao. Fast-forward55136b44->8036b9b0, instalador installed16:46:13UTC, zero migrations/importacoes. Revisao publica e15hashes funcionais coincidem; delta autenticado na ficha53/dossier958df138 verificado, versao5 preservada, zero novos pedidos/gravacoes/submissoes. Sem repetir provas aceites. Ver treatment-scope-installation-receipt-20261023.json e inicio do manual. Pendencias historicas de PDF/instalacao superadas neste recorte. Complementos e fechos anteriores preservados. Saldo ancora6985f82e mantido; Estatisticas/IA adiadas; sem fecho global.",,,,diagnosis and targeted corrections,,"24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. Isolamento e recuperacao de dois dossiers/nova sessao aceites, nao repetidos. Restam deltas S1 de moeda guardada e S2 de recuperacao por ID com admissoes suspensas; nao presumir fuga nem repetir todos os logins. | Historico preservado: [Retoma 21/10/2026] QA 18576, clone simulator_review_delta_20261020_test: sessão sintética renovada por login normal; gravação autenticada e recarga recuperaram saldo 123, receita 900, custos 600, calendário mensal 10/vazio/0, crédito IVA estimado 500. Caixa conhecida 3713 MZN; total indeterminado desde mês 2; crédito estimado excluído da caixa. Prova visual cashflow-recovered-20261021.png e snapshot .txt em outputs/simulator-continuation-20261020. Não certifica recuperação destes novos valores após outro login, CSV/DOCX ou PDF nativo. Ligação de controlo do navegador perdida durante espera de download; não atribuir falha à aplicação. Leitura remota aguarda identificação da ligação SSH; zero alterações no destino. | [Saldo consolidado21/10/2026] Concluído no recorte. A/B, logout/novo login, recuperação e recusa pela aplicação demonstrados anteriormente. A tesouraria tem prova API de nova sessão e prova visual de recuperação por recarga. Não atribuir ao navegador nova sessão dos valores de tesouraria, nem nova certificação RLS; limites expressos conservados. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação. | [Delta QA 23/10/2026 sobre c3f7c3ad] QA: gzip/ETag; idioma guardado e recuperado; versao antiga continua recusada. Ver docs/investmoz/unification/traceability-and-manual.md. Homologacao permanece 7c1f5321; cobertura transversal parcial. 23/10/2026: Tempo encerrou os tres casos no ambito reportado (6b544548; recibo 4098192a), sem repetir. Avaliacao estatica dos trechos restantes no manual existente, seccao de 23/10: escolhas por ficha preservadas no contrato; parques e campos comuns usam a primeira escolha; land/desk/submission reutilizam campos comuns, sem lista OpportunityChoices no DossierPrefill. Demonstracao multi-oportunidade nos restantes formularios pendente. Aplicacao transversal parcial. Sem alteracao no activo. | 23/10/2026: conferência executada QA da segunda oportunidade Gaza/Limpopo → Manica/Beira; primeira/terceira exactamente preservadas no dossier, transacção revertida. Zonas/parques continuam por choices[0]; Terra/DUAT, Balcão e manifestação propõem campos comuns da primeira. Lacunas confirmadas, não corrigidas nem fechadas. Complementos d8224ba8 e fechos anteriores aceites, sem repetição. Ver multi-opportunity-context-review-20261023.json e manual existente. | 23/10/2026: correcção executável QA 4a01e9e2 dos quatro consumidores por identidade: parque próprio, Terra/DUAT, Balcão e manifestação; segunda 309 Gaza/Limpopo → Manica/Beira/parque Manica, primeira exactamente intacta; gravar/recuperar e relatórios conforme recibo multi-opportunity-context-qa-receipt-20261023.json. 4 testes/104 asserções, 3 frontend, tipos/build e prova visual dirigidos. Homologação permanece d8224ba8; complementos e fechos preservados; não é fecho transversal. | 23/10/2026: quatro consumidores entregues na homologação 55136b44 (correcção 4a01e9e2), revisão pública e delta instalado conferidos na ficha real 53 e GET autorizado do contexto. Provas QA reutilizadas, sem novos pedidos nem repetição dos casos aceites. d8224ba8 e fechos anteriores preservados; estatísticas/IA adiadas. Ver multi-opportunity-context-installation-receipt-20261023.json e manual; sem fecho transversal global. | Revisao estatica em b6a626c9, sem nova execucao funcional ou alteracao da homologacao. Estatisticas e IA adiadas. | Prova QA: tests/Feature/InvestmentTreatmentScopeTest.php; tests/frontend/treatment-scope-export.test.mjs; novo dossier d279172b-8bd1-4074-b000-ee25f0d29778. Sem repetir testes aceites. | [PDF nativo 23/10/2026] Falhas observadas na saida real: not_started e detalhe dos requisitos ausente. Correcao 2856240c sobre candidata 1afdfee8: estados humanos e requisitos apenas da oportunidade aplicavel. Teste novo native-pdf-scope passou; tipos/build passaram; sem repetir Word/ZIP. Saida real revista13, oportunidade309/Manica, valores QA123456/45678/diferenca77778MZN, pronta para gravacao manual. PDF guardado/paginacao pendentes por falta de controlo do dialogo nativo. Integracao/disponibilizacao ja autorizada pela Tempo apos conferencia, ainda nao executada; origin/main55136b44. Estatisticas e IA adiadas. | [PDF nativo guardado conferido 23/10/2026] Original encontrado na pasta indicada com titulo automatico Relatorio SYNTHETIC QA, extensao .pdf, maquina ONALA/macbook/Console. SHA256010eb4ea12015563c1b2f8bc255b1078c276f824c50690732541d5bffe34b8a6. Dez paginas renderizadas e conferidas: oportunidade309/Manica, cinco requisitos especificos, valores123456/45678/diferenca77778MZN; paginacao e legibilidade aprovadas. Sem regenerar PDF ou repetir Word/ZIP/provas aceites. Condicao satisfeita para1afdfee8+2856240c; disponibilizacao Git autorizada em execucao, ainda a confirmar instalada. Ver inicio do manual e native-pdf-and-anchor-review-20261023.json. Pendencias historicas de ficheiro em falta superadas; saldo de ancoras6985f82e preservado; Estatisticas/IA adiadas. | [Entrega confirmada 23/10/2026] 1afdfee8+2856240c entregues na homologacao8036b9b0. PDF original encontrado pelo titulo automatico na mesma pasta/maquina/sessao: dez paginas e ambito/requisitos/valores/paginacao conferidos, SHA256010eb4ea12015563c1b2f8bc255b1078c276f824c50690732541d5bffe34b8a6, sem regeneracao. Fast-forward55136b44->8036b9b0, instalador installed16:46:13UTC, zero migrations/importacoes. Revisao publica e15hashes funcionais coincidem; delta autenticado na ficha53/dossier958df138 verificado, versao5 preservada, zero novos pedidos/gravacoes/submissoes. Sem repetir provas aceites. Ver treatment-scope-installation-receipt-20261023.json e inicio do manual. Pendencias historicas de PDF/instalacao superadas neste recorte. Complementos e fechos anteriores preservados. Saldo ancora6985f82e mantido; Estatisticas/IA adiadas; sem fecho global.",,20/10/2026,,," | Antes da delimitacao do simulador 24/10/2026: QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining | Antes da execucao QA 24/10/2026: Isolamento e recuperacao de dois dossiers/nova sessao aceites, nao repetidos. Restam deltas S1 de moeda guardada e S2 de recuperacao por ID com admissoes suspensas; nao presumir fuga nem repetir todos os logins. | Antes da conferencia final S3: Saldo deste lote: apenas conferencia de paginacao do bloco IVA mensal no PDF nativo guardado; CSV/Word conferidos. S1/S2 corrigidos em QA, sem entrega na homologacao. | Antes da entrega S1-S3: Saldo QA deste lote: zero. Falta integracao/disponibilizacao pelo Git e conferencia do delta instalado; nao e entrega na homologacao nem simulador fiscal integral.",,,,,,,,,,," | [Saldo corrente 23/10/2026] São três lacunas de integração constatadas por leitura e quatro verificações delimitadas, não sete falhas de execução. Os itens 1–3 determinam a correcção executável seguinte; 4–6 podem ser conferidos independentemente em QA isolado; 7 depende apenas do âmbito corrigido. A contagem refere-se a estes sete recortes, não a cada formato ou campo. Uma verificação que passe encerra o item; uma que falhe regista o defeito concreto na mesma linha da matriz. Não criar outra matriz/backlog nem converter ausência de prova em regressão. Fechos preservados: 6b544548/4098192a; d8224ba8/af926180; 55136b44/b6a626c9. Notas historicas de falta de entrega destes recortes estao superadas. Ver sete recortes no inicio do manual existente. | [QA conjunta 23/10/2026] Itens 1-3 corrigidos: escolha de oportunidade no simulador, aplicabilidade/estados por oportunidade, atalho Terra pelo pedido associado. Provas dirigidas novas nos itens 4-6: retirada da primeira, contactos autorizados, entradas ideia/sector/territorio e login. Word/ZIP gerados; composicao de impressao conferida. Resta PDF nativo efectivamente guardado/paginacao e recorte ancora por analisar. Sem entrega na homologacao desta candidata. Ver estado corrente no inicio do manual; sete itens historicos abaixo nao sao o saldo corrente. Fechos 6b544548, d8224ba8, 55136b44 preservados. Estatisticas e IA adiadas. | [PDF nativo 23/10/2026] Falhas observadas na saida real: not_started e detalhe dos requisitos ausente. Correcao 2856240c sobre candidata 1afdfee8: estados humanos e requisitos apenas da oportunidade aplicavel. Teste novo native-pdf-scope passou; tipos/build passaram; sem repetir Word/ZIP. Saida real revista13, oportunidade309/Manica, valores QA123456/45678/diferenca77778MZN, pronta para gravacao manual. PDF guardado/paginacao pendentes por falta de controlo do dialogo nativo. Integracao/disponibilizacao ja autorizada pela Tempo apos conferencia, ainda nao executada; origin/main55136b44. Estatisticas e IA adiadas. | [PDF nativo guardado conferido 23/10/2026] Original encontrado na pasta indicada com titulo automatico Relatorio SYNTHETIC QA, extensao .pdf, maquina ONALA/macbook/Console. SHA256010eb4ea12015563c1b2f8bc255b1078c276f824c50690732541d5bffe34b8a6. Dez paginas renderizadas e conferidas: oportunidade309/Manica, cinco requisitos especificos, valores123456/45678/diferenca77778MZN; paginacao e legibilidade aprovadas. Sem regenerar PDF ou repetir Word/ZIP/provas aceites. Condicao satisfeita para1afdfee8+2856240c; disponibilizacao Git autorizada em execucao, ainda a confirmar instalada. Ver inicio do manual e native-pdf-and-anchor-review-20261023.json. Pendencias historicas de ficheiro em falta superadas; saldo de ancoras6985f82e preservado; Estatisticas/IA adiadas. | [Entrega confirmada 23/10/2026] 1afdfee8+2856240c entregues na homologacao8036b9b0. PDF original encontrado pelo titulo automatico na mesma pasta/maquina/sessao: dez paginas e ambito/requisitos/valores/paginacao conferidos, SHA256010eb4ea12015563c1b2f8bc255b1078c276f824c50690732541d5bffe34b8a6, sem regeneracao. Fast-forward55136b44->8036b9b0, instalador installed16:46:13UTC, zero migrations/importacoes. Revisao publica e15hashes funcionais coincidem; delta autenticado na ficha53/dossier958df138 verificado, versao5 preservada, zero novos pedidos/gravacoes/submissoes. Sem repetir provas aceites. Ver treatment-scope-installation-receipt-20261023.json e inicio do manual. Pendencias historicas de PDF/instalacao superadas neste recorte. Complementos e fechos anteriores preservados. Saldo ancora6985f82e mantido; Estatisticas/IA adiadas; sem fecho global." AUD-SIM-INT04,Review stale and historical results and correct dossier,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,"Existing versions/fingerprints; targeted verification pending | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",S1/S2/S3 entregues na homologacao em cd10cccb; delta instalado conferido,Saldo deste lote S1-S3: zero. Nao representa simulador de todos os impostos; proximo lote fiscal sera delimitado pelos modelos anexados. Variantes fora deste recorte conservam criterios proprios.,,,P1,,,,,,,,,,, | Estado antes da delimitacao 24/10/2026: Historical results visible after fix; 12 and 24 recovered; hashes unchanged; synthetic temporal resolver versions verified in memory only | Antes da execucao QA 24/10/2026: Historicos e invalidacao aceites; retoma S2 e prova mensal S3 delimitadas | Antes da conferencia final S3: S1/S2 corrigidos e demonstrados QA; S3 aguarda PDF nativo; candidata 65b87819 | Antes da entrega S1-S3: S1/S2/S3 concluidos em QA; candidata 65b87819 pronta para integracao,,"24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. Invalidacao por vendas/entradas e snapshots historicos preservados. S2 deve recuperar estado terminal pelo mesmo ID sem duplicacao; S3 confere rotulo actual/historico e versao no bloco mensal exportado. | Historico preservado: 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.","24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. Invalidacao por vendas/entradas e snapshots historicos preservados. S2 deve recuperar estado terminal pelo mesmo ID sem duplicacao; S3 confere rotulo actual/historico e versao no bloco mensal exportado. | Historico preservado: ",,,,diagnosis and targeted corrections,,"24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. Invalidacao por vendas/entradas e snapshots historicos preservados. S2 deve recuperar estado terminal pelo mesmo ID sem duplicacao; S3 confere rotulo actual/historico e versao no bloco mensal exportado. | Historico preservado: [Saldo consolidado21/10/2026] Concluído no recorte demonstrado. Histórico24/12 visível, hashes preservados e versões temporais sintéticas do resolvedor conferidas. Execução fiscal integrada com parâmetros reais pertence ao saldo de02 e não foi demonstrada por estes testes. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação. | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",,20/10/2026,,," | Antes da delimitacao do simulador 24/10/2026: QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining | Antes da execucao QA 24/10/2026: Invalidacao por vendas/entradas e snapshots historicos preservados. S2 deve recuperar estado terminal pelo mesmo ID sem duplicacao; S3 confere rotulo actual/historico e versao no bloco mensal exportado. | Antes da conferencia final S3: Saldo deste lote: apenas conferencia de paginacao do bloco IVA mensal no PDF nativo guardado; CSV/Word conferidos. S1/S2 corrigidos em QA, sem entrega na homologacao. | Antes da entrega S1-S3: Saldo QA deste lote: zero. Falta integracao/disponibilizacao pelo Git e conferencia do delta instalado; nao e entrega na homologacao nem simulador fiscal integral.",,,,,,,Catálogo visual sintético QA; ZEE/ZFI apenas controlos HTTP revertidos; condições/benefícios não executáveis indeterminados; sem ensaio visual integral dos outros consumidores.,,,,Incremento contextual QA para revisão; sem integração main/activação fiscal. AUD-SIM-INT05,Independent financial controls unknown zero units and currencies,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Reconciliation pending; no invented tax assumptions,S1/S2/S3 entregues na homologacao em cd10cccb; delta instalado conferido,Saldo deste lote S1-S3: zero. Nao representa simulador de todos os impostos; proximo lote fiscal sera delimitado pelos modelos anexados. Variantes fora deste recorte conservam criterios proprios.,,,P1,,,,,,,,,,," | Estado antes da delimitacao 24/10/2026: Independent business-plan and cashflow ledgers passed; complete credit recipe included in screen and exports | Antes da execucao QA 24/10/2026: Controlos anteriores aceites; lacuna de moeda S1 diagnosticada, ainda nao corrigida | Antes da conferencia final S3: S1/S2 corrigidos e demonstrados QA; S3 aguarda PDF nativo; candidata 65b87819 | Antes da entrega S1-S3: S1/S2/S3 concluidos em QA; candidata 65b87819 pronta para integracao",,"24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. Controlos financeiros independentes anteriores mantidos. Lacuna S1 confirmada em diagnostico novo sem DB: snapshot de tesouraria sem moeda permite relabel USD para MZN no IVA e relatorio. Preservar moeda de origem e montantes; reconciliar divergencia sem conversao presumida. | Historico preservado: ","24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. Controlos financeiros independentes anteriores mantidos. Lacuna S1 confirmada em diagnostico novo sem DB: snapshot de tesouraria sem moeda permite relabel USD para MZN no IVA e relatorio. Preservar moeda de origem e montantes; reconciliar divergencia sem conversao presumida. | Historico preservado: ",,,,diagnosis and targeted corrections,,"24/10/2026 ENTREGA S1-S3 HOMOLOGACAO: cd10cccbf45f53836d8bf7b2bd90794d99602cb9, funcional 65b87819, avancando main de 276d833a sem conflitos/force. Revisao servida e manifesto conferidos; quatro assets HTTP200 com os deltas, simulador HTTP200, IVA existente enabled=true/cobertura2026 preservados. Referencia de estabilizacao ancestral; nenhum delta em app/database/config/routes/deploy, sem outros impostos ou regras alteradas. Provas QA/PDF aceites reutilizadas; nenhum dossier/pedido/calculo sintetico criado no destino. S1-S3 entregues, saldo zero neste lote. Confirmacao de moeda v1 sem origem continua explicita, valores intactos. Nao conclui todos os impostos; modelos anexados delimitam proximo lote. Ver closure_homologation_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 FECHO QA S1/S2/S3: candidata funcional 65b87819 pronta para integracao; nao entregue na homologacao. PDF monthly-final.pdf gerado a pedido expresso no motor Edge isolado; 4 paginas renderizadas e inspeccionadas, valores/moeda/oportunidade/periodo/fonte/versao iguais ao CSV/Word, cabecalhos/linhas/rodapes integros. SHA256 7719a05136f6dba668b621f551626060d10db5fcbb84815cdad112a1eab9079b. S3 deixa de estar pendente. Nao foi gravacao manual no dialogo nativo. Provas aceites reutilizadas; sem outros impostos ou alteracao de regras. Referencia 276d833a preservada. Ver closure_qa_20261024 no recibo integrado e inicio do manual. | Historico preservado: 24/10/2026 CANDIDATA QA 65b87819: S1 corrigido com moeda de origem v2, v1 preservado e confirmacao explicita; S2 corrigido com recuperacao GET por mesmo ID apesar de novas admissoes desligadas, permissoes e contagem preservadas. 12 testes frontend dirigidos, 2 API/23 assercoes em QA nominal transaccional, TypeScript/build aprovados. S3 CSV/Word/fonte HTML conferidos; falta apenas PDF nativo guardado para paginacao do bloco mensal. Nao pronto para integrar ate essa conferencia. Sem main/homologacao, novos impostos, regras fiscais, schema, permissoes ou dados activos alterados. Ver manual e closure_qa_20261024 no recibo integrado; provas aceites reutilizadas. | Historico preservado: 24/10/2026 AMBITO SIMULADOR: proposta finita S1/S2 (duas lacunas de codigo) e S3 (uma prova especifica). Ver inicio do manual e closure_scope_reconciliation_20261024 no recibo integrado existente. Nao executadas correccoes/integracao/publicacao fiscal; provas validas reutilizadas. Seis associacoes e dois originais sem dependencia efectiva identificada. Controlos financeiros independentes anteriores mantidos. Lacuna S1 confirmada em diagnostico novo sem DB: snapshot de tesouraria sem moeda permite relabel USD para MZN no IVA e relatorio. Preservar moeda de origem e montantes; reconciliar divergencia sem conversao presumida. | Historico preservado: [Retoma 21/10/2026] QA 18576, clone simulator_review_delta_20261020_test: sessão sintética renovada por login normal; gravação autenticada e recarga recuperaram saldo 123, receita 900, custos 600, calendário mensal 10/vazio/0, crédito IVA estimado 500. Caixa conhecida 3713 MZN; total indeterminado desde mês 2; crédito estimado excluído da caixa. Prova visual cashflow-recovered-20261021.png e snapshot .txt em outputs/simulator-continuation-20261020. Não certifica recuperação destes novos valores após outro login, CSV/DOCX ou PDF nativo. Ligação de controlo do navegador perdida durante espera de download; não atribuir falha à aplicação. Leitura remota aguarda identificação da ligação SSH; zero alterações no destino. | [Saldo consolidado21/10/2026] Concluído nos controlos delimitados. Controlos independentes de caixa/plano/crédito, zero/desconhecido e moedas preservados. Não são validação de taxas legais nem certificação de toda a contabilidade. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação.",,20/10/2026,,," | Antes da delimitacao do simulador 24/10/2026: QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining | Antes da execucao QA 24/10/2026: Controlos financeiros independentes anteriores mantidos. Lacuna S1 confirmada em diagnostico novo sem DB: snapshot de tesouraria sem moeda permite relabel USD para MZN no IVA e relatorio. Preservar moeda de origem e montantes; reconciliar divergencia sem conversao presumida. | Antes da conferencia final S3: Saldo deste lote: apenas conferencia de paginacao do bloco IVA mensal no PDF nativo guardado; CSV/Word conferidos. S1/S2 corrigidos em QA, sem entrega na homologacao. | Antes da entrega S1-S3: Saldo QA deste lote: zero. Falta integracao/disponibilizacao pelo Git e conferencia do delta instalado; nao e entrega na homologacao nem simulador fiscal integral.",,,,,,,,,,, diff --git a/resources/js/components/simulation-acquisitions.tsx b/resources/js/components/simulation-acquisitions.tsx new file mode 100644 index 00000000..64bbf65e --- /dev/null +++ b/resources/js/components/simulation-acquisitions.tsx @@ -0,0 +1,62 @@ +import { useState } from 'react'; +import { acquisitionBook, acquisitionCurrent, acquisitionExcludedFields, acquisitionPlanReferences, acquisitionReportRows, calculateAcquisitions, newAcquisition, reuseAcquisitions, saveAcquisitionBook, type Acquisition, type AcquisitionBook } from '@/lib/iva-acquisitions'; + +export function SimulationAcquisitions({draft,onChange}:{draft:Record;onChange:(field:string,value:string)=>void}) { + const [error,setError]=useState(''); + let book:AcquisitionBook; + try {book=acquisitionBook(draft);} catch(cause) {return

{String(cause)}

;} + const save=(next:AcquisitionBook)=>{try {onChange('modelo_a_snapshot',saveAcquisitionBook(draft,next));setError('');}catch(cause){setError(String(cause));}}; + const change=(id:string,patch:Partial)=>save({...book,rows:book.rows.map(row=>row.id===id?{...row,...patch}:row)}); + const run=(action:()=>void)=>{try{action();setError('');}catch(cause){setError(cause instanceof Error?cause.message:String(cause));}}; + let references:ReturnType=[]; + try {references=acquisitionPlanReferences(draft);}catch { /* The action reports the concrete currency/source error without replacing saved values. */ } + const labels:Record={'03':'Base à taxa reduzida','04':'IVA à taxa reduzida','05':'Isentas com direito à dedução','06':'Operações art.18(1)(b)','07':'Isentas sem direito','11':'Importações','12':'Regularizações a favor do sujeito passivo','13':'Regularizações a favor do Estado'}; + const select=(row:Acquisition,key:keyof Acquisition,label:string,options:Array<[string,string]>)=>; + const yesNo:Array<[string,string]>=[['yes','Sim'],['no','Não']]; + return
+

Compras e apuramento parcial do Modelo A

+

Oportunidade em tratamento: {String(draft.context_opportunity||'entrada geral')}. Moeda de origem: {book.currency||'por indicar'}. A compra registada não gera automaticamente IVA dedutível.

+ {book.currency && draft.currency!==book.currency &&

As compras conservam {book.currency}; o projecto está em {String(draft.currency||'moeda por indicar')}. Reveja a moeda no projecto. Os montantes e o resultado anterior não foram convertidos ou reinterpretados.

} + {!book.currency && !!draft.currency && } +

Primeiro âmbito: aquisições internas em MZN, afectação exclusiva a operações tributadas, sem exclusões ou dedução parcial, documento e dedução no mesmo período de 2026. Nas projecções, cada confirmação é um pressuposto, sem certificar documento ou declaração efectiva. Indique dois valores entre líquido, IVA e bruto; o terceiro é obtido por diferença ou soma, sem taxa de compra presumida.

+ + {error&&

{error}

} + + + {book.rows.map(row=>
{row.description||'Aquisição adicional'} — {row.period} — campo{row.field} +

Origem: {row.sourceMonth===null?'Introdução directa':`Plano, mês ${row.sourceMonth} (${row.sourcePeriod??'por indicar'}): ${row.sourceAmount??'sem informação'} ${row.sourceCurrency}`}. O mês da encomenda/orçamento não determina a data do documento ou a dedução. Alterações não substituem o resultado anterior.

+
+ + {row.sourceMonth===null && } + {select(row,'field','Categoria',[['08','08 — Imobilizado'],['09','09 — Existências'],['10','10 — Outros bens e serviços']])} + {select(row,'origin','Natureza dos dados',[['projected','Projectados / pressupostos'],['effective','Efectivos declarados']])} + + {row.sourceMonth!==null && } + {(['net','vat','gross'] as const).map((field,index)=>)} + {select(row,'documentType','Tipo de documento',[['invoice','Factura'],['equivalent','Documento equivalente']])} + + + + + {select(row,'domestic','Aquisição interna',yesNo)} + {select(row,'supplierRegistered','Fornecedor inscrito no IVA',yesNo)} + {select(row,'legalDocument','Documento emitido em forma legal',yesNo)} + {select(row,'held','Documento na posse do adquirente / previsto na projecção',yesNo)} + {select(row,'allocation','Afectação',[['taxable_only','Exclusiva a operações tributadas'],['mixed','Mista / parcial — fora deste lote'],['no_right','Operações sem direito à dedução']])} + {select(row,'exclusion','Exclusões de dedução',[['none','Sem exclusões ou casos especiais dos arts.18–20'],['excluded','Despesa excluída'],['special','Veículos, combustível, viagens, alojamento, comunicações, luxo ou outra situação especial — por enquadrar']])} + {select(row,'integrity','Operação real / pressuposto regular, sem simulação, margem de segunda mão ou impedimentos do art.18(3–5)',yesNo)} +
+

Fundamento: CIVA arts.18–21, fontes e versão no resultado. Não se calcula dedução parcial, excepção de despesa ou dedução posterior neste lote.

+ {row.sourceMonth===null && } + {row.sourceMonth!==null && } +
)} + {book.periods.map(period=>
{period.period} — cobertura das parcelas — {period.complete && period.absent.length===acquisitionExcludedFields.length?'confirmada':'por completar'} + +

Campos fora deste lote: assinale apenas quando não existiram as respectivas operações. Uma parcela não assinalada permanece indeterminada.

+ {acquisitionExcludedFields.map(field=>)} +
)} + +

O preenchimento e o resultado seguem a gravação privada do simulador. Os campos19–27 e a submissão à AT permanecem fora deste lote; 17/18 são diferenças antes de créditos anteriores, sem ordem de pagamento ou promessa de reembolso.

+ {book.result&&<>

{acquisitionCurrent(draft,book)?'Resultado correspondente às entradas guardadas.':'Entradas ou origem alteradas: resultado histórico preservado; actualizar o cálculo.'}

{acquisitionReportRows(draft).map(([,label,value,origin],i)=>
{label}
{value}{origin}
)}
} +
; +} diff --git a/resources/js/components/simulation-modelo-a.tsx b/resources/js/components/simulation-modelo-a.tsx index d8d0329d..3a5122a2 100644 --- a/resources/js/components/simulation-modelo-a.tsx +++ b/resources/js/components/simulation-modelo-a.tsx @@ -8,7 +8,7 @@ export function SimulationModeloA({draft}: {draft:Record}) { return

Modelo A — correspondência da simulação

{modeloAReference.status}

-

Os campos 14–18 do apuramento permanecem indeterminados. O IVA das vendas não é imposto final a pagar. Os dados deste percurso são projecções, separados de facturas e declarações efectivas.

+

Esta correspondência descreve a componente de vendas01/02. Consulte o bloco de compras e apuramento parcial para os campos08–10 e14–18, que só são determinados com as parcelas necessárias completas. O IVA das vendas não é imposto final a pagar.

Aquisições já projectadas — sem dedução presumida

Reutilizam-se os valores das compras/encomendas para existências do plano. O mês da encomenda não prova a data da factura, recepção ou pagamento. Valores declarados ainda sem indicação de base líquida/IVA incluído não são tratados como base tributável. IVA suportado e IVA dedutível continuam por determinar; zero de compras não prova inexistência de outras aquisições.

{error &&

{error}

} diff --git a/resources/js/components/simulation-monthly-iva.tsx b/resources/js/components/simulation-monthly-iva.tsx index 97d70532..db342fe0 100644 --- a/resources/js/components/simulation-monthly-iva.tsx +++ b/resources/js/components/simulation-monthly-iva.tsx @@ -4,6 +4,7 @@ import { monthlyIvaInput, monthlyIvaKey, monthlySalesFromDraft, readMonthlyIvaRe import { fiscalQaRows } from '@/lib/fiscal-qa-preview'; import { type ApiSimulationExecutionV1 } from '@/lib/simulation-contract'; import { SimulationModeloA } from './simulation-modelo-a'; +import { SimulationAcquisitions } from './simulation-acquisitions'; export function SimulationMonthlyIva({draft, busy, onCalculate, onChange}: { draft: Record; busy: boolean; @@ -83,6 +84,7 @@ export function SimulationMonthlyIva({draft, busy, onCalculate, onChange}: { {input &&

{input.monthly_sales.length} meses; moeda {input.currency || 'por indicar'}. Campo vazio significa informação em falta; zero declarado permanece zero. Depois da primeira execução, alterações das vendas actualizam o cálculo enquanto a actualização automática estiver ligada.

} {projection?.rows &&
{['Mês','Vendas declaradas','Vendas tributáveis sem IVA','Taxa aplicada (%)','IVA calculado','Total com IVA','Estado'].map((label) => )}{projection.rows.map((row) => )}
IVA mensal — {current ? 'versão correspondente às entradas' : 'versão histórica'}
{label}
{row.date.slice(0,7)}{row.sales_declared ?? 'Sem informação'}{row.net_sales ?? 'Indeterminado'}{row.rate ?? 'Indeterminada'}{row.vat ?? 'Indeterminado'}{row.gross_sales ?? 'Indeterminado'}{{calculated:'Calculado',missing_sales:'Sem informação de vendas',unsupported_basis:'Base líquida não determinada',indeterminate:'Enquadramento ou regra indeterminados'}[row.status] ?? 'Indeterminado'}
} {snapshot &&
Ver fundamento e relatório da versão guardada
{fiscalQaRows(snapshot).map(([label,value], index) =>
{label}
{value}
)}
} +
; } diff --git a/resources/js/lib/iva-acquisitions.ts b/resources/js/lib/iva-acquisitions.ts new file mode 100644 index 00000000..29bd7f6d --- /dev/null +++ b/resources/js/lib/iva-acquisitions.ts @@ -0,0 +1,182 @@ +import { modeloAPurchaseReferences } from './iva-modelo-a.ts'; +import { monthlyIvaInput, monthlyIvaKey, readMonthlyIvaRecord, readMonthlyIvaSettings } from './monthly-iva.ts'; +import { restoreBusinessPlanSnapshot } from './business-financial-plan.ts'; + +export const acquisitionVersion = 'modelo-a-internal-acquisitions/1'; +export const acquisitionBasis = 'CIVA arts.18(1)(a),18(2) (Lei10/2025),18(3–5),19(1)(a),19(2),20 (Lei22/2022),21(1–3); âmbito interno, afectação exclusiva, mesmo período, sem exclusões ou dedução parcial.'; +export const acquisitionSources = 'Modelo A DOCX 62c198e9 / v1 63d45fa8; VAT Return.pdf SHA256 9c0b99a810c7db53eb75d63c22ee22fb86a50ba57bd5509041ed80ee10f75741, p.1; CIVA republicado Lei13/2016, PDF14–16; Lei22/2022, art.20; Lei10/2025, arts.18/19, PDF13.'; +type Choice = '' | 'yes' | 'no'; +export type Acquisition = { + id: string; field: '08'|'09'|'10'; period: string; origin: 'projected'|'effective'; + sourceMonth: number|null; sourcePeriod?:string; sourceField?:'inventory'|'asset'|'operating'; sourceAmount: string|null; sourceCurrency: string; sourceBasis: ''|'net'|'gross'; + net: string; vat: string; gross: string; documentType: ''|'invoice'|'equivalent'; documentRef: string; documentDate: string; documentLine:string; + supplier: string; supplierRegistered: Choice; legalDocument: Choice; held: Choice; domestic: Choice; + allocation: ''|'taxable_only'|'mixed'|'no_right'; exclusion: ''|'none'|'excluded'|'special'; + integrity: Choice; description: string; +}; +export type AcquisitionResult = {id:string; net:string|null; vat:string|null; gross:string|null; deductible:string|null; reason:string}; +type PeriodInput = {period:string; complete:boolean; absent:string[]}; +export type AcquisitionBook = {currency:string; taxpayerRegistered?:Choice; rows:Acquisition[]; periods:PeriodInput[]; result?:AcquisitionCalculation}; +export type AcquisitionCalculation = {version:string; revision:number; calculatedAt:string; opportunity:string; location:string; currency:string; sourceKey:string; basis:string; sources:string; + declarations?:{taxpayerRegistered:Choice;periods:PeriodInput[]}; rows:AcquisitionResult[]; inputs:Acquisition[]; periods:Array<{period:string; fields:Record; reasons:string[]}>}; +type Store = {version:1; books:Record}; +const excluded = ['03','04','05','06','07','11','12','13']; +export const acquisitionExcludedFields = excluded; +export function acquisitionScope(draft:Record):string { + if(!draft.context_opportunity) { + try {const context=JSON.parse(String(draft.context_applicability_snapshot??''));if(context.opportunity_choices?.length>1)throw new Error('Escolha a oportunidade em tratamento antes de preparar as compras.');} + catch(cause) {if(cause instanceof Error && cause.message.startsWith('Escolha'))throw cause;} + } + return String(draft.context_opportunity || 'general'); +} +export function readAcquisitionStore(raw:unknown):Store { + if (!raw) return {version:1,books:{}}; + const value=JSON.parse(String(raw)); + if (value?.version!==1 || !value.books || typeof value.books!=='object' || Array.isArray(value.books)) throw new Error('Compras fiscais guardadas não recuperáveis; dados preservados.'); + for(const book of Object.values(value.books) as AcquisitionBook[]) { + if(!book || !Array.isArray(book.rows) || !Array.isArray(book.periods) || typeof book.currency!=='string') throw new Error('Formato de compras não recuperável; sem substituição.'); + const stringKeys=Object.keys(newAcquisition('','','')).filter(key=>!['sourceMonth','sourceAmount'].includes(key)); + if(book.rows.some(row=>!row || stringKeys.some(key=>typeof row[key as keyof Acquisition]!=='string') || !(row.sourceMonth===null || Number.isInteger(row.sourceMonth)) || !(row.sourceAmount===null || typeof row.sourceAmount==='string')) || book.periods.some(p=>!p || typeof p.period!=='string' || typeof p.complete!=='boolean' || !Array.isArray(p.absent) || p.absent.some(f=>typeof f!=='string'))) throw new Error('Linhas ou períodos de compras não recuperáveis; os dados guardados foram preservados.'); + } + return value; +} +export function acquisitionBook(draft:Record):AcquisitionBook { + return readAcquisitionStore(draft.modelo_a_snapshot).books[acquisitionScope(draft)] ?? {currency:String(draft.currency ?? ''),rows:[],periods:[]}; +} +export function saveAcquisitionBook(draft:Record,book:AcquisitionBook):string { + const store=readAcquisitionStore(draft.modelo_a_snapshot); + return JSON.stringify({...store,books:{...store.books,[acquisitionScope(draft)]:book}}); +} +export function newAcquisition(id:string,period:string,currency:string):Acquisition { + return {id,field:'09',period,origin:'projected',sourceMonth:null,sourceAmount:null,sourceCurrency:currency,sourceBasis:'',net:'',vat:'',gross:'',documentType:'',documentRef:'',documentDate:'',documentLine:'',supplier:'',supplierRegistered:'',legalDocument:'',held:'',domestic:'',allocation:'',exclusion:'',integrity:'',description:''}; +} +function periods(draft:Record):string[] { + try {return monthlyIvaInput(draft,readMonthlyIvaSettings(String(draft.monthly_iva_settings ?? ''))).monthly_sales.map(r=>r.date.slice(0,7));} + catch {return [];} +} +export function acquisitionPlanReferences(draft:Record):Array<{key:string;kind:'inventory'|'asset'|'operating';month:number;period:string;amount:string|null;currency:string;label:string}> { + const dates=periods(draft),plan=restoreBusinessPlanSnapshot(String(draft.business_plan_snapshot??'')); + if(!plan || !dates.length)return []; + if(plan.currency!==draft.currency)throw new Error('Moeda do plano divergente; não reutilizar como moeda do projecto.'); + const inventory=modeloAPurchaseReferences(draft).map(r=>({key:`inventory:${r.month}`,kind:'inventory' as const,month:r.month,period:dates[r.month-1],amount:r.declared,currency:plan.currency,label:`Compras/encomendas — mês ${r.month}`})); + const asset={key:'asset:1',kind:'asset' as const,month:1,period:dates[0],amount:plan.assetInvestment?.trim()||null,currency:plan.currency,label:'Orçamento de investimento em activos — período a confirmar'}; + const operating=dates.map((period,index)=>({key:`operating:${index+1}`,kind:'operating' as const,month:index+1,period,amount:(plan.monthlyOperatingExpensesByPeriod?plan.monthlyOperatingExpensesByPeriod[index]:plan.monthlyOperatingExpenses)?.trim()||null,currency:plan.currency,label:`Orçamento de despesas operacionais — mês ${index+1}`})); + return [...inventory,asset,...operating]; +} +export function reuseAcquisitions(draft:Record,book:AcquisitionBook):AcquisitionBook { + const dates=periods(draft); if(!dates.length) throw new Error('Defina o período mensal e resolva a moeda da projecção antes de reutilizar compras.'); + const rows=[...book.rows]; + for(const reference of modeloAPurchaseReferences(draft)) { + if(rows.some(r=>r.sourceMonth===reference.month)) continue; + rows.push({...newAcquisition(`plan-${reference.month}`,dates[reference.month-1],String(draft.currency ?? '')),sourceMonth:reference.month,sourcePeriod:dates[reference.month-1],sourceAmount:reference.declared,description:`Compras/encomendas do plano — mês ${reference.month}`}); + } + return {...book,rows,periods:dates.map(period=>book.periods.find(p=>p.period===period) ?? {period,complete:false,absent:[]})}; +} +// Decimal arithmetic for aggregation only. No binary rounding and no invented purchase tax rate. +function amount(raw:unknown):bigint|null { + if(typeof raw!=='string' || !/^\d{1,15}(\.\d{1,6})?$/.test(raw.trim())) return null; + const [a,b='']=raw.trim().split('.');return BigInt(a)*1000000n+BigInt(b.padEnd(6,'0')); +} +function money(value:bigint):string {const a=value/1000000n,b=(value%1000000n).toString().padStart(6,'0').replace(/0+$/,'').padEnd(2,'0');return `${a}.${b}`;} +function sum(values:Array):string|null {const parsed=values.map(amount);return parsed.some(v=>v===null)?null:money((parsed as bigint[]).reduce((a,b)=>a+b,0n));} +function dateValid(raw:string):boolean {const date=new Date(`${raw}T00:00:00Z`);return /^\d{4}-\d{2}-\d{2}$/.test(raw) && Number.isFinite(date.getTime()) && date.toISOString().slice(0,10)===raw;} +export function evaluateAcquisition(row:Acquisition,currency:string,taxpayerRegistered:Choice=''):AcquisitionResult { + let n=amount(row.net),v=amount(row.vat),g=amount(row.gross); + if(n!==null && v!==null && g===null && !row.gross.trim()) g=n+v; + if(g!==null && v!==null && n===null && !row.net.trim() && g>=v) n=g-v; + if(n!==null && g!==null && v===null && !row.vat.trim() && g>=n) v=g-n; + const result:AcquisitionResult={id:row.id,net:n===null?null:money(n),vat:v===null?null:money(v),gross:g===null?null:money(g),deductible:null,reason:''}; + const stop=(reason:string,deductible:string|null=null)=>({...result,reason,deductible}); + if(currency!=='MZN' || row.sourceCurrency!==currency) return stop('Divergência ou moeda fora de MZN; sem conversão.'); + if(!/^2026-(0[1-9]|1[0-2])$/.test(row.period)) return stop('Período fora do âmbito 2026 ou em falta.'); + if(n===null || v===null || g===null || n+v!==g) return stop('Indique dois valores válidos; líquido + IVA deve corresponder ao bruto.'); + if(row.sourceMonth!==null && (!row.sourceBasis || amount(row.sourceAmount)!==(row.sourceBasis==='net'?n:g))) return stop('Classifique ou resolva a divergência do valor de origem; não foi reinterpretado.'); + if(v===0n) return stop('IVA explicitamente indicado como zero; não existe imposto a deduzir nesta aquisição.','0.00'); + if(taxpayerRegistered!=='yes') return stop('Confirme o enquadramento do adquirente como sujeito passivo de IVA no regime normal; não é inferido da organização.'); + if(row.allocation==='no_right' || row.exclusion==='excluded' || row.supplierRegistered==='no' || row.legalDocument==='no' || row.integrity==='no') return stop('Sem dedução no âmbito declarado: afectação, exclusão, fornecedor ou documento não elegível.','0.00'); + if(row.domestic!=='yes') return stop('Aquisição interna por confirmar; importações fora deste lote.'); + if(row.allocation!=='taxable_only' || row.exclusion!=='none') return stop('Confirme afectação exclusiva a operações tributadas e ausência de exclusões; casos mistos/especiais não calculados.'); + if(!['invoice','equivalent'].includes(row.documentType) || !row.documentRef.trim() || !row.supplier.trim() || row.supplierRegistered!=='yes' || row.legalDocument!=='yes' || row.held!=='yes' || row.integrity!=='yes') return stop('Documento, fornecedor inscrito, posse e condições de dedução ainda incompletos.'); + if(!dateValid(row.documentDate) || row.documentDate.slice(0,7)!==row.period) return stop('Data do documento e período de dedução devem coincidir neste lote; dedução posterior não presumida.'); + return stop(row.origin==='projected'?'Dedução projectada sob pressupostos explícitos; não certifica factura ou declaração.':'Dedução segundo dados e condições declarados; sem submissão ou certificação pela AT.',money(v)); +} +function sourceKey(draft:Record,book:AcquisitionBook):string { + const raw=JSON.stringify([acquisitionScope(draft),draft.currency??'',draft.province_id??'',draft.district_id??'',draft.business_plan_snapshot,draft.monthly_iva_settings,draft.monthly_iva_snapshot,book.currency,book.taxpayerRegistered,book.rows,book.periods]); + // Change detection only, never an authorization or authenticity token. + let hash=14695981039346656037n;for(let i=0;i):string { + const labels=draft.selection_labels as Record|undefined; + return ['province_id','district_id'].filter(key=>draft[key]).map(key=>String(draft[`${key}_label`]??labels?.[key]??draft[key])).join(' / '); +} +export function acquisitionCurrent(draft:Record,book:AcquisitionBook):boolean {return !!book.result && book.result.version===acquisitionVersion && book.result.opportunity===acquisitionScope(draft) && book.result.sourceKey===sourceKey(draft,book);} +export function calculateAcquisitions(draft:Record,book:AcquisitionBook,now=new Date().toISOString()):AcquisitionCalculation { + const scope=acquisitionScope(draft),dates=periods(draft); + if(book.currency!=='MZN' || draft.currency!==book.currency) throw new Error('Resolva a moeda de origem das compras; valores preservados sem conversão.'); + if(!dates.length) throw new Error('Período de vendas por determinar.'); + if(new Set(book.rows.map(r=>r.id)).size!==book.rows.length) throw new Error('Existem compras com identidade repetida.'); + const documents=book.rows.filter(r=>r.documentRef.trim() && r.supplier.trim()).map(r=>JSON.stringify([r.origin,r.supplier.trim().toLowerCase(),r.documentRef.trim().toLowerCase(),r.documentDate,r.documentLine?.trim()??''])); + if(new Set(documents).size!==documents.length) throw new Error('Documento/linha repetido: discrimine linhas distintas ou remova a duplicação antes de deduzir.'); + if(book.rows.some(r=>!['08','09','10'].includes(r.field) || !dates.includes(r.period))) throw new Error('Classifique cada aquisição num campo08–10 e num período da projecção.'); + const references=acquisitionPlanReferences(draft); + for(const row of book.rows.filter(r=>r.sourceMonth!==null)) { + const current=references.find(p=>p.month===row.sourceMonth && p.kind===(row.sourceField??'inventory')); + if(!current || current.amount!==row.sourceAmount || (current.kind!=='asset' && row.sourcePeriod && current.period!==row.sourcePeriod)) throw new Error('As compras ou orçamentos do plano mudaram. Resolva a divergência de origem antes de calcular; histórico preservado.'); + } + const rows=book.rows.map(row=>evaluateAcquisition(row,book.currency,book.taxpayerRegistered)); + const record=readMonthlyIvaRecord(String(draft.monthly_iva_snapshot ?? '')); + let salesCurrent=false; + try {salesCurrent=!!record && record.execution.status==='completed' && monthlyIvaKey(record.input)===monthlyIvaKey(monthlyIvaInput(draft,readMonthlyIvaSettings(String(draft.monthly_iva_settings ?? ''))));} catch { /* Preserve history, never fabricate 01/02. */ } + const projection=record?.execution.result_snapshot?.monthly_projection as {rows?:Array<{date:string;net_sales:string|null;vat:string|null}>}|undefined; + const calculated=dates.map(period=>{ + const input=book.periods.find(p=>p.period===period), reasons:string[]=[], fields:Record={}; + const declaredAmount=(key:string)=>{const value=amount(String(draft[key]??''));return value!==null && value>0n;}; + if(input?.absent.includes('11') && (declaredAmount('imports') || book.rows.some(r=>r.period===period && r.domestic==='no'))) throw new Error('Existem importações declaradas. Não confirme ausência no campo11; enquadramento fora deste lote.'); + if(input?.absent.includes('07') && declaredAmount('sales_exempt')) throw new Error('Existem vendas isentas declaradas. Resolva o período e a classificação antes de confirmar ausência no campo07.'); + if(input?.absent.includes('05') && (declaredAmount('exports')||declaredAmount('sales_zero_rate'))) throw new Error('Existem exportações ou vendas de outro enquadramento. Não confirme ausência no campo05 sem resolver a classificação.'); + const sales=salesCurrent?projection?.rows?.find(r=>r.date.slice(0,7)===period):null; + fields['01']=sales?.net_sales??null;fields['02']=sales?.vat??null; + if(!sales || sales.net_sales===null || sales.vat===null) reasons.push('01/02: vendas ou IVA mensal em falta, execução incompleta ou desactualizada.'); + for(const field of excluded) fields[field]=input?.absent.includes(field)?'0.00':null; + for(const field of ['08','09','10']) { + const matching=book.rows.filter(r=>r.period===period && r.field===field); + fields[field]=input?.complete ? sum(matching.map(r=>rows.find(x=>x.id===r.id)!.deductible)) : null; + } + if(!input?.complete) reasons.push('Aquisições08–10: confirme que todas as compras do período foram incluídas, mesmo quando não existam.'); + for(const row of book.rows.filter(r=>r.period===period)) {const r=rows.find(x=>x.id===row.id)!;if(r.deductible===null) reasons.push(`${row.description||row.id}: ${r.reason}`);} + for(const field of excluded) if(fields[field]===null) reasons.push(`Campo${field}: fora deste lote, sem declaração expressa de inexistência de operações.`); + fields['14']=sum(['01','03','05','06','07'].map(f=>fields[f])); + fields['15']=sum(['08','09','10','11','12'].map(f=>fields[f])); + fields['16']=sum(['02','04','13'].map(f=>fields[f])); + const state=amount(fields['16']),taxpayer=amount(fields['15']); + fields['17']=state===null||taxpayer===null?null:money(state>taxpayer?state-taxpayer:0n); + fields['18']=state===null||taxpayer===null?null:money(taxpayer>state?taxpayer-state:0n); + return {period,fields,reasons}; + }); + return {version:acquisitionVersion,revision:(book.result?.revision??0)+1,calculatedAt:now,opportunity:scope,location:location(draft),currency:book.currency,sourceKey:sourceKey(draft,book),basis:acquisitionBasis,sources:acquisitionSources,declarations:{taxpayerRegistered:book.taxpayerRegistered??'',periods:structuredClone(book.periods)},rows,inputs:structuredClone(book.rows),periods:calculated}; +} +export function acquisitionReportRows(draft:Record):Array<[string,string,string,string]> { + if(!draft.modelo_a_snapshot) return []; + try { + const book=acquisitionBook(draft),result=book.result; + if(!result) return [['IVA mensal','Compras — Modelo A','Sem cálculo guardado para a oportunidade escolhida','Sem dedução presumida']]; + const context=`${result.currency}; oportunidade ${result.opportunity}; localização ${result.location || 'não indicada'}; ${result.version}; revisão ${result.revision}; ${result.calculatedAt}`; + const out:Array<[string,string,string,string]>=[['IVA mensal','Apuramento parcial Modelo A',acquisitionCurrent(draft,book)?'Versão correspondente às entradas':'Histórico desactualizado; não aplicar à projecção actual',context],['IVA mensal','Fundamento das aquisições',result.basis,result.sources]]; + for(const row of result.inputs) { + const r=result.rows.find(x=>x.id===row.id)!; + const source=row.sourceMonth===null?'Introduzido pelo utilizador':`Plano (${row.sourceField==='asset'?'orçamento de activos':row.sourceField==='operating'?'orçamento operacional':'compras/encomendas'}), mês ${row.sourceMonth}, ${row.sourcePeriod??'período de origem não indicado'}, ${row.sourceAmount??'valor em falta'} ${row.sourceCurrency}; ${row.sourceBasis==='net'?'sem IVA':row.sourceBasis==='gross'?'com IVA':'base por classificar'}`; + const allocation={taxable_only:'exclusiva a operações tributadas',mixed:'mista',no_right:'sem direito à dedução','':'por indicar'}[row.allocation]; + out.push(['IVA mensal',`Aquisição ${row.id} — campo${row.field} — ${row.period}`,`${row.description}; líquido ${r.net??'Indeterminado'}; IVA ${r.vat??'Indeterminado'}; bruto ${r.gross??'Indeterminado'}; dedutível ${r.deductible??'Indeterminado'}`,`${context}; ${row.origin==='projected'?'Projecção':'Dados efectivos declarados'}; ${source}; ${row.documentType==='invoice'?'Factura':row.documentType==='equivalent'?'Documento equivalente':'Documento por indicar'} ${row.documentRef}, ${row.documentDate}, linha ${row.documentLine||'única'}; fornecedor ${row.supplier}; afectação ${allocation}; ${r.reason}`]); + } + for(const period of result.periods) { + const entries=Object.entries(period.fields).sort(([a],[b])=>Number(a)-Number(b)); + const declaration=result.declarations?.periods.find(p=>p.period===period.period); + const declarationOrigin=declaration?`Aquisições08–10 ${declaration.complete?'declaradas completas':'por completar'}; ausência de operações expressamente declarada nos campos ${declaration.absent.join(', ')||'nenhum'}.`:'Declarações detalhadas não recuperáveis nesta versão histórica.'; + out.push(['IVA mensal',`Modelo A — ${period.period} — parcelas01–13`,entries.filter(([field])=>Number(field)<=13).map(([field,value])=>`${field}: ${value??'Indeterminado'}`).join('; '),`${context}; ${declarationOrigin}`]); + out.push(['IVA mensal',`Modelo A — ${period.period} — totais14–18`,entries.filter(([field])=>Number(field)>=14).map(([field,value])=>`${field}: ${value??'Indeterminado'}`).join('; '),context]); + if(period.reasons.length)out.push(['IVA mensal',`Modelo A — ${period.period} — pendências`,period.reasons.join(' '),result.sources]); + } + return out; + } catch {return [['IVA mensal','Compras — Modelo A','Não foi possível recuperar os dados guardados','Preservados, sem substituição por zero']];} +} diff --git a/resources/js/lib/iva-modelo-a.ts b/resources/js/lib/iva-modelo-a.ts index 0fb865e7..10b171b8 100644 --- a/resources/js/lib/iva-modelo-a.ts +++ b/resources/js/lib/iva-modelo-a.ts @@ -45,7 +45,7 @@ export function modeloAComponentRows(snapshot: Record): Array<[ return [ ['Correspondência Modelo A',modeloAReference.status], ['Campos01/02', 'Base líquida e IVA mensal da versão publicada. Os restantes campos não foram presumidos iguais a zero.'], - ['Apuramento do período — campos14–18', 'Indeterminado: faltam componentes e enquadramentos do Modelo A. IVA das vendas não é imposto final a pagar.'], + ['Apuramento nesta execução de vendas — campos14–18', 'Indeterminado nesta execução isolada de01/02. Consulte o bloco separado de aquisições e apuramento parcial, quando preenchido. IVA das vendas não é imposto final a pagar.'], ['Origem dos dados','Projecção do negócio; não são operações efectivas nem declaração fiscal.'], ['Exemplar de referência',`${modeloAReference.file}; SHA256 ${modeloAReference.sha256}. ${modeloAReference.edition}`], ]; diff --git a/resources/js/lib/project-dossier.ts b/resources/js/lib/project-dossier.ts index 2d911d59..475dc925 100644 --- a/resources/js/lib/project-dossier.ts +++ b/resources/js/lib/project-dossier.ts @@ -3,6 +3,7 @@ import { investmentFieldOrigin } from './context-inheritance.ts'; import { investmentLandPreparation } from './investment-land-preparation.ts'; import { monthlyIvaInput, monthlyIvaKey, readMonthlyIvaRecord, readMonthlyIvaSettings } from './monthly-iva.ts'; import { modeloAPurchaseReferences } from './iva-modelo-a.ts'; +import { acquisitionReportRows } from './iva-acquisitions.ts'; import { fiscalQaRows } from './fiscal-qa-preview.ts'; import { csvCellWithDelimiter } from './csv.js'; import { @@ -614,6 +615,7 @@ export function buildProjectDossierRows( 'Planeado/realizado declarado pelo utilizador', ]); } + rows.push(...acquisitionReportRows(draft)); if (draft.monthly_iva_snapshot) { const saved = readMonthlyIvaRecord(String(draft.monthly_iva_snapshot)); let current = false; diff --git a/tests/Feature/ModeloAAcquisitionsDraftTest.php b/tests/Feature/ModeloAAcquisitionsDraftTest.php new file mode 100644 index 00000000..d5795489 --- /dev/null +++ b/tests/Feature/ModeloAAcquisitionsDraftTest.php @@ -0,0 +1,69 @@ +assertSame('simulator_fiscal_delta_20261021_test', $identity->name); + $this->assertSame(55441, (int) $identity->port); + $this->actingAs(User::factory()->create(['email_verified_at' => now()])); + $path = getenv('IVA_ACQUISITION_UI_INPUT') ?: base_path('tests/frontend/fixtures/modelo-a-acquisitions.json'); + $draft = json_decode(file_get_contents($path), true, flags: JSON_THROW_ON_ERROR); + $draft['purpose'] = 'simulate_only'; + $created = $this->postJson('/api/v1/simulation-drafts', ['personal_snapshot' => [], 'economic_snapshot' => $draft], ['Idempotency-Key' => (string) Str::uuid()])->assertCreated(); + $recovered = $this->getJson('/api/v1/simulation-drafts/'.$created->json('data.id'))->assertOk()->json('data.economic_snapshot'); + $this->assertSame($draft['modelo_a_snapshot'], $recovered['modelo_a_snapshot']); + $this->assertSame($draft['context_opportunity'], $recovered['context_opportunity']); + if (getenv('IVA_ACQUISITION_UI_RECOVERED_OUT')) file_put_contents(getenv('IVA_ACQUISITION_UI_RECOVERED_OUT'), json_encode($recovered, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE)); + } + + public function test_calculated_acquisitions_round_trip_in_private_draft_and_other_owner_cannot_read(): void + { + $identity = DB::selectOne('select current_database() as name,inet_server_port() as port'); + $this->assertSame('simulator_fiscal_delta_20261021_test', $identity->name); + $this->assertSame(55441, (int) $identity->port); + config(['investor-path.enabled' => true, 'suitecrm.enabled' => false]); + $fingerprint = DB::selectOne("select md5(string_agg(row_to_json(r)::text,E'\\n' order by id)) as hash from simulation_tax_rule_versions r")->hash; + $actor = User::factory()->create(['email_verified_at' => now()]); + $this->actingAs($actor); + $draft = json_decode(file_get_contents(base_path('tests/frontend/fixtures/modelo-a-acquisitions.json')), true, flags: JSON_THROW_ON_ERROR); + $draft['purpose'] = 'simulate_only'; + $created = $this->postJson('/api/v1/simulation-drafts', ['personal_snapshot' => [], 'economic_snapshot' => $draft], ['Idempotency-Key' => (string) Str::uuid()])->assertCreated(); + $id = $created->json('data.id'); + $this->assertNotEmpty($id); + $saved = $this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk(); + $economic = $saved->json('data.economic_snapshot'); + $this->assertSame($draft['modelo_a_snapshot'], $economic['modelo_a_snapshot']); + $store = json_decode($economic['modelo_a_snapshot'], true, flags: JSON_THROW_ON_ERROR); + $first = $store['books']['opportunity:309']; + $this->assertSame('144.0048', $first['result']['periods'][0]['fields'][17]); + $store['books']['opportunity:310'] = $first; + $store['books']['opportunity:310']['rows'][0]['net'] = '200'; + $store['books']['opportunity:310']['rows'][0]['vat'] = '32'; + $economic['context_opportunity'] = 'opportunity:310'; + $economic['modelo_a_snapshot'] = json_encode($store, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE); + $this->putJson('/api/v1/simulation-drafts/'.$id, ['personal_snapshot' => [], 'economic_snapshot' => $economic], ['If-Match' => $saved->headers->get('ETag')])->assertOk(); + $recovered = $this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk()->json('data.economic_snapshot'); + $this->assertSame($economic['modelo_a_snapshot'], $recovered['modelo_a_snapshot']); + $this->assertSame($first, json_decode($recovered['modelo_a_snapshot'], true)['books']['opportunity:309']); + if (getenv('IVA_ACQUISITION_RECOVERED_OUT')) { + // The original calculated opportunity, recovered through the real private API, is the report source. + $economic['context_opportunity'] = 'opportunity:309'; + file_put_contents(getenv('IVA_ACQUISITION_RECOVERED_OUT'), json_encode($economic, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE)); + } + $this->actingAs(User::factory()->create(['email_verified_at' => now()])); + $this->getJson('/api/v1/simulation-drafts/'.$id)->assertNotFound(); + $this->assertSame($fingerprint, DB::selectOne("select md5(string_agg(row_to_json(r)::text,E'\\n' order by id)) as hash from simulation_tax_rule_versions r")->hash); + } +} diff --git a/tests/frontend/fixtures/modelo-a-acquisitions.json b/tests/frontend/fixtures/modelo-a-acquisitions.json new file mode 100644 index 00000000..1c0c64d6 --- /dev/null +++ b/tests/frontend/fixtures/modelo-a-acquisitions.json @@ -0,0 +1,15 @@ +{ + "project_title": "SYNTHETIC QA — aquisições e apuramento parcial Modelo A", + "currency": "MZN", + "context_opportunity": "opportunity:309", + "context_applicability_snapshot": "{\"version\":1,\"context_revision\":13,\"consumer_opportunity\":\"opportunity:309\",\"opportunity_choices\":[{\"opportunity\":{\"key\":\"opportunity:309\",\"title\":\"SYNTHETIC QA — segunda oportunidade Manica\"}}],\"path\":{\"steps\":[]}}", + "business_plan_snapshot": "{\"version\":17,\"plan\":{\"openingCash\":\"0\",\"monthlyCollections\":\"0\",\"monthlyVariableCostPayments\":\"0\",\"monthlyInventoryPurchases\":\"0\",\"monthlyOperatingExpenses\":\"0\",\"monthlyOperatingPayments\":\"0\",\"monthlyPayrollExpense\":\"0\",\"monthlyPayrollPayments\":\"0\",\"assetInvestment\":\"0\",\"inventory\":\"0\",\"receivables\":\"0\",\"payables\":\"0\",\"equity\":\"0\",\"shareholderLoans\":\"0\",\"bankLoanProceeds\":\"0\",\"grants\":\"0\",\"assetDepreciation\":\"0\",\"monthlyInterestExpense\":\"0\",\"monthlyInterestPayment\":\"0\",\"monthlyPrincipalRepayment\":\"0\",\"currency\":\"MZN\",\"periods\":4,\"depreciationLifeMonths\":60,\"products\":[{\"label\":\"SYNTHETIC QA\",\"monthlyUnits\":\"1\",\"unitPrice\":\"1000.03\",\"unitVariableCost\":\"0\",\"monthlyUnitsByPeriod\":[\"1\",\"2\",\"0\",\"\"]}],\"inventoryPurchaseLeadMonths\":0,\"inventoryPurchaseSchedule\":null,\"useInventoryPurchaseSchedule\":false,\"useProductInventorySchedule\":false,\"useSupplierPaymentTerms\":false,\"monthlyVariableCostPaymentsByPeriod\":null,\"salesCollectionLagMonths\":null,\"salesCollectionPercent\":\"100\",\"openingReceivablesCollectionMonth\":null,\"openingReceivablesCollectionPercent\":\"100\",\"openingReceivablesInstallments\":[],\"openingPayablesInstallments\":[],\"salesRecoverySchedule\":[]}}", + "monthly_iva_settings": "{\"start\":\"2026-01\",\"basis\":\"net\",\"declared\":true,\"auto\":false}", + "monthly_iva_snapshot": "{\"input\":{\"scenario_kind\":\"fiscal_rule_published\",\"monthly_sales\":[{\"date\":\"2026-01-01\",\"amount\":\"1000.03\"},{\"date\":\"2026-02-01\",\"amount\":\"2000.06\"},{\"date\":\"2026-03-01\",\"amount\":\"0.00\"},{\"date\":\"2026-04-01\",\"amount\":null}],\"sales_vat_basis\":\"net\",\"currency\":\"MZN\",\"scope_declared\":true},\"execution\":{\"id\":\"06566910-9672-4176-804d-aad8350417cb\",\"status\":\"completed\",\"version_no\":2,\"result_snapshot\":{\"contract_version\":1,\"scenario_kind\":\"fiscal_rule_published\",\"base\":null,\"currency\":\"MZN\",\"indicative_total\":null,\"legal_interpretation\":false,\"formula_version\":\"investmoz.tax.v1\",\"context\":{\"reference_date\":\"2026-01-01\",\"currency\":\"MZN\",\"currency_fraction_digits\":2,\"scenario_id\":\"61000100-0000-4000-8000-000000000099\",\"scenario_version\":1,\"engine_version\":\"fiscal-published-v1\",\"ruleset_version\":\"IVA-GERAL-BASE-LIQUIDA:4\"},\"result\":{\"status\":\"indeterminate\",\"value\":null,\"unit\":\"MZN\",\"explanation\":\"IVA das vendas projectadas; sem apuramento final.\",\"missing_inputs\":[\"monthly_sales\"],\"source_ids\":[\"synthetic-qa-source\"]},\"presentation\":{\"value\":null,\"rounding_applied\":false},\"fiscal_provenance\":{\"rule\":{\"rule_code\":\"IVA-GERAL-BASE-LIQUIDA\",\"rule_version\":4,\"valid_from\":\"2023-01-01\",\"valid_until\":null,\"source_sha256\":\"synthetic-qa-source-hash\",\"source\":{\"diploma\":\"Fonte sintética QA — regra já ensaiada\",\"article\":\"Cópia do snapshot aceite\"}},\"scope_status\":\"user_declared\"},\"monthly_projection\":{\"input\":{\"scenario_kind\":\"fiscal_rule_published\",\"monthly_sales\":[{\"date\":\"2026-01-01\",\"amount\":\"1000.03\"},{\"date\":\"2026-02-01\",\"amount\":\"2000.06\"},{\"date\":\"2026-03-01\",\"amount\":\"0.00\"},{\"date\":\"2026-04-01\",\"amount\":null}],\"sales_vat_basis\":\"net\",\"currency\":\"MZN\",\"scope_declared\":true},\"rows\":[{\"date\":\"2026-01-01\",\"sales_declared\":\"1000.03\",\"net_sales\":\"1000.03\",\"rate\":\"16\",\"vat\":\"160.0048\",\"gross_sales\":\"1160.0348\",\"status\":\"calculated\"},{\"date\":\"2026-02-01\",\"sales_declared\":\"2000.06\",\"net_sales\":\"2000.06\",\"rate\":\"16\",\"vat\":\"320.0096\",\"gross_sales\":\"2320.0696\",\"status\":\"calculated\"},{\"date\":\"2026-03-01\",\"sales_declared\":\"0.00\",\"net_sales\":\"0.00\",\"rate\":\"16\",\"vat\":\"0\",\"gross_sales\":\"0\",\"status\":\"calculated\"},{\"date\":\"2026-04-01\",\"sales_declared\":null,\"net_sales\":null,\"rate\":null,\"vat\":null,\"gross_sales\":null,\"status\":\"missing_sales\"}],\"cash_treatment\":\"IVA separado da tesouraria; não é imposto final a pagar.\"}}}}", + "province_id": "cf5e81f1-ffbc-535d-b1b6-b44b445c4421", + "district_id": "", + "selection_labels": { + "province_id": "Manica" + }, + "modelo_a_snapshot": "{\"version\":1,\"books\":{\"opportunity:309\":{\"currency\":\"MZN\",\"taxpayerRegistered\":\"yes\",\"rows\":[{\"id\":\"qa-inventory\",\"field\":\"09\",\"period\":\"2026-01\",\"origin\":\"projected\",\"sourceMonth\":null,\"sourceAmount\":null,\"sourceCurrency\":\"MZN\",\"sourceBasis\":\"\",\"net\":\"100\",\"vat\":\"16\",\"gross\":\"116\",\"documentType\":\"invoice\",\"documentRef\":\"SYNTHETIC QA 001\",\"documentDate\":\"2026-01-10\",\"documentLine\":\"\",\"supplier\":\"SYNTHETIC QA supplier\",\"supplierRegistered\":\"yes\",\"legalDocument\":\"yes\",\"held\":\"yes\",\"domestic\":\"yes\",\"allocation\":\"taxable_only\",\"exclusion\":\"none\",\"integrity\":\"yes\",\"description\":\"SYNTHETIC QA existências\"}],\"periods\":[{\"period\":\"2026-01\",\"complete\":true,\"absent\":[\"03\",\"04\",\"05\",\"06\",\"07\",\"11\",\"12\",\"13\"]},{\"period\":\"2026-02\",\"complete\":true,\"absent\":[\"03\",\"04\",\"05\",\"06\",\"07\",\"11\",\"12\",\"13\"]},{\"period\":\"2026-03\",\"complete\":true,\"absent\":[\"03\",\"04\",\"05\",\"06\",\"07\",\"11\",\"12\",\"13\"]},{\"period\":\"2026-04\",\"complete\":true,\"absent\":[\"03\",\"04\",\"05\",\"06\",\"07\",\"11\",\"12\",\"13\"]}],\"result\":{\"version\":\"modelo-a-internal-acquisitions/1\",\"revision\":1,\"calculatedAt\":\"2026-10-24T12:00:00.000Z\",\"opportunity\":\"opportunity:309\",\"location\":\"Manica\",\"currency\":\"MZN\",\"sourceKey\":\"5009:840f2acff1252a8e\",\"basis\":\"CIVA arts.18(1)(a),18(2) (Lei10/2025),18(3–5),19(1)(a),19(2),20 (Lei22/2022),21(1–3); âmbito interno, afectação exclusiva, mesmo período, sem exclusões ou dedução parcial.\",\"sources\":\"Modelo A DOCX 62c198e9 / v1 63d45fa8; VAT Return.pdf SHA256 9c0b99a810c7db53eb75d63c22ee22fb86a50ba57bd5509041ed80ee10f75741, p.1; CIVA republicado Lei13/2016, PDF14–16; Lei22/2022, art.20; Lei10/2025, arts.18/19, PDF13.\",\"declarations\":{\"taxpayerRegistered\":\"yes\",\"periods\":[{\"period\":\"2026-01\",\"complete\":true,\"absent\":[\"03\",\"04\",\"05\",\"06\",\"07\",\"11\",\"12\",\"13\"]},{\"period\":\"2026-02\",\"complete\":true,\"absent\":[\"03\",\"04\",\"05\",\"06\",\"07\",\"11\",\"12\",\"13\"]},{\"period\":\"2026-03\",\"complete\":true,\"absent\":[\"03\",\"04\",\"05\",\"06\",\"07\",\"11\",\"12\",\"13\"]},{\"period\":\"2026-04\",\"complete\":true,\"absent\":[\"03\",\"04\",\"05\",\"06\",\"07\",\"11\",\"12\",\"13\"]}]},\"rows\":[{\"id\":\"qa-inventory\",\"net\":\"100.00\",\"vat\":\"16.00\",\"gross\":\"116.00\",\"deductible\":\"16.00\",\"reason\":\"Dedução projectada sob pressupostos explícitos; não certifica factura ou declaração.\"}],\"inputs\":[{\"id\":\"qa-inventory\",\"field\":\"09\",\"period\":\"2026-01\",\"origin\":\"projected\",\"sourceMonth\":null,\"sourceAmount\":null,\"sourceCurrency\":\"MZN\",\"sourceBasis\":\"\",\"net\":\"100\",\"vat\":\"16\",\"gross\":\"116\",\"documentType\":\"invoice\",\"documentRef\":\"SYNTHETIC QA 001\",\"documentDate\":\"2026-01-10\",\"documentLine\":\"\",\"supplier\":\"SYNTHETIC QA supplier\",\"supplierRegistered\":\"yes\",\"legalDocument\":\"yes\",\"held\":\"yes\",\"domestic\":\"yes\",\"allocation\":\"taxable_only\",\"exclusion\":\"none\",\"integrity\":\"yes\",\"description\":\"SYNTHETIC QA existências\"}],\"periods\":[{\"period\":\"2026-01\",\"fields\":{\"10\":\"0.00\",\"11\":\"0.00\",\"12\":\"0.00\",\"13\":\"0.00\",\"14\":\"1000.03\",\"15\":\"16.00\",\"16\":\"160.0048\",\"17\":\"144.0048\",\"18\":\"0.00\",\"01\":\"1000.03\",\"02\":\"160.0048\",\"03\":\"0.00\",\"04\":\"0.00\",\"05\":\"0.00\",\"06\":\"0.00\",\"07\":\"0.00\",\"08\":\"0.00\",\"09\":\"16.00\"},\"reasons\":[]},{\"period\":\"2026-02\",\"fields\":{\"10\":\"0.00\",\"11\":\"0.00\",\"12\":\"0.00\",\"13\":\"0.00\",\"14\":\"2000.06\",\"15\":\"0.00\",\"16\":\"320.0096\",\"17\":\"320.0096\",\"18\":\"0.00\",\"01\":\"2000.06\",\"02\":\"320.0096\",\"03\":\"0.00\",\"04\":\"0.00\",\"05\":\"0.00\",\"06\":\"0.00\",\"07\":\"0.00\",\"08\":\"0.00\",\"09\":\"0.00\"},\"reasons\":[]},{\"period\":\"2026-03\",\"fields\":{\"10\":\"0.00\",\"11\":\"0.00\",\"12\":\"0.00\",\"13\":\"0.00\",\"14\":\"0.00\",\"15\":\"0.00\",\"16\":\"0.00\",\"17\":\"0.00\",\"18\":\"0.00\",\"01\":\"0.00\",\"02\":\"0\",\"03\":\"0.00\",\"04\":\"0.00\",\"05\":\"0.00\",\"06\":\"0.00\",\"07\":\"0.00\",\"08\":\"0.00\",\"09\":\"0.00\"},\"reasons\":[]},{\"period\":\"2026-04\",\"fields\":{\"10\":\"0.00\",\"11\":\"0.00\",\"12\":\"0.00\",\"13\":\"0.00\",\"14\":null,\"15\":\"0.00\",\"16\":null,\"17\":null,\"18\":null,\"01\":null,\"02\":null,\"03\":\"0.00\",\"04\":\"0.00\",\"05\":\"0.00\",\"06\":\"0.00\",\"07\":\"0.00\",\"08\":\"0.00\",\"09\":\"0.00\"},\"reasons\":[\"01/02: vendas ou IVA mensal em falta, execução incompleta ou desactualizada.\"]}]}}}}" +} \ No newline at end of file diff --git a/tests/frontend/iva-acquisitions.test.mjs b/tests/frontend/iva-acquisitions.test.mjs new file mode 100644 index 00000000..e106377d --- /dev/null +++ b/tests/frontend/iva-acquisitions.test.mjs @@ -0,0 +1,78 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import fs from 'node:fs'; +import {closureFixture} from './fixtures/simulator-closure-fixture.mjs'; +import {acquisitionBook,acquisitionCurrent,acquisitionExcludedFields,acquisitionPlanReferences,acquisitionReportRows,calculateAcquisitions,evaluateAcquisition,newAcquisition,reuseAcquisitions,saveAcquisitionBook} from '../../resources/js/lib/iva-acquisitions.ts'; +import {createProjectDossierReport} from '../../resources/js/lib/project-dossier-report.ts'; +import {serializeBusinessPlanSnapshot,restoreBusinessPlanSnapshot} from '../../resources/js/lib/business-financial-plan.ts'; + +export function acquisitionsFixture(){ + const draft=closureFixture().draft; + draft.project_title='SYNTHETIC QA — aquisições e apuramento parcial Modelo A'; + draft.province_id='cf5e81f1-ffbc-535d-b1b6-b44b445c4421';draft.district_id='';draft.selection_labels={province_id:'Manica'}; + const book={currency:'MZN',taxpayerRegistered:'yes',rows:[{...newAcquisition('qa-inventory','2026-01','MZN'),net:'100',vat:'16',gross:'116',documentType:'invoice',documentRef:'SYNTHETIC QA 001',documentDate:'2026-01-10',supplier:'SYNTHETIC QA supplier',supplierRegistered:'yes',legalDocument:'yes',held:'yes',domestic:'yes',allocation:'taxable_only',exclusion:'none',integrity:'yes',description:'SYNTHETIC QA existências'}],periods:['2026-01','2026-02','2026-03','2026-04'].map(period=>({period,complete:true,absent:[...acquisitionExcludedFields]}))}; + return {draft,book}; +} +test('a recorded purchase does not establish VAT, legal document or deduction',()=>{ + const row=newAcquisition('a','2026-01','MZN');row.net='100'; + assert.equal(evaluateAcquisition(row,'MZN','yes').deductible,null); + row.vat='16';let r=evaluateAcquisition(row,'MZN','yes');assert.equal(r.gross,'116.00');assert.equal(r.deductible,null); + row.gross='117';assert.match(evaluateAcquisition(row,'MZN','yes').reason,/corresponder/); +}); +test('eligibility handles exclusions, mixed use, document, supplier, date and currency without inventing rules',()=>{ + const row=acquisitionsFixture().book.rows[0]; + assert.equal(evaluateAcquisition(row,'MZN').deductible,null); + assert.equal(evaluateAcquisition(row,'MZN','yes').deductible,'16.00'); + for(const patch of [{documentRef:''},{supplierRegistered:''},{held:''},{allocation:'mixed'},{exclusion:'special'},{documentDate:'2026-02-10'},{documentDate:'2026-99-10'},{domestic:'no'},{sourceCurrency:'USD'}]) assert.equal(evaluateAcquisition({...row,...patch},'MZN','yes').deductible,null,JSON.stringify(patch)); + for(const patch of [{supplierRegistered:'no'},{allocation:'no_right'},{exclusion:'excluded'},{integrity:'no'}]) assert.equal(evaluateAcquisition({...row,...patch},'MZN','yes').deductible,'0.00'); + assert.equal(evaluateAcquisition({...row,origin:'effective'},'MZN','yes').deductible,'16.00'); + assert.equal(evaluateAcquisition({...row,net:'100',vat:'0',gross:'100',documentRef:''},'MZN','yes').deductible,'0.00'); +}); +test('duplicates, ambiguous opportunity and absent declarations are not silently accepted',()=>{ + const {draft,book}=acquisitionsFixture(); + book.rows.push({...book.rows[0],id:'duplicate'});assert.throws(()=>calculateAcquisitions(draft,book),/repetido/); + assert.throws(()=>acquisitionBook({...draft,context_opportunity:'',context_applicability_snapshot:JSON.stringify({opportunity_choices:[{},{}]})}),/Escolha a oportunidade/); + const missing=acquisitionsFixture();missing.book.periods[0].absent=[];missing.book.result=calculateAcquisitions(missing.draft,missing.book);missing.draft.modelo_a_snapshot=saveAcquisitionBook(missing.draft,missing.book); + assert.match(JSON.stringify(acquisitionReportRows(missing.draft)),/nenhum/); + assert.equal(missing.book.result.periods[0].fields['17'],null); +}); +test('08–10, formulas14–18, decimal precision, missing parcels and explicit absence',()=>{ + const {draft,book}=acquisitionsFixture(); + book.rows.push({...book.rows[0],id:'asset',field:'08',documentLine:'2',net:'200',vat:'32',gross:'232'},{...book.rows[0],id:'service',field:'10',documentLine:'3',net:'50',vat:'8',gross:'58'}); + const result=calculateAcquisitions(draft,book);const f=result.periods[0].fields; + assert.equal(f['08'],'32.00');assert.equal(f['09'],'16.00');assert.equal(f['10'],'8.00');assert.equal(f['14'],'1000.03');assert.equal(f['15'],'56.00');assert.equal(f['16'],'160.0048');assert.equal(f['17'],'104.0048');assert.equal(f['18'],'0.00'); + assert.equal(result.periods[2].fields['17'],'0.00');assert.equal(result.periods[3].fields['17'],null); + book.periods[0].absent=[];const incomplete=calculateAcquisitions(draft,book).periods[0];for(const field of ['14','15','16','17','18'])assert.equal(incomplete.fields[field],null); + book.periods[0].absent=[...acquisitionExcludedFields];book.periods[0].complete=false;assert.equal(calculateAcquisitions(draft,book).periods[0].fields['15'],null); + const credit=acquisitionsFixture();credit.book.rows[0]={...credit.book.rows[0],net:'2000',vat:'320',gross:'2320'};assert.equal(calculateAcquisitions(credit.draft,credit.book).periods[0].fields['18'],'159.9952'); + assert.throws(()=>calculateAcquisitions({...draft,imports:'5'},book),/importa/); +}); +test('reuse keeps source values unclassified, preserves deliberate changes and detects source drift',()=>{ + const {draft}=acquisitionsFixture();let book=reuseAcquisitions(draft,acquisitionBook(draft));assert.equal(book.rows[0].sourceAmount,'0.00');assert.equal(book.rows[0].net,'');assert.equal(book.rows[0].sourceBasis,''); + book.rows[0].net='123';book=reuseAcquisitions(draft,book);assert.equal(book.rows[0].net,'123');assert.equal(book.rows.length,4); + const plan=restoreBusinessPlanSnapshot(draft.business_plan_snapshot);plan.monthlyInventoryPurchases='1';const changed={...draft,business_plan_snapshot:serializeBusinessPlanSnapshot(plan)};assert.throws(()=>calculateAcquisitions(changed,book),/plano mudaram/); +}); +test('asset and operating budgets can be reused explicitly without becoming VAT or deductions',()=>{ + const {draft,book}=acquisitionsFixture();const plan=restoreBusinessPlanSnapshot(draft.business_plan_snapshot);plan.assetInvestment='200';plan.monthlyOperatingExpenses='50';draft.business_plan_snapshot=serializeBusinessPlanSnapshot(plan); + const refs=acquisitionPlanReferences(draft);assert.equal(refs.find(r=>r.kind==='asset').amount,'200');assert.equal(refs.find(r=>r.key==='operating:1').amount,'50'); + const row={...newAcquisition('asset-reference','2026-01','MZN'),field:'08',sourceField:'asset',sourceMonth:1,sourceAmount:'200',sourceBasis:'net',net:'200'};book.rows=[row];assert.equal(calculateAcquisitions(draft,book).rows[0].deductible,null); + row.vat='32';assert.equal(calculateAcquisitions(draft,book).rows[0].deductible,null); + assert.equal(calculateAcquisitions(draft,book).rows[0].gross,'232.00'); +}); +test('order month is retained as origin and never forces invoice or deduction month',()=>{ + const {draft}=acquisitionsFixture();const plan=restoreBusinessPlanSnapshot(draft.business_plan_snapshot);plan.useInventoryPurchaseSchedule=true;plan.inventoryPurchaseSchedule=[{amount:'100',leadMonths:0},{amount:'0',leadMonths:0},{amount:'0',leadMonths:0},{amount:'0',leadMonths:0}];draft.business_plan_snapshot=serializeBusinessPlanSnapshot(plan); + let book=reuseAcquisitions(draft,acquisitionBook(draft));book.taxpayerRegistered='yes';book.periods=book.periods.map(p=>({...p,complete:true,absent:[...acquisitionExcludedFields]})); + book.rows=book.rows.map(row=>({...row,net:row.sourceAmount,vat:'0',sourceBasis:'net'})); + book.rows[0]={...book.rows[0],...acquisitionsFixture().book.rows[0],id:'plan-1',sourceMonth:1,sourcePeriod:'2026-01',sourceAmount:'100.00',sourceBasis:'net',period:'2026-02',documentDate:'2026-02-10'}; + const result=calculateAcquisitions(draft,book);assert.equal(result.rows[0].deductible,'16.00');assert.equal(result.periods[0].fields['09'],'0.00');assert.equal(result.periods[1].fields['09'],'16.00');assert.equal(result.inputs[0].sourcePeriod,'2026-01'); +}); +test('second opportunity changes preserve first book, frozen results and report context after recovery',()=>{ + const {draft,book}=acquisitionsFixture();draft.context_opportunity='opportunity:1';book.result=calculateAcquisitions(draft,book);draft.modelo_a_snapshot=saveAcquisitionBook(draft,book);const first=JSON.stringify(acquisitionBook(draft)); + draft.context_opportunity='opportunity:309';assert.equal(acquisitionBook(draft).rows.length,0);const second=acquisitionsFixture().book;second.rows[0].vat='32';second.rows[0].net='200';second.rows[0].gross='232';second.result=calculateAcquisitions(draft,second);draft.modelo_a_snapshot=saveAcquisitionBook(draft,second); + const recovered=JSON.parse(JSON.stringify(draft));assert.equal(acquisitionCurrent(recovered,acquisitionBook(recovered)),true);assert.equal(acquisitionBook(recovered).result.periods[0].fields['17'],'128.0048'); + assert.equal(JSON.stringify(acquisitionBook({...draft,context_opportunity:'opportunity:1'})),first); + const report=JSON.stringify(createProjectDossierReport(recovered,{selectedSections:new Set(['finance'])}));assert.match(report,/128\.0048/);assert.match(report,/opportunity:309/);assert.doesNotMatch(report,/opportunity:1;/); + const old=JSON.stringify(second.result);second.rows[0].vat='33';draft.modelo_a_snapshot=saveAcquisitionBook(draft,second);assert.equal(acquisitionCurrent(draft,second),false);assert.equal(JSON.stringify(second.result),old);assert.match(JSON.stringify(acquisitionReportRows(draft)),/Histórico desactualizado/); + assert.throws(()=>acquisitionBook({modelo_a_snapshot:'broken'})); +}); +if(process.env.IVA_ACQUISITION_FIXTURE_OUT){const {draft,book}=acquisitionsFixture();book.result=calculateAcquisitions(draft,book,'2026-10-24T12:00:00.000Z');draft.modelo_a_snapshot=saveAcquisitionBook(draft,book);fs.writeFileSync(process.env.IVA_ACQUISITION_FIXTURE_OUT,JSON.stringify(draft,null,2));}