@@ -0,0 +1,75 @@
|
||||
# Revisão de relações, projectos e catálogos
|
||||
|
||||
Data: 04/10/2026. Revisão feita por leitura da base activa e do código de importação; nenhum registo foi alterado nesta revisão.
|
||||
|
||||
## Decisões localizadas
|
||||
|
||||
- **Relações corredor–cluster (20), cluster–projecto (13) e corredor–projecto (17):** manter as 50 relações em `pending`, `association_type=potential`, sem datas de vigência, fonte específica, evidência ou revisores. O campo `source_system=upgrade-v4` e as secções do documento de programação registam de onde veio o mapa, mas não provam cada relação nem a sua natureza oficial, proximidade ou influência. Não aprovar em massa. Não exigir certificador externo: a validação pode ser feita por revisor interno independente quando houver referência documental suficiente.
|
||||
- **Efeito na pesquisa:** a pesquisa oficial de relações continua a incluir apenas relações validadas e vigentes. Assim, os 50 vínculos candidatos não aparecem como ligações oficiais. Os catálogos e fichas de corredor, cluster e projecto continuam acessíveis; esta pendência não bloqueia o portal.
|
||||
- **Projectos âncora (15):** a fonte registada é `upgrade do portal de investimentos v4 programacao.docx — 6.1 / 6.6`; o código identifica a importação `upgrade-v4`. Os 15 registos `projects` estão em `draft`; os campos de orçamento e calendário estão vazios. Não foi localizada uma fonte primária individual, aprovação do promotor, actualização de estado ou base documental para afirmar execução, disponibilidade ou concurso. A ficha deve permanecer referência exploratória e explicitar estado não confirmado.
|
||||
- **Zonas:** a base activa tem 0 zonas publicadas e 0 fontes jurídicas validadas/vigentes. Por isso, não há uma zona real que possa ser seleccionada como prova de publicação. O fluxo de cadastro, fonte, revisão, publicação e pesquisa foi exercitado na base isolada com fixtures sintéticas e URLs `example.test`; isso prova o fluxo técnico, não uma zona real nem fundamento legal.
|
||||
- **Oportunidades:** existem 6 registos publicados, criados pelo `OpportunitySeeder`; todos têm `last_validated_at` vazio. São conteúdo de seed sem referência documental registada e não foram confirmados como oportunidades reais autorizadas. O catálogo e filtros foram verificados sem os transformar em ofertas confirmadas. Não foi iniciada pretensão sobre esses registos. O catálogo de negócios existentes tem 0 anúncios publicados, logo não há activo real autorizado para ensaiar.
|
||||
|
||||
## Revisão das 20 relações corredor–cluster
|
||||
|
||||
Todas as linhas abaixo têm `source_system=upgrade-v4`, `validation_status=pending`, `association_type=potential`, `source_reference=NULL`, `evidence_reference=NULL`, `valid_from=NULL`, `valid_until=NULL`, `editor_id=NULL` e `validator_id=NULL`. A correspondência está registada na matriz de importação da secção 4.3.4 do documento de programação indicado pelo seeder; não há citação individual de página/documento oficial ou evidência que permita elevar o tipo para `official`.
|
||||
|
||||
| Corredor | Cluster | Resultado da revisão |
|
||||
|---|---|---|
|
||||
| COR-02 Corredor da Beira e Centro | CLU-01 Agro-indústria e segurança alimentar | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-02 Corredor da Beira e Centro | CLU-02 Energia e industrialização | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-02 Corredor da Beira e Centro | CLU-03 Logística, corredores e exportação | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-02 Corredor da Beira e Centro | CLU-05 Têxtil, vestuário e algodão | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-01 Corredor de Nacala e Norte | CLU-01 Agro-indústria e segurança alimentar | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-01 Corredor de Nacala e Norte | CLU-02 Energia e industrialização | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-01 Corredor de Nacala e Norte | CLU-03 Logística, corredores e exportação | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-01 Corredor de Nacala e Norte | CLU-06 Mineração e transformação mineral | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-01 Corredor de Nacala e Norte | CLU-04 Turismo costeiro e economia azul | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-06 Corredor Industrial Nacional Norte–Sul | CLU-02 Energia e industrialização | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-06 Corredor Industrial Nacional Norte–Sul | CLU-03 Logística, corredores e exportação | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-06 Corredor Industrial Nacional Norte–Sul | CLU-07 Tecnologia e serviços digitais | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-04 Corredor Maputo–Limpopo | CLU-01 Agro-indústria e segurança alimentar | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-04 Corredor Maputo–Limpopo | CLU-03 Logística, corredores e exportação | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-05 Corredor Turístico Inhambane–Bazaruto | CLU-07 Tecnologia e serviços digitais | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-05 Corredor Turístico Inhambane–Bazaruto | CLU-04 Turismo costeiro e economia azul | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-03 Corredor Zambeze–Macuse | CLU-01 Agro-indústria e segurança alimentar | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-03 Corredor Zambeze–Macuse | CLU-02 Energia e industrialização | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-03 Corredor Zambeze–Macuse | CLU-03 Logística, corredores e exportação | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
| COR-03 Corredor Zambeze–Macuse | CLU-06 Mineração e transformação mineral | Mapeamento de planeamento registado; relação factual por confirmar. |
|
||||
|
||||
Os outros 30 vínculos (`cluster_projects`: 13; `corridor_projects`: 17) têm os mesmos campos de validação e prova vazios. A sua lista exacta é reproduzível em `InvestmentPortfolioSeeder`: as âncoras são extraídas dos campos `anchors` do JSON de importação e das matrizes de COR-01 a COR-06. Não foi localizada evidência individual; nenhum deles foi validado.
|
||||
|
||||
## Projectos âncora — estado documental observado
|
||||
|
||||
| Código | Projecto | Estado de execução | Orçamento/calendário | Fonte e decisão |
|
||||
|---|---|---|---|---|
|
||||
| A01 | MozParks – 20 Parques Industriais | draft | vazio | Fonte genérica do documento de programação, secções 6.1/6.6; situação operacional não confirmada. |
|
||||
| A02 | Linha Ferroviária Norte–Sul | draft | vazio | Idem; fonte primária individual por confirmar. |
|
||||
| A03 | Programa de Desenvolvimento Integrado do Corredor de Nacala | draft | vazio | Idem; financiamento, calendário e execução por confirmar. |
|
||||
| A04 | Crusse Jamali – Zona Económica Especial de Turismo | draft | vazio | Idem; estatuto da zona e disponibilidade por confirmar. |
|
||||
| A05 | Linha de Transmissão Namialo–Metoro (400 kV) | draft | vazio | Idem; fonte e calendário por confirmar. |
|
||||
| A06 | Cadeia de Valor do Arroz por Projecto de Processamento | draft | vazio | Idem; promotor e projecto executável por confirmar. |
|
||||
| A07 | Parque Têxtil Integrado | draft | vazio | Idem; estatuto, infra-estruturas e disponibilidade por confirmar. |
|
||||
| A08 | Zona Económica Especial de Mocuba | draft | vazio | Idem; diploma, operador e condições por confirmar. |
|
||||
| A09 | Construção da Cidadela Parlamentar de Mocuba | draft | vazio | Idem; entidade, projecto e calendário por confirmar. |
|
||||
| A10 | Mphanda Nkuwa HPP – Hidroeléctrica | draft | vazio | Idem; fase, fonte individual e calendário por confirmar. |
|
||||
| A11 | Corredor Ferroviário e Portuário de Macuse–Moatize | draft | vazio | Idem; fase, financiamento e calendário por confirmar. |
|
||||
| A12 | Programa de Conectividade e Resiliência Costeira (Compacto II) | draft | vazio | Idem; designação/fase e fonte primária por confirmar. |
|
||||
| A13 | Vilanculos – Região Integrada de Turismo | draft | vazio | Idem; promotor, estatuto e disponibilidade por confirmar. |
|
||||
| A14 | Zona Económica Especial de Agronegócio do Limpopo | draft | vazio | Idem; diploma, operador e condições por confirmar. |
|
||||
| A15 | Regadio na Bacia Hidrográfica do Rio Maputo | draft | vazio | Idem; entidade, calendário e disponibilidade por confirmar. |
|
||||
|
||||
## Ensaios e evidências
|
||||
|
||||
- `php artisan test --testsuite=Feature --filter='InvestmentPortfolioTest|InvestmentStructureTest|InvestmentZoneTest'`: 20/20 testes, 353 asserções, base isolada. Inclui início autenticado de manifestação privada associada a dossier, propriedade/isolamento, idempotência e percurso de fonte/revisão/publicação/pesquisa de zona com fixtures sintéticas.
|
||||
- `php artisan test`: execução completa na base isolada; ver resultado final registado no relatório de reparação.
|
||||
- Restauro verificado em `investmoz_restore_verify_20261004`, sem tocar na base original: 134 tabelas, 20 relações `corridor_clusters`; a ausência de `validation_status` é esperada porque o backup foi feito antes da migration aditiva.
|
||||
- Browser: [filtros e barreira de autenticação do catálogo](pilot/authorized-opportunity-filter-browser-2026-10-04.json). Seis cartões; filtro `Nampula` devolveu 1, filtro `agronegocio` devolveu 1, detalhe HTTP 200 e início de manifestação direccionado para login quando anónimo; sem erros JavaScript. Os cartões observados são seeds, não confirmação de ofertas autorizadas.
|
||||
|
||||
## Pendências concretas
|
||||
|
||||
1. Revisor interno designado e fonte/evidência individual para cada um dos 50 vínculos, com datas de vigência aplicáveis; decidir se cada vínculo é `official`, `influence`, `proximity`, `potential`, `historical` ou se deve ser retirado. Até lá, permanecem pendentes e não aparecem como relações oficiais.
|
||||
2. Fonte primária e estado actual para cada um dos 15 projectos âncora; decisão humana de publicação/actualização após confronto documental. Nenhum estado de concurso é inferido.
|
||||
3. Para zonas, fornecer fonte legal validada e registo real autorizado para ensaio visual de ponta a ponta. O fluxo sintético prova implementação técnica, não conteúdo real.
|
||||
4. Para investimentos, substituir ou validar os seis registos de seed; fornecer ao menos uma oportunidade e um anúncio de negócio autorizados, com fonte e data, antes de ensaiar uma pretensão real. O fluxo de submissão foi coberto por fixtures na suite, sem criar dados reais.
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
# Auditoria de conclusão dos pedidos InvestMoz — 2026-10-04
|
||||
|
||||
## Resultado
|
||||
|
||||
**Estado geral: parcialmente concluído; não declarar “tudo concluído”.** A revisão reconciliou os prompts sequenciais e o prompt master com o repositório actual, executou novamente verificações técnicas e corrigiu duas descrições SuiteCRM obsoletas. As calculadoras financeiras educativas, fluxo de rascunhos consentido, governação de regras parametrizadas, pedidos de assistência DUAT e controlos de formulários têm implementação e evidência automatizada. Permanecem gates legais, operacionais e de revisão humana que não podem ser fechados por código ou por pressuposição.
|
||||
|
||||
Este relatório é um índice de estado actual; prevalece sobre afirmações históricas contraditórias nos registos datados. Não apaga os registos antigos nem altera dados ou configuração de produção.
|
||||
|
||||
## Reconciliação por grupos de pedidos
|
||||
|
||||
| Grupo | Estado técnico actual | Pendência que impede conclusão |
|
||||
| --- | --- | --- |
|
||||
| Diagnóstico integral da aplicação e inventário de funcionalidades | Parcial; documentação/matriz consolidada existe | Rever manualmente todas as páginas e validar com perfis reais. Integrações e comportamentos não comprovados pelo código continuam “a validar”. |
|
||||
| Migrações, PostgreSQL/PostGIS, segurança e QA | Parcial/concluído tecnicamente em componentes | Suite foi repetida em cluster descartável; o incidente histórico em `investmoz_test:5432` carece de comparação/restauro validado por DBA. Não executar operações destrutivas nessa base. |
|
||||
| Geografia e formulários de investimento/oportunidades | Implementação extensa e testes presentes | Confirmar catálogo territorial e conteúdo com fonte de negócio, percorrer browser/dispositivos e validar permissões operacionais. |
|
||||
| Projectos, estruturas de investimento, carteira e catálogo | Parcial | Aprovação institucional dos dados, contratos de submissão e percurso completo de investimento real não demonstrados. Não há processamento/custódia de investimento financeiro confirmado. |
|
||||
| Portal público de manifestações e CRM local | Recepção e conversão local idempotentes com consentimento | Fluxo é local. Processamento externo, sincronização e reconciliação não activos. |
|
||||
| SuiteCRM | Cliente API OAuth implementado e desligado por defeito; testes simulados; catálogo lógico/matriz com 15 colunas criado em `suitecrm/mapping-catalog.md` | Docker/Podman ausentes e WSL não instalado; a release SuiteCRM 8.10.x consultada só lista PHP 8.2–8.4, enquanto o projecto exige PHP 8.5. Instalação, campos, RBAC, workers, reconciliação, segurança e operação aguardam runtime compatível/homologação. `SUITECRM_ENABLED=false` deve manter-se. |
|
||||
| Simulador financeiro, plano e tesouraria | Calculadoras independentes implementadas e cobertas por testes | Validação contabilística/institucional e teste de utilizadores. Estimativas não são ofertas de crédito ou aconselhamento. |
|
||||
| Motor fiscal e reforma 2026 | DSL/governação e resolvedor técnicos parciais; componentes legais permanecem indeterminadas | Texto oficial consolidado, anexos, vigência, fundamentos, parâmetros aprovados e casos dourados assinados por Fiscalista. Não activar taxas nem declarar apuramento. |
|
||||
| IVA e rectificação da Lei 13/2016 | Investigação documental parcial; cópia local do BR 89/2017 tem proveniência incompleta; digitalização rectificada não foi lida com fiabilidade | Confirmar autenticidade, texto integral dos anexos corrigidos, vigência e consolidação em fonte oficial. Nenhuma regra decorrente foi activada. |
|
||||
| Incentivos, ISPC, IRPS/IRPC, INSS, retenções, ICE e pauta aduaneira | Estrutura permite manter resultados indeterminados | Validação legal por regime/período, fontes oficiais integrais, elegibilidade/classificação e aprovação profissional. |
|
||||
| Educação e catálogo de serviços | Funcionalidade implementada parcialmente e testes existentes | Aprovação institucional dos cursos, prestadores, reconhecimento e correspondência a emprego. |
|
||||
| Importação/revisão de dados e oportunidades | Revisões documentais e staging existentes; alguns registos foram deixados privados | Resolver duplicados, moedas e autoridade de origem com os responsáveis; não publicar dados incertos. |
|
||||
| Dados pessoais/PII | Revisão e controlos de snapshots, consentimento e minimização existentes | Confirmar finalidade, retenção, acesso, eliminação, bases legais e transferência com encarregado/jurídico; revisão completa de ficheiros de entrada. |
|
||||
| Formulário e acompanhamento de assistência fundiária/DUAT | Fluxo e testes implementados | Não substitui pedido ou decisão oficial. Rever base legal, documentos, acesso, retenção, integração externa e percursos com equipa responsável. |
|
||||
| Acessibilidade e experiência | Testes unitários, browser/visual e validações responsivas registadas para alguns percursos | Teste presencial com teclado, leitor de ecrã, dispositivos e utilizadores; rever mensagens, erros, carregamento e todos os percursos. |
|
||||
| Entrega/produção | Não concluído | Sem autorização de publicação, integração real, migração ou activação. Requer revisão humana e plano de operação/rollback. |
|
||||
|
||||
## Verificações executadas nesta revisão
|
||||
|
||||
- `php artisan test --filter='InterestSubmissionTest|CrmIntakeTest|SuiteCrmClientTest'`: **28 testes, 155 asserções, passou** em PostgreSQL/PostGIS descartável, `127.0.0.1:55441`.
|
||||
- `node --test tests/frontend/*.test.mjs`: **124/124 passou**.
|
||||
- `npm.cmd run types:check`: terminou com código 0.
|
||||
- Browser QA no Edge headless, `tools/simulator-a11y-browser.mjs`: passou em 390/768/1024/1440 px, sem overflow, controles sem rótulo, foco inválido, alerta visível, erro JS ou falha API; resposta do GET confirmou `investmoz_test:55441`. Artefacto: `simulations/simulator-a11y-browser-2026-10-04.json`. É smoke automatizado, não substitui teste manual com leitor de ecrã/utilizadores.
|
||||
- A suite PHP completa foi iniciada com PHP 8.5.11 contra o alvo QA isolado `55441`; resultado final ainda será acrescentado após a conclusão do processo.
|
||||
- `composer run types:check` (PHPStan): passou, 0 erros. `npm.cmd run types:check`: código 0. `git diff --check` nos três documentos desta revisão: sem erros.
|
||||
- `php vendor/bin/pint --test`: não passou por três ficheiros já alterados no worktree (`database/migrations/2026_09_28_160000_investment_primary_territory.php`, `tools/simulator-qa-router.php`, `tools/test-mne-integrity.php`); não os reformatei por não serem necessários a esta auditoria.
|
||||
- O cluster QA PostgreSQL foi encerrado com `pg_ctl`; o comando confirmou `no server running` depois do encerramento.
|
||||
- Nenhum `.env` foi lido. Nenhuma alteração foi feita na base operacional `5432`, em produção ou em serviço externo.
|
||||
|
||||
## Correcções documentais feitas
|
||||
|
||||
- `docs/investmoz/suitecrm/architecture.md`: corrigida afirmação antiga de que não existia cliente SuiteCRM; agora regista cliente presente, desligado por defeito e sem instalação/tráfego real.
|
||||
- `docs/investmoz/suitecrm/architecture.md`: já descreve a idempotência real da manifestação pública — chave UUID opcional, hash, comparação do payload canónico, recibo/outbox transaccionais, replay e conflito — baseada em `InterestSubmission` e `InterestSubmissionTest`.
|
||||
- `docs/investmoz/suitecrm/mapping-catalog.md`: entregue como etapa técnica segura seguinte. Documenta sete fluxos, a matriz com 15 colunas, autoridade por sistema, consentimento, minimização, identificadores e critérios de homologação. Não inventa nomes de atributos nem inicia sincronização.
|
||||
- Verificação de texto: removido o carácter de controlo acidental no caminho do cliente SuiteCRM; scan dos dois documentos confirmou zero caracteres de controlo e `git diff --check` passou.
|
||||
- Pré-condição SuiteCRM confirmada em 2026-10-04: Docker e Podman não estão instalados; `wsl --status` informa que WSL não está instalado. A [matriz oficial SuiteCRM](https://docs.suitecrm.com/8.x/admin/compatibility-matrix/) lista PHP 8.2–8.4 para 8.10.x; por isso, não iniciei a instalação em PHP 8.5 nem alterei o sistema operativo.
|
||||
|
||||
## Sequência de fecho
|
||||
|
||||
1. Fechar a suite PHP completa em QA descartável e registar a evidência.
|
||||
2. Reconciliar os resultados contra este índice e os gates por etapa; tratar inconsistências documentais sem apagar histórico.
|
||||
3. Corrigir apenas pendências técnicas seguras e reproduzíveis, na ordem de dependências.
|
||||
4. Encaminhar blocos legais, institucionais, dados e acessibilidade para validação humana; manter componentes afectadas desactivadas/indeterminadas até aprovação registada.
|
||||
5. Só depois da aceitação dos gates, preparar uma decisão separada de publicação. Este documento não é aprovação de produção.
|
||||
|
||||
## Gate proposto
|
||||
|
||||
**PARCIAL / NO-GO para activação pública fiscal, sincronização SuiteCRM e produção.** A evidência automatizada demonstra qualidade técnica em partes do sistema; não demonstra aprovação legal, fiscal, de dados, produto, operação ou acessibilidade.
|
||||
@@ -0,0 +1,225 @@
|
||||
# Matriz consolidada de revisão e execução InvestMoz
|
||||
|
||||
Data: 2026-10-03. Âmbito: prompt master recebido em `Pasted text.txt`, documentos acessíveis na pasta de prompts indicada e estado verificado do repositório. Este é um diagnóstico vivo; “parcial” e “não verificado” não equivalem a aceite. Nenhuma alteração de dados operacionais, publicação ou activação externa foi feita nesta fase.
|
||||
|
||||
## Estado inicial e ambiente
|
||||
|
||||
| Item | Evidência observada |
|
||||
| --- | --- |
|
||||
| Branch / commit | `main` / `4f35313d06ccd597a4ebf9ed043964d898c95813` |
|
||||
| Árvore de trabalho | 50 ficheiros rastreados modificados, muitos não rastreados; cerca de 7.748 inserções e 1.053 remoções rastreadas. Estado anterior preservado, sem reset ou limpeza. |
|
||||
| Runtime | PHP 8.5.11, Composer 2.8.12, Node 24.20.0, npm 11.19.0. Laravel 13.30.1, Inertia Laravel 3.3.3, React 19.2.8, TypeScript 5.9.3, Vite 8.2.2, PHPUnit 12.5.34. |
|
||||
| Dados | Configuração local aponta PostgreSQL em `127.0.0.1:5432`; listener activo. O harness PHPUnit usa PostgreSQL/PostGIS na porta 55441 e allowlist de bases QA. Não foi executada suite PHP nesta linha de base por não haver serviço QA 55441 disponível e por não ser seguro apontar testes com `RefreshDatabase` à instância local activa. |
|
||||
| API / CI | Rotas web e `api/v1`; contratos em `api/openapi.yaml` e contratos por domínio em `docs/investmoz/**`. Workflow `.github/workflows/tests.yml` configura PHP 8.5, Node 24 e serviço PostGIS 17-3.5. |
|
||||
| Documentos pedidos | Prompt master recebido como anexo e `Prompt master para revisão do potal.docx`, documentos em `Formularios` e `por executar`, e relatório PII estão acessíveis. Não localizei `revisao-prompts-investmoz.md` nem `prototipo-portal-v2_1.html` no caminho pesquisado. A falta desses caminhos não prova ausência de funcionalidades. |
|
||||
|
||||
## Matriz única
|
||||
|
||||
Estados: **implementado e verificado**, **parcial**, **não implementado**, **não verificado**, **bloqueado**, **substituído por decisão documentada**.
|
||||
|
||||
| ID / origem | Requisito e aceite verificável | Implementação / evidência actual | Estado / lacuna | Dependências / prioridade | Próxima alteração ou teste / validação pendente |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| M-01 §1–3, master | Preservar autorização, tecnologia, trabalho existente e limites de publicação/dados. | Branch e commit registados; Laravel 13 + React/Inertia/TS + PostgreSQL/PostGIS confirmados; diff preexistente mantido. | Implementado e verificado no procedimento desta revisão. | Transversal / crítica. | Continuar a executar mudanças reversíveis; nenhuma publicação ou integração real sem configuração e autorização específicas. |
|
||||
| M-02 §2, master | Reconciliar documentos e caminhos sem inferir ausência funcional. | Prompt master, directórios `Formularios`/`por executar`, relatório PII e docs internos localizados. Revisão consolidada Markdown e protótipo HTML não localizados no caminho pesquisado. | Parcial. | Inventário documental / alta. | Extrair conteúdo/hash dos DOCX relevantes por lote e mapear requisitos aos IDs; confirmar se os dois artefactos ausentes existem noutra pasta. |
|
||||
| M-03 §4 e §13, master | Inventariar e manter matriz completa, sequencial e persistente. | Esta matriz e o ledger `simulator-evolution-progress.md`; rotas, testes, migrations, CI e OpenAPI localizados. | Parcial. | Todas as etapas / crítica. | Expandir matriz com requisitos atómicos e referências de parágrafo/tabela dos DOCX; actualizar estado após cada etapa. |
|
||||
| M-04 §5, master | Resolver conflitos documentais sem executar prompts/DDL literalmente. | Decisões reconciliadas em `docs/investmoz/simulations/current-status-2026-10-03.md`, `fiscal-reform-2026-review.md`, `official-source-register.md`, docs GIS e existing-business. | Parcial. | Evidência e decisões do utilizador / alta. | Confirmar precedência documental por domínio e registar decisão quando versões de formulário divergem. |
|
||||
| M-05 §6 e §14, master | Validar segurança, relações, rascunhos, concorrência, permissões, exposição, erros, pesquisa e UX. | Policies, migrations, formulários, testes de concorrência e fluxo de rascunhos; relatórios browser em alguns domínios. | Parcial; cobertura transversal não verificada. | Acesso QA, critérios por domínio / crítica. | Testes negativos de autorização, erros, pesquisa/paginação, concorrência e acessibilidade para cada fluxo antes de aceite. |
|
||||
| D-01 §7, master | Dados mestres territoriais consistentes, acessíveis e pesquisáveis. | `PublicGeographyController`, `TerritorialRegistry`, migrations/seeder e `docs/investmoz/gis`; teste frontend limpa descendentes quando ascendente muda. | Parcial. | Fontes oficiais, integridade hierárquica / alta. | Confirmar cobertura de países/CAE/localidades, pesquisa sem acentos, pertença servidor e reconciliação de importação sem fusão fuzzy automática. |
|
||||
| D-02 §8, master | Projectos, clusters, corredores, parques, ZEE/ZFI e PII com fonte, relação e revisão. | Controllers e rotas para projectos/clusters/zonas; documentos de zonas e baseline; relatório PII DOCX inventariado em `pii-extraction-review-2026-10-03.md`. | Parcial. Corredores/parques e importação rastreável do PII precisam de auditoria funcional específica. | Origem, aprovação editorial, relações versionadas / alta. | 174 linhas de projecto inventariadas com tabelas de origem; um título repetido e uma tabela com moeda USD/MZN ambígua. Staging CSV aguarda reconciliação do duplicado/moeda e validação responsável/localização; sem publicar projectos previstos como oportunidades. |
|
||||
| D-03 §9, master | Catálogo consistente e formulários curtos, condicionais, retomáveis, com dados públicos separados e submissão não publica automaticamente. | Catálogo público, intake de empresas existentes, formulários de investidor/simulador e rascunhos; `docs/investmoz/existing-business/**`. | Parcial. Upload seguro/quarentena e reconciliação completa mapa/lista/contagens não verificados. | RBAC, armazenamento privado, política antimalware / crítica. | Fazer threat review e testes de formato/tamanho/autorização/revogação; anexos pendentes não devem ser distribuídos. |
|
||||
| D-04 §10, master | CRM interno com interesses, contactos, responsáveis, tarefas, consentimento e acompanhamento; SuiteCRM por API suportada. | `CrmController`, modelos/rotas management, consentimento e documentação `docs/investmoz/suitecrm/**`; testes de intake e cliente. | Parcial. Mandatos, diligência, propostas versionadas, fecho e integração real não verificados ou ausentes. | Papéis, consentimento, configuração SuiteCRM / alta. | Cobrir revogação e isolamento por organização; manter CRM interno distinto; não activar SuiteCRM nem tratar aceite como transacção concluída. |
|
||||
| D-05 §11, master | Fontes legais versionadas; simulador com pressupostos e histórico; cálculo fiscal apenas com fontes/regras aprovadas. | Governança de regras, contratos, snapshots, fontes arquivadas e testes; `current-status-2026-10-03.md` mantém cálculo fiscal público bloqueado. | Parcial; cálculo fiscal bloqueado. | Fiscalista, diplomas integrais e parâmetros vigentes / crítica. | Manter indeterminação; não activar taxas/benefícios; validar alterações por período e cenários financeiros independentes. |
|
||||
| D-06 §12, master | Educação baseada em evidência, sem certificação/contratação automática; assistência com fontes autorizadas e revisão. | Controllers/páginas/testes Educação; AiGateway e controles internos documentados. | Parcial. Cobertura de correspondência oferta/procura e revalidação das fontes precisa aceite funcional. | Dados autorizados, moderação humana / média-alta. | Auditar permissões, fonte e decisão humana; não introduzir modelo generativo nem recomendação automática sem gate. |
|
||||
| D-07 §13, master | Executar sequência dependente sem parar após plano; guardar estado e bloqueios por módulo. | Etapas documentadas em gates 9–11 e ledger; várias etapas já parcialmente executadas. | Parcial. | Matriz + validação por módulo / alta. | Continuar com segurança/integridade e módulos independentes enquanto gates legal/external ficam bloqueados. |
|
||||
| M-08 §14–15, master | Verificações reproduzíveis, comparação com base, sem alegar sucesso global. | CI existe; evidências PHP 231/231. Nesta linha: frontend 99/99, TypeScript passou e build passou; PHPStan 0 erros. Pint e `vp check` globais mantêm achados descritos abaixo. | Parcial. A cobertura manual com leitor de ecrã permanece em falta. | QA PostGIS isolado / crítica. | Corrigir lint legado/ledger sem reescrita não autorizada; completar validação assistiva manual. |
|
||||
| M-09 §16, master | Relatório final com evidência, reconciliação, rollback e prontidão por módulo. | Matriz inicial criada; runbooks e status parciais por domínio. | Parcial. | Conclusão das etapas / média. | Actualizar tabela e prontidão no fecho de cada tranche; não declarar lançamento integral antes de gates. |
|
||||
| C-01 regra de conflito, master | Não fabricar coordenadas; manter lista para não georreferenciados. | Fluxos de coordenadas e mapas existentes; documentação GIS prevê revisão de localização. | Não verificado ponta a ponta. | Fonte espacial validada / alta. | Teste de oportunidade sem coordenadas na lista e não inclusão no mapa; verificar contagens. |
|
||||
| C-02 regra de conflito, master | Distinguir CRM interno de SuiteCRM e domínios de projecto/dossier/oportunidade/negócio/território. | Rotas, modelos e contratos separados; SuiteCRM tem cliente/outbox documentados. | Parcial. | Dicionário canónico / alta. | Rever imports, conversões e UI para impedir associação/tipo implícito indevido. |
|
||||
| C-03 regra de conflito, master | Aprovações próprias de cada domínio; não aplicar DDL histórico se estrutura equivalente existir. | Gates de domínio, migrations incrementais e documentação de esquema existentes. | Parcial. | Mapeamento migrations/modelos/gates / alta. | Validar cada migration contra schema real QA e manter as migrations executadas imutáveis. |
|
||||
| V-01 relatório PII + §8 master | Extrair investimento, período, moeda, fase, responsáveis e localização com origem verificável. | DOCX identificado por SHA-256 e estruturalmente lido; resumo em `pii-extraction-review-2026-10-03.md`; nenhuma importação executada. | Parcial; estrutura e contagens verificadas, conteúdo substancial não validado. | Confirmar duplicado, moeda da tabela 19, responsável, estado e topónimos / alta. | Produzir staging rastreável apenas depois da revisão humana; sem publicar como oportunidade. |
|
||||
| V-02 §9 master | Upload/download protegido: MIME real, tamanho, classe, storage privado, ACL, antimalware e histórico. | `PortalServicesController::upload` passou a gravar em `quarantined/internal`; o catálogo e `resource()` só aceitam `active/public`; teste actualizado cobre bloqueio e fluxo de documento previamente revisto. | Parcial; a quarentena segura foi corrigida, scanner/fluxo de revisão autorizado não existe/verificado. | Configuração de storage/scanner e perfis / crítica. | Manter novos anexos indisponíveis até scanner + revisão autorizada; teste de integração pendente por falta de PostgreSQL QA activo. |
|
||||
| V-03 §10 master | Consentimento revogável e acompanhamento sem custódia/pagamentos. | Rotas CRM e retirada de consentimento de divulgação do proponente; sem evidência neste inventário de custódia/pagamento. | Parcial. | Política de consentimento, estado de negociação / alta. | Cobrir revogação com acesso posterior negado e auditoria sem PII; manter pagamentos fora do âmbito. |
|
||||
| V-04 §11 master + reforma 2026 | Separar períodos fiscais históricos e novos, distinguir crédito de caixa, sem residência inferida por nacionalidade/dias. | Testes frontend de intake fiscal e ponte financeira; status fiscal indeterminado sem regra aprovada. | Parcial; regras legais bloqueadas. | Diploma integral, aprovação fiscal e testes de fronteira / crítica. | Manter estados indeterminados e testar antes/depois de vigência somente quando regra oficial estiver aprovada. |
|
||||
| V-05 §12 master | Educação e IA apenas com dados autorizados, fontes revalidadas e revisão humana. | Educação e AI gateway com controle de feature; testes locais existem. | Parcial; activação externa não verificada. | Dados e configuração, avaliação humana / alta. | Testar feature desligada, ACL e fontes revogadas; integração permanece desactivada até configuração/autorização. |
|
||||
| B-01 baseline 2026-10-03 | Checks seguros disponíveis sem alterar dados operacionais. | Nesta extensão: frontend `node --test tests/frontend/*.test.mjs` 99/99; TypeScript passou; build 2.388 módulos; formatter/lint dirigidos passaram. Última suite PHP global permanece 231/231, 2.299 assertions. `composer run lint:check` global falhou em cinco ficheiros anteriores à tranche; `npm.cmd run check` global falhou ao ler o ledger histórico. | Parcial. | QA isolado para novas alterações backend e aceitação final / alta. | Corrigir causa do ledger binário por migração de formato separada; manter histórico append-only. Corrigir lint global em tranche identificada. |
|
||||
|
||||
## Reconciliação de versões e conflitos
|
||||
|
||||
| Conflito | Decisão baseada no pedido e evidência actual | Consequência |
|
||||
| --- | --- | --- |
|
||||
| Coordenada obrigatória vs localização por validar | Não inventar coordenada; lista continua disponível. | Publicação no mapa requer evidência geográfica validada. |
|
||||
| CRM vs SuiteCRM | CRM interno é domínio próprio; SuiteCRM é integração por mecanismo suportado. | Sem escrita directa na BD SuiteCRM; manter integração desligada até configuração e teste. |
|
||||
| Projecto previsto vs oportunidade disponível | São entidades e estados editoriais distintos. | Investimento do PII não entra automaticamente no catálogo público. |
|
||||
| Benefício/regra fiscal em resumo secundário vs diploma oficial | Somente fonte primária vigente e aprovação formal permitem regra executável. | Cenário público mantém indeterminação quando falta fonte/aprovação. |
|
||||
| Propostas DDL históricas vs esquema já evoluído | Reconciliar pela estrutura actual e migrations incrementais; não executar DDL literalmente nem editar migration aplicada. | Qualquer divergência requer teste de schema em QA antes da alteração. |
|
||||
|
||||
## Linha de base e evidências
|
||||
|
||||
| Comando executado | Resultado |
|
||||
| --- | --- |
|
||||
| `git branch --show-current; git rev-parse HEAD; git status --short` | `main`, commit acima; diff preexistente preservado. |
|
||||
| `php artisan route:list --json` com PHP 8.5.11 | Sucesso; rotas públicas, autenticadas e management listadas. |
|
||||
| `composer show --no-interaction --direct` | Sucesso; versões do backend confirmadas. |
|
||||
| `npm.cmd --version; npm.cmd ls --depth=0 --json` | npm 11.19.0; dependências directas listadas. |
|
||||
| `node --test tests/frontend/*.test.mjs` | 98 aprovados, 0 falhas. |
|
||||
| `npm.cmd run types:check` | Passou, `tsc --noEmit`. |
|
||||
| `composer run types:check --no-interaction` | Passou, PHPStan: 0 erros. |
|
||||
| `composer run lint:check --no-interaction` | Falhou em cinco ficheiros: migration territorial de 28/09, `routes/investment-zones.php`, `routes/web.php`, `tests/Feature/ApiContractTest.php`, `tools/test-mne-integrity.php`. Não alterados nesta tranche. |
|
||||
| `npm.cmd run check` | Falhou antes da análise porque `docs/investmoz/simulator-evolution-progress.md` não pode ser lido pelo formatador (ficheiro binário/inacessível). Nenhuma opção `--fix` executada. |
|
||||
| `php vendor/bin/phpunit --configuration=phpunit.xml --filter PortalServicesTest --do-not-cache-result` | 5/5 testes, 191 assertions; passou na base QA `investmoz_browser_e2e_test`, porta 55441.
|
||||
| `php vendor/bin/phpunit --configuration=phpunit.xml --do-not-cache-result` | 231/231 testes, 2.299 assertions; passou em 71,593 s na mesma base QA isolada. |
|
||||
| Build Vite | 2.388 módulos compilados com sucesso nesta revisão. |
|
||||
| `npm.cmd run build` | Passou nesta revisão; 2.388 módulos. Aviso não bloqueante: dependência opcional `fontaine`. |
|
||||
| `php -l app/Http/Controllers/PortalServicesController.php`; `php -l tests/Feature/PortalServicesTest.php`; Pint dirigido `--test` nesses dois ficheiros | Sintaxe passou e Pint dirigido passou. |
|
||||
| `git diff --check` | Passou; avisos apenas de normalização CRLF/LF nos docs/forms preexistentes. |
|
||||
|
||||
## Prioridade para continuidade
|
||||
|
||||
1. **Crítica — segurança documental:** upload novo agora fica em quarentena interna e não pode ser catalogado. Implementar scanner e acção de revisão auditável antes de disponibilizar o fluxo de aprovação; manter bloqueado até então.
|
||||
2. **Crítica — integridade e operações:** reiniciar/provisionar ambiente QA isolado na porta 55441; repetir suíte PHP e schema lifecycle sem tocar a base 5432.
|
||||
3. **Alta — matriz documental:** extrair os DOCX em `Formularios` e `por executar`, eliminar duplicação por equivalência sem descartar referências e ligar critérios a testes.
|
||||
4. **Alta — PII e estruturas:** extrair campos apenas para inventário de evidência; revisão manual antes de staging, sem publicar como oportunidade.
|
||||
5. **Alta — CRM, catálogo e formulários:** testar paginação, filtros, coerência mapa/lista/contagem, consentimento/revogação, rascunhos e publicação controlada.
|
||||
6. **Bloqueado — regras fiscais:** fontes integrais e aprovação do Fiscalista permanecem pré-condições; manter componentes como indeterminadas.
|
||||
7. **Média — educação e assistência:** cobertura funcional, fontes, ACL e revisão humana antes de expandir recomendações.
|
||||
|
||||
## Rollback e estado de gate
|
||||
|
||||
Esta tranche apenas adiciona documentação. Rollback: remover `consolidated-review-matrix-2026-10-03.md`; a adenda ao ledger, quando feita, deve ser append-only e pode ser revertida apenas removendo a secção adicionada, sem reescrever o histórico. Não há migration ou alteração de dados nesta tranche. Estado proposto: diagnóstico técnico parcial; nenhuma prontidão de lançamento global; fiscal bloqueado; demais módulos seguem parciais e necessitam testes funcionais/de segurança específicos.
|
||||
|
||||
## Adenda D-06 — validação do território no intake educativo (2026-10-03)
|
||||
|
||||
Evidência nova: o backend restringe `geo_location_id` de procura/oferta aos tipos province/district/admin_post/locality e rejeita country. `EducationTest` passou 8/8 (207 assertions) em QA isolado/55442. O módulo continua parcial: essa validação não demonstra a correspondência de capacidades com resultados de emprego nem aprova fontes/acreditação; não foi adicionada decisão automática.
|
||||
|
||||
## Atualizacao D-04 — consentimento de contacto
|
||||
|
||||
A cobertura de revogacao foi expandida: o ecrã interno disponibiliza acao distinta para `respond_to_interest`; o backend cifra a justificacao, regista transicao e outbox sem PII, bloqueia conversao apos revogacao e evita duplicacao no replay. Testes focados PortalManagement + CRM: 16/16, 234 assertions; TypeScript, build e Pint passaram. D-04 permanece parcial: falta canal do titular e política de retencao; separacao organizacional, diligencia, propostas/fecho e SuiteCRM continuam por validar. Isto satisfaz parte do criterio de revogacao interna, nao constitui aprovacao de privacidade ou activacao de integracao.
|
||||
|
||||
- Adenda de integracao CRM: o teste agora percorre revogacao pela rota de gestao seguida de tentativa real de conversao; a conversao e rejeitada. Tambem verifica que utilizador sem papel nao revoga e que repeticao nao duplica outbox/transicao. Reexecucao final: 16/16 testes, 237 assertions. `npm run build` e TypeScript passaram; aviso opcional `fontaine`. O verificador Vite+ de formatacao considera este ficheiro legado fora do formato global; nao foi reformatado inteiro para evitar diff mecanico alheio ao escopo.
|
||||
|
||||
### Regressao global apos CRM — 2026-10-03
|
||||
|
||||
- A suite PHP global foi executada em cluster PostgreSQL 17 novo e isolado na porta 55441. O harness criou a base `investmoz_test`, aplicou todas as migrations antes da suite (dependencia de `AiGatewayTest`) e usou PHP 8.5.11. Resultado final: 233/233 testes, 2.345 assertions; zero falhas/erros.
|
||||
- Suite frontend: 104/104. TypeScript, Pint dirigido, PHP lint, build Vite (2.388 modulos) e `git diff --check` passaram. Build emite aviso nao bloqueante do pacote opcional `fontaine`.
|
||||
- Uma tentativa preliminar em DB vazio sem migrations terminou com 8 testes AI falhados por `ai_controls` inexistente; corrigido apenas o setup de QA, sem alterar testes ou codigo por causa desse resultado. A repeticao completa acima e a evidência final.
|
||||
- Cluster encerrado e porta 55441 confirmada sem listener; a base local na porta 5432 nao foi consultada nem alterada. Permanecem pendentes: reconciliacao administrativa do incidente QA e gates humanos/legal/privacidade/manual descritos no estado actual.
|
||||
|
||||
### Gate documental — scanner antimalware indisponivel no ambiente local (2026-10-03)
|
||||
|
||||
A verificacao do ambiente nao encontrou os executaveis `clamscan`, `clamdscan` ou `clamd`, nem servico ClamAV instalado. Nao instalei nem activei scanner externo; os uploads continuam em quarentena interna e a publicacao de ficheiros novos permanece bloqueada. Proxima tarefa independente do plano: continuar a lacuna de localizacoes multipla/estruturadas no formulario privado; nao fabricar coordenadas nem publicar registos.
|
||||
|
||||
### Dados territoriais — pesquisa tolerante a acentos (2026-10-03)
|
||||
|
||||
- `GET /api/v1/investment/territory-options` agora normaliza o termo de pesquisa (`Str::ascii`) e compara nomes com `translate(lower(name), ...)`, além de manter correspondência por código e código de origem. Não altera nem translitera os nomes guardados, não instala extensão e mantém o escopo de território público e dependência hierárquica.
|
||||
- `ExistingBusinessWizardTest`: 4/4 testes, 55 assertions no PostgreSQL 17 descartável, PHP 8.5.11/porta 55441; inclui pesquisas `maputo`, `provincia` e `Mapúto` contra `Província de Mapúto`. PHP lint, Pint dirigido, TypeScript, três testes de localização frontend e diff check passaram. Build Vite também passou nesta continuação anterior (2.389 módulos); aviso não bloqueante da dependência opcional `fontaine`.
|
||||
- O cluster QA está parado. Porta 5432 permaneceu intocada. As limitações de cobertura oficial/importação de dados territoriais, reconciliação e aproximação sem fusão automática continuam. D-01 melhora, mas permanece parcial.
|
||||
|
||||
### Catálogo, lista e mapa — reconciliação das contagens (2026-10-03)
|
||||
|
||||
- A auditoria confirmou que catálogo web, pesquisa API e mapa derivam o conjunto base de `InvestmentCatalogue::query()` com os mesmos filtros. A lista não esconde oportunidades sem ponto: elas aparecem em `unlocated` no mapa, e `matched_count` inclui georreferenciadas e não georreferenciadas. O limite de 1.000 registos é explícito por `truncated`.
|
||||
- Reforcei `InvestmentTerritoryTest` para comparar IDs e totais na página Inertia, endpoint de pesquisa e endpoint de mapa em três estados: oportunidade publicada sem coordenadas; coordenadas públicas confirmadas; oportunidade retirada. Resultado: 9/9 testes, 138 assertions, PHP 8.5.11/PostgreSQL 17 QA isolado, porta 55441; Pint e PHP lint passaram. Sem alteração funcional/dados de produção.
|
||||
- A verificação confirma consistência para o fluxo amostrado, mas não prova exaustivamente filtros combinados, paginação acima de 1.000 ou aceitação visual assistiva. C-01 continua parcial até essas verificações; nenhuma coordenada foi fabricada. QA foi encerrado e a porta 5432 não foi consultada.
|
||||
|
||||
## Adenda — extracção de revisão não importável (2026-10-03)
|
||||
|
||||
O DOCX de origem voltou a ser localizado no caminho registado. O SHA-256 actual (`BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6`) coincide com a proveniência acima. Foi criada `docs/investmoz/source-staging/pii-26-30-review-only.csv` com 174 linhas, preservando índice de tabela no XML, linha, legenda da tabela, chave, título, tipo, relação literal, localização, custo literal, cabeçalho literal da moeda e horizonte. Cada linha tem estado `review_only_not_importable`; nenhum registo canónico ou anúncio foi criado.
|
||||
|
||||
A extração confirma que “Terminal de Contentores – Porto de Nacala” ocorre em T16/L4 (`A07 - C02`, `110,000,000`) e T17/L4 (`A08 - C02`, `300.000.000`), ambos sob cabeçalho USD. São identificadores/valores distintos: manter ambas as linhas para reconciliação, sem deduplicar ou escolher um valor. As sete linhas da tabela XML 19 conservam o cabeçalho `Custo (USD/ MZN)` e ficam marcadas `currency_ambiguous_mixed_header`. O texto inclui “Taxa de câmbio: 1 USD = 64,00 MZN” imediatamente antes e depois desta tabela, mas não estabelece a moeda de cada linha, a aplicação dessa taxa às estimativas, a data/base da taxa nem a autoridade da conversão; por isso, nenhum valor foi convertido.
|
||||
|
||||
As colunas uniformes das 13 tabelas não identificam pessoa/entidade responsável nem fase de execução; no CSV ficam vazias, sem inferência. Localizações e relações permanecem literais, não validadas. Validação do artefacto: 174/174 linhas, 174 referências tabela/linha únicas, 7 linhas em T19 sinalizadas e 2 linhas do título repetido sinalizadas. Não houve escrita em base de dados nem alteração do DOCX. Gate V-01/D-02 continua parcial e bloqueado para importação/publicação até reconciliação pelo responsável do documento e validação dos topónimos, responsáveis, estados e moeda.
|
||||
|
||||
Rollback deste artefacto derivado: remover apenas `pii-26-30-review-only.csv` e esta adenda; o original e dados de aplicação permanecem intactos.
|
||||
|
||||
### Cadastro administrativo de corredores — 2026-10-03
|
||||
|
||||
- A auditoria confirmou que `development_corridors` e o modelo existiam, mas não havia CRUD na área de gestão: as rotas genéricas só aceitavam `projects` e `clusters`. Acrescentei `/management/corridors` com pesquisa/paginação e formulário privado para código, nome, estado e descrição, reutilizando o selector territorial existente na criação. Os estados aceites são os já definidos pela tabela (`proposed`, `active`, `closed`); não foi criada regra nem conteúdo oficial.
|
||||
- O registo fica com classificação `internal`; o estado `active` é apenas estado operacional do corredor e não cria publicação. Não houve migration. Autorização, criação, leitura, edição e estado foram verificados em `InvestmentStructureTest`: 5/5 testes, 68 assertions, PostgreSQL 17 QA isolado na porta 55441, PHP 8.5.11. PHPStan: 0 erros; Pint, PHP lint, TypeScript, build Vite (2.389 módulos) e `git diff --check` passaram. Build assinala apenas a dependência opcional `fontaine` ausente. Cluster encerrado; 5432 não utilizada.
|
||||
- D-02 permanece parcial: esta tranche só acrescenta CRUD básico de corredor. Associações corredor–projecto/cluster com fonte, evidência, vigência e revisão independente, catálogo de parques/zona, relações com PII e validação oficial dos dados ainda não estão concluídos. Nenhum corredor real foi inserido.
|
||||
- Rollback: reverter `routes/web.php`, controller, tipos/páginas de estruturas, ligação no menu e o teste. Não há alteração de esquema ou dados a reverter.
|
||||
|
||||
### Publicação da carteira — aprovação separada da importação (2026-10-03)
|
||||
|
||||
- Corrigido um bypass verificado: `portfolio:import --approval=<texto>` aceitava qualquer texto arbitrário e publicava até 29 dossiers sem autenticar o proprietário nem confirmar revisão. O comando agora só corre o seeder idempotente e deixa os dossiers em rascunho privado. O parâmetro `--approval` deixou de existir; chamada com esse parâmetro foi executada e terminou com erro `The "--approval" option does not exist.`
|
||||
- Fechada também a auto-publicação pela rota de gestão: um dossier sem editor atribuído não pode ser publicado (422); o editor não pode rever/publicar a própria edição (403); outro gestor tem de rever. O fluxo mantém versão optimista, evidência e auditoria. As fichas já publicadas/históricas não foram alteradas.
|
||||
- `InvestmentPortfolioTest` + `InvestmentUnificationTest`: 15/15 testes, 224 assertions, incluindo importação repetida, ausência de publicação automática, preservação de edições, editor distinto e filtros com fixtures sintéticas explicitamente publicadas. PHPStan 0 erros; Pint e PHP lint dirigidos passaram. Testes em PostgreSQL 17 isolado, PHP 8.5.11/porta 55441. Não foi usada a base 5432.
|
||||
- Sem migration. Rollback de código reabre os caminhos de auto-publicação; preservar o controlo actual salvo decisão expressa de política. O histórico documental de 26/09 sobre a autorização inicial foi mantido como histórico, não como instrução de execução actual.
|
||||
|
||||
### D-02 addendum - relations require independent evidence review (2026-10-03)
|
||||
|
||||
The three investment structure junction tables now support association type, source/evidence references, validity and separate editor/reviewer status via an additive migration. Imported rows stay pending. Public related-project navigation filters to validated and currently effective relations. Submission and independent review routes are covered by tests. The admin form is currently complete for cluster-project links; corridor-project and corridor-cluster management forms, verified official relation sources, parks/ZEE/ZFI and PII review remain open. No relation or dossier was published by this change. D-02 is still partial.
|
||||
|
||||
## Reconciliacao corrente — 2026-10-04
|
||||
|
||||
Esta adenda prevalece sobre estados e caminhos pesquisados em 2026-10-03, sem apagar o registo historico. A matriz continua sendo o indice consolidado; `simulator-evolution-progress.md` e o diario de execucao, nao uma segunda matriz.
|
||||
|
||||
| ID | Requisito | Evidencia actual conferida | Estado actual e accao | Teste/gate |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| M-02 | Reconciliar prompts, fontes e pastas indicadas, sem inferir ausencia a partir de um caminho errado. | A pasta `C:\Mac\Home\Documents\TEMPO\Portal Tempo\Servicos Tempo\prompt` e acessivel; existe conjunto de DOCX, incluindo prompts do simulador e formulários. A pasta `Legislacao` tem codigos e alteracoes fiscais antes registados como nao disponiveis. Foi localizado `Informacao Publica\Legislacao - resumos\Reforma fiscal de 2026.docx`. | Corrigida a afirmacao de indisponibilidade do resumo fiscal. A coleccao foi inventariada e documentos relevantes foram extraidos selectivamente; nao se declara leitura/reconciliacao integral de todos os DOCX. `DUAT.docx` permanece bloqueado por uso do ficheiro e nao foi alterado. | Continuar leitura por dominio e actualizar esta matriz; scans exigem OCR/cotejo visual. |
|
||||
| D-05 / V-04 | Motor fiscal reproduzivel, por periodo, com fontes, formulas, pressupostos e resultado indeterminado quando faltar dado. | `SimulationTaxRuleExpression` implementa DSL allowlist/DAG/BigRational; `SimulationTaxParameterResolver` trata periodo, `scope_key`, contexto e fonte; endpoint publico projecta parametros; interface apresenta estado/fonte. `RunSimulation` nao invoca o avaliador e continua aritmetica geral/custom. | **Parcial; nenhum motor de apuramento fiscal integrado.** Testes de DSL/resolucao existem, mas sem casos dourados externos ligados a resultados independentes. Nao chamar o fluxo genericamente estimativo de calculo legal. | Executar os testes unitarios tecnicos; gate por componente requer texto legivel/autenticado, regra ligada, snapshot/explicabilidade e resultado de referencia confirmado. |
|
||||
| D-05 / M-04 | Consolidar CIVA sem somar texto substituido e respeitar vigencia. | O acervo tem Lei 13/2016 (32 paginas, sem camada de texto), PDF denominado rectificado (15 paginas, sem camada de texto), Lei 22/2022 (26 paginas, camada de texto) e alteracao CIVA 2023 (18 paginas, texto extraivel). Ha fontes oficiais INM/Parlamento ja citadas em `official-source-register.md`. | Localizacao confirmada; OCR util nao obtido nesta execucao para scans. Aplicar Lei 13/2016 como base metodologica, reconciliar diplomas anteriores e aplicar posteriores apenas por artigo/vigencia. Anexos rectificados continuam pendentes de cotejo legivel. | Sem activar isencoes/taxas afectadas ate cotejo de fonte/autenticidade e testes antes/depois da vigencia. |
|
||||
| D-05 / M-04 | Distinguir diploma e resumo secundario, preservar a origem. | BR 248 arquivado tem 21 paginas, 440.018 bytes e SHA-256 `CCF2A8DEECA820F2DD076B4B2141B1EFE3F6A806568C3A587CA59A8E92F4C251`; a extraccao foi conferida nas disposicoes abaixo. A copia do acervo `BR_248_I_SERIE_SUPLEMENTO_2025.pdf` tem 20 paginas e SHA-256 `A0110696253715567AF39C159A21BACFEBC32F944FA43A4EFD18070D36959E50`, logo nao e o mesmo binario. CBF e ISPC_Financas foram localizados, mas sao scans ou extraccoes parciais. | O resumo “Reforma fiscal de 2026” localizado e fonte secundaria. Existencia e texto extraivel nao equivalem a autenticidade/pericial nem a aprovacao do caso. Nao inserir parametros com base em tabelas de resumo. | Comparacao artigo a artigo contra edicao oficial arquivada e teste de vigencia por regra. |
|
||||
| D-05 / M-09 | Registar revisao profissional informada sem alargar o ambito de documentos. | O proprietario declarou que contabilista/fiscalista reviu e validou o simulador, e ja autorizou formalmente matriz/regras. O PDF OCAM refere-se a Declaracao Anual de Informacao Contabilistica e Fiscal (Modelo 20) da empresa no exercicio de 2025. | Registar a declaracao como informacao/autorizacao do proprietario, nao como validacao independente. O PDF do Modelo 20 nao certifica simulador nem testes fiscais; nao reproduzir PII. A falta de relatorio individual nao impede codigo neutro, testes nem cenarios estimativos fundamentados. | Confirmacao especifica necessaria para regras com fonte/anexo/vigencia ilegivel ou nao consolidada, elegibilidade de beneficios, classificacao pautal/ICE, parametros novos de 2026 e resultados dourados por componente. |
|
||||
| B-01 | Preservar ambiente e provar apenas comandos efectivamente executados. | Worktree apresenta muitas alteracoes preexistentes/nao comprometidas; foram preservadas. PHP 8.5 permanece requisito do portal. OCR foi tentado com dependencias temporarias; originais nao foram alterados. | Sem reset/clean, migration operacional, activacao fiscal ou mudanca de infraestrutura nesta tranche. | Tests devem usar PHP 8.5.11 e DB descartavel; nao inferir QA a partir da base local. |
|
||||
|
||||
### Reconciliacao do resumo fiscal secundario localizado — 2026-10-04
|
||||
|
||||
Documento lido: `Informacao Publica/Legislacao - resumos/Reforma fiscal de 2026.docx`, SHA-256 `36666904ADB982AD578145E7B70244146C6414299B18F086042A5B4A6C2385B6`. Referencia primaria consultada no BR 248 previamente arquivado e no sumario oficial INM. Uma segunda copia local tem texto extraivel, mas hash e paginação diferem do exemplar arquivado.
|
||||
|
||||
| Tema | Alegacao secundária | Dispositivo primário cotejado | Resultado / estado |
|
||||
| --- | --- | --- | --- |
|
||||
| IVA vs ISPC | Revogacao dos regimes simplificados de IVA pode ser lida como eliminacao do ISPC. | Lei 9/2025 cria/actualiza ISPC; Lei 10/2025, arts. 3 e 53, altera/revoga disposicoes do CIVA e regula transicao do IVA. | Regimes distintos; divergencia resolvida. ISPC permanece sujeito a elegibilidade propria, nao basta limite de volume. |
|
||||
| Reembolso IVA | 150 dias e prescricao de 10 anos. | Lei 10/2025, art. 21, n.os 10 e 15 no texto extraido. | Correspondencia textual encontrada. Nao confundir credito/pedido com reconhecimento ou recebimento; regulamento/procedimento e estados de tesouraria continuam por validar. |
|
||||
| Dedutibilidade | Proporcao em casos de base reduzida e exclusoes. | Lei 10/2025, art. 18(6) e art. 19(2), este referente a operacoes do art. 17-A. | Confirmado apenas no escopo dos dispositivos citados; nao generalizar a todas as operacoes. |
|
||||
| Operacoes digitais IVA | Responsabilidade do adquirente nao residente/digital descrita de forma ampla. | Lei 10/2025, arts. 6(7), 23(2), 32 e 33. | Depende da natureza da operacao e do sujeito definido em cada artigo; intake nao deve aplicar uma regra universal. |
|
||||
| Estabelecimento estavel IRPC | Regra de 90 dias pode ser lida como aplicavel tambem a servicos digitais. | Lei 12/2025, art. 3(2)(c), exclui servicos digitais do teste de permanencia por prestacao de servicos; arts. 5(5)–(7) e 62(5) tratam rendimento digital em vias distintas. | Divergencia resolvida; nao importar 90 dias para servico digital por analogia. |
|
||||
| Mais-valias | Taxa de 32% referida para IRPC. | Lei 12/2025, art. 61-A; Lei 11/2025, art. 54-A do IRPS tem tabela propria. | 32% e regra textual IRPC; nao transportar para IRPS. Aplicacao por categoria e bases ainda requer teste e validacao. |
|
||||
| Isencoes em importacao e Decreto 52/2025 | Resumo indica caducidade de bens especificos e prazos/condicoes de reembolso especiais. | Lei 10/2025, anexos/dispositivos e Decreto 52/2025 exigem cotejo integral; texto primario legivel correspondente nao foi fechado nesta tranche. | Pendente. Sem regras de isencao nem previsao de reembolso implementadas a partir desta alegacao. |
|
||||
|
||||
### Inventario de fontes fiscais localizadas nesta revisao
|
||||
|
||||
| Ficheiro (fora do repositorio) | Tamanho / SHA-256 | Leitura nesta execucao |
|
||||
| --- | --- | --- |
|
||||
| `Legislacao/Lei 13_2016_Reimpressao Codigo do IVA.pdf` | 2.127.554 bytes / `b90dc7c14ece2a2e3784c62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b` | 32 paginas, sem camada de texto; OCR nao produziu texto utilizavel. |
|
||||
| `Legislacao/RectificaçãoLei.13.2016_Republicação.Codigo.IVA.pdf` | 19.539.751 bytes / `ad675fef757016b730e859c834ab1a1602576260510912dda6f9d320393d415c` | 15 paginas, sem camada de texto; OCR nao produziu texto utilizavel. |
|
||||
| `Legislacao/alteracao CIVA 2023.pdf` | 708.707 bytes / `0c13f4b03dadea7f2dfe30694650078fa7b9de00ef84cb47389422d23a5271cd` | 18 paginas; texto extraivel, ainda nao reconciliado artigo a artigo. |
|
||||
| `Legislacao/Legislacao/Legislacao/Lei 22 2022 IVA.pdf` | 1.989.462 bytes / `5bd31ff1231659ce8d89e1260a9de3b067e69e4ace128b3fe0af60e2e928e6af` | 26 paginas; texto extraivel, cotejo oficial por fazer. |
|
||||
| `Legislacao/Lei 12.2025_IRPC.pdf` | 511.828 bytes / `3b67d10beaa3bf65d62a3d75fa01cc5a8181000d674e7b2ba62d06c60d449757` | 4 paginas; texto extraivel inclui Suplemento 1 do BR 248 e Lei 12/2025. |
|
||||
| `Legislacao/Legislacao/2009/Lei 4_2009 Código dos Benefícios Fiscais - versão consolidada.pdf` | 253.019 bytes / `61e3439426f1eab4c3eec91f8d4587baa2e71249c7d60bbb17c8d4427dcd0aa3` | 13 paginas; extraccao parcial com aviso de fonte tipografica. |
|
||||
| `Legislacao/Legislacao/a digitalizar/ISPC_Financas.pdf` | 363.424 bytes / `761502b64d65bfac3f9a6e1b23071a397c1c59a961bd15b27708dc01962ea1de` | 17 paginas; scan/camada de texto insuficiente. |
|
||||
|
||||
O PDF de compromisso OCAM foi lido apenas para estabelecer o seu escopo (Modelo 20 empresarial, exercicio 2025); nomes, NUIT, codigos e outros dados pessoais foram omitidos. A extraccao dos restantes codigos legiveis e do resumo secundario permanece por reconciliar antes de se afirmar cobertura fiscal completa.
|
||||
|
||||
## REC001-REC016 - connected journey tranche (2026-10-04)
|
||||
|
||||
| REC | Current evidence and decision | State after this tranche | Next concrete work |
|
||||
| --- | --- | --- | --- |
|
||||
| REC001 | `SimulationFormDraft` already encrypts snapshots; `SimulationBusinessPlan` stores a versioned plan snapshot. Adapt existing draft rather than add a second dossier. | Partial: exploratory small-business draft now contains idea and plan stages; not yet one persistent canonical project linked to all modules. | Define canonical project relationship and cross-module ownership before linking records. |
|
||||
| REC002 | Guided sections already exist in `simulation-form.ts`. | Partial: the small-business exploratory path captures problem, customers, value proposition, sector/activity, location and declared market assumptions in the existing resumable draft. | Add structured market evidence and reusable operational detail. |
|
||||
| REC003 | Business plan and cashflow tools have independent tests and versioned snapshots. | Partial: financial plan is available in exploratory small-business path; fiscal rules remain separate and may be indeterminate. | Test full plan-to-simulator reconciliation and scenario history. |
|
||||
| REC004 | Existing plan supports user-edited financial assumptions. | Partial: a free-text milestone field accepts planned/actual notes and dates; it is not yet a structured plan-vs-actual register. | Add structured milestones, status transitions and cost reconciliation after canonical dossier ownership is settled. |
|
||||
| REC005 | Public procedures and DUAT guidance exist. | Partial: the location stage links to `/terra-duat` and `/como-investir`; no project-specific checklist is saved. | Add stage-specific checklist with source and applicability, without universal required documents. |
|
||||
| REC006 | Interest/CRM intake exists; SuiteCRM remains disabled. | Partial: internal intake is not official submission. | Record referrals and proof only when an actual supported channel exists. |
|
||||
| REC007 | Indicator schemas/data exist but source metadata/catalogue coverage is partial. | Partial. | Expose a small catalog with unit, period, geography, source and coverage metadata. |
|
||||
| REC008 | Territorial catalogue exists; completeness and comparative analytics are not established. | Partial. | Compare only verified coverage; preserve list view where coordinates are absent. |
|
||||
| REC009 | Several CSV exports exist; no common dossier export established. | Partial. | Export the project and its versioned plan once a canonical aggregate is defined. |
|
||||
| REC010 | Existing assistance/AI paths have controls; explanations and scope vary. | Partial. | Use rule-based, cited suggestions first; keep AI optional and reviewable. |
|
||||
| REC011 | Portal operations include status and audit data, but no complete journey funnel verified. | Partial. | Define cohort, denominator, declared vs verified outcomes and privacy rules. |
|
||||
| REC012 | Automated tests exist; no full connected pilot/browser/accessibility pass executed in this tranche. | Partial. | Test end-to-end journey, authorization, keyboard, narrow viewport and regressions. |
|
||||
| REC013 | Education tables/controllers exist. | Partial: the draft captures user-declared competency/team needs as text; it does not structure availability, gap, solution, cost and deadline or match a training provider. | Map available occupation/skill entities and build declared needs/actions without implying certification. |
|
||||
| REC014 | Education discovery and partner routes exist; no verified project-to-provider match. | Partial. | Match by explicit task, location, availability, cost and evidence. |
|
||||
| REC015 | Portal aggregates exist in some dashboards; safe public aggregate semantics need review. | Partial. | Document universe, method, periods and suppression/privacy controls. |
|
||||
| REC016 | Finance catalog/search exists but no complete product-level compatibility contract verified. | Partial: the draft accepts a financing/resource need and optional amount, but does not match products or establish pre-eligibility. | Show compatible, incompatible by documented criterion, or insufficient information; no approval promise. |
|
||||
|
||||
Pilot: synthetic, unseeded small-business idea using the public `/Simulador` path, `journey_type=small_business` and `purpose=simulate_only`. It captures optional idea/market responses, existing sector and territorial selections, competency/resource/milestone notes and the versioned financial plan in the existing draft. It can save locally and, when signed in, use the existing server draft. Market data, competency matches and financing products are not verified or matched. The pilot is not a public business listing, formal filing, fiscal determination, financing pre-approval or official submission. No operational fixture was created.
|
||||
|
||||
### REC001–REC016 follow-up — 2026-10-04
|
||||
|
||||
| Area | Delivered in this tranche | Remaining gate |
|
||||
| --- | --- | --- |
|
||||
| Dossier, idea and finance | Reused encrypted `SimulationFormDraft` and existing versioned business-plan snapshot; added dossier CSV with market claim/source, location, finance assumptions, declared needs, team and execution rows. | Cross-module canonical project identity and plan snapshot reconciliation remain future work. |
|
||||
| Team and execution | New structured planner rows capture competency, availability/gap, planned response, estimated cost/date, milestone status and planned/actual amounts. Server enforces JSON shape, state whitelist, 100-row limit and nonnegative amounts. | Matching to education providers/certified skills and reconciling realized amounts to accounting/plan remain pending. |
|
||||
| Market origin and indicators | UI and dossier explicitly say “Informação declarada, não verificada”; source/date optional. Exports distinguish declared assumptions and estimates from selected territorial catalogue values. | Official indicator catalogue with source, period, geography, unit and coverage is not present as a complete connected dataset. |
|
||||
| Financing | Missing product catalogue and criteria produce “Informação insuficiente”; no pre-eligibility result is invented. | Documented product feed, current sources/eligibility criteria and tests required before indicative matching. |
|
||||
| Computer/mobile journeys | Targeted frontend/API/PHP tests pass. | Real Edge/browser checks at desktop/mobile widths, idea/existing-business/incomplete-data save-recovery and validation are not completed because runner policy rejected launching `msedge.exe`. Browser gate stays open. |
|
||||
|
||||
Evidence: frontend suite 128/128; isolated PostgreSQL 17/PHP 8.5.11 full PHP suite 255/255 (2,601 assertions); TypeScript check, production build (2,399 modules), PHPStan (0 errors), PHP request lint and `git diff --check` passed. Build reports only the optional `fontaine` fallback warning. No operational fixture or database was used; the temporary QA database was isolated on port 55441.
|
||||
@@ -61,6 +61,25 @@ servidor. A configuração de proxy deve confiar apenas no proxy efectivamente u
|
||||
sem autorização recebem 403 nas rotas de gestão. Ensaiar emails com destinatário
|
||||
controlado antes de activar notificações públicas.
|
||||
|
||||
## Activação da biblioteca documental
|
||||
|
||||
Para uma entrega que inclui o catálogo documental ou a análise antimalware, não
|
||||
usar uma migração global se existirem migrações pendentes não relacionadas. Fazer
|
||||
e validar primeiro um backup recuperável. Confirmar que a aplicação aponta para a
|
||||
base prevista e executar, nesta ordem, apenas as duas migrações desta entrega:
|
||||
|
||||
```sh
|
||||
php artisan migrate --path=database/migrations/2026_10_05_120000_extend_portal_document_catalogue.php --force
|
||||
php artisan migrate --path=database/migrations/2026_10_05_130000_add_document_malware_scanning.php --force
|
||||
php artisan portal:check-document-library-schema
|
||||
```
|
||||
|
||||
O último comando tem de terminar com sucesso antes de disponibilizar o catálogo.
|
||||
As migrações mantêm os direitos anteriores como `unconfirmed` e as análises
|
||||
anteriores como `pending`; não marcar registos antigos como públicos ou limpos.
|
||||
Se a compatibilidade falhar, manter os controlos de publicação e análise e
|
||||
consultar o diagnóstico interno. O comando não altera dados.
|
||||
|
||||
## Notificações
|
||||
|
||||
Definir PORTAL_NOTIFICATION_RECIPIENTS com emails da equipa separados por vírgulas.
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"base": "http://127.0.0.1:18089/documentos",
|
||||
"testedAt": "2026-10-05T10:05:45.546Z",
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1440,
|
||||
"height": 1000,
|
||||
"status": 200,
|
||||
"heading": 1,
|
||||
"emptyState": 1,
|
||||
"overflow": {
|
||||
"viewport": 1440,
|
||||
"document": 1440,
|
||||
"body": 1440
|
||||
},
|
||||
"firstKeyboardFocus": {
|
||||
"tag": "A",
|
||||
"label": null,
|
||||
"text": "Saltar para o conteúdo"
|
||||
},
|
||||
"screenshot": "docs/investmoz/document-library-desktop-2026-10-05.png"
|
||||
},
|
||||
{
|
||||
"name": "mobile",
|
||||
"width": 390,
|
||||
"height": 844,
|
||||
"status": 200,
|
||||
"heading": 1,
|
||||
"emptyState": 1,
|
||||
"overflow": {
|
||||
"viewport": 390,
|
||||
"document": 390,
|
||||
"body": 390
|
||||
},
|
||||
"firstKeyboardFocus": {
|
||||
"tag": "A",
|
||||
"label": null,
|
||||
"text": "Saltar para o conteúdo"
|
||||
},
|
||||
"screenshot": "docs/investmoz/document-library-mobile-2026-10-05.png"
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
# Conclusão funcional da biblioteca documental
|
||||
|
||||
Data: 06/10/2026. Estado: implementação funcional; validação de conteúdo e publicação parcial. Este relatório actualiza e complementa `legal-source-library-migration-2026-10-06.md`, que documentava o estado anterior à importação do ficheiro do INE e à migração de vigência.
|
||||
|
||||
## Resultado
|
||||
|
||||
A biblioteca `/documentos` tem agora pesquisa e filtros no servidor, ficha pública de cada registo publicável, consulta controlada de PDF/imagem e download protegido. A interface de gestão permite criar e editar rascunhos privados, ver proveniência e estado técnico, associar documentos a requisitos com uma referência concreta (artigo, secção, página ou excerto) e indicar período de aplicabilidade. Um ficheiro em análise pode ser guardado como rascunho; os controlos existentes continuam a impedir publicação até que a análise esteja limpa, o hash coincida e os restantes requisitos editoriais estejam cumpridos.
|
||||
|
||||
Foram importados quatro documentos para armazenamento privado. Todos permanecem internos, não publicados e com direitos não confirmados. A biblioteca pública vazia é, portanto, o resultado correcto nesta base: nenhuma autorização de direitos ou decisão editorial foi inferida a partir do antivírus ou da existência de uma fonte oficial.
|
||||
|
||||
## Inventário e decisões pendentes por documento
|
||||
|
||||
| Documento | Proveniência e estado | Relações | Decisão pendente antes de publicar |
|
||||
|---|---|---|---|
|
||||
| Lei n.º 22/2022, republicação do Código do IVA | PDF comparado byte a byte com o exemplar da AT; origem oficial confirmada. Estado jurídico registado como alterado, não como consolidação integral actual. | Evidência documental do simulador fiscal. | Gestor deve rever a possibilidade de divulgação da composição PDF e confirmar a versão/alcance editorial. Direitos: `unconfirmed`; classificação: `internal`. |
|
||||
| BR n.º 248/2025, Suplemento n.º 1 | PDF comparado byte a byte com endpoint oficial da AT. Reúne vários diplomas; estado jurídico agregado desconhecido. | Evidência documental fiscal, sem afirmar que cada tema cria obrigação ou regra activa. | Avaliar direitos da composição e identificar os diplomas e vigências individualmente antes de apresentar como referência consolidada. |
|
||||
| BR n.º 89, I Série, de 08/06/2017 | A ficha do INM identifica o aviso de rectificação da Lei n.º 13/2016 na p. 569; o binário local não foi comparado com um download oficial. Proveniência apenas identificada. | Evidência fiscal; efeito temporal continua por confirmar. | Obter o PDF/binário oficial, comparar hash e confirmar autenticidade, anexos e efeito da rectificação. Direitos continuam por confirmar. |
|
||||
| Codificador da Divisão Político-Administrativa do INE, edição de 2012 | Os bytes locais (67.067 bytes) coincidem com o PDF servido pelo URL oficial do INE. Confirma a origem do ficheiro, não a actualidade dos códigos nem os direitos de reutilização da composição. | Sem associação automática às relações territoriais actuais. | Rever reutilização/publicação e utilidade histórica. Não usar esta edição para atribuir localizações actuais sem reconciliação documentada. |
|
||||
|
||||
Nos quatro registos, a análise antimalware foi concluída sem ameaça e os hashes analisados coincidem com os ficheiros guardados. Este resultado é uma verificação técnica, não prova de direitos de publicação, exactidão jurídica, vigência ou actualidade.
|
||||
|
||||
As seis referências de zonas em `investment_legal_sources` e as referências de DUAT continuam a ser URLs, não ficheiros anexados à biblioteca. Continuam pendentes de validação e não foram convertidas em documentos fictícios. O resumo de reforma fiscal de 2026 e folhas de revisão pessoal não foram importados como diplomas. Extractos e CSVs de revisão potencialmente pessoais também não foram importados.
|
||||
|
||||
## Alterações desta entrega
|
||||
|
||||
- `app/Http/Controllers/PortalServicesController.php`: consulta pública mantém os filtros de publicação, classificação, direitos, estado e hash; acrescenta ficha, consulta inline restrita a PDF/imagem com hash verificado, download público autorizado e download de gestão privado apenas para gestor e ficheiro activo/analisado.
|
||||
- `routes/web.php`: rotas da ficha/consulta e download de gestão com restrições de formato de ID e middleware de gestão existente.
|
||||
- `resources/js/pages/portal/services.tsx` e novo `resources/js/pages/portal/document.tsx`: catálogo, filtros combináveis, ordenação por tema, estado vazio, consulta/ficha/download e informação de proveniência sem expor chaves internas.
|
||||
- `resources/js/pages/portal/manage.tsx`: criação/edição de rascunhos, estado de análise, fontes detalhadas, downloads privados de gestão e datas de aplicabilidade. A criação de rascunho não altera o gate editorial.
|
||||
- `database/migrations/2026_10_06_180000_add_document_applicability_dates.php`: duas datas de aplicabilidade opcionais com validação de intervalo. Migração aditiva; não preenche registos antigos.
|
||||
- `app/Console/Commands/ImportLegalSourceArchive.php`: importador idempotente por hash para fontes explicitamente autorizadas, incluindo a cópia privada exacta do INE. Preserva rascunho, classificação interna, direitos não confirmados e não cria associações territoriais.
|
||||
- `app/Console/Commands/CheckDocumentLibrarySchema.php`: verificação de compatibilidade das colunas e invariantes da biblioteca.
|
||||
- `tests/Feature/PortalServicesTest.php`, `tests/Feature/ImportLegalSourceArchiveTest.php`, `tests/Feature/DocumentLibrarySchemaCompatibilityTest.php`: cobrem fluxos públicos/privados, scan, direitos, data, associações, importação e esquema.
|
||||
- `tools/document-library-completion-browser.mjs` e evidências associadas: verificação visual automatizada em desktop e telemóvel.
|
||||
|
||||
## Dados activos, backup e migração
|
||||
|
||||
Base confirmada pelo Laravel: `investemoz`, PostgreSQL em `127.0.0.1:5432`. Consulta somente de leitura após a migração: 4 documentos, 4 recursos, 0 recursos publicados, 4 documentos limpos e 0 trabalhos pendentes. Os registos importados mantêm classificação interna e direitos não confirmados.
|
||||
|
||||
Antes da migração foi criado o backup PostgreSQL customizado `investemoz-before-document-library-applicability-20261006.dump` e o arquivo de armazenamento `investemoz-portal-documents-before-applicability-20261006.zip` em `%LOCALAPPDATA%\InvestMoz\Backups`. `pg_restore --list` validou o dump e este foi restaurado com sucesso numa base isolada `investmoz_restore_qa_afterimport_20261006`; a contagem recuperada foi 4 documentos, 4 recursos e 11 associações, e os hashes dos ficheiros restaurados coincidiram. O ambiente isolado foi parado após o ensaio; as bases QA de restauração foram preservadas.
|
||||
|
||||
Aplicou-se apenas `2026_10_06_180000_add_document_applicability_dates.php` à base activa, depois do backup/restauro. Não se reconstruíram tabelas, eliminaram documentos, preencheram campos editoriais em massa nem executaram migrações não relacionadas. `portal:check-document-library-schema` confirmou compatibilidade depois da migração.
|
||||
|
||||
O importador foi executado em modo de pré-visualização e aplicação; a repetição da aplicação reutilizou os quatro documentos pelo hash e não criou duplicações. A fila ficou sem trabalhos pendentes e os quatro documentos importados estavam em estado `clean` com hash verificado.
|
||||
|
||||
## Verificações e evidências
|
||||
|
||||
- PHP em QA isolado: `php artisan test tests/Feature/PortalServicesTest.php tests/Feature/DocumentLibrarySchemaCompatibilityTest.php tests/Feature/ImportLegalSourceArchiveTest.php` — **17 testes aprovados, 418 verificações**.
|
||||
- Tipos: `npm.cmd run types:check` — aprovado.
|
||||
- Build: `npm.cmd run build` — aprovado. Avisos existentes: pacote opcional `fontaine` ausente e chunk `services` acima de 500 kB; não impediram a compilação.
|
||||
- Esquema activo: `php artisan portal:check-document-library-schema` — compatível.
|
||||
- Browser ligado à aplicação/base activa, `/documentos`: desktop 1440×1000 e telemóvel 390×844 — HTTP 200, zero erros JavaScript, sem overflow horizontal, primeiro foco de teclado no link “Saltar para o conteúdo”, pesquisa sem correspondência mantém estado vazio, 0 documentos publicados. Evidência estruturada em `document-library-completion-browser-2026-10-06.json`; capturas em `document-library-completion-desktop-2026-10-06.png` e `document-library-completion-mobile-2026-10-06.png`.
|
||||
- O browser confirma o estado vazio seguro, não um documento público positivo. Não se publicou documento real porque os direitos permanecem por confirmar. Ficha, download e consulta de documento público têm testes de autorização; não existe ainda demonstração visual de download público de um documento real autorizado.
|
||||
|
||||
## Limites e acções seguintes
|
||||
|
||||
1. Um gestor autorizado revê os quatro documentos individualmente e regista direitos/classificação; publica apenas os ficheiros cuja divulgação esteja sustentada. A origem oficial confirmada não equivale automaticamente a autorização da composição ou do PDF.
|
||||
2. Para o BR n.º 89, obter do INM o binário integral oficial e comparar antes de promover a origem a confirmada.
|
||||
3. Validar conteúdo e vigência de cada diploma do BR n.º 248 separadamente; não o tratar como um único diploma vigente.
|
||||
4. Rever manualmente as datas/versão e utilidade do codificador INE de 2012; não o usar como catálogo territorial actual.
|
||||
5. Identificar os binários oficiais e os requisitos exactos dos percursos de zonas e DUAT antes de criar anexos/associações adicionais.
|
||||
6. Após a decisão documental do gestor, voltar a verificar o percurso positivo no browser: localizar o recurso publicado, abrir a ficha, consultar ou descarregar o mesmo ficheiro e aceder à referência no módulo associado.
|
||||
|
||||
Rollback estrutural: a migração acrescentou apenas colunas opcionais. O rollback operacional recomendado é restaurar o backup de base e o arquivo de armazenamento juntos, se necessário, ou manter as colunas inactivas. O `down` da migração só deve ser usado se as datas ainda não tiverem sido preenchidas; não eliminar esses dados depois de começarem a ser usados. Os quatro imports podem ser preservados como rascunhos; não remover ficheiros/dados automaticamente.
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"base": "http://127.0.0.1:8000/documentos",
|
||||
"testedAt": "2026-10-06T12:29:09.571Z",
|
||||
"targetDatabase": "investemoz (confirmed by read-only Laravel connection query)",
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1440,
|
||||
"height": 1000,
|
||||
"status": 200,
|
||||
"heading": 1,
|
||||
"publicResultsText": "0 documentos correspondem aos filtros activos",
|
||||
"emptyState": true,
|
||||
"overflow": {
|
||||
"viewport": 1440,
|
||||
"document": 1440,
|
||||
"body": 1440
|
||||
},
|
||||
"firstKeyboardFocus": {
|
||||
"tag": "A",
|
||||
"label": null,
|
||||
"text": "Saltar para o conteúdo"
|
||||
},
|
||||
"noMatchSearch": {
|
||||
"url": "http://127.0.0.1:8000/documentos?category=&document_type=&issuer=&language=&legal_status=&province=&q=__sem_correspondencia_qa__§or=&source_confirmation=&territory_id=&topic=",
|
||||
"emptyState": true,
|
||||
"noHorizontalOverflow": true
|
||||
},
|
||||
"screenshot": "docs/investmoz/document-library-completion-desktop-2026-10-06.png"
|
||||
},
|
||||
{
|
||||
"name": "mobile",
|
||||
"width": 390,
|
||||
"height": 844,
|
||||
"status": 200,
|
||||
"heading": 1,
|
||||
"publicResultsText": "0 documentos correspondem aos filtros activos",
|
||||
"emptyState": true,
|
||||
"overflow": {
|
||||
"viewport": 390,
|
||||
"document": 390,
|
||||
"body": 390
|
||||
},
|
||||
"firstKeyboardFocus": {
|
||||
"tag": "A",
|
||||
"label": null,
|
||||
"text": "Saltar para o conteúdo"
|
||||
},
|
||||
"noMatchSearch": {
|
||||
"url": "http://127.0.0.1:8000/documentos?category=&document_type=&issuer=&language=&legal_status=&province=&q=__sem_correspondencia_qa__§or=&source_confirmation=&territory_id=&topic=",
|
||||
"emptyState": true,
|
||||
"noHorizontalOverflow": true
|
||||
},
|
||||
"screenshot": "docs/investmoz/document-library-completion-mobile-2026-10-06.png"
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
}
|
||||
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 97 KiB |
@@ -0,0 +1,73 @@
|
||||
# Biblioteca de Documentos e Formulários — entrega e validação
|
||||
|
||||
Data: 05/10/2026
|
||||
|
||||
## Estado
|
||||
|
||||
Implementação funcional no código; validação automatizada concluída numa base PostgreSQL isolada. A migração da biblioteca **não foi aplicada à base activa**. O catálogo público activo estava vazio na verificação de leitura. Não foram importados nem publicados documentos demonstrativos. A validação visual desktop foi satisfatória para o estado vazio; a captura móvel a 390 px apresenta corte horizontal e requer correcção/ensaio adicional antes de validar a apresentação móvel.
|
||||
|
||||
## Implementado
|
||||
|
||||
- Catálogo único em `/documentos`, aproveitando `portal_resources` e `documents`, com ligações estruturadas a módulos, actividades, fases e territórios.
|
||||
- Pesquisa textual, filtros de metadados e território, paginação e inclusão de documentos nacionais. As relações são consultadas com `EXISTS` para evitar duplicações.
|
||||
- Carregamento privado e quarentena por defeito, limite de 10 MiB, validação MIME, autoria/data, hash SHA-256, detecção de conteúdo duplicado e prevenção de publicação implícita.
|
||||
- Edição versionada com controlo optimista, histórico de revisões e indicação de metadados/fontes em falta.
|
||||
- Publicação separada do carregamento. Exige fonte identificada e direitos explicitamente autorizados; legislação exige também confirmação de fonte oficial. Propostas e situação jurídica por confirmar mantêm rótulos próprios.
|
||||
- Recomendações documentais contextuais no dossier do simulador, sem bloquear o percurso quando não há documentos aplicáveis.
|
||||
- Atalho para a biblioteca na página inicial.
|
||||
|
||||
## Ficheiros alterados/criados
|
||||
|
||||
- `database/migrations/2026_10_05_120000_extend_portal_document_catalogue.php`
|
||||
- `app/Http/Controllers/PortalServicesController.php`
|
||||
- `routes/api.php`, `routes/web.php`
|
||||
- `resources/js/pages/PortalInvestidor.tsx`
|
||||
- `resources/js/pages/portal/services.tsx`
|
||||
- `resources/js/pages/portal/manage.tsx`
|
||||
- `resources/js/components/simulation-form.tsx`
|
||||
- `tests/Feature/PortalServicesTest.php`
|
||||
- `docs/investmoz/document-library-inventory-2026-10-05.md`
|
||||
- `docs/investmoz/document-library-implementation-2026-10-05.md`
|
||||
|
||||
## Evidências e comandos
|
||||
|
||||
Executados no projecto, usando PHP 8.5.11 e PostgreSQL QA em `127.0.0.1:55441`, base `investmoz_test`. O router web de QA fixa estes valores e interrompe a execução se a configuração divergir; não tem fallback para a base activa.
|
||||
|
||||
- `php artisan test --filter=PortalServicesTest` — 8 testes, 277 assertions, aprovados.
|
||||
- `php artisan test` — 281 testes, 2.987 assertions, aprovados.
|
||||
- `node --test tests/frontend/*.test.mjs` — 144 testes aprovados.
|
||||
- `npm.cmd run types:check` — aprovado.
|
||||
- `npm.cmd run build` — aprovado; avisos existentes de chunk acima de 500 kB e dependência opcional de fontes `fontaine` ausente.
|
||||
- Lint PHP nos ficheiros PHP alterados — aprovado.
|
||||
- `vp fmt --check` nos quatro TSX alterados — aprovado.
|
||||
- Verificação direccionada `vp check --no-fmt` — zero erros e três avisos preexistentes em `simulation-form.tsx` sobre coerção de tipos de template, fora das alterações desta biblioteca. `npm.cmd run check` global reportou 202 problemas de formatação pelo repositório; não foi aplicado um format global.
|
||||
- Consulta apenas de leitura à base activa — zero linhas que satisfaçam publicação, estado activo e classificação pública em `portal_resources`.
|
||||
- Browser Edge headless, contra `http://127.0.0.1:18089/documentos`, com cabeçalho QA `investmoz_test:55441`: HTTP 200. Inspecção visual desktop confirma título, filtros, estado vazio e contagem 0. Capturas temporárias em `%TEMP%\investmoz-document-library-qa\documentos-desktop.png` e `documentos-mobile.png`. A captura móvel de 390 px corta conteúdo à direita; não foi aprovada visualmente.
|
||||
|
||||
Os testes PHP incluem fixtures para filtros positivos e negativos, hierarquia territorial, inclusão nacional, publicação explícita, permissões, revisão de metadados, duplicados, ausência de fundamento legal em requisitos obrigatórios e recomendações. Esses resultados são evidência em ambiente isolado; não representam documentos reais publicados.
|
||||
|
||||
## Inventário e dados
|
||||
|
||||
O inventário encontra-se em `document-library-inventory-2026-10-05.md`. Três PDFs no arquivo interno foram identificados por nome, tamanho e hash, mas o seu conteúdo, proveniência e direitos não foram validados para publicação; não foram importados. A base activa permanece sem alterações de esquema ou conteúdo nesta entrega.
|
||||
|
||||
## Pendências
|
||||
|
||||
1. Corrigir e revalidar o corte horizontal na apresentação de 390 px.
|
||||
2. Rever documentalmente fonte, vigência e direitos dos documentos candidatos; depois, um gestor pode carregá-los em privado, completar metadados e publicá-los explicitamente.
|
||||
3. Aplicar a migração aditiva à base activa apenas no procedimento operacional próprio, com backup e janela definidos. A migração não foi necessária para os testes QA e não foi aplicada à base activa.
|
||||
4. A evidência browser com registos documentais reais publicados depende de candidatos autorizados e aprovados. Não usar dados demonstrativos públicos para simular esse resultado.
|
||||
|
||||
## Rollback
|
||||
|
||||
Antes de aplicar a migração em qualquer ambiente, fazer backup recuperável. O `down()` recusa remover estruturas se já houver ligações/revisões/metadados novos; portanto, após começar a usar o catálogo, a reversão segura é desactivar rotas/fluxo por deploy e preservar tabelas e dados até planeamento explícito de migração inversa. Os ficheiros carregados permanecem no armazenamento privado e não são apagados pela reversão do código.
|
||||
|
||||
## Validation update — 5 October 2026
|
||||
|
||||
- Corrected horizontal overflow at 390 px. Edge headless returned HTTP 200 at 1440 px and 390 px; document width equalled viewport width at both sizes, keyboard focus began at “Saltar para o conteúdo”, the empty state was coherent, and there were no JavaScript errors. Screenshots: `document-library-desktop-2026-10-05.png` and `document-library-mobile-2026-10-05.png`; measurements: `document-library-browser-2026-10-05.json`.
|
||||
- The focused suite after antimalware integration passed: 20 tests, 437 assertions. Real ClamD and file limits were exercised; `queue:work --once` ran against the isolated database.
|
||||
- Positive EICAR detection, socket timeouts, and encrypted documents remain pending; none is reported as approved. See `malware-scanning-2026-10-05.md`.
|
||||
- Browser screenshots show the empty state because the active database has no approved public documents. Positive search fixtures are isolated tests, not real records or proof of authorised publication.
|
||||
|
||||
Final regression after the antimalware integration: `php artisan test` — 285 tests / 3,017 assertions passed; frontend — 144 passed; TypeScript, production build, PHP syntax checks, and the edited TSX formatter check passed. Scanner positive-pattern validation and remote-host setup are still open (see the separate antimalware report).
|
||||
|
||||
On Windows/Laragon, user-level Scheduled Tasks now start the loopback scanner on sign-in and refresh official signatures at sign-in/every two hours. This local operation does not configure the remote hosting target.
|
||||
@@ -0,0 +1,48 @@
|
||||
# Inventário da biblioteca documental — 5 de Outubro de 2026
|
||||
|
||||
## Estado observado no código
|
||||
|
||||
- `documents` é o registo canónico do ficheiro: UUID, nome, MIME, chave privada de armazenamento, SHA-256, classificação, estado, versão e, após migração de 30/09, emissor, data, validade, tamanho e utilizador que carregou.
|
||||
- `portal_resources` é o catálogo editorial público, ligado por `document_id`. A pesquisa pública exige registo publicado, ficheiro activo, classificação pública, sem eliminação e download validado por hash.
|
||||
- `PortalServicesController` já implementava `/documentos`, `/legislacao`, download e gestão. Antes desta alteração, a pesquisa era por título, categoria e tema; o upload aceitava PDF/TXT e ficava em quarentena.
|
||||
- A navegação comum e a página inicial já tinham uma ligação à biblioteca. A entrada foi destacada no conjunto de atalhos da página inicial.
|
||||
- Os anexos de zonas, pedidos, casos Terra/DUAT e ingestão de IA também usam `documents`, mas as respectivas relações e autorizações continuam limitadas a esses contextos. Não foram copiados para a biblioteca.
|
||||
|
||||
## Inventário de registos publicados
|
||||
|
||||
Uma consulta apenas de leitura à base configurada como `investemoz`, juntando `portal_resources` a `documents` e filtrando `published=true`, `status=active`, `data_classification=public` e `deleted_at IS NULL`, devolveu **zero registos**. Nenhum documento foi copiado da base activa, alterado, ou publicado para produzir evidência de QA.
|
||||
|
||||
## Ficheiros de referência encontrados no repositório
|
||||
|
||||
Os três ficheiros abaixo estão em `docs/investmoz/simulations/source-archive/`. O inventário registou nome, tamanho e hash; esta tarefa **não confirmou o texto integral, fonte oficial, vigência, idioma, direitos de reprodução, âmbito ou aptidão para publicação**. Permanecem no arquivo original e não foram importados para o catálogo.
|
||||
|
||||
| Ficheiro | Bytes | SHA-256 | Situação para a biblioteca |
|
||||
|---|---:|---|---|
|
||||
| `Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf` | 1.834.284 | `EA1B0DC6F5CF6E595F6D9A19E7042F398999E0087CAEF1785F6E8FAC571B5F53` | Candidato a legislação; fonte canónica, artigos, vigência consolidada e direitos por rever. |
|
||||
| `BR-89-I-Serie-2017-06-08.pdf` | 9.456.358 | `11F0CAB15EB6E51010952203FFA24FDC533A24FD642E19525FE4F46B17A1F5E5` | Boletim da República; acto/artigos e relação com diplomas por identificar. |
|
||||
| `BR-248-I-Suplemento-1-2025.pdf` | 440.018 | `CCF2A8DEECA820F2DD076B4B2141B1EFE3F6A806568C3A587CA59A8E92F4C251` | Boletim da República; acto/artigos e relação com diplomas por identificar. |
|
||||
|
||||
## Exclusões e limites do inventário
|
||||
|
||||
- O anexo `Pasted text.txt` que acompanhou esta tarefa é uma especificação, não um documento de apoio para investidores.
|
||||
- `docs/investmoz/source-staging/` contém materiais de preparação e revisão; `pii-26-30-review-only.csv` identifica-se como material apenas de revisão e foi excluído da biblioteca pública.
|
||||
- `storage/app/public` não contém ficheiros documentais além do marcador `.gitignore`. O armazenamento privado contém backups e materiais de outras áreas; esses conteúdos não foram lidos nem copiados para esta biblioteca.
|
||||
- A pasta de topo `C:\Users\macbook\Documents` não apresentou ficheiros ao inventário directo. Outros caminhos externos não foram indicados, logo permanecem **por inventariar**.
|
||||
- Não foi encontrado um scanner antimalware operacional comum aos uploads. Os uploads existentes e os novos ficam privados/em quarentena; sem o controlo de segurança, não se promove o ficheiro a `active`/`public`.
|
||||
- O catálogo público activo está vazio. A criação de uma página navegável não comprova integração documental com conteúdo real.
|
||||
|
||||
## Later update — 5 October 2026
|
||||
|
||||
The inventory above records the state before the malware scanner was integrated. ClamAV 1.5.4 was subsequently installed locally, current signatures were confirmed, and a worker was exercised against the isolated PostgreSQL database. See `malware-scanning-2026-10-05.md`. The remote hosting scanner remains unconfigured. The candidate PDFs still lack complete validation of source, legal status, and publication rights.
|
||||
|
||||
## Official-source reconciliation — 5 October 2026
|
||||
|
||||
The INM catalogue confirms the identity of two useful candidates:
|
||||
|
||||
- `BR-89-I-Serie-2017-06-08.pdf` is associated with the official 8 June 2017 notice rectifying Law 13/2016 (CIVA), page 569 ([INM record](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-br-n%C2%BA-89-de-080617-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-569)). This is a rectification source, not a consolidated current CIVA text.
|
||||
- `BR-248-I-Suplemento-1-2025.pdf` corresponds by title/date to Supplement 1 of BR 248, published 29 December 2025 ([INM product](https://inm.gov.mz/pt-br/content/suplemento-n%C2%BA-1-de-291225-pag-2180-1-20-br-n%C2%BA-248-boletim-da-rep%C3%BAblica-i-serie)). INM lists Laws 7–12/2025, covering ICE, the Customs Tariff, ISPC, IVA, IRPS and IRPC.
|
||||
- `Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf` corresponds to the corrected second supplement to BR 250 ([INM record](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-2-de-281222-pag-2252-25-42-br-n%C2%BA-250-boletim-da)). INM explicitly says the Law 22/2022 version in the main issue is without effect and identifies the republication in Supplement 2 ([main BR notice](https://www.inm.gov.mz/pt-br/content/br-n%C2%BA-250-de-281222-boletim-da-rep%C3%BAblica-i-serie)). This candidate must be labelled as a 2022 historical amendment; later amendments include Laws 3/2025 and 10/2025.
|
||||
|
||||
Law 9/2022, article 7, excludes official legislative, administrative and judicial texts from copyright protection ([official text hosted by the Tribunal Supremo](https://ts.gov.mz/wp-content/uploads/2023/09/Lei-no-9-2022-de-22-de-Junho-Lei-dos-Direitos-do-Autor-e-Direitos-Conexos-e-revoga-a-Lei-no.-4-2001-de-27-de-Fevereiro.pdf)). That supports publication of the statutory text itself. The repository copies are facsimile PDFs, however, and their byte identity against the official downloads and any rights in the specific issue layout/compilation have not yet been confirmed. Retain each local file privately until its hash is compared with the official copy and its record clearly labels date, source, version and status. This is a per-file check; it does not suspend unrelated library records.
|
||||
|
||||
No candidate was inserted or published. The active database still lacks the catalogue and malware migrations, and the local `pg_dump` backup step was blocked by the execution policy. Official identity is corroborated at the catalogue level; local PDF byte provenance and public publication remain pending.
|
||||
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 93 KiB |
@@ -0,0 +1,48 @@
|
||||
# Incidente de esquema — biblioteca documental — 5 de Outubro de 2026
|
||||
|
||||
## Causa confirmada
|
||||
|
||||
A consulta de recursos essenciais em `PortalServicesController::resources()` corresponde ao modelo da biblioteca: a migração `2026_10_05_120000_extend_portal_document_catalogue` declara `rights_status` em `portal_resources` e `documents`. O código não está a usar um nome alternativo ou incorrecto. A base activa ainda não recebeu essa migração.
|
||||
|
||||
Leitura do esquema activo: PostgreSQL 17.11, base `investemoz`, host `127.0.0.1`, porta `5432`.
|
||||
|
||||
- `portal_resources`: 12 colunas. Tem `published`, `essential`, `legislation`, título/categoria/tópico, referência e auditoria básica; não tem `rights_status` nem os campos de metadados, revisão e relações da biblioteca.
|
||||
- `documents`: 19 colunas. Tem estado, classificação, hash, chave privada, MIME, versão e datas; não tem `rights_status`, `original_source` ou qualquer coluna `malware_*`.
|
||||
- `portal_resource_links`, `portal_resource_revisions` e `document_malware_scans` ainda não existem.
|
||||
- Ambas as migrações específicas da biblioteca estão `Pending`. Também existem seis migrações pendentes anteriores e não relacionadas; não foram executadas.
|
||||
- `portal_resources` tem zero linhas no relatório de contagens da base activa.
|
||||
|
||||
## Compatibilidade e protecções
|
||||
|
||||
A consulta continua a exigir publicação explícita, classificação pública, estado activo, direitos não restritos, análise antimalware `clean` e igualdade entre o hash guardado e o hash analisado. Nenhum destes filtros foi removido.
|
||||
|
||||
As migrações definem `unconfirmed` como valor inicial para direitos e `pending` para análise. Assim, dados antigos não passam automaticamente a autorizados, públicos ou limpos. O novo comando `php artisan portal:check-document-library-schema` verifica tabelas, colunas, migrações, valores predefinidos e coerência do hash de documentos `clean`; é só leitura e falha de forma explícita quando a estrutura está incompleta.
|
||||
|
||||
Erros SQL e de ligação recebidos por HTTP passam a apresentar 503 com mensagem genérica e referência. A excepção completa continua no registo interno. Não foi possível validar a apresentação no browser activo nesta execução.
|
||||
|
||||
## Alterações desta correcção
|
||||
|
||||
- `app/Console/Commands/CheckDocumentLibrarySchema.php`: verificação pré-activação da estrutura e dos valores predefinidos seguros.
|
||||
- `bootstrap/app.php` e `resources/views/errors/database-unavailable.blade.php`: ocultação de SQL, host, base e caminhos na resposta pública para erros SQL/de ligação.
|
||||
- `tests/Feature/DocumentLibrarySchemaCompatibilityTest.php` e `tests/Feature/DatabaseErrorRedactionTest.php`: regressão de compatibilidade e redacção.
|
||||
- `docs/investmoz/deployment.md`: procedimento para validar backup, executar apenas as duas migrações da biblioteca por ordem e confirmar compatibilidade antes da activação.
|
||||
|
||||
## Testes e limites da evidência
|
||||
|
||||
Executados na base isolada `investemoz_test` (`127.0.0.1:55441`):
|
||||
|
||||
- `php artisan test --filter='DocumentLibrarySchemaCompatibilityTest|DatabaseErrorRedactionTest'` — 5 testes, 21 asserções, aprovados.
|
||||
- `php artisan test --filter=PortalServicesTest` — 9 testes, 289 asserções, aprovados.
|
||||
|
||||
Executado na base activa, sem escrita: `php artisan portal:check-document-library-schema` terminou com falha esperada e listou as colunas/tabelas e migrações em falta, sem imprimir SQL, credenciais ou caminho interno.
|
||||
|
||||
A revisão automática bloqueou a criação do backup local por `pg_dump`; não foi criado backup. Portanto, nenhuma migração foi aplicada e os testes QA não são apresentados como prova de compatibilidade activa. A tentativa de abrir Edge headless para a captura activa também foi bloqueada pela política de execução. O percurso visual do Início, Documentos e Formulários e o download real continuam por demonstrar.
|
||||
|
||||
## Procedimento pendente
|
||||
|
||||
1. Criar e validar um backup recuperável numa sessão local autorizada.
|
||||
2. Confirmar outra vez o destino `investemoz` antes da escrita.
|
||||
3. Aplicar apenas `2026_10_05_120000_extend_portal_document_catalogue.php` e depois `2026_10_05_130000_add_document_malware_scanning.php`.
|
||||
4. Exigir sucesso de `php artisan portal:check-document-library-schema`.
|
||||
5. Testar no browser activo o Início e a biblioteca. O catálogo deve mostrar vazio enquanto não houver documentos com direitos, publicação e análise adequados.
|
||||
6. Quando existir documento autorizado, demonstrar pesquisa, download protegido e acesso no módulo associado. Não marcar documentos existentes como aprovados para preencher o catálogo.
|
||||
@@ -1,13 +1,15 @@
|
||||
{
|
||||
"proponent_type": {
|
||||
"step": 1,
|
||||
"pt": "Tipo de proponente",
|
||||
"en": "Applicant type",
|
||||
"pt": "Quem apresenta a oportunidade?",
|
||||
"en": "Who is presenting the opportunity?",
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"person": "Pessoa \/ Person",
|
||||
"organization": "Organização \/ Organization"
|
||||
"organization": "Empresa ou organização \/ Company or organization",
|
||||
"sole_trader": "Empresário em nome individual \/ Sole trader",
|
||||
"person": "Pessoa singular \/ Individual",
|
||||
"public_entity": "Entidade pública \/ Public entity"
|
||||
}
|
||||
},
|
||||
"proponent_name": {
|
||||
@@ -17,33 +19,51 @@
|
||||
"type": "text",
|
||||
"max": 200
|
||||
},
|
||||
"country": {
|
||||
"step": 1,
|
||||
"pt": "País de origem ou constituição (código ISO de duas letras)",
|
||||
"en": "Country of origin or incorporation (two-letter ISO code)",
|
||||
"type": "text",
|
||||
"max": 2
|
||||
},
|
||||
"tax_identifier": {
|
||||
"step": 1,
|
||||
"pt": "NUIT ou identificador",
|
||||
"en": "Tax identifier",
|
||||
"pt": "NUIT ou identificador (interno, quando aplicável)",
|
||||
"en": "NUIT or identifier (internal, when applicable)",
|
||||
"type": "text",
|
||||
"max": 50
|
||||
},
|
||||
"contact_name": {
|
||||
"step": 1,
|
||||
"pt": "Nome da pessoa de contacto",
|
||||
"en": "Contact person name",
|
||||
"type": "text",
|
||||
"max": 200
|
||||
},
|
||||
"contact_email": {
|
||||
"step": 1,
|
||||
"pt": "Email de contacto",
|
||||
"en": "Contact email",
|
||||
"pt": "Correio electrónico (indique email ou telefone)",
|
||||
"en": "Email (provide email or phone)",
|
||||
"type": "email",
|
||||
"max": 254
|
||||
},
|
||||
"contact_phone": {
|
||||
"step": 1,
|
||||
"pt": "Telefone",
|
||||
"en": "Phone",
|
||||
"pt": "Telefone (indique telefone ou email)",
|
||||
"en": "Phone (provide phone or email)",
|
||||
"type": "tel",
|
||||
"max": 40
|
||||
},
|
||||
"country": {
|
||||
"contact_preference": {
|
||||
"step": 1,
|
||||
"pt": "País (código de duas letras)",
|
||||
"en": "Country (two-letter code)",
|
||||
"type": "text",
|
||||
"max": 2
|
||||
"pt": "Preferência de contacto",
|
||||
"en": "Contact preference",
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"through_portal": "Receber pedidos através da InvestMoz",
|
||||
"approved_business_contact": "Mostrar contacto empresarial aprovado"
|
||||
}
|
||||
},
|
||||
"acting_capacity": {
|
||||
"step": 2,
|
||||
@@ -58,24 +78,58 @@
|
||||
},
|
||||
"declared_holder": {
|
||||
"step": 2,
|
||||
"pt": "Titular declarado",
|
||||
"en": "Declared holder",
|
||||
"pt": "Entidade ou pessoa representada",
|
||||
"en": "Entity or person represented",
|
||||
"type": "text",
|
||||
"max": 200
|
||||
},
|
||||
"mandate_reference": {
|
||||
"step": 2,
|
||||
"pt": "Referência do mandato",
|
||||
"en": "Mandate reference",
|
||||
"pt": "Referência do documento de autorização",
|
||||
"en": "Authorization document reference",
|
||||
"type": "text",
|
||||
"max": 500
|
||||
"max": 500,
|
||||
"when": {
|
||||
"acting_capacity": [
|
||||
"representative"
|
||||
]
|
||||
}
|
||||
},
|
||||
"mandate_document_reference": {
|
||||
"step": 2,
|
||||
"pt": "Referência interna do documento de autorização (não carregue aqui)",
|
||||
"en": "Internal authorization document reference (do not upload here)",
|
||||
"type": "text",
|
||||
"max": 500,
|
||||
"when": {
|
||||
"acting_capacity": [
|
||||
"representative"
|
||||
]
|
||||
}
|
||||
},
|
||||
"mandate_valid_until": {
|
||||
"step": 2,
|
||||
"pt": "Validade do mandato",
|
||||
"en": "Mandate expiry",
|
||||
"type": "date",
|
||||
"max": 10
|
||||
"max": 10,
|
||||
"when": {
|
||||
"acting_capacity": [
|
||||
"representative"
|
||||
]
|
||||
}
|
||||
},
|
||||
"disclosure_scope": {
|
||||
"step": 2,
|
||||
"pt": "Limites da autorização de divulgação",
|
||||
"en": "Limits of disclosure authorization",
|
||||
"type": "textarea",
|
||||
"max": 2000,
|
||||
"when": {
|
||||
"acting_capacity": [
|
||||
"representative"
|
||||
]
|
||||
}
|
||||
},
|
||||
"legitimacy_declaration": {
|
||||
"step": 2,
|
||||
@@ -95,13 +149,36 @@
|
||||
"type": "text",
|
||||
"max": 200
|
||||
},
|
||||
"opportunity_type": {
|
||||
"step": 3,
|
||||
"pt": "Tipo de oportunidade",
|
||||
"en": "Opportunity type",
|
||||
"type": "select",
|
||||
"max": 40,
|
||||
"options": {
|
||||
"investment_project": "Projecto de investimento",
|
||||
"company_sale": "Venda de negócio existente",
|
||||
"asset_sale": "Activo disponível",
|
||||
"business_partnership": "Parceria empresarial",
|
||||
"financing_request": "Procura de financiamento",
|
||||
"concession_opportunity": "Concessão",
|
||||
"supply_opportunity": "Oportunidade de fornecimento"
|
||||
}
|
||||
},
|
||||
"description": {
|
||||
"step": 3,
|
||||
"pt": "Descrição reservada",
|
||||
"en": "Private description",
|
||||
"pt": "Descrição resumida: o que está disponível, procura e condições principais",
|
||||
"en": "Summary: what is available, sought and key conditions",
|
||||
"type": "textarea",
|
||||
"max": 10000
|
||||
},
|
||||
"subsector_activity": {
|
||||
"step": 3,
|
||||
"pt": "Subsector e actividade (por designação)",
|
||||
"en": "Subsector and activity (by name)",
|
||||
"type": "text",
|
||||
"max": 500
|
||||
},
|
||||
"declared_reason": {
|
||||
"step": 3,
|
||||
"pt": "Motivo e objectivo",
|
||||
@@ -109,26 +186,108 @@
|
||||
"type": "textarea",
|
||||
"max": 2000
|
||||
},
|
||||
"project_stage": {
|
||||
"step": 3,
|
||||
"pt": "Situação do projecto ou negócio",
|
||||
"en": "Project or business status",
|
||||
"type": "select",
|
||||
"max": 40,
|
||||
"options": {
|
||||
"idea": "Ideia ou conceito",
|
||||
"study": "Em estudo",
|
||||
"preparation": "Em preparação",
|
||||
"implementation": "Em implementação",
|
||||
"operating": "Em funcionamento",
|
||||
"suspended": "Actividade suspensa",
|
||||
"other": "Outra situação"
|
||||
}
|
||||
},
|
||||
"project_stage_other": {
|
||||
"step": 3,
|
||||
"pt": "Especifique a situação",
|
||||
"en": "Specify the status",
|
||||
"type": "text",
|
||||
"max": 200,
|
||||
"when": {
|
||||
"project_stage": [
|
||||
"other"
|
||||
]
|
||||
}
|
||||
},
|
||||
"availability": {
|
||||
"step": 3,
|
||||
"pt": "Disponibilidade",
|
||||
"en": "Availability",
|
||||
"type": "select",
|
||||
"max": 40,
|
||||
"options": {
|
||||
"available": "Disponível",
|
||||
"from_date": "Disponível a partir de uma data",
|
||||
"negotiating": "Em negociação; aceita manifestações de interesse"
|
||||
}
|
||||
},
|
||||
"available_from": {
|
||||
"step": 3,
|
||||
"pt": "Disponível a partir de",
|
||||
"en": "Available from",
|
||||
"type": "date",
|
||||
"max": 10,
|
||||
"when": {
|
||||
"availability": [
|
||||
"from_date"
|
||||
]
|
||||
}
|
||||
},
|
||||
"valid_until": {
|
||||
"step": 3,
|
||||
"pt": "Validade declarada",
|
||||
"en": "Declared expiry",
|
||||
"pt": "Prazo para manifestações de interesse (opcional)",
|
||||
"en": "Interest deadline (optional)",
|
||||
"type": "date",
|
||||
"max": 10
|
||||
},
|
||||
"asking_value": {
|
||||
"step": 4,
|
||||
"pt": "Valor pedido",
|
||||
"en": "Asking value",
|
||||
"pt": "Valor",
|
||||
"en": "Value",
|
||||
"type": "decimal",
|
||||
"max": 24
|
||||
"max": 24,
|
||||
"when": {
|
||||
"value_status": [
|
||||
"defined",
|
||||
"indicative"
|
||||
]
|
||||
}
|
||||
},
|
||||
"currency": {
|
||||
"value_status": {
|
||||
"step": 4,
|
||||
"pt": "Moeda (código de três letras)",
|
||||
"en": "Currency (three-letter code)",
|
||||
"type": "text",
|
||||
"max": 3
|
||||
"pt": "O valor está definido?",
|
||||
"en": "Is the value defined?",
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"defined": "Sim",
|
||||
"indicative": "Valor indicativo",
|
||||
"consultation": "Sob consulta",
|
||||
"unknown": "Ainda não definido"
|
||||
}
|
||||
},
|
||||
"value_meaning": {
|
||||
"step": 4,
|
||||
"pt": "Significado do valor",
|
||||
"en": "Meaning of the value",
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"asking_price": "Preço pedido",
|
||||
"investment_estimate": "Investimento estimado",
|
||||
"financing_sought": "Financiamento procurado"
|
||||
},
|
||||
"when": {
|
||||
"value_status": [
|
||||
"defined",
|
||||
"indicative"
|
||||
]
|
||||
}
|
||||
},
|
||||
"value_nature": {
|
||||
"step": 4,
|
||||
@@ -137,9 +296,65 @@
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"asking": "Pedido \/ Asking",
|
||||
"indicative": "Indicativo \/ Indicative",
|
||||
"appraised": "Avaliado, sujeito a prova \/ Appraised, evidence required"
|
||||
"asking": "Pedido",
|
||||
"indicative": "Indicativo",
|
||||
"appraised": "Avaliado, sujeito a prova"
|
||||
},
|
||||
"when": {
|
||||
"value_status": [
|
||||
"defined",
|
||||
"indicative"
|
||||
]
|
||||
}
|
||||
},
|
||||
"currency": {
|
||||
"step": 4,
|
||||
"pt": "Moeda (código de três letras)",
|
||||
"en": "Currency (three-letter code)",
|
||||
"type": "text",
|
||||
"max": 3,
|
||||
"when": {
|
||||
"value_status": [
|
||||
"defined",
|
||||
"indicative"
|
||||
]
|
||||
}
|
||||
},
|
||||
"amount_secured": {
|
||||
"step": 4,
|
||||
"pt": "Montante assegurado (projectos)",
|
||||
"en": "Secured amount (projects)",
|
||||
"type": "decimal",
|
||||
"max": 24,
|
||||
"when": {
|
||||
"opportunity_type": [
|
||||
"investment_project"
|
||||
]
|
||||
}
|
||||
},
|
||||
"investment_total": {
|
||||
"step": 4,
|
||||
"pt": "Investimento total estimado (projectos)",
|
||||
"en": "Estimated total investment (projects)",
|
||||
"type": "decimal",
|
||||
"max": 24,
|
||||
"when": {
|
||||
"opportunity_type": [
|
||||
"investment_project"
|
||||
]
|
||||
}
|
||||
},
|
||||
"amount_sought": {
|
||||
"step": 4,
|
||||
"pt": "Montante de financiamento procurado",
|
||||
"en": "Financing sought",
|
||||
"type": "decimal",
|
||||
"max": 24,
|
||||
"when": {
|
||||
"opportunity_type": [
|
||||
"investment_project",
|
||||
"financing_request"
|
||||
]
|
||||
}
|
||||
},
|
||||
"equity_percentage": {
|
||||
@@ -156,13 +371,211 @@
|
||||
"type": "textarea",
|
||||
"max": 2000
|
||||
},
|
||||
"asset_deal_kind": {
|
||||
"step": 4,
|
||||
"pt": "Tipo de venda",
|
||||
"en": "Type of sale",
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"whole_business": "Venda total",
|
||||
"participation": "Participação",
|
||||
"assets": "Activos"
|
||||
},
|
||||
"when": {
|
||||
"opportunity_type": [
|
||||
"company_sale",
|
||||
"asset_sale"
|
||||
]
|
||||
}
|
||||
},
|
||||
"partnership_contribution": {
|
||||
"step": 4,
|
||||
"pt": "Contribuição pretendida",
|
||||
"en": "Contribution sought",
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"capital": "Capital",
|
||||
"technology": "Tecnologia",
|
||||
"management": "Gestão",
|
||||
"equipment": "Equipamento",
|
||||
"distribution": "Distribuição",
|
||||
"other": "Outra"
|
||||
},
|
||||
"when": {
|
||||
"opportunity_type": [
|
||||
"business_partnership"
|
||||
]
|
||||
}
|
||||
},
|
||||
"asset_modality": {
|
||||
"step": 4,
|
||||
"pt": "Modalidade do activo",
|
||||
"en": "Asset arrangement",
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"sale": "Venda",
|
||||
"lease": "Arrendamento",
|
||||
"other": "Outra"
|
||||
},
|
||||
"when": {
|
||||
"opportunity_type": [
|
||||
"asset_sale"
|
||||
]
|
||||
}
|
||||
},
|
||||
"concession_entity": {
|
||||
"step": 4,
|
||||
"pt": "Entidade responsável pela concessão",
|
||||
"en": "Concession authority",
|
||||
"type": "text",
|
||||
"max": 300,
|
||||
"when": {
|
||||
"opportunity_type": [
|
||||
"concession_opportunity"
|
||||
]
|
||||
}
|
||||
},
|
||||
"concession_reference": {
|
||||
"step": 4,
|
||||
"pt": "Referência oficial, procedimento e prazo",
|
||||
"en": "Official reference, procedure and deadline",
|
||||
"type": "textarea",
|
||||
"max": 2000,
|
||||
"when": {
|
||||
"opportunity_type": [
|
||||
"concession_opportunity"
|
||||
]
|
||||
}
|
||||
},
|
||||
"supply_description": {
|
||||
"step": 4,
|
||||
"pt": "Bem ou serviço, quantidade\/capacidade, destino e prazo",
|
||||
"en": "Good or service, quantity\/capacity, destination and timing",
|
||||
"type": "textarea",
|
||||
"max": 2000,
|
||||
"when": {
|
||||
"opportunity_type": [
|
||||
"supply_opportunity"
|
||||
]
|
||||
}
|
||||
},
|
||||
"conditions": {
|
||||
"step": 4,
|
||||
"pt": "Condições adicionais",
|
||||
"en": "Additional conditions",
|
||||
"type": "textarea",
|
||||
"max": 4000
|
||||
},
|
||||
"geography_scope": {
|
||||
"step": 5,
|
||||
"pt": "Âmbito geográfico",
|
||||
"en": "Geographic scope",
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"specific": "Localização específica",
|
||||
"multiple": "Várias localizações",
|
||||
"national": "Âmbito nacional",
|
||||
"digital": "Digital\/sem instalação definida"
|
||||
}
|
||||
},
|
||||
"province_id": {
|
||||
"step": 5,
|
||||
"pt": "Província ou Cidade de Maputo",
|
||||
"en": "Province or Maputo City",
|
||||
"type": "territory",
|
||||
"max": 36,
|
||||
"when": {
|
||||
"geography_scope": [
|
||||
"specific",
|
||||
"multiple"
|
||||
]
|
||||
}
|
||||
},
|
||||
"district_id": {
|
||||
"step": 5,
|
||||
"pt": "Distrito",
|
||||
"en": "District",
|
||||
"type": "territory",
|
||||
"max": 36,
|
||||
"when": {
|
||||
"geography_scope": [
|
||||
"specific",
|
||||
"multiple"
|
||||
]
|
||||
}
|
||||
},
|
||||
"admin_post_id": {
|
||||
"step": 5,
|
||||
"pt": "Posto administrativo",
|
||||
"en": "Administrative post",
|
||||
"type": "territory",
|
||||
"max": 36,
|
||||
"when": {
|
||||
"geography_scope": [
|
||||
"specific",
|
||||
"multiple"
|
||||
]
|
||||
}
|
||||
},
|
||||
"locality_id": {
|
||||
"step": 5,
|
||||
"pt": "Localidade",
|
||||
"en": "Locality",
|
||||
"type": "territory",
|
||||
"max": 36,
|
||||
"when": {
|
||||
"geography_scope": [
|
||||
"specific",
|
||||
"multiple"
|
||||
]
|
||||
}
|
||||
},
|
||||
"location_notes": {
|
||||
"step": 5,
|
||||
"pt": "Localização declarada (reservada)",
|
||||
"en": "Declared location (private)",
|
||||
"pt": "Endereço ou referência (interno)",
|
||||
"en": "Address or reference (internal)",
|
||||
"type": "textarea",
|
||||
"max": 2000
|
||||
},
|
||||
"location_unknown": {
|
||||
"step": 5,
|
||||
"pt": "Não conheço a localização exacta",
|
||||
"en": "I do not know the exact location",
|
||||
"type": "select",
|
||||
"max": 3,
|
||||
"options": {
|
||||
"yes": "Sim",
|
||||
"no": "Não"
|
||||
},
|
||||
"when": {
|
||||
"geography_scope": [
|
||||
"specific",
|
||||
"multiple"
|
||||
]
|
||||
}
|
||||
},
|
||||
"disclosure_precision": {
|
||||
"step": 5,
|
||||
"pt": "Precisão de divulgação",
|
||||
"en": "Disclosure precision",
|
||||
"type": "select",
|
||||
"max": 30,
|
||||
"options": {
|
||||
"exact": "Localização exacta (sujeita a aprovação)",
|
||||
"approximate": "Localização aproximada",
|
||||
"administrative": "Apenas território administrativo"
|
||||
},
|
||||
"when": {
|
||||
"geography_scope": [
|
||||
"specific",
|
||||
"multiple"
|
||||
]
|
||||
}
|
||||
},
|
||||
"asset_notes": {
|
||||
"step": 6,
|
||||
"pt": "Resumo dos activos e direitos declarados",
|
||||
@@ -177,11 +590,83 @@
|
||||
"type": "textarea",
|
||||
"max": 2000
|
||||
},
|
||||
"source_provider": {
|
||||
"step": 7,
|
||||
"pt": "Quem forneceu os dados?",
|
||||
"en": "Who supplied the information?",
|
||||
"type": "text",
|
||||
"max": 500
|
||||
},
|
||||
"source_date": {
|
||||
"step": 7,
|
||||
"pt": "Data da fonte\/informação",
|
||||
"en": "Source\/information date",
|
||||
"type": "date",
|
||||
"max": 10
|
||||
},
|
||||
"official_source_entity": {
|
||||
"step": 7,
|
||||
"pt": "Entidade da fonte oficial (se existir)",
|
||||
"en": "Official source authority (if any)",
|
||||
"type": "text",
|
||||
"max": 500
|
||||
},
|
||||
"official_source_document": {
|
||||
"step": 7,
|
||||
"pt": "Documento oficial associado",
|
||||
"en": "Related official document",
|
||||
"type": "text",
|
||||
"max": 500
|
||||
},
|
||||
"official_source_url": {
|
||||
"step": 7,
|
||||
"pt": "Ligação da fonte oficial",
|
||||
"en": "Official source link",
|
||||
"type": "url",
|
||||
"max": 2000
|
||||
},
|
||||
"official_source_period": {
|
||||
"step": 7,
|
||||
"pt": "Período da fonte oficial",
|
||||
"en": "Official source period",
|
||||
"type": "text",
|
||||
"max": 200
|
||||
},
|
||||
"document_reference": {
|
||||
"step": 7,
|
||||
"pt": "Referências documentais (não são ficheiros validados)",
|
||||
"en": "Document references (not validated files)",
|
||||
"type": "textarea",
|
||||
"max": 2000
|
||||
},
|
||||
"confirm_information": {
|
||||
"step": 8,
|
||||
"pt": "Confirmo que a informação corresponde ao que conheço e identifiquei estimativas ou pendências.",
|
||||
"en": "I confirm the information reflects what I know and identify estimates or pending items.",
|
||||
"type": "checkbox",
|
||||
"max": 3,
|
||||
"options": {
|
||||
"yes": "yes"
|
||||
}
|
||||
},
|
||||
"confirm_disclosure_authority": {
|
||||
"step": 8,
|
||||
"pt": "Confirmo que tenho autorização para apresentar a oportunidade e divulgar os conteúdos seleccionados.",
|
||||
"en": "I confirm I am authorized to submit the opportunity and disclose selected content.",
|
||||
"type": "checkbox",
|
||||
"max": 3,
|
||||
"options": {
|
||||
"yes": "yes"
|
||||
}
|
||||
},
|
||||
"confirm_no_publication_guarantee": {
|
||||
"step": 8,
|
||||
"pt": "Compreendo que a submissão não constitui publicação, aprovação oficial ou garantia de investimento.",
|
||||
"en": "I understand submission is not publication, official approval or an investment guarantee.",
|
||||
"type": "checkbox",
|
||||
"max": 3,
|
||||
"options": {
|
||||
"yes": "yes"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,3 +41,32 @@ npm.cmd run build
|
||||
```
|
||||
|
||||
Em ambiente QA isolado (`APP_ENV=testing`, base `portal_services_test`, porta 55441): `php tools/business-wizard-browser-seed.php`, seguido de `node tools/business-wizard-browser.mjs`, com servidor QA 18027 e navegador CDP 9224. As fixtures sintéticas ficam apenas nessa base de teste.
|
||||
|
||||
## Revisão da especificação do formulário de oportunidades — 02/10/2026
|
||||
|
||||
- O cadastro continua em sessão autenticada em `/investidor/negocios`, com classificação reservada. Não é uma submissão pública anónima e não publica automaticamente.
|
||||
- O wizard `wizard_version=2` apresenta os sete tipos pedidos, recolhe proponente/representação e fonte, mostra dados de negócio por tipo, disponibilidade, estado de valor e três confirmações separadas. Rascunho/retoma permanecem no armazenamento cifrado já existente. O contrato legado v1 continua com validação própria; não se reescrevem rascunhos históricos.
|
||||
- A nova migration aditiva `2026_10_02_160000_extend_existing_business_opportunity_types.php` estende o CHECK de modalidades sem editar migration anterior. Recusa migrar se não localizar exactamente uma constraint da modalidade. A reversão recusa remover os valores quando existirem registos que os usam. **Migration não executada nesta continuação.**
|
||||
- Localização específica/múltipla usa dropdowns territoriais em cascata da referência pública existente e valida a hierarquia na submissão. Os IDs ficam no payload cifrado; ainda não criam relação espacial canónica para a oportunidade, não há marcador de mapa nem múltiplas localizações estruturadas. Subsector/actividade é texto pesquisável por designação, sem código obrigatório.
|
||||
- Recursos tipados aceitam estado (disponível, contratado, previsto ou por confirmar) e data da fonte. Referências documentais continuam referências, não upload. Anexos classificados, scanner, classificação individual de conteúdo público/interno/confidencial, parque/cluster/corredor/ZEE/ZFI e projecto âncora continuam pendentes.
|
||||
- Proponente existente pode ser declarado por nome, mas não há selector de CRM/cadastro sem duplicação. A escolha de contacto empresarial aprovado é uma preferência declarada; não é autorização automática de publicação. A projecção pública mantém contactos pessoais fora da allowlist.
|
||||
- Não foi implementado pedido pós-publicação para suspensão/encerramento, alerta periódico de disponibilidade, nem fluxo MNE completo de consulta e resposta. Alterações materiais continuam limitadas a draft/pedido de informação e precisam de nova submissão/revisão.
|
||||
- `docs/investmoz/existing-business/form-schema.json` e `docs/investmoz/existing-business/openapi.json` foram regenerados pelos exportadores existentes. `npm.cmd run types:check`, `php -l` nos seis ficheiros PHP alterados e `git diff --check` passaram. Não executei testes PHPUnit nem a migration.
|
||||
- Gate proposto: **parcial, apenas teste privado após aplicar e validar a migration num banco isolado**. Sem uploads/revisão de anexos e consentimentos de divulgação por item, não avançar para publicação de oportunidades reais.
|
||||
|
||||
## Verificação do formulário recebido — 03/10/2026
|
||||
|
||||
- A proposta foi comparada com o wizard v2. Já existem as oito etapas, sete tipos de oportunidade, campos por modalidade, declaração de proponente/representação, contacto por email ou telefone, hierarquia territorial dependente, resumo editável e submissão reservada para revisão. O marketplace público usa uma allowlist e não recebe contactos pessoais nem o payload cifrado.
|
||||
- Corrigida a submissão com `valid_until` vencido em payloads sem `wizard_version`: o prazo continua opcional, mas qualquer prazo fornecido passa a ser validado como não vencido. A versão 1 continua a exigir prazo conforme o contrato legado; as versões seguintes aceitam prazo omitido.
|
||||
- Permanecem por implementar: selector de proponente/cadastro sem duplicação; múltiplas localizações estruturadas, coordenadas e precisão no mapa; relações económicas; upload com antivírus e classificação individual de anexos; selecção granular dos campos publicáveis; e fluxo para actualizar disponibilidade, suspender/encerrar e confirmar disponibilidade periodicamente. Referências documentais continuam a não ser anexos validados.
|
||||
- Evidência executada nesta verificação: `php -l app/Services/ExistingBusinessIntake.php`, `php vendor/bin/pint --test app/Services/ExistingBusinessIntake.php` e o teste dirigido `ExistingBusinessIntakeTest::test_arbitrary_states_and_incomplete_or_expired_submission_are_rejected` passaram (1 teste, 5 asserções) no PostgreSQL isolado em 55441. O cluster de QA foi parado e a porta confirmou-se fechada; não usei a base da aplicação. Restantes testes do wizard permanecem por executar nesta verificação.
|
||||
|
||||
- **Pesquisa de sector:** o campo do passo 3 agora filtra a taxonomia activa por designação, sem perder a selecção actual do rascunho. Esta melhoria não altera a API nem o armazenamento. Continuam pendentes o proponente associado a cadastro existente sem duplicação, localizações múltiplas/georreferenciadas, relações económicas estruturadas, anexos com scanner e consentimento individual de divulgação, e ciclo de vida pós-publicação.
|
||||
|
||||
### Localizações administrativas múltiplas — 2026-10-03
|
||||
|
||||
- O rascunho privado agora admite 2–20 percursos administrativos, guardados em `payload.locations_json` dentro do payload já cifrado. O cliente limpa selecções descendentes ao mudar um nível; o servidor valida UUID, hierarquia na referência pública, mínimo/máximo e percursos repetidos ou sobrepostos. Não são recolhidas nem inventadas coordenadas.
|
||||
- A resposta de leitura/gravação resolve os nomes dos percursos exclusivamente a partir da referência territorial pública. O resumo mostra os nomes depois de guardar. `wizard_version=2` consta do contrato OpenAPI; a rota legada conserva validação própria.
|
||||
- Ficheiros desta tranche: `BusinessFormSchema.php`, `InvestmentGeography.php`, `ExistingBusinessController.php`, `business-locations.ts`, `business-wizard.tsx`, `business-types.ts`, `existing-business-openapi.mjs`, `ExistingBusinessWizardTest.php` e `business-locations.test.mjs`.
|
||||
- Evidência: PHP 8.5.11 e PostgreSQL 17 descartável na porta 55441, migrations aplicadas apenas na base temporária; `ExistingBusinessWizardTest` 3/3, 49 assertions; testes frontend da localização 3/3; TypeScript, Pint dirigido, PHP lint e `git diff --check` passaram. O listener preexistente em 5432 não foi utilizado. Cluster parado; os ficheiros de dados QA permanecem no directório temporário `%TEMP%\investmoz-stage-multiloc` porque a limpeza automática foi bloqueada pelo executor.
|
||||
- Sem migration nem alteração de esquema persistente. Rollback: reverter os trechos acima e remover os dois testes/helpers novos; não há dados existentes a migrar. Permanecem pendentes mapa/coordenadas, relação territorial canónica e associação a parques/zonas; esta entrega não autoriza publicação de oportunidade.
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
# Correcção e integração funcional — InvestMoz
|
||||
|
||||
Data: 04/10/2026
|
||||
Ambiente: portal local em `http://127.0.0.1:8000`, PostgreSQL activo do Laravel.
|
||||
|
||||
## Resultado
|
||||
|
||||
Estado proposto: **parcial — pesquisa territorial corrigida e percursos públicos ajustados; não declarar a etapa integral concluída**.
|
||||
|
||||
### Pesquisa por cluster
|
||||
|
||||
A consulta não usava nomes de campos inventados. `InvestmentPortfolioController::currentRelation()` filtra relações documentais pelos campos `validation_status`, `valid_from` e `valid_until`, que são necessários para excluir relações não validadas ou fora de vigência. O esquema real não tinha esses campos porque a migration aditiva `2026_10_03_180000_govern_investment_structure_relations` estava pendente.
|
||||
|
||||
Antes da alteração estrutural foi criado um arquivo PostgreSQL custom fora do repositório: `%LOCALAPPDATA%\InvestMoz\backups\investmoz-before-structure-relations-20261004.dump`. O catálogo foi lido por `pg_restore --list`: 2.155 entradas, 1.421.544 bytes, SHA-256 `70a30878d3875c844995993f7c66276e0956024566e6c3ca69282c22f2af8044`. A verificação do catálogo confirma que o arquivo é reconhecível pelo `pg_restore`; não foi feito ensaio de restauro numa base descartável.
|
||||
|
||||
Foi aplicada **apenas** essa migration. As três tabelas cobertas são `cluster_projects`, `corridor_projects` e `corridor_clusters`. Os campos de associação foram acrescentados com estado inicial `pending`. A inspecção após a migration encontrou 20 relações `corridor_clusters`, todas `pending`; nenhuma foi aprovada ou alterada em massa. Assim, localização territorial, associação económica, validação documental e vigência continuam conceitos separados. Dossiers públicos de cluster continuam visíveis pelo seu próprio cadastro; relações não validadas não passam a relações oficiais.
|
||||
|
||||
### Catálogos e navegação
|
||||
|
||||
- O menu público agrupa clusters, corredores, ZEE/ZFI/parques, projectos âncora e oportunidades/negócios sob um único grupo, mantendo os URLs existentes e os respectivos redireccionamentos.
|
||||
- O catálogo de investimento ganhou ligações directas para os catálogos de zonas, parques, dossiers âncora e negócios publicados; mantém os resultados publicados e uma mensagem de vazio com alternativas.
|
||||
- A lista de dossiers territoriais agora pesquisa por província, distrito, posto administrativo e localidade, além de texto e categoria; a opção territorial filtra os registos ligados a entidades nessa área.
|
||||
- Foi corrigido um erro descoberto pelo browser em `/negocios`: a página tentava iterar `results.links` como array, mas a Resource Collection do Laravel fornece os links de paginação em `results.meta.links`. O componente agora lê a estrutura real e mantém compatibilidade com uma lista directa.
|
||||
- A ficha pública de projecto âncora mostra estado, orçamento e calendário apenas se existirem num registo elegível para publicação; quando o registo vinculado permanece em rascunho, informa que o estado não está confirmado. Em ambos os casos, identifica a fonte do dossier e não sugere concurso aberto ou disponibilidade imediata.
|
||||
- A acção de uma ficha territorial pede login a visitantes anónimos. Para o titular autenticado, explica e confirma a criação de uma manifestação privada ligada ao dossier; rascunhos anteriores do próprio utilizador são listados para continuar ou criar outra manifestação sem os fundir. O dossier-fonte não é copiado nem publicado pelo investidor.
|
||||
|
||||
### “Como investir”
|
||||
|
||||
A página agora oferece os percursos “Tenho um projecto definido” e “Tenho uma ideia”. Actividade, maturidade e localização em vista são opcionais e adaptam o texto nesta sessão; o componente não envia nem guarda esses campos. Cada etapa mostra objectivo, informação, documentos quando aplicáveis, fonte, resultado esperado e acção seguinte. O percurso da ideia cobre ideia, mercado, projecto/localização, recursos/financiamento, formalização, implementação e acompanhamento. O percurso do investidor separa simulação fiscal de análise financeira, não presume incentivos e não bloqueia a exploração por falta de documentos ou empresa constituída.
|
||||
|
||||
## Evidência
|
||||
|
||||
- Browser Chromium (Playwright), desktop e viewport móvel de 390 × 844:
|
||||
- `/oportunidades`: HTTP 200, 6 oportunidades publicadas no ambiente;
|
||||
- `/carteira?kind=cluster`: HTTP 200, 8 dossiers, abertura de ficha sem erro SQL;
|
||||
- filtros legados `/clusters`, `/corredores` e `/projectos-ancora` redireccionam correctamente; a selecção de uma província aplicou o filtro. A província escolhida não tinha dossiers de cluster publicados e mostrou o estado vazio;
|
||||
- pesquisa deliberadamente sem correspondências: estado vazio útil;
|
||||
- `/carteira?kind=project`: HTTP 200, 15 dossiers; a ficha informa quando o estado não está confirmado e não sugere concurso;
|
||||
- `/zonas?category=zee`: HTTP 200, 0 registos publicados, sem dados demonstrativos;
|
||||
- `/negocios`: HTTP 200, 0 anúncios, sem erro React após corrigir a paginação;
|
||||
- `/como-investir`: ambos os percursos, selecção da ideia e contexto de actividade renderizam;
|
||||
- menu móvel expande, foco por teclado avança e não foram observados erros JavaScript.
|
||||
- Evidência automatizada: [JSON do browser](pilot/investmoz-catalogue-guide-browser-2026-10-04.json) e [captura móvel](pilot/investmoz-guide-mobile-2026-10-04.png).
|
||||
- `npm.cmd run types:check`: passou.
|
||||
- `npm.cmd run build`: passou. Avisos: dependência opcional `fontaine` ausente e chunk `services` acima de 500 kB.
|
||||
- `node --test tests/frontend/*.test.mjs`: 139 passaram, 0 falharam.
|
||||
- `php -l app/Http/Controllers/InvestmentPortfolioController.php`: passou.
|
||||
- `php artisan migrate --path=database/migrations/2026_10_03_180000_govern_investment_structure_relations.php --force --no-interaction`: migration aplicada.
|
||||
|
||||
## Resultados do seguimento (04/10/2026)
|
||||
|
||||
- Base de teste criada em PostgreSQL isolado; a base preexistente `investmoz_test` (53 MB) foi preservada. A suite completa `php artisan test` passou: **261 testes, 2.687 asserções, 0 falhas**. O filtro `InvestmentPortfolioTest|InvestmentStructureTest|InvestmentZoneTest` passou: **20 testes, 353 asserções**.
|
||||
- Dois testes de rollback manual foram ajustados para reverter e reaplicar a migration de continuidade antes da fundação de negócio. Um novo teste verifica autenticação, propriedade, isolamento do rascunho e que a criação não altera/publica o dossier.
|
||||
- O backup custom foi restaurado com `pg_restore --exit-on-error --no-owner --no-acl` na base temporária `investmoz_restore_verify_20261004`: 134 tabelas e 20 relações `corridor_clusters`. O backup é anterior à migration aditiva; a ausência dos campos novos foi confirmada e era esperada. Bases temporárias de teste/restauro foram removidas depois; o backup externo de rollback foi preservado.
|
||||
- Browser autenticado em servidor local na porta 8011 e base sintética isolada: login, dossier existente e rascunho aparecem; “Continuar rascunho” abre o mesmo ID. Cancelar a confirmação de uma nova manifestação mantém a ficha, não envia POST e não duplica o rascunho (contagem permaneceu 1). Evidência: [JSON](pilot/private-dossier-association-browser-2026-10-04.json) e [captura](pilot/private-dossier-association-browser-2026-10-04.png). O teste PHP confirma que outra conta recebe 404 ao abrir o rascunho.
|
||||
- Fluxo de zona foi testado na suite com fixtures: criar rascunho, anexar fonte, revisão independente, publicar e pesquisar. Na base activa há **0 zonas publicadas e 0 fontes legais validadas/vigentes**; o ensaio não representa uma zona real.
|
||||
- No catálogo real carregado, há seis oportunidades provenientes do `OpportunitySeeder`, todas sem `last_validated_at`, e zero anúncios de negócio. Filtros por Nampula e agronegócio devolveram um cartão cada; o CTA anónimo encaminha para login. A origem seed não prova autorização comercial. O catálogo e detalhe agora avisam quando a data de validação documental não está registada. Evidência: [JSON](pilot/authorized-opportunity-filter-browser-2026-10-04.json).
|
||||
- `npm.cmd run types:check`, `npm.cmd run build` e `node --test tests/frontend/*.test.mjs`: passaram (139/139). Avisos de build: dependência opcional `fontaine` ausente e chunk `services` acima de 500 kB.
|
||||
- Os resultados e decisões de fonte para as 50 relações, 15 projectos âncora e catálogos constam em [revisão documental](catalogue-review-2026-10-04.md).
|
||||
## Pendências e limites
|
||||
|
||||
1. **50 relações candidatas:** falta atribuir revisor interno e registar fonte/evidência individual com vigência. A decisão pendente é a natureza de cada ligação (oficial, influência, proximidade, potencial, histórica) ou remoção. Não se exige certificador externo; relações sem prova ficam fora de pesquisas oficiais. Os catálogos e fichas continuam acessíveis.
|
||||
2. **Projectos âncora:** falta fonte primária/estado actual por projecto e decisão de publicação após confronto documental. Não inferir concurso, execução, calendário ou orçamento.
|
||||
3. **Zonas:** o percurso técnico foi demonstrado com fixtures isoladas; falta fonte oficial validada e registo real autorizado para ensaio browser. Há 0 zonas publicadas e 0 fontes válidas na base activa.
|
||||
4. **Negócios e oportunidades:** os seis cartões disponíveis são seeds sem data de validação; o catálogo de negócios tem 0 anúncios. Falta ao menos um registo autorizado com fonte e data para verificar anúncio e pretensão real. O catálogo continua consultável com aviso; não há confirmação de oferta.
|
||||
5. **ZFE:** a sigla não tem definição/fonte encontrada; pedir a referência original antes de criar categoria.
|
||||
6. **Dispositivo físico:** falta ensaio num telemóvel físico; viewport Chromium não substitui compatibilidade real.
|
||||
## Diff lógico nesta entrega
|
||||
|
||||
- `database/migrations/2026_10_03_180000_govern_investment_structure_relations.php`: migration aditiva pendente executada nas três tabelas; não foi editada.
|
||||
- `resources/js/layouts/portal-navigation.tsx`: agrupamento dos catálogos e link para negócios publicados.
|
||||
- `resources/js/pages/investment/catalogue.tsx`: atalhos territoriais/económicos e limites dos anúncios privados.
|
||||
- `resources/js/pages/investment/business-marketplace.tsx`: leitura correcta da paginação da Resource Collection e mensagem de contagem.
|
||||
- `app/Http/Controllers/InvestmentPortfolioController.php`, `resources/js/pages/portfolio/show.tsx`: dados registados de projecto âncora, aviso sobre concursos e ligação confirmada, privada e sem fusão ao dossier-fonte.
|
||||
- `resources/js/pages/portfolio/index.tsx`: vazio com alternativas e distinção de catálogo.
|
||||
- `resources/js/pages/portal/services.tsx`: guia com dois percursos e contexto opcional.
|
||||
- `resources/js/pages/investment/shared.tsx`, `resources/js/pages/investment/catalogue.tsx`, `resources/js/pages/investment/detail.tsx`: aviso quando não há data de validação documental registada.
|
||||
- `tests/Feature/InvestmentPortfolioTest.php`: autenticação, rascunho privado, ownership e preservação do dossier; o browser isolado cobre o cancelamento. `tests/Feature/InvestmentZoneTest.php` e `tests/Feature/ExistingBusinessFoundationTest.php`: ordem de rollback alinhada com a migration de continuidade.
|
||||
- `tools/investmoz-authorized-catalogue-review-browser.mjs`, `tools/investmoz-private-association-browser.mjs`, `docs/investmoz/pilot/*`: filtros, privacidade e cancelamento autenticado com fixtures temporárias; scripts não criaram conteúdo na base activa.
|
||||
|
||||
## Rollback
|
||||
|
||||
- Código: reverter apenas as alterações listadas nesta entrega, preservando os outros ficheiros modificados preexistentes.
|
||||
- Migration: após rever se algum registo adquiriu metadados de validação, executar `php artisan migrate:rollback --path=database/migrations/2026_10_03_180000_govern_investment_structure_relations.php`. O `down()` bloqueia se houver relações com metadados governados. Se a migration não puder ser revertida, restaurar o backup verificado para uma instância aprovada após ensaio; não executar `migrate:fresh`, reset ou reconstrução da base.
|
||||
|
||||
## Gate
|
||||
|
||||
**Proposta: pendente com decisões delimitadas, sem bloquear o portal globalmente.** A associação privada passou no teste browser autenticado e no teste PHP. As decisões humanas em falta são: rever os 50 vínculos com fonte/evidência; confirmar documentalmente os 15 projectos; fornecer fonte legal e registo real de zona; fornecer anúncios autorizados para ensaiar uma pretensão real; esclarecer ZFE; realizar ensaio num telemóvel físico. Os percursos públicos já verificados continuam disponíveis com os avisos registados.
|
||||
@@ -0,0 +1,68 @@
|
||||
# Terra e DUAT — implementação técnica e limites
|
||||
|
||||
## Estado
|
||||
|
||||
Implementação interna preparada; não activar como checklist jurídico nem como canal oficial de submissão. A Lei de Terras, o regulamento aplicável, formulários oficiais e procedimentos locais ainda não foram validados em cópias legíveis. O inventário de ficheiros disponíveis e hashes está em [source-inventory.md](source-inventory.md).
|
||||
|
||||
O confronto com o prompt consolidado está detalhado em [requirement-traceability.md](requirement-traceability.md). A triagem legislativa está em [legal-source-review-2026-10-03.md](legal-source-review-2026-10-03.md). A checklist jurídica permanece bloqueada até revisão do Boletim da República e aprovação competente. O pedido de apoio aceita email ou telefone: a migration aditiva permite `interest_requests.email = NULL`, sem email fictício. Integrações downstream que exijam email precisam de validação operacional.
|
||||
|
||||
## Funcionalidade incluída
|
||||
|
||||
- Guia público, modelo em branco imprimível e fluxo autenticado de rascunho privado.
|
||||
- Formulário progressivo com dados do requerente, localização por selecção territorial publicada, uso e situação declarados, antecedentes, plano facultativo de exploração, preparação/informação sobre consulta e estado comunicado pelo próprio requerente.
|
||||
- Referência interna e versões optimistas; cada alteração guarda snapshot cifrado e evento sem conteúdo pessoal.
|
||||
- Pedido de apoio encaminhado ao CRM `InterestSubmission`, com consentimento, chave idempotente por caso, recibo interno e evento outbox. Um contacto utilizável (email ou telefone) é aceite; a coluna email foi tornada anulável por migration aditiva e reversível com guarda para preservar pedidos telefónicos.
|
||||
- Acompanhamento e vista de gestão com estados internos. “Encaminhamento preparado” não confirma envio nem recepção por órgão público.
|
||||
- Cópia preenchida é HTML imprimível/guardar como PDF pelo navegador; não é um PDF oficial preenchível.
|
||||
- Ficheiros privados limitados a PDF/JPG/PNG e 10 MB. Sem antivírus configurado, ficam em quarentena e não são descarregáveis.
|
||||
|
||||
## Limites funcionais e jurídicos
|
||||
|
||||
- O selector territorial identifica apenas entradas do catálogo público. Não valida cadastro, limites, titularidade, disponibilidade ou direito.
|
||||
- Consulta comunitária e dados associados são informação declarada/preparatória; a aplicação não certifica convocatória, presença, acta, consentimento ou suficiência legal.
|
||||
- Não há submissão electrónica, pagamento de taxas, consulta a processos governamentais nem integração com órgãos públicos.
|
||||
- Os scans em `Scan/Terras` são imagens sem OCR pesquisável. `DUAT.docx` estava bloqueado por outro processo; não foi contornado. Os originais não foram alterados. Conteúdo exige OCR/abertura autorizada e revisão humana.
|
||||
- Sem publicação de requisitos legais, prazos, elegibilidade, taxas ou promessa de emissão.
|
||||
|
||||
## Confronto com o prompt consolidado
|
||||
|
||||
- Percursos, dados condicionais, múltiplas parcelas, plano facultativo, consulta preparatória e acompanhamento interno estão representados no formulário existente.
|
||||
- As versões em branco e preenchida são páginas imprimíveis. Não são chamadas oficiais nem afirmam recepção pela autoridade. A cópia preenchida reflecte os dados guardados e a versão interna; não tem assinatura simulada.
|
||||
- A checklist por modalidade/jurisdição/fase não foi activada: os scans ainda não foram lidos e fontes legais integrais não foram reconciliadas. Não substituir esta lacuna por itens presumidos.
|
||||
- O requisito de contacto “email ou telefone” está coberto no intake local. Consumidores, notificações e exports que não tolerem email nulo ainda exigem verificação antes de operar com pedidos exclusivamente telefónicos.
|
||||
- Antimalware continua ausente; uploads permanecem em quarentena sem libertação automática.
|
||||
|
||||
## Ficheiros principais
|
||||
|
||||
- `routes/land-assistance.php`, incluído em `routes/web.php`.
|
||||
- `app/Http/Controllers/LandAssistanceController.php`
|
||||
- `app/Http/Requests/StoreLandAssistanceCaseRequest.php`
|
||||
- `app/Models/LandAssistanceCase.php`
|
||||
- `database/migrations/2026_10_03_200000_create_land_assistance_cases.php`
|
||||
- `resources/js/pages/land-assistance/` e `resources/js/layouts/portal-navigation.tsx`
|
||||
- `docs/investmoz/land-assistance/source-inventory.md`
|
||||
- `docs/investmoz/land-assistance/requirement-traceability.md`
|
||||
- `tests/Feature/LandAssistanceTest.php`
|
||||
|
||||
## Verificações executadas
|
||||
|
||||
- PHP 8.5.11: lint sintáctico dos três ficheiros PHP principais e do teste.
|
||||
- `npm.cmd run types:check`: TypeScript passou.
|
||||
- `php artisan route:list --path=terra-duat`: 16 rotas registadas.
|
||||
- `php artisan test --filter=LandAssistanceTest`: 6/6 testes, 46 asserções, em PostgreSQL 17 QA descartável na porta 55441; a suite PHP integral passou 253/253 (2.590 asserções) nesse ambiente. Nenhuma migration foi aplicada à base operacional; a porta 5432 não foi usada.
|
||||
|
||||
## Riscos e pendências
|
||||
|
||||
1. Completar confronto artigo a artigo com Boletins da República integrais; registar diploma, artigo, vigência, URL/cópia e revisão jurídica antes de transformar qualquer item em requisito executável.
|
||||
2. Identificar e revisar por OCR os sete scans, em cópias de trabalho, sem substituir ou publicar os originais.
|
||||
3. Configurar serviço antivírus/quarentena com estados, auditoria e política de retenção antes de permitir download de uploads.
|
||||
4. Fazer teste de navegador de passos condicionais, seletores em cascata, gravação/retoma, impressão e permissões de gestão; a evidência automatizada específica desta interface ainda não está registada.
|
||||
5. Confirmar política de retenção/eliminação de dados pessoais e tratamento de dados sensíveis de comunidade/ocupantes.
|
||||
|
||||
## Reversão
|
||||
|
||||
A migration tem `down()` protegido: recusa eliminar as tabelas quando há registos. Para reversão depois de uso, preservar exportação cifrada e referências CRM, validar retenção/apagamento, separar/arquivar os registos e só então planear reversão. Não apagar tabelas com casos activos. As rotas/UI podem ser desactivadas por remoção do `require` em `routes/web.php` e do link de navegação, mantendo dados intactos.
|
||||
|
||||
## Gate proposto
|
||||
|
||||
`PENDENTE — revisão humana`. Fluxo interno implementado; integração de CRM e controles técnicos preparados. Gate público para requisitos legais, checklist e submissão oficial não satisfeito.
|
||||
@@ -0,0 +1,50 @@
|
||||
# Triagem de fontes legais — Terra e DUAT
|
||||
|
||||
**Data da pesquisa:** 2026-10-03
|
||||
**Estado:** preliminar; não é parecer jurídico nem aprovação de requisitos executáveis.
|
||||
|
||||
## Resultado que afecta o produto
|
||||
|
||||
O acervo disponível permite identificar diplomas e pontos de revisão, mas não aprova uma checklist documental, prazo, taxa, competência de decisão ou elegibilidade no formulário. A página do Parlamento consultada classifica a revisão da Lei de Terras como **proposta** e publica um texto de proposta separado. O comunicado governamental de 28-10-2025 diz que a proposta foi aprovada pelo Conselho de Ministros para ser submetida à Assembleia da República; isso, por si só, não é promulgação nem vigência. Nesta pesquisa dirigida não foi encontrada publicação da nova Lei no Boletim da República. O texto proposto permanece inactivo no InvestMoz.
|
||||
|
||||
## Matriz de fontes e efeitos
|
||||
|
||||
| Matéria | Diploma ou indicação | Fonte consultada e qualidade | Vigência/estado nesta triagem | Área do produto | Teste/controlo | Aprovação |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| Lei de Terras | Lei n.º 19/97, de 1 de Outubro; a reprodução consultada contém, entre outros, arts. 12–15 (aquisição, titulação, registo e prova), art. 19 (plano de exploração) e art. 24 (participação comunitária) | PDF “Lei de terra” na página normativa do PDUL, programa governamental. É reprodução útil para localizar dispositivos, ainda sem confronto página a página com o BR | Lei-base histórica identificada. Consolidação/alterações e vigência artigo a artigo por confirmar no BR e com revisão jurídica | Avisos, categorias de pedido, direitos adquiridos por ocupação e formulação de campos | Testar que ausência de título/registo não é tratada pelo portal como inexistência de direito; nenhuma inferência jurídica a partir de mapa | Pendente de confirmação por jurista fundiário |
|
||||
| Regulamento rural | Decreto n.º 66/98, de 8 de Dezembro | PDF “Regulamento da Lei de Terra” na página normativa do PDUL; reprodução governamental. Fontes secundárias consultadas indicam alterações pelos Decretos n.º 1/2003, 50/2007 e 43/2010; falta conferir os diplomas e artigos no BR | Texto-base identificado; consolidação e vigência por dispositivo pendentes | Checklist por modalidade, consulta comunitária, plano e processo rural | Não tornar campos ou scans em obrigação até completar a matriz artigo→campo→evidência | Pendente |
|
||||
| Solo urbano | Decreto n.º 60/2006, de 26 de Dezembro, Regulamento do Solo Urbano | PDF ligado pela página normativa do PDUL; reprodução governamental | Identificado; relação com actos posteriores, regulamentos locais e reformas de ordenamento a validar por jurisdição | Ramificação urbana distinta; não reutilizar automaticamente procedimentos rurais | Caso de teste urbano não deve herdar checklist rural por omissão | Pendente |
|
||||
| Taxas fundiárias | Diploma Ministerial n.º 47/2020; o sumário do BR n.º 176 (14-09-2020) diz que actualiza taxas do Decreto 66/98 e Decreto 77/99 e revoga o DM n.º 144/2010 | Sumário da Imprensa Nacional de Moçambique (fonte oficial), sem o texto integral/quadros revistos nesta revisão | Existência da actualização confirmada pelo sumário; valor, moeda, âmbito, aplicação temporal e eventual alteração posterior não confirmados | Biblioteca informativa; não calcular nem pedir pagamento no formulário | As taxas não podem ter fallback demonstrativo ou valor de 2010; assegurar ausência de cálculo activo até fonte integral aprovada | Pendente |
|
||||
| Proposta de nova Lei de Terras | Proposta de Revisão da Lei de Terras, com PDF “Lei de Terras” na página do Parlamento | Parlamento de Moçambique lista a matéria na secção “Projectos e Propostas de Lei”; comunicado do Conselho de Ministros de 28-10-2025 anuncia submissão de proposta à AR | **Proposta, não regra activa.** A pesquisa dirigida não localizou promulgação/publicação no BR. A confirmação do estado legislativo deve ser repetida antes de qualquer actualização de produção | Registo histórico e comparação futura, sem condicionar o formulário activo | Teste documental de que conteúdo proposto não altera regras publicadas nem snapshots | Não aprovada para execução |
|
||||
| Regulamento de ordenamento territorial | Lei n.º 19/2007 e Decreto n.º 23/2008; a actividade governamental “Nosso Território” também identifica o Decreto n.º 60/2006 no pacote em revisão | Página oficial da actividade do MTA sobre revisão do pacote; cópias normativas PDUL são referências secundárias governamentais | A página evidencia processo de revisão, não entrada em vigor de projecto. Diplomas, alterações e incidência concreta no DUAT precisam de confronto com BR | Triagem territorial e avisos de jurisdição; nenhuma decisão cartográfica | Tratar intersecção como alerta, nunca como decisão de titularidade/disponibilidade | Pendente |
|
||||
| Metodologia de regularização por ocupação | Diploma Ministerial n.º 2/2020, referido no Guião de Gestão de Terras Urbanas do PDUL | Guia governamental de gestão urbana (fonte administrativa/técnica, não substitui o diploma); cópia integral do DM e âmbito ainda não revistos aqui | Não activar requisitos ou prazo de ocupação com base no guia apenas | Campos de antecedentes e apoio a reconhecimento/regularização | Requer fonte primária, artigo, jurisdição, vigência e aprovação antes de checklist | Pendente |
|
||||
| Formulários digitalizados do utilizador | Sete PDFs nas subpastas `Formulario`, `exploracao` e `Consulta` | Inventário local, nomes e hashes no [source-inventory.md](source-inventory.md); classificação vem apenas da pasta | Conteúdo, emissor, data, jurisdição e actualidade por OCR e conferência visual | Referência interna reservada, sem download público nem preenchimento automático | OCR em cópia separada; cada campo conferido contra imagem; ilegível fica pendente | Pendente |
|
||||
| Guia Nacional mencionado | Não localizado como documento legível e autenticado no acervo disponível | Pasta local indicada foi pesquisada; `DUAT.docx` separado estava bloqueado por outro processo e não foi lido | Não confirmado | Sem checklist jurídica | Não preencher lacunas por inferência | Pendente |
|
||||
|
||||
## Salvaguardas funcionais que já podem permanecer
|
||||
|
||||
- O formulário recolhe declarações do interessado, permite “não sei”/“por confirmar” e chama a referência de processo de **interna**.
|
||||
- O guia e a cópia imprimível declaram que o InvestMoz não atribui DUAT, não confirma disponibilidade e não substitui a autoridade competente.
|
||||
- Catálogo geográfico e mapas não são apresentados como cadastro fundiário; sobreposições não decidem direitos.
|
||||
- A modalidade declarada não é uma conclusão de elegibilidade. Regularização, transmissão, demarcação e alteração são tipos de apoio/actos reportados, não aquisições automáticas.
|
||||
- Rascunhos, documentos, eventos e versões do caso são separados de um processo governamental. A aplicação não simula protocolo externo.
|
||||
|
||||
## Bloqueios para etapa legal executável
|
||||
|
||||
1. Obter a edição/cópia integral dos Boletins da República dos diplomas relevantes e das alterações; construir consolidação artigo a artigo, com datas de vigência.
|
||||
2. Obter o Guia Nacional em formato legível e identificar emissor, data, âmbito e estatuto.
|
||||
3. Extrair os sete scans a partir de cópias de trabalho, identificar emissor/ano/jurisdição e conferir OCR por página; não adoptar valores manuscritos/apagados por suposição.
|
||||
4. Revisão e aprovação de jurista/entidade competente para cada item de checklist, taxa, prazo, competência, documento e evidência.
|
||||
5. Revalidar a situação parlamentar da proposta imediatamente antes de uma versão pública que descreva legislação vigente.
|
||||
|
||||
## URLs consultadas
|
||||
|
||||
- PDUL, Documentos Normativos (página governamental que liga cópias da Lei de Terras, regulamento rural e solo urbano): <https://www.pdul.gov.mz/Anuncios/Documentos-Normativos>
|
||||
- Imprensa Nacional de Moçambique, sumário do BR 176/2020, DM 47/2020: <https://www.inm.gov.mz/pt-br/content/sum%C3%A1rio-br-n%C2%BA-176-de-140920-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-1439>
|
||||
- Parlamento, projectos e propostas de lei, secção de revisão da Lei de Terras: <https://www.parlamento.mz/?page_id=15236>
|
||||
- Texto de proposta de Lei de Terras publicado pelo Parlamento: <https://www.parlamento.mz/wp-content/uploads/2026/03/LEI-DE-TERRAS.pdf>
|
||||
- Comunicado do Conselho de Ministros (28-10-2025): <https://portaldogoverno.gov.mz/wp-content/uploads/2025/10/COMUNICADO-DA-36.a-SOCM2025.pdf>
|
||||
- MTA, actividade de revisão da legislação de ordenamento territorial: <https://nossoterritorio.mta.gov.mz/actividade/>
|
||||
- MTA, documentos da actividade: <https://nossoterritorio.mta.gov.mz/documentos-da-actividade/>
|
||||
|
||||
**Estado de gate:** revisão de fonte preliminar; a funcionalidade pública pode continuar como orientação/preparação. Checklist legal, tabelas de taxas, formulário oficial e alegações de vigência ficam pendentes.
|
||||
@@ -0,0 +1,46 @@
|
||||
# Matriz de rastreabilidade — Terra e DUAT
|
||||
|
||||
**Revisão:** 2026-10-03. Esta matriz descreve o código presente no repositório; não certifica a validade jurídica de modelos nem a aprovação da funcionalidade para submissão oficial.
|
||||
|
||||
| Requisito do prompt | Fonte disponível/estado | Campo ou percurso | Validação/evidência | Teste/estado |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Guia público e limites do InvestMoz | `resources/js/pages/land-assistance/guide.tsx`; não depende de requisito jurídico específico | `/terra-duat` | Aviso de que não atribui DUAT nem confirma disponibilidade ou direitos | `LandAssistanceTest`: guia público 200; coberto |
|
||||
| Formulário em branco público | Modelo InvestMoz `land-assistance-v1`; scans oficiais não identificados | `/terra-duat/formulario-em-branco` | Impressão/guardar como PDF; explicitamente não oficial e não preenchível | `LandAssistanceTest`: rota pública 200; coberto como modelo imprimível |
|
||||
| Formulário progressivo, rascunho, retoma e versão | Modelo interno `land-assistance-v1` | `/investidor/terra-duat/novo`, edição e acompanhamento | Autenticação, cifra do payload, versão optimista, histórico cifrado e eventos sem conteúdo pessoal | Testes de feature cobrem criação, propriedade, concorrência e suporte; sem evidência de ensaio browser DUAT nesta revisão |
|
||||
| Categorias de apoio e actos posteriores | Vocabulário de produto do prompt; modalidades e efeitos legais pendentes | `payload.support_kind`, `request_description` | Valores delimitados no FormRequest; UI não declara elegibilidade ou aprovação | Parcial: classificação jurídica detalhada depende das fontes oficiais |
|
||||
| Requerente, contacto, representação e minimização | Requisitos do prompt; fundamento de recolha por acto concreto ainda carece de fonte | `applicant_category`, contacto, representação, NUIT | Campos opcionais no rascunho; apoio exige um contacto utilizável e consentimento | Email ou telefone isolado coberto por `LandAssistanceTest`; não é criado endereço sintético |
|
||||
| Localização, várias parcelas e hierarquia territorial | Catálogo territorial da aplicação; não é cadastro fundiário | `parcels[]`, province/district/admin_post/locality, área e geometria declaradas | UUID, tipos e sequência pai/filho; até 10 parcelas; catálogo/mapa não confirmam direitos | Validação servidor implementada; cenário visual de cascata e retoma do DUAT sem teste browser registado |
|
||||
| Ocupação, usos, antecedentes e conflito | Declarações do requerente, não inferências do portal | `known_occupants`, `known_improvements`, `prior_right_status`, `conflict_status` | Opções incluem “não sei” e estados qualificados; sem conclusão cadastral | Coberto pelo formulário, sem regra fundiária automática |
|
||||
| Checklist personalizada por modalidade/jurisdição/fase | **Pendente:** guia, Lei/regulamentos e procedimentos vigentes não foram obtidos em cópia legível/reconciliada | Não há checklist jurídica executável | Não tornar itens dos scans documentos obrigatórios; não inventar fonte, prazo, responsável oficial ou evidência | **Bloqueado por fonte/revisão jurídica** |
|
||||
| Plano de exploração | Scans `exploracao/scan0003.pdf` e `scan0004.pdf`, classificados só pela pasta; OCR e conferência pendentes | `exploration_plan.activity_rows[]` | Linhas facultativas; período livre, existente/planeado, unidade; não soma áreas anuais | Validação estrutural no FormRequest; OCR não reconciliado |
|
||||
| Consulta comunitária e pareceres | Scans `Consulta/scan*.pdf`, ainda sem OCR/revisão | `consultation.participants[]`, intervenções, oposição, acordos, documentos referidos | Até 200 participantes; estados comunicados/preparatórios; não gera parecer, assinatura ou acta | Cobertura do formulário; sem validação de execução/interpretação legal |
|
||||
| Anexos e documentos privados | Armazenamento privado e registo `documents` existente | Documentos no caso | Tipos/tamanho limitados; acesso autenticado/proprietário; quarentena não descarregável | Implementado com bloqueio seguro; **antimalware não configurado**, sem libertação automática |
|
||||
| Cópia preenchida, histórico e referência | Modelo InvestMoz `land-assistance-v1` | `/imprimir` | Reflecte payload guardado e versão; referência interna; sem assinatura/número oficial simulado | HTML imprimível, não PDF electrónico; correspondência visual/browser ainda sem evidência nesta revisão |
|
||||
| Apoio e CRM | `InterestSubmission`; migration aditiva `2026_10_03_210000_make_interest_request_email_nullable.php` | `solicitar-apoio` | Email ou telefone; consentimento, transacção, idempotência e recibo interno | Telefone isolado persiste email `NULL`; `LandAssistanceTest` cobre percurso e rollback protegido. Consumidores downstream com email obrigatório ainda carecem de validação operacional |
|
||||
| Acompanhamento externo e gestão | Nenhuma API pública de DUAT confirmada | Área privada e gestão | Estados internos; factos externos apenas informados ou sustentados por evidência; encaminhamento preparado não é envio | Implementado sem simular integração pública |
|
||||
| Direitos, disponibilidade e intersecções | Não confirmáveis por dados/catálogos locais | Localização e documentos | Ausência de registo/intersecção não prova ausência de direitos; conflitos não são decididos | Salvaguarda de interface presente; confirmação cabe à entidade competente |
|
||||
| Segurança, auditoria e reversão | PostgreSQL e padrões locais | Migrations `2026_10_03_200000_create_land_assistance_cases.php` e `2026_10_03_210000_make_interest_request_email_nullable.php` | Payload/revisões cifrados; controlo de propriedade; concorrência optimista; eventos sem payload; upload privado em quarentena; rollback protegido | PostgreSQL 17 QA descartável: `LandAssistanceTest` 6/6 (46 asserções); nenhuma migration aplicada à base operacional |
|
||||
| Fontes e versões históricas | Inventário read-only em `source-inventory.md` | `land-assistance-v1` | SHA-256 dos sete PDFs; originais fora de `public/`; snapshots preservam versões | Identidade dos ficheiros verificada anteriormente; conteúdo/actualidade pendentes |
|
||||
|
||||
## Bloqueios antes de activar checklist legal ou canal oficial
|
||||
|
||||
1. Obter o Guia Nacional e os textos integrais do Boletim da República; confrontar reproduções PDUL com o BR e consolidar alterações por artigo, jurisdição e vigência. A triagem consta de [legal-source-review-2026-10-03.md](legal-source-review-2026-10-03.md).
|
||||
2. Extrair os scans numa cópia de trabalho, preservar originais/hashes e rever OCR página a página. Trechos ilegíveis ficam pendentes.
|
||||
3. Aprovar aplicabilidade, responsável, prazo e evidência por fonte competente antes de disponibilizar a checklist como requisito.
|
||||
4. Rever notificações, exports e integrações downstream perante registos com email `NULL`; não inventar endereço para compatibilizar consumidor.
|
||||
5. Configurar/testar antimalware, quarentena, retenção e auditoria antes de libertar uploads.
|
||||
6. Testar em navegador hierarquia territorial, persistência/retoma, impressão preenchida e permissões; complementar com teclado/leitor de ecrã e revisão humana.
|
||||
|
||||
## Estado proposto
|
||||
|
||||
**Fluxo interno de orientação e acompanhamento: parcialmente implementado e sujeito a validação funcional. Checklist legal, activação como formulário oficial, confirmação cadastral, submissão a autoridades e aprovação de DUAT: bloqueados/fora da capacidade do portal.** Um pedido preenchido ou encaminhado ao CRM não é protocolo oficial.
|
||||
|
||||
## Adenda — contacto telefónico sem email (2026-10-03)
|
||||
|
||||
A regra anterior desta matriz que marcava o email como obrigatório foi substituída no código: o pedido de apoio aceita email ou telefone. Email ausente é persistido como `NULL`, sem endereço inventado. Uma migration aditiva torna a coluna anulável; o rollback recusa-se a remover essa compatibilidade enquanto existirem pedidos só telefónicos. A conversão CRM para lead continua a exigir confirmação de email. Os testes de feature foram escritos, mas não executados porque a base isolada configurada em `127.0.0.1:55441` estava encerrada; não foi tentada ligação à porta operacional 5432.
|
||||
### Evidência posterior — migration e percurso telefónico (2026-10-03)
|
||||
|
||||
A nota anterior de tentativa bloqueada foi superada numa execução posterior: a nova base PostgreSQL 17 foi criada em pasta temporária exclusiva e usada através da porta QA 55441. `LandAssistanceTest` passou 4/4 (42 asserções) e a suite PHP completa passou 251/251 (2.586 asserções); isto executou a migration aditiva em QA. O cluster foi parado. Nenhuma migration foi executada na base da aplicação e a porta 5432 não foi usada.
|
||||
### Actualização dos testes de reversibilidade — 2026-10-03
|
||||
|
||||
`LandAssistanceTest` agora passa 6/6 (46 asserções), incluindo reversão normal da coluna para não nula quando não existem pedidos telefónicos e bloqueio do rollback quando existem. A suite PHP completa após esses testes passou 253/253 (2.590 asserções) no cluster PostgreSQL QA descartável. O cluster foi parado; nenhuma conexão de teste foi aberta na porta 5432. Nenhuma migration foi aplicada à base local ou de produção.
|
||||
@@ -0,0 +1,37 @@
|
||||
# Inventário de fontes — Terra e DUAT
|
||||
|
||||
**Inventário read-only:** 2026-10-03. Os originais permanecem na pasta-fonte, fora do repositório e do caminho público da aplicação. Esta lista não constitui aprovação jurídica nem autenticação dos documentos.
|
||||
|
||||
Pasta observada: `C:\Mac\Home\Documents\TEMPO\Portal Tempo\Servicos Tempo\Scan\Terras`. A classificação abaixo deriva apenas do nome da subpasta, não da leitura do conteúdo. Os PDFs não apresentam camada de texto detectável nesta verificação; OCR e conferência página a página continuam pendentes. Não foram copiados para `public/` nem usados para criar requisitos automáticos.
|
||||
|
||||
| Categoria provisória | Ficheiro original | Bytes | SHA-256 | Tratamento |
|
||||
| --- | --- | ---: | --- | --- |
|
||||
| Consulta comunitária/pareceres | `Consulta/scan0001.pdf` | 140871 | `3C1143FD565D92403E0C175ADFBEA293AFC3F187FD6A201BA26E1D45A998D2CA` | Referência reservada; conteúdo por OCR/revisão |
|
||||
| Consulta comunitária/pareceres | `Consulta/scan0002.pdf` | 88860 | `B6A0CCAC07EEF71294089DDE653F6ED3E600196B75836D69C0E99687E199D6CC` | Referência reservada; conteúdo por OCR/revisão |
|
||||
| Consulta comunitária/pareceres | `Consulta/scan.pdf` | 174964 | `732FF341BBD4C0C05E8ACCDB6919FA6151D18E50E0C3ED0CD618A4FD69B9018F` | Referência reservada; conteúdo por OCR/revisão |
|
||||
| Plano de exploração | `exploracao/scan0003.pdf` | 144995 | `F1F5778426D16FAD122F1DF32F40DF1B2CD66F5C56CA41A9EA56499F10ED8D60` | Referência reservada; conteúdo por OCR/revisão |
|
||||
| Plano de exploração | `exploracao/scan0004.pdf` | 150054 | `54EE525982C78450611A3C4B93F77ECC00493DECDBA4CF982BBC45E52DE1CF01` | Referência reservada; conteúdo por OCR/revisão |
|
||||
| Formulário/requisitos | `Formulario/scan0006.pdf` | 243123 | `A45CA527E0581B95939F0A35BF107BF78F24E183513E5CE4AD81C0FE6FEC3E53` | Referência reservada; conteúdo por OCR/revisão |
|
||||
| Formulário/requisitos | `Formulario/scan0005.pdf` | 286614 | `D994A036EFFB269A1BF808164518FC251458379CC15F1A4D5730E8BD746A9A37` | Referência reservada; conteúdo por OCR/revisão |
|
||||
|
||||
Também foi localizado `C:\Mac\Home\Documents\TEMPO\Portal Tempo\Servicos Tempo\prompt\por executar\DUAT.docx`. Estava aberto/bloqueado por outro processo e não foi lido nem copiado. O Guia Nacional para Obtenção e Regularização do DUAT continua por localizar como cópia identificada e legível.
|
||||
|
||||
### Fontes normativas digitais localizadas em 2026-10-03
|
||||
|
||||
| Material | Fonte e natureza | Uso permitido nesta fase | Estado |
|
||||
| --- | --- | --- | --- |
|
||||
| Lei n.º 19/97, de 1 de Outubro | [PDUL — Documentos Normativos](https://www.pdul.gov.mz/Anuncios/Documentos-Normativos), ligação “Lei de terra” para PDF; compilação alojada num programa governamental, reprodução digital do diploma | Identificar estrutura/artigos para revisão; não substituir conferência com o Boletim da República | Texto pesquisável obtido; cópia do BR e reconciliação de alterações ainda pendentes |
|
||||
| Decreto n.º 66/98, de 8 de Dezembro | Mesma página PDUL, ligação “Regulamento da Lei de Terra” | Referência de trabalho para revisão do regulamento | Texto digital localizado; verificar alterações em conjunto (Decretos n.º 1/2003, 50/2007 e 43/2010 mencionados nas fontes consultadas) |
|
||||
| Decreto n.º 60/2006, de 26 de Dezembro | Mesma página PDUL, ligação “Regulamento do solo urbano” | Identificar percurso urbano separado do rural | PDF localizado; texto extraído pela pesquisa não foi integralmente confrontado com o BR |
|
||||
| Diploma Ministerial n.º 47/2020 | [Imprensa Nacional de Moçambique — sumário do BR n.º 176, 14-09-2020](https://www.inm.gov.mz/pt-br/content/sum%C3%A1rio-br-n%C2%BA-176-de-140920-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-1439) | Registar que houve actualização de taxas DUAT e revogação expressa do DM n.º 144/2010; não publicar valores sem ler o diploma integral e confirmar aplicação actual | Sumário oficial localizado; anexo/texto integral e vigência actual por verificar |
|
||||
| Proposta de revisão da Lei de Terras | [Parlamento — Projectos e Propostas de Lei](https://www.parlamento.mz/?page_id=15236), secção “Proposta de Revisão da Lei de Terras”; [texto disponibilizado](https://www.parlamento.mz/wp-content/uploads/2026/03/LEI-DE-TERRAS.pdf) | Comparação e arquivo separados da regra activa | O portal parlamentar classifica o material como proposta. Não tratar o PDF como lei promulgada ou vigente |
|
||||
| Comunicado do Conselho de Ministros, 28-10-2025 | [Portal do Governo](https://portaldogoverno.gov.mz/wp-content/uploads/2025/10/COMUNICADO-DA-36.a-SOCM2025.pdf) | Confirma apenas que o Governo aprovou uma proposta para submeter à Assembleia da República | Comunicado secundário ao diploma; não demonstra aprovação parlamentar, promulgação ou entrada em vigor |
|
||||
|
||||
O conteúdo de [legal-source-review-2026-10-03.md](legal-source-review-2026-10-03.md) é uma triagem de fontes, não parecer jurídico. A Lei n.º 19/97 obtida no PDUL não deve ser apresentada como consolidação oficial; o acesso ao portal da Imprensa Nacional confirmou sumários, mas não a cópia integral do BR de 1997. A pesquisa dirigida não encontrou publicação/promulgação da proposta até à data desta revisão; isso não substitui uma certidão ou pesquisa exaustiva do BR.
|
||||
|
||||
## Gates das fontes
|
||||
|
||||
- Não divulgar digitalizações nem chamar-lhes formulários oficiais.
|
||||
- OCR só numa cópia de trabalho; guardar ficheiro original, hash, data/origem e resultado OCR separado; cada campo extraído exige revisão humana contra a imagem.
|
||||
- Requisitos, documentos obrigatórios, taxas, prazos, competência territorial e efeitos jurídicos ficam pendentes até identificar diploma/fonte oficial, artigo, âmbito e vigência.
|
||||
- A interface de orientação usa declarações do requerente e não afirma inexistência de direitos, disponibilidade cadastral, recepção oficial ou decisão pública.
|
||||
@@ -0,0 +1,75 @@
|
||||
# Migração e associação das fontes legais
|
||||
|
||||
Data: 06/10/2026. Este relatório substitui, para o estado actual, a observação de biblioteca vazia feita em 05/10. A migração foi aplicada à base local `investemoz` depois de um backup novo; não houve alteração aos PDFs originais.
|
||||
|
||||
## Resultado actual
|
||||
|
||||
Foram copiados três PDFs do arquivo existente para o armazenamento privado do portal e registados em `documents` e `portal_resources`. A importação é transaccional e repetível; a segunda execução reutilizou os três registos pelos hashes, sem criar documentos, recursos, ligações ou revisões duplicados.
|
||||
|
||||
Os três ficheiros passaram pelo ClamAV 1.5.4, com assinaturas de 06/10/2026 08:26 UTC. O hash analisado coincide com o hash guardado em cada registo. O estado técnico ficou `active`/`clean`; a classificação continua `internal`, os direitos continuam `unconfirmed` e nenhum recurso foi publicado. O resultado antimalware não aprova direitos nem altera visibilidade.
|
||||
|
||||
## Matriz dos documentos importados
|
||||
|
||||
| Documento e versão | Módulos e informação sustentada | Estado documental | Revisão/pendências |
|
||||
|---|---|---|---|
|
||||
| Lei n.º 22/2022, republicada no 2.º Suplemento do BR 250 | `simulator` como evidência documental; tema IVA. A revisão documental cita o art. 17(1). | Ficheiro descarregado do catálogo oficial AT e comparado byte a byte com o arquivo: 1.834.284 bytes; SHA-256 `EA1B0DC6F5CF6E595F6D9A19E7042F398999E0087CAEF1785F6E8FAC571B5F53`. Origem oficial confirmada. Situação registada como `amended`; não é apresentado como consolidação integral actual. | Direitos da composição PDF aguardam revisão administrativa; classificação privada e publicação pendente. A taxa ou regra não é activada pelo registo documental. |
|
||||
| BR n.º 248/2025, Suplemento n.º 1 | `simulator` como evidência; temas ICE, aduaneiro, ISPC, IVA, IRPS e IRPC, sem afirmar uma obrigação por tema. | Ficheiro descarregado do endpoint WebDAV oficial AT e comparado byte a byte com o arquivo: 440.018 bytes; SHA-256 `CCF2A8DEECA820F2DD076B4B2141B1EFE3F6A806568C3A587CA59A8E92F4C251`. Origem oficial confirmada. Situação jurídica registada como `unknown`, pois a edição contém vários diplomas cuja vigência deve ser analisada individualmente. | Direitos da composição PDF aguardam revisão administrativa; classificação privada e publicação pendente. Os artigos e a vigência de cada lei não ficam aprovados pela associação temática. |
|
||||
| BR n.º 89, I Série, 08/06/2017 — aviso de rectificação da Lei n.º 13/2016 | `simulator` como evidência; tema IVA. A ficha INM identifica o aviso na p. 569. | O hash do PDF local é `11F0CAB15EB6E51010952203FFA24FDC533A24FD642E19525FE4F46B17A1F5E5` e coincide com o exemplar arquivado no repositório. A ficha oficial identifica o acto, mas os bytes locais não foram comparados com um download oficial. Origem `identified`; situação jurídica `unknown`. | Cadeia de custódia, autenticidade binária, anexos e efeito temporal por confirmar. Direitos por confirmar; classificação privada e publicação pendente. |
|
||||
|
||||
As onze associações foram gravadas como evidência (`applicability=evidence`), nunca como requisito obrigatório. A interface da biblioteca apresenta “Onde este documento é utilizado” e liga a associação `simulator` a `/Simulador`; o próprio simulador já consulta recomendações para esse módulo. Não foram criadas associações a DUAT, licenciamento, constituição de empresas, trabalho, imigração, zonas ou procedimentos porque estes três ficheiros não sustentam esses percursos.
|
||||
|
||||
## Referências sem ficheiro importável
|
||||
|
||||
As seis linhas de `investment_legal_sources` são referências URL, todas com `validation_status=pending`; não são binários e não foram convertidas em documentos fictícios:
|
||||
|
||||
| Referência existente | Situação nesta migração |
|
||||
|---|---|
|
||||
| Beluluane Industrial Park — Free Zone; Resolução Interna do Conselho de Ministros n.º 15/99; página APIEX | URL existente; diploma/efeito actual e ficheiro integral por confirmar. |
|
||||
| Conselho de Ministros — BR n.º 70, 30/08/2013; Decreto n.º 47/2013 | Página INM existente; texto integral e artigos aplicáveis por confirmar. |
|
||||
| Manga-Mungassa Special Economic Zone; Decreto n.º 22/2012 | Página APIEX existente; diploma e efeito actual por confirmar. |
|
||||
| BR n.º 46, 06/06/2014; Decreto n.º 28/2014 | Página INM existente; texto integral e artigos aplicáveis por confirmar. |
|
||||
| Mocuba Industrial Free Zone; Decreto n.º 29/2014 | Página APIEX existente; diploma e efeito actual por confirmar. |
|
||||
| Nacala Special Economic Zone; Decreto n.º 76/2007 | Página APIEX existente; diploma e efeito actual por confirmar. |
|
||||
|
||||
O inventário Terra/DUAT também contém referências URL a Lei n.º 19/97, Decreto n.º 66/98, Decreto n.º 60/2006 e Diploma Ministerial n.º 47/2020. Os ficheiros oficiais correspondentes não foram encontrados no arquivo local indicado e não foram copiados. `docs/investmoz/land-assistance/source-inventory.md` documenta os limites de cada referência.
|
||||
|
||||
O resumo “Reforma fiscal de 2026” e o CSV de revisão pessoal não foram importados: são material secundário/de revisão, não diplomas públicos. Os restantes módulos mantêm pendências de inventário de documentos, fonte e requisito; esta migração não valida todo o portal.
|
||||
|
||||
## Segurança, publicação e acção do gestor
|
||||
|
||||
O novo rascunho guarda `approved_by=null`, `published=false`, `data_classification=internal` e `rights_status=unconfirmed`. A cópia privada só é descarregável pela biblioteca quando o registo estiver publicado e satisfizer os filtros de segurança.
|
||||
|
||||
O formulário de gestão agora permite escolher `internal` ou `public`. A classificação pública exige scan limpo com hash coincidente, direitos registados como autorizados e fonte identificada; diplomas exigem fonte oficial confirmada. A publicação continua a ser uma acção separada, autenticada e auditada. Nenhuma destas condições foi preenchida automaticamente para os três documentos.
|
||||
|
||||
Para concluir os primeiros documentos, o gestor autorizado deve, individualmente:
|
||||
|
||||
1. Rever a permissão de divulgação da composição PDF e registar a base documental em “Direitos de utilização”.
|
||||
2. Manter a vigência como “Por confirmar” quando não houver consolidação artigo a artigo.
|
||||
3. Alterar a classificação para pública apenas depois da revisão de direitos.
|
||||
4. Usar a acção separada de publicação para cada recurso que passe os controlos. O BR 89 deve permanecer privado até se obter e comparar a cópia oficial.
|
||||
|
||||
A interface não preencheu campos com zero, não atribuiu autor/aprovador inexistente e não publicou os recursos em nome do gestor 13 ou de outra pessoa.
|
||||
|
||||
## Migração, backup e reversão
|
||||
|
||||
- Backup custom PostgreSQL criado antes das alterações: `%LOCALAPPDATA%\InvestMoz\Backups\investemoz-before-legal-source-import-20261006.dump`, 1.579.980 bytes. `pg_restore --list` conseguiu ler o arquivo e enumerou 2.293 entradas. Não foi feito um restauro integral; o backup é verificável, mas o ensaio de recuperação permanece pendente.
|
||||
- Migração aplicada apenas: `2026_10_06_140000_allow_unapproved_private_portal_resources`. Torna `portal_resources.approved_by` anulável para distinguir rascunhos privados de aprovação. O `down()` recusa rollback se houver rascunhos sem aprovador.
|
||||
- Os PDFs originais em `docs/investmoz/simulations/source-archive/` foram preservados; as cópias ficam em `storage/app/private/portal-documents/`.
|
||||
- Para reverter a integração de conteúdo, primeiro preservar as revisões e os três documentos; não apagar manualmente linhas. A migração não pode ser revertida enquanto houver `approved_by=null`. O restauro do backup recupera o esquema/dados anteriores à importação, mas requer janela e verificação operacional.
|
||||
|
||||
## Evidência e testes
|
||||
|
||||
- `php artisan portal:check-document-library-schema`: aprovado na base activa após a migração.
|
||||
- Pré-visualização `php artisan documents:import-legal-source-archive`: três novos registos previstos, sem escrita.
|
||||
- `php artisan documents:import-legal-source-archive --apply`: três documentos/recursos criados e scans enfileirados. Repetição: três registos reutilizados, zero novos scans e nenhuma duplicação.
|
||||
- Base activa após a importação: 3 documentos, 3 recursos, 11 associações, 5 revisões e 3 resultados de scan; 0 recursos publicados. Os três resultados são `clean`, ClamAV 1.5.4, hash analisado igual ao guardado.
|
||||
- Comparação oficial temporária AT: BR 248 e Lei 22/2022 retornaram HTTP com PDF e o SHA-256/tamanho coincidiram exactamente com os arquivos. O PDF do BR 89 não foi descarregado da INM para comparação.
|
||||
- Browser headless em `http://localhost:8000/documentos`: HTTP 200 em 1440×1000 e 390×844; estado vazio correcto (0 documentos publicados), sem overflow horizontal nem erros JavaScript. O download privado `/documentos/1/download` respondeu 404.
|
||||
- Capturas: [desktop](document-library-migration-desktop-2026-10-06.png) e [telemóvel](document-library-migration-mobile-2026-10-06.png). Não houve resultado positivo na biblioteca pública, pois os três recursos continuam privados.
|
||||
- `php artisan test tests/Feature/PortalServicesTest.php tests/Feature/DocumentLibrarySchemaCompatibilityTest.php tests/Feature/ImportLegalSourceArchiveTest.php`: 15 testes e 363 afirmações aprovados na instância isolada `127.0.0.1:55441/investmoz_test`. O teste específico de classificação e publicação separada voltou a passar (1 teste/28 afirmações). A instância QA foi parada após os ensaios; os ficheiros do cluster permanecem em `%LOCALAPPDATA%\InvestMoz\QA\legal-source-import-20261006`.
|
||||
- `npm.cmd run build`: aprovado; avisos de chunk acima de 500 kB e dependência opcional `fontaine` ausente.
|
||||
- `npm.cmd run types:check`: continua a falhar em `resources/js/pages/investment/zones.tsx:127`, porque o tipo `Zone` não declara `district`. Este ficheiro não foi alterado nesta entrega.
|
||||
|
||||
## Estado
|
||||
|
||||
**Integração técnica parcial, não publicada.** Os arquivos foram copiados, analisados, identificados, associados ao simulador e protegidos por hash. A biblioteca pública permanece vazia até revisão individual de direitos e publicação autenticada. Permanecem pendentes o restauro de ensaio, o BR 89, os seis diplomas de zonas, as fontes binárias de Terra/DUAT, as associações dos demais módulos e uma pesquisa pública positiva com download.
|
||||
@@ -0,0 +1,73 @@
|
||||
# Antimalware de documentos e anexos — 5 de Outubro de 2026
|
||||
|
||||
## Âmbito implementado
|
||||
|
||||
Os ficheiros continuam a usar o registo canónico `documents` e o armazenamento privado existente. Uploads da biblioteca, anexos de zonas, pedidos de investimento, processos Terra/DUAT e documentos de texto da área de IA são colocados em quarentena técnica e enviados para `ScanDocumentForMalware`. O estado técnico é separado da revisão editorial. Um resultado limpo só liberta o ficheiro para o estado técnico `active`; não altera a classificação privada, não o publica nem o associa automaticamente a um catálogo.
|
||||
|
||||
O worker calcula SHA-256 antes e depois da análise, compara com o registo do documento e grava cada tentativa em `document_malware_scans`, incluindo hash, resultado, motor/versão, versão temporal das assinaturas, duração e motivo. Resultados infectados, falhados ou inconclusivos mantêm o ficheiro em quarentena. Descarregamentos, selecção pública, catálogo público e ingestão de IA verificam estado limpo e correspondência do hash. O histórico não é apagado automaticamente. `malware:scan-pending --dry-run` inventaria pendências e `--apply --limit=N` processa lotes limitados; não publica registos.
|
||||
|
||||
Estados: `pending`, `scanning`, `clean`, `infected`, `inconclusive`, `failed`. A interface de anexos distingue análise em curso, ausência de ameaça detectada, ameaça detectada e análise não concluída. Gestores podem repetir tentativas de ficheiros inconclusivos/falhados; um ficheiro detectado como infectado exige substituição.
|
||||
|
||||
## Scanner local observado
|
||||
|
||||
- Windows 11 Pro ARM64, ClamAV oficial 1.5.4 ARM64 em `%LOCALAPPDATA%\InvestMoz\ClamAV\1.5.4\clamav-1.5.4.win.arm64`.
|
||||
- SHA-256 do pacote comparado com o digest da release oficial antes de extrair.
|
||||
- `freshclam` actualizou a base oficial; `malware:health` reportou assinaturas 28144, data UTC `2026-10-05T08:24:24Z`, com cerca de 1,5 horas quando verificado.
|
||||
- `clamd` correu no momento da validação e escuta apenas em `127.0.0.1:3310`; sem porta exposta na rede local ou Internet. Configuração local: `clamd-investmoz.conf`, fora do repositório; 2 threads, fila 16, timeout 120 s, ficheiro 25 MiB, análise 100 MiB, stream 25 MiB, profundidade 10, máximo 1.000 ficheiros e alertas para ficheiros cifrados/limites.
|
||||
- O protocolo utilizado é `INSTREAM`, sem partilhar ficheiros com serviços públicos.
|
||||
|
||||
O Docker Compose contém um modelo com ClamAV privado, sem publicação de TCP/3310; apenas aplicação e worker pertencem à rede Docker privada do scanner. O modelo Linux usa loopback. Estes são modelos de implantação, não prova de instalação no alojamento. O servidor Linux remoto não estava acessível nesta validação.
|
||||
|
||||
## Evidência executada
|
||||
|
||||
- `php artisan malware:health`: disponível; ClamAV 1.5.4; assinaturas recentes; listener confirmado em loopback.
|
||||
- `php artisan test --filter=ClamDScannerIntegrationTest`: 2 testes, 7 assertions — ficheiro benigno aceite como sem ameaça detectada; limite de tamanho produz resultado inconclusivo; endpoint indisponível também produz estado inconclusivo.
|
||||
- `ClamDQueueWorkerIntegrationTest`: comando real `queue:work --once` ligado à base isolada `investmoz_test` processou upload privado; verificou hash, histórico e ausência de publicação.
|
||||
- Testes da biblioteca e anexos de zonas validaram que a libertação técnica preserva classificação privada e que a publicação continua explícita e condicionada a direitos/revisão editorial.
|
||||
- A invocação directa do ficheiro padrão de teste EICAR foi bloqueada pela política de execução do ambiente. Não foi usado malware real nem contornada essa barreira. A detecção positiva necessita de uma execução autorizada do ficheiro de teste padrão ou de uma validação operacional equivalente antes do aceite final.
|
||||
|
||||
## Pendências de operação
|
||||
|
||||
1. Configurar e validar scanner, actualização de assinaturas e worker no alojamento real. O worker de QA foi exercitado; isso não comprova o worker remoto.
|
||||
2. Acrescentar monitorização e alertas operacionais para indisponibilidade, assinaturas desactualizadas, fila, falhas e idade dos itens pendentes. `malware:health` dá uma verificação manual; ainda não está ligado a um sistema de alertas.
|
||||
3. Executar testes adicionais de timeout do socket, documento cifrado/protegido por senha e limite de descompressão com artefactos padrão benignos num ambiente autorizado.
|
||||
4. Inventariar em modo seco todos os documentos antigos e processar apenas em lotes revistos. A migração marca os registos anteriores como `pending`; nenhum ficheiro é apagado, aprovado ou publicado automaticamente. Não foi executada migração na base activa.
|
||||
5. Definir retenção administrativa para ficheiros suspeitos e histórico. Até existir política, os ficheiros suspeitos permanecem preservados no armazenamento privado.
|
||||
|
||||
## Operação e recuperação
|
||||
|
||||
Manter o daemon em loopback (ou a rede privada isolada descrita no Compose), actualizar assinaturas por canal oficial e confirmar `php artisan malware:health`. Manter o worker activo com timeout inferior a `retry_after` (150 s e 210 s, respectivamente). Para itens parados, listar com `php artisan malware:scan-pending --dry-run`, rever a contagem e executar lotes limitados com `--apply --limit=50`. Reprocessamento não remove histórico nem altera publicação. Em falha do scanner, corrigir serviço/configuração e repetir explicitamente; não marcar o ficheiro como limpo manualmente.
|
||||
|
||||
## Rollback
|
||||
|
||||
Desactivar os pontos de entrada do worker mantém documentos não analisados bloqueados. Não remova a migração nem as colunas/histórico após haver resultados. Reverter o código para uma versão sem a barreira de download/publicação antes de preservar dados seria inseguro; qualquer rollback de aplicação deve manter bloqueio de acesso aos ficheiros ainda não analisados e conservar `document_malware_scans`.
|
||||
|
||||
## Final QA run — 5 October 2026
|
||||
|
||||
- `php artisan test`: 285 tests, 3,017 assertions, all passing. PostgreSQL target: isolated `investmoz_test` at `127.0.0.1:55441`; the QA cluster was stopped after testing. No active database migration was run.
|
||||
- `node --test tests/frontend/*.test.mjs`: 144 passing.
|
||||
- `npm.cmd run types:check`: passing.
|
||||
- `npm.cmd run build`: passing. Existing warnings: optional `fontaine` is absent and the services bundle exceeds 500 kB.
|
||||
- PHP syntax checks passed for the scanner, worker, commands, controller, and affected feature tests. The document library TSX passed `vp fmt --check`.
|
||||
- `php artisan documents:scan-pending --limit=50` with explicit QA connection variables: zero rows eligible; dry-run made no changes.
|
||||
- Browser QA against the isolated router: desktop 1440 px and mobile 390 px both HTTP 200, no horizontal overflow, keyboard skip link focused first, empty catalogue shown, zero JS errors. The active catalogue remains empty.
|
||||
- The local development scanner remains running only on loopback; the temporary database and QA web server were stopped.
|
||||
|
||||
## Windows/Laragon persistence
|
||||
|
||||
Two user-level Scheduled Tasks were registered (no system-wide service or firewall rule): `InvestMoz ClamAV Loopback Scanner` starts clamd at user sign-in; `InvestMoz ClamAV Signature Update` runs at sign-in and every two hours. Both use the local per-user ClamAV installation and limited user token. The update task was started manually after registration and completed with exit code 0; `malware:health` then passed. The daemon task was restarted and observed loading 3,628,118 signatures before binding `127.0.0.1:3310`; startup took about 12 seconds. During startup the portal fails closed and leaves files pending/quarantined.
|
||||
|
||||
To remove these per-user tasks, run `Unregister-ScheduledTask -TaskName 'InvestMoz ClamAV Loopback Scanner','InvestMoz ClamAV Signature Update' -Confirm:$false`. Removing them does not delete signature databases or scan history. The current loopback daemon is running under the user session; on the next sign-in the scheduled task starts it again.
|
||||
|
||||
## Follow-up security tests and activation check — 5 October 2026
|
||||
|
||||
- Added a streaming ZIP metadata guard: malformed ZIPs, missing ZIP inspection support, more than 1,000 entries, or declared expanded content above 100 MiB remain inconclusive. This check runs before ClamAV.
|
||||
- The first real-daemon test with a harmless ZIP declaring 110 MiB returned `clean` from local ClamAV 1.5.4 despite `MaxScanSize 100M` and `AlertExceedsMax yes` being loaded. The application-side limit guard now rejects that fixture as `archive_decompression_limit`; the same over-limit case passed after the correction. This is not evidence that ClamAV's own limit alert fired.
|
||||
- A harmless AES-encrypted ZIP was scanned by local ClamAV and returned `inconclusive` with `encrypted_or_password_protected`.
|
||||
- A local controlled TCP fixture completed the ClamD handshake and timed out during INSTREAM. The scanner now returns `inconclusive/scanner_timeout`; this validates the timeout handling path, not daemon capacity.
|
||||
- `php artisan test --filter=ClamDScannerIntegrationTest`: 5 tests / 20 assertions passed. `ClamDQueueWorkerIntegrationTest`: 1 / 9 passed; `PortalServicesTest`: 9 / 289 passed; `InvestmentZoneTest`: 10 / 161 passed. All used isolated PostgreSQL `investemoz_test` on `127.0.0.1:55441`.
|
||||
- The standard positive-detection fixture remains blocked by the execution policy. It was not recreated, encoded differently, or otherwise bypassed; positive detection is still pending an authorized validation route.
|
||||
- The active database was confirmed read-only as PostgreSQL 17.11, `investemoz`, `127.0.0.1:5432`. It still has the 2026-10-05 catalogue and malware migrations pending. An automated attempt to create a backup file using `pg_dump` was rejected by the execution policy, so no backup was created and no active migration or document import/publication was attempted.
|
||||
- No Laravel queue worker task exists. Only the per-user ClamAV daemon/signature tasks are registered. The shared default queue is not started automatically because it may contain non-malware application jobs.
|
||||
- The public library remains empty. Official INM catalogue records identify two document candidates (BR 89/2017 rectification of Law 13/2016 and BR 248/2025 supplement with Laws 7–12/2025); their local PDF bytes still need comparison with the official copies, and a manager must record per-file rights/version metadata and publish explicitly after active schema activation. The Lei 22/2022 candidate is the corrected 2nd supplement version; the main-gazette version is explicitly marked ineffective by INM.
|
||||
- Hosting was not defined or reached; Linux and Docker files are deployment templates only.
|
||||
@@ -0,0 +1,49 @@
|
||||
# Revisão de extracção do relatório PII 2026–2030
|
||||
|
||||
Data da análise: 2026-10-03. **Este documento é um inventário estrutural e de qualidade da fonte; não é uma importação, validação institucional, lista de oportunidades, autorização de publicação ou reconciliação financeira.**
|
||||
|
||||
## Proveniência
|
||||
|
||||
| Campo | Registo |
|
||||
| --- | --- |
|
||||
| Ficheiro | `C:\Mac\Home\Documents\TEMPO\Portal Tempo\Servicos Tempo\portal do investidor\MPD_Relatório Final do PII 26-30_2111.docx` |
|
||||
| Tamanho / data local | 5.456.742 bytes; 2026-09-08 14:34 (metadata do filesystem) |
|
||||
| SHA-256 | `BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6` |
|
||||
| Método | Leitura local de `word/document.xml` no DOCX; contagem de parágrafos, tabelas, linhas e cabeçalhos. Sem alteração do documento ou da base de dados. |
|
||||
| Referência interna | Índices das tabelas pela ordem em `word/document.xml`, contados a partir de 1. O DOCX não foi convertido em páginas PDF; por isso, os índices não são páginas. |
|
||||
|
||||
## Inventário e qualidade estrutural
|
||||
|
||||
| Observação | Resultado verificável | Implicação |
|
||||
| --- | --- | --- |
|
||||
| Estrutura integral do corpo | 2.520 parágrafos, 30 tabelas e 353 linhas no total. | O ficheiro contém contexto programático além das tabelas de projectos; não importar o DOCX como se fosse uma única tabela. |
|
||||
| Tabelas com projectos/custos | Tabelas 11–13, 15–21 e 23–25 (13 tabelas), 174 linhas preenchidas. | Cada linha continua a ser uma proposta/estimativa do plano; não se converte automaticamente em anúncio público. |
|
||||
| Campos tabulares centrais | Nas 174 linhas, os campos de identificação/nome, localização, custo e horizonte estão preenchidos nas respectivas colunas. | Preenchimento tabular não confirma a exactidão, actualidade nem granularidade geográfica do conteúdo. |
|
||||
| Título repetido | 174 linhas produzem 173 títulos normalizados; um título aparece mais de uma vez em tabelas diferentes. | Pode representar repetição, fases ou âmbitos distintos. Requer reconciliação humana antes de deduplicar ou criar entidades. |
|
||||
| Moeda | A tabela 19 tem cabeçalho de custo “USD/MZN”; as demais tabelas seleccionadas indicam USD. | O cabeçalho misto não permite atribuir moeda linha a linha com segurança. Não somar nem converter esse conjunto sem regra e fonte cambial declaradas. |
|
||||
| Horizonte/período | Presente como coluna nas tabelas de projectos seleccionadas; o documento também contém tabelas de estratégia sem essa coluna. | Preservar literal e referência de tabela; não inferir datas exactas quando o horizonte é textual. |
|
||||
| Responsáveis, fase/estado e evidência de execução | Não são campos uniformes nas tabelas tabulares seleccionadas. | Não preencher responsáveis, maturidade, disponibilidade, execução, licenciamento ou aprovação por inferência. |
|
||||
| Localização | Cada linha tem texto na coluna de localização; a análise estrutural não validou topónimos, limites administrativos nem coordenadas. | Manter texto da fonte e estado “não verificado”; mapa apenas depois de validação territorial independente. |
|
||||
|
||||
## Decisão para staging futuro
|
||||
|
||||
1. Manter o documento original imutável e identificá-lo pelo SHA-256 acima.
|
||||
2. Preparar uma tabela de staging que preserve a referência `tabela + linha`, valor original e moeda literal; linhas com cabeçalho misto ficam em revisão.
|
||||
3. Reconciliar o título repetido sem merge automático; preservar ambas as ocorrências até confirmar se são a mesma iniciativa, fases ou escopos.
|
||||
4. Separar `project`, `investment dossier` e `business opportunity`. A presença no PII, custo estimado e horizonte não constitui oferta aberta ou oportunidade disponível.
|
||||
5. Solicitar confirmação de responsável, estado, período preciso e validação territorial à entidade competente antes de criar/actualizar registos canónicos.
|
||||
6. Só depois da reconciliação, importar em ambiente isolado com relatório de rejeições e idempotência; aprovação editorial distinta antes de publicação.
|
||||
|
||||
## Estado
|
||||
|
||||
Extracção estrutural verificada e hash registado. Valores e referências institucionais ainda carecem de validação substantiva por projecto; nenhuma linha foi importada. Próxima actividade segura: produzir um staging CSV revisável com referências de tabela/linha, apenas depois de confirmar a classificação do duplicado e da coluna USD/MZN com o responsável pelo documento. Até lá, readiness do PII: **não pronto para importação/publicação**.
|
||||
|
||||
## Adenda — extracção de revisão não importável (2026-10-03)
|
||||
|
||||
O DOCX de origem voltou a ser localizado no caminho registado. O SHA-256 actual (`BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6`) coincide com a proveniência acima. Foi criada `docs/investmoz/source-staging/pii-26-30-review-only.csv` com 174 linhas, preservando índice de tabela no XML, linha, legenda da tabela, chave, título, tipo, relação literal, localização, custo literal, cabeçalho literal da moeda e horizonte. Cada linha tem estado `review_only_not_importable`; nenhum registo canónico ou anúncio foi criado.
|
||||
|
||||
A extração confirma que “Terminal de Contentores – Porto de Nacala” ocorre em T16/L4 (`A07 - C02`, `110,000,000`) e T17/L4 (`A08 - C02`, `300.000.000`), ambos sob cabeçalho USD. São identificadores/valores distintos: manter ambas as linhas para reconciliação, sem deduplicar ou escolher um valor. As sete linhas da tabela XML 19 conservam o cabeçalho `Custo (USD/ MZN)` e ficam marcadas `currency_ambiguous_mixed_header`. O texto inclui “Taxa de câmbio: 1 USD = 64,00 MZN” imediatamente antes e depois desta tabela, mas não estabelece a moeda de cada linha, a aplicação dessa taxa às estimativas, a data/base da taxa nem a autoridade da conversão; por isso, nenhum valor foi convertido.
|
||||
|
||||
As colunas uniformes das 13 tabelas não identificam pessoa/entidade responsável nem fase de execução; no CSV ficam vazias, sem inferência. Localizações e relações permanecem literais, não validadas. Validação do artefacto: 174/174 linhas, 174 referências tabela/linha únicas, 7 linhas em T19 sinalizadas e 2 linhas do título repetido sinalizadas. Não houve escrita em base de dados nem alteração do DOCX. Gate V-01/D-02 continua parcial e bloqueado para importação/publicação até reconciliação pelo responsável do documento e validação dos topónimos, responsáveis, estados e moeda.
|
||||
|
||||
Rollback deste artefacto derivado: remover apenas `pii-26-30-review-only.csv` e esta adenda; o original e dados de aplicação permanecem intactos.
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"base": "http://127.0.0.1:8000",
|
||||
"testedAt": "2026-10-04T13:58:01.667Z",
|
||||
"records": [
|
||||
{
|
||||
"key": "all",
|
||||
"route": "/oportunidades",
|
||||
"status": 200,
|
||||
"cards": 6,
|
||||
"unvalidatedNotice": 6
|
||||
},
|
||||
{
|
||||
"key": "province",
|
||||
"route": "/oportunidades?province=Nampula",
|
||||
"status": 200,
|
||||
"cards": 1,
|
||||
"unvalidatedNotice": 1
|
||||
},
|
||||
{
|
||||
"key": "sector",
|
||||
"route": "/oportunidades?sector=agronegocio",
|
||||
"status": 200,
|
||||
"cards": 1,
|
||||
"unvalidatedNotice": 1
|
||||
}
|
||||
],
|
||||
"errors": [],
|
||||
"detail": {
|
||||
"status": 200,
|
||||
"title": "Unidade de processamento agrícola em Nampula - Laravel",
|
||||
"unvalidatedNotice": true,
|
||||
"publishedIntentActionRequiresLogin": true
|
||||
},
|
||||
"pageErrors": []
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
# Piloto de utilização do percurso exploratório
|
||||
|
||||
Estado: protocolo preparado; sessões com empreendedores ainda não realizadas.
|
||||
Apresentação adequada neste momento: **versão piloto com continuidade técnica testada**. Não apresentar como ferramenta validada com utilizadores.
|
||||
Escopo: observar o percurso existente e a continuidade do dossier. O código já oferece recuperação anónima entre sessões do browser e associação explícita à conta; o piloto avaliará compreensão, confiança e dificuldades de utilização.
|
||||
|
||||
## Preparação
|
||||
|
||||
- Convidar pequenos empreendedores com diferentes níveis de familiaridade digital. Participação voluntária; explicar finalidade e que o protótipo não presta aconselhamento fiscal/financeiro nem submete candidaturas.
|
||||
- Obter consentimento antes da observação e permitir desistir. Usar exemplos sintéticos; não pedir nomes de clientes, NUIT, documentos, credenciais ou valores comerciais reais.
|
||||
- Incluir pelo menos uma sessão num telemóvel físico. Registar modelo/classe de ecrã, browser e larguras aproximadas, sem recolher identificadores do dispositivo.
|
||||
- Sessão sugerida: 30–45 minutos, observador sem conduzir as respostas. Pedir ao participante que pense em voz alta. Não gravar áudio/vídeo por defeito.
|
||||
|
||||
## Tarefas observadas
|
||||
|
||||
1. Iniciar uma ideia simples e explicar o que espera guardar.
|
||||
2. Descrever um negócio existente sem publicar nem submeter uma oportunidade.
|
||||
3. Prosseguir com localização, origem de mercado ou dados financeiros incompletos; identificar o que é opcional e o que impede avançar.
|
||||
4. Escolher “Guardar e continuar mais tarde”, fechar completamente o browser, reabri-lo e recuperar o rascunho; confirmar prazo e significado de “neste navegador”.
|
||||
5. Com conta de teste, autenticar e escolher explicitamente continuar um dossier existente ou guardar o anónimo como outro projecto. Confirmar que nada é fundido ou substituído sem escolha.
|
||||
6. Ligar o dossier a um negócio existente, confirmar o efeito limitado da ligação e desfazê-la; verificar que os dados do negócio não são copiados e que não há publicação.
|
||||
7. Navegar por teclado; localizar validações, estado da gravação, texto auxiliar (incluindo 12 px) e próxima acção.
|
||||
8. Exportar CSV e explicar valores declarados, estimados e indeterminados.
|
||||
|
||||
## Folha de observação (sem PII)
|
||||
|
||||
| Sessão | Dispositivo/browser | Tarefa | Resultado (concluída/parou) | Dificuldade ou interpretação | Sugestão literal, sem identificadores | Severidade (bloqueia/atrapalha/menor) |
|
||||
|---|---|---|---|---|---|---|
|
||||
| | | | | | | |
|
||||
|
||||
Em cada tarefa, observar primeiro sem ajudar. Registar conclusão autónoma, tempo aproximado, pedidos de ajuda, validações compreendidas à primeira, sucesso de recuperação e duplicações percebidas. Perguntar ao participante o que faria a seguir com o resultado e que dados considera declarados, estimados ou verificados. Não guardar respostas do formulário junto das notas de pesquisa.
|
||||
|
||||
## Critérios de saída
|
||||
|
||||
- Cada participante identifica que dados são guardados, onde e durante quanto tempo.
|
||||
- Recuperação após fechar o browser e associação após autenticar são observadas, sem inferências.
|
||||
- A escolha entre continuar um dossier e guardar outro é compreendida; não ocorre substituição/fusão inesperada.
|
||||
- A ligação reversível ao negócio existente não é confundida com cópia ou publicação.
|
||||
- Nenhum participante confunde estimativa com aprovação/decisão fiscal ou financeira.
|
||||
- Problemas de leitura no telemóvel, incluindo texto auxiliar de 12 px, são registados com contexto.
|
||||
- Perda, troca de titular ou publicação indevida constituem bloqueio do piloto.
|
||||
|
||||
## Estado técnico e limites conhecidos
|
||||
|
||||
- Recuperação anónima usa cookie aleatório `HttpOnly`, `SameSite=Lax` e prazo deslizante de 30 dias. Funciona no mesmo perfil do browser; não promete recuperação anónima noutro dispositivo. O prazo aparece no formulário.
|
||||
- A associação anónimo→conta e a ligação reversível a negócio requerem acção explícita; feature tests cobrem autorização, conflitos, repetição idempotente, ausência de fusão/cópia e reversão. A prova Chromium existente cobriu fechar e relançar um perfil anónimo persistente a 390×900, não uma sessão visual autenticada.
|
||||
- Evidências: `docs/investmoz/simulations/simulator-continuity-browser-2026-10-04.json` e `docs/investmoz/simulations/simulator-journey-browser-2026-10-04.json`. São ensaios sintéticos; não equivalem a observação de voluntários nem a ensaio num aparelho físico.
|
||||
- Catálogos de financiamento, indicadores oficiais e prestadores de formação permanecem ausentes; a interface identifica os limites e estes itens não bloqueiam o percurso exploratório.
|
||||
|
||||
## Consolidação após as sessões
|
||||
|
||||
Agrupar dificuldades por etapa e tema; manter as citações anonimizadas e sem dados do projecto. Para cada achado, registar evidência observada, número de sessões em que ocorreu, impacto (bloqueia/atrapalha/menor), alcance (telemóvel/computador/ambos), correcção proposta e prioridade. Priorizar primeiro perda/troca de dossier, associação/publicação acidental e impossibilidade de recuperar; depois bloqueios de navegação ou interpretação; por fim melhorias de texto e apresentação. Revalidar cada correcção nas tarefas que originaram o achado.
|
||||
|
||||
Resumo final: sessões realizadas; dispositivos/browser (sem identificadores); tarefas autónomas; ajudas solicitadas; falhas de recuperação/associação; distinção de dados; clareza da próxima acção; achados priorizados; correcções e reteste; limitações da amostra.
|
||||
|
||||
## Evidência e próxima verificação
|
||||
|
||||
Implementação técnica registada em `docs/investmoz/simulator-evolution-progress.md` (secção “Continuidade e associação explícita de dossiers — 2026-10-04”). Próxima etapa: executar as tarefas acima com voluntários e aparelho físico, recolher notas sem PII, corrigir bloqueios observados e actualizar esta folha. Não afirmar piloto concluído antes dessas sessões.
|
||||
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"base": "http://127.0.0.1:8000",
|
||||
"testedAt": "2026-10-04T13:38:08.584Z",
|
||||
"pages": [
|
||||
{
|
||||
"key": "catalogue",
|
||||
"status": 200,
|
||||
"title": "Catálogo de investimento - Laravel",
|
||||
"bodyTextLength": 7000
|
||||
},
|
||||
{
|
||||
"key": "clusters",
|
||||
"status": 200,
|
||||
"title": "Corredores, clusters e projectos âncora - Laravel",
|
||||
"bodyTextLength": 2614
|
||||
},
|
||||
{
|
||||
"key": "clusters-again",
|
||||
"status": 200,
|
||||
"title": "Corredores, clusters e projectos âncora - Laravel",
|
||||
"bodyTextLength": 2614
|
||||
},
|
||||
{
|
||||
"key": "clusters-after-location-filter",
|
||||
"status": 200,
|
||||
"title": "Corredores, clusters e projectos âncora - Laravel",
|
||||
"bodyTextLength": 2614
|
||||
},
|
||||
{
|
||||
"key": "clusters-no-results",
|
||||
"status": 200,
|
||||
"title": "Corredores, clusters e projectos âncora - Laravel",
|
||||
"bodyTextLength": 1177
|
||||
},
|
||||
{
|
||||
"key": "anchor-projects",
|
||||
"status": 200,
|
||||
"title": "Corredores, clusters e projectos âncora - Laravel",
|
||||
"bodyTextLength": 6513
|
||||
},
|
||||
{
|
||||
"key": "zee-catalogue",
|
||||
"status": 200,
|
||||
"title": "ZEE, ZFI e parques industriais - Laravel",
|
||||
"bodyTextLength": 1104
|
||||
},
|
||||
{
|
||||
"key": "existing-business-marketplace",
|
||||
"status": 200,
|
||||
"title": "Oportunidades de negócio - Laravel",
|
||||
"bodyTextLength": 645
|
||||
},
|
||||
{
|
||||
"key": "investment-guide-desktop",
|
||||
"status": 200,
|
||||
"title": "Como Investir / Procedimentos - Laravel",
|
||||
"bodyTextLength": 3760
|
||||
}
|
||||
],
|
||||
"errors": [],
|
||||
"catalogueStatus": "6 oportunidades publicadas",
|
||||
"navigationHasCatalogueGroup": true,
|
||||
"publishedOpportunityCount": 6,
|
||||
"clusterRecords": 8,
|
||||
"legacyclustersRedirect": true,
|
||||
"legacycorredoresRedirect": true,
|
||||
"legacyprojectos-ancoraRedirect": true,
|
||||
"locationFilterApplied": true,
|
||||
"locationFilteredResults": 0,
|
||||
"clusterDetailHref": "/carteira/ca6a1427-0e2b-406e-94bd-da23630d5ec4",
|
||||
"clusterDetailUrl": "http://127.0.0.1:8000/carteira/ca6a1427-0e2b-406e-94bd-da23630d5ec4",
|
||||
"clusterDetailLoaded": true,
|
||||
"privateManifestationRequiresAccount": true,
|
||||
"usefulEmptyState": true,
|
||||
"anchorDossiers": 15,
|
||||
"anchorReferenceVisible": true,
|
||||
"anchorDoesNotClaimOpenTender": true,
|
||||
"zoneCountText": "0 registos disponíveis",
|
||||
"businessListingCount": 0,
|
||||
"guideHasBothPaths": true,
|
||||
"ideaPathRenders": true,
|
||||
"activityContextShown": true,
|
||||
"mobileMenuExpanded": true,
|
||||
"keyboardFocusVisible": true,
|
||||
"pageErrors": []
|
||||
}
|
||||
|
After Width: | Height: | Size: 318 KiB |
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"testedAt": "2026-10-04T14:12:49.096Z",
|
||||
"loginSucceeded": true,
|
||||
"dossierHttpStatus": 200,
|
||||
"existingDraftVisible": true,
|
||||
"cancelledConfirmationKeepsDossierPage": true,
|
||||
"cancelledConfirmationSentNoCreateRequest": true,
|
||||
"publicDossierRemainsVisible": true,
|
||||
"existingDraftContinues": true,
|
||||
"pageErrors": []
|
||||
}
|
||||
|
After Width: | Height: | Size: 407 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"testedAt": "2026-10-04T15:27:23.846Z",
|
||||
"path": "/oportunidades",
|
||||
"initialFilters": {
|
||||
"province_id": "c20efcce-8af8-588d-84b2-b4b138b6e066",
|
||||
"sector": "energia"
|
||||
},
|
||||
"initialCount": 1,
|
||||
"removedFilter": "sector",
|
||||
"remainingFilters": {
|
||||
"province_id": "c20efcce-8af8-588d-84b2-b4b138b6e066"
|
||||
},
|
||||
"countAfterRemoval": 2,
|
||||
"oneFilterRemovedIndividually": true,
|
||||
"javascriptErrors": []
|
||||
}
|
||||
|
After Width: | Height: | Size: 437 KiB |
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"testedAt": "2026-10-04T14:29:24.997Z",
|
||||
"desktop": {
|
||||
"httpStatus": 200,
|
||||
"province": {
|
||||
"id": "059b02ca-7095-577a-8705-4d4c46896747",
|
||||
"label": "Cabo Delgado (02)"
|
||||
},
|
||||
"url": "http://127.0.0.1:8000/oportunidades?admin_post_id=&before=&cluster_id=&corridor_id=¤cy=&dimension=&district=&district_id=&education=0&geo_location_id=&include_national=0&locality_id=&maturity_level=&max_amount=&min_amount=&park_id=&project_id=&province=&province_id=059b02ca-7095-577a-8705-4d4c46896747&q=§or=&sort=recent&view=grid&zee_id=&zfi_id=",
|
||||
"listCount": 0,
|
||||
"mapMatchedCount": 0,
|
||||
"apiSearchCount": 0,
|
||||
"csvStatus": 200,
|
||||
"csvHasBom": true,
|
||||
"csvDataRows": 0,
|
||||
"emptyStateVisible": true,
|
||||
"widenSearchVisible": true,
|
||||
"activeFilterShown": true
|
||||
},
|
||||
"mobile": {
|
||||
"viewport": {
|
||||
"width": 390,
|
||||
"height": 844
|
||||
},
|
||||
"documentWidth": 390,
|
||||
"horizontalOverflow": false,
|
||||
"sameEmptyState": true
|
||||
},
|
||||
"detailReturn": {
|
||||
"detailHttp": 200,
|
||||
"backHref": "/oportunidades?province_id=059b02ca-7095-577a-8705-4d4c46896747&include_national=0",
|
||||
"provincePreservedOnReturn": true,
|
||||
"returnedListCount": 0
|
||||
},
|
||||
"businessMarketplace": {
|
||||
"httpStatus": 200,
|
||||
"territoryFilterApplied": true,
|
||||
"viewportWidth": 390,
|
||||
"documentWidth": 390,
|
||||
"resultSummary": "0 anúncios de negócios publicados",
|
||||
"consoleErrors": []
|
||||
},
|
||||
"consoleErrors": []
|
||||
}
|
||||
|
After Width: | Height: | Size: 797 KiB |
|
After Width: | Height: | Size: 457 KiB |
|
After Width: | Height: | Size: 291 KiB |
@@ -0,0 +1,51 @@
|
||||
# Seguimento da pesquisa territorial — 04/10/2026
|
||||
|
||||
## Resultado
|
||||
|
||||
A coluna `simulation_form_drafts.expires_at` está presente na base activa `investemoz`. A falha de continuidade foi resolvida na execução anterior: a causa, transição dos rascunhos e evidência do Edge estão em [incidente de continuidade](../simulations/simulation-draft-continuity-incident-2026-10-04.md) e [registo do browser](../simulations/simulation-draft-continuity-active-browser-2026-10-04.json). Nesta verificação confirmei novamente a coluna no schema activo; não corri limpeza nem alterei rascunhos.
|
||||
|
||||
## Pesquisa positiva no portal local ligado à base activa
|
||||
|
||||
No browser Edge, em `http://127.0.0.1:8000/oportunidades`, seleccionei Zambézia (UUID `c20efcce-8af8-588d-84b2-b4b138b6e066`). A ligação Laravel confirmou a base `investemoz`. A pesquisa sem filtro devolveu 6 oportunidades; a área seleccionada devolveu 2, iguais às da API:
|
||||
|
||||
- Processamento de pescado e cadeia fria
|
||||
- Mini-rede solar para polo produtivo
|
||||
|
||||
As outras quatro oportunidades publicadas, de outras províncias, não apareceram. Lista e API coincidiram. Em 390×844 não houve overflow horizontal nem erros JavaScript. O mapa terminou com zero coordenadas disponíveis para estes dois registos; as fichas permaneceram na lista e não se inferiram coordenadas.
|
||||
|
||||
Evidência: [JSON do ensaio positivo](territorial-search-positive-browser-2026-10-04.json), [captura desktop](territorial-search-positive-desktop-2026-10-04.png) e [captura 390 px](territorial-search-positive-mobile-2026-10-04.png). Também removi o filtro Sector no browser: a contagem passou de 1 para 2 e a província Zambézia permaneceu activa; [registo](territorial-filter-removal-browser-2026-10-04.json) e [captura](territorial-filter-removal-browser-2026-10-04.png).
|
||||
|
||||
## Alterações desta continuação
|
||||
|
||||
- `InvestmentGeography::constrainDossiersToTerritories()` concentra o filtro territorial dos dossiês usados por `/carteira` e pelo catálogo. Inclui localizações primárias e locais públicos de corredores; para a localização de clusters/corredores pelos projectos relacionados exige relação pública, validada, vigente e projecto não eliminado nem em rascunho. A associação não é inferida por nomes.
|
||||
- `/management/education`: com uma área activa, cursos e prestadores só aparecem se existir capacidade formativa registada nessa hierarquia territorial. Não se infere o local pelo endereço ou nome do prestador. Sem filtro territorial, o catálogo mantém a listagem geral.
|
||||
- `/management/opportunities?geography_scope=unspecified`: filtro protegido por autenticação de gestor, contador de pendências e território já registado com origem/código quando disponíveis. A lista não altera âmbito nem localização; a confirmação continua manual e baseada em fontes existentes.
|
||||
- Testes acrescentados cobrem capacidade formativa em duas províncias, relação de cluster pendente versus validada, e paginação pública acima de 12 itens mantendo a província.
|
||||
|
||||
Na base activa encontrei 6 oportunidades publicadas marcadas `unspecified`. Todas já guardam um território primário e a fonte/código do nó territorial (Nampula, Zambezia, Inhambane, Sofala, Zambezia e Maputo Cidade). Não alterei qualquer registo nem converti `unspecified` em `specific`; a classificação ainda precisa de revisão documental individual.
|
||||
|
||||
## Verificações executadas
|
||||
|
||||
- `php artisan migrate:status`: confirmou `2026_10_04_120000_add_simulation_draft_continuity` aplicada; as migrations não relacionadas continuaram pendentes.
|
||||
- Consulta de leitura ao schema/base activa: `investemoz`, coluna `expires_at` presente, 6 oportunidades publicadas `unspecified` com território primário. Nenhuma alteração à base activa nesta continuação.
|
||||
- Suites PHP relacionadas, num processo e numa base PostgreSQL descartável: `InvestmentTerritoryTest|InvestmentPortfolioTest|ExistingBusinessWizardTest|EducationTest|InvestmentZoneTest|InvestmentUnificationTest` — **47 testes, 835 afirmações, passaram**.
|
||||
- Os testes específicos da fila administrativa e de cursos/prestadores também passaram isoladamente durante o diagnóstico.
|
||||
- `npm.cmd run build`: passou. Mantém avisos do pacote opcional `fontaine` e do chunk `services` acima de 500 kB.
|
||||
- `php -l`: passou nos controllers/serviço alterados.
|
||||
- Browser real local/Edge: pesquisa positiva acima e viewport móvel emulado. Não equivale a ensaio num telemóvel físico.
|
||||
|
||||
O runner configurado em `phpunit.xml` aponta à porta `55441`, onde não havia PostgreSQL a escutar (`connection refused`). Para executar sem tocar em `investemoz`, criei a base vazia `investmoz_territory_qa_20261004_test` na instância local 5432, migrei-a e usei-a só para os testes. O bootstrap contém limpeza de funções e schema auxiliar restrita a nomes/porta de teste pré-configurados; foi preciso limpar esses objectos apenas nesse banco descartável. Não consegui reproduzir a falha de interferência: as seis suites passaram juntas nessa base depois da preparação. A configuração habitual do runner permanece dependente de voltar a disponibilizar o PostgreSQL de testes na porta 55441.
|
||||
|
||||
## Limites ainda abertos
|
||||
|
||||
- Clusters têm teste da associação validada a projectos em várias localizações; a extensão equivalente a corredores foi implementada, mas ainda precisa de caso de regressão próprio e evidência no browser.
|
||||
- `/negocios` precisa de caso dedicado multi-localização; `/zonas` precisa de caso multi-geometria. Assistência fundiária e restantes pesquisas GIS continuam por uniformizar/testar.
|
||||
- A cobertura do percurso de educação agora usa capacidades como evidência territorial, mas ainda falta ensaio visual autenticado da página administrativa.
|
||||
- A segunda página foi verificada por teste HTTP sintético, com 13 registos e filtro de província preservado; a navegação de página no browser com dados acima de 12 continua pendente.
|
||||
- Os filtros activos agora têm acções de remoção individual, incluindo níveis territoriais, pesquisa, entidades, facetas, educação, maturidade, montante, data e âmbito nacional. O ensaio visual verificou remoção de Sector mantendo a província; cada tipo de chip ainda não tem cenário browser automatizado próprio.
|
||||
- A fila `unspecified` tem teste de acesso/filtragem, mas a revisão dos seis registos e confirmação das fontes é trabalho editorial de gestor; nenhum foi reclassificado.
|
||||
- Falta ensaio num dispositivo móvel físico.
|
||||
|
||||
Não declarar a cobertura territorial transversal concluída. As rotas e pendências por módulo continuam descritas na [auditoria territorial anterior](../territorial-search-audit-2026-10-04.md).
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 701 KiB |
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"testedAt": "2026-10-04T15:22:02.196Z",
|
||||
"portal": "http://127.0.0.1:8000",
|
||||
"database": "investemoz",
|
||||
"path": "/oportunidades",
|
||||
"province": {
|
||||
"id": "c20efcce-8af8-588d-84b2-b4b138b6e066",
|
||||
"name": "Zambezia"
|
||||
},
|
||||
"unfilteredCount": 6,
|
||||
"filteredCount": 2,
|
||||
"visibleCountText": "2 oportunidades publicadas",
|
||||
"visibleTitles": [
|
||||
"Processamento de pescado e cadeia fria",
|
||||
"Mini-rede solar para polo produtivo"
|
||||
],
|
||||
"excludedOtherAreaTitles": [
|
||||
"Plataforma de crédito para PME agrícolas",
|
||||
"Centro logístico provincial",
|
||||
"Eco-lodge costeiro com integração comunitária",
|
||||
"Unidade de processamento agrícola em Nampula"
|
||||
],
|
||||
"serverApiMatchesVisibleResults": true,
|
||||
"mapStatus": [
|
||||
"0 investimentos com coordenadas disponíveis."
|
||||
],
|
||||
"mobile": {
|
||||
"innerWidth": 390,
|
||||
"scrollWidth": 390,
|
||||
"noHorizontalOverflow": true
|
||||
},
|
||||
"javascriptErrors": []
|
||||
}
|
||||
|
After Width: | Height: | Size: 470 KiB |
|
After Width: | Height: | Size: 359 KiB |
@@ -41,3 +41,10 @@ Continuam pendentes: cadastro GIS e nós territoriais, CRUD das relações de co
|
||||
## Migração e reversão
|
||||
|
||||
Migração aditiva `2026_09_25_130000_investment_portfolio_journeys`. Não modifica as migrations históricas. O rollback recusa eliminar dossiers ou contas existentes; preservar dados e preparar reconciliação antes de reverter o esquema. Para suspender divulgação, guardar a ficha como rascunho. Não executar `migrate:fresh` na base local ou de produção.
|
||||
|
||||
### Publicação da carteira — aprovação separada da importação (2026-10-03)
|
||||
|
||||
- Corrigido um bypass verificado: `portfolio:import --approval=<texto>` aceitava qualquer texto arbitrário e publicava até 29 dossiers sem autenticar o proprietário nem confirmar revisão. O comando agora só corre o seeder idempotente e deixa os dossiers em rascunho privado. O parâmetro `--approval` deixou de existir; chamada com esse parâmetro foi executada e terminou com erro `The "--approval" option does not exist.`
|
||||
- Fechada também a auto-publicação pela rota de gestão: um dossier sem editor atribuído não pode ser publicado (422); o editor não pode rever/publicar a própria edição (403); outro gestor tem de rever. O fluxo mantém versão optimista, evidência e auditoria. As fichas já publicadas/históricas não foram alteradas.
|
||||
- `InvestmentPortfolioTest` + `InvestmentUnificationTest`: 15/15 testes, 224 assertions, incluindo importação repetida, ausência de publicação automática, preservação de edições, editor distinto e filtros com fixtures sintéticas explicitamente publicadas. PHPStan 0 erros; Pint e PHP lint dirigidos passaram. Testes em PostgreSQL 17 isolado, PHP 8.5.11/porta 55441. Não foi usada a base 5432.
|
||||
- Sem migration. Rollback de código reabre os caminhos de auto-publicação; preservar o controlo actual salvo decisão expressa de política. O histórico documental de 26/09 sobre a autorização inicial foi mantido como histórico, não como instrução de execução actual.
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
# Incidente de encaminhamento do smoke test a `investemoz` — 2026-10-03
|
||||
|
||||
## Estado
|
||||
|
||||
Investigacao em curso. Nao consultar nem modificar a base `investemoz`/5432 para reconciliar este incidente. Nao apagar linhas sem backup, identificacao exacta e decisao do responsavel. Os servidores de teste em 18082/18083, Edge/CDP em 9224 e PostgreSQL QA foram parados; 5432 continua apenas escuta preexistente.
|
||||
|
||||
## Causa confirmada
|
||||
|
||||
`artisan serve` iniciou um processo PHP filho que carregou a configuracao de `.env` (`DB_DATABASE=investemoz`, `DB_PORT=5432`) apesar das variaveis QA definidas no processo pai. Uma instrumentacao temporaria, removida de seguida de `SimulationController.php`, registou a configuracao efectiva dentro do pedido HTTP: `database=investemoz`, `queue=database`, `jobs=13` em 2026-10-03 10:13:13. O valor `jobs=13` era uma contagem total observada nessa altura; nao atribuir os 13 registos a este teste.
|
||||
|
||||
Os comandos Tinker directos apontavam para `investmoz_browser_e2e_test`/55442, mas nao isolavam os pedidos servidos pelo filho de `artisan serve`. Por isso, os relatórios anteriores que classificaram as chamadas de escrita do browser como QA isolado nao sao evidencia valida de isolamento da base.
|
||||
|
||||
## Accoes executadas e limites
|
||||
|
||||
- Varios smoke tests anonimos abriram `/simulador-fiscal`, submeteram um cenario aritmetico hipotetico e autosalvaram um rascunho. Entradas observadas: periodo 2026, contexto INSS, base 1000, taxa hipotetica 10%, reducao hipotetica 50%; o formulario nao introduziu identidade ou contacto. A API devolveu `202` e o estado observado permaneceu `queued`.
|
||||
- Foram vistos estes IDs em respostas/logs persistidos: `0233d756-c0e8-47c0-8fc7-329edb05b146`, `02cadbcb-54cc-43d3-b357-fb084ce8d79f`, `2ecf214c-da99-494e-834d-a983dc678f2d`, `85b3b99d-b30e-4f01-ab18-4f6304c1e2d9`, `8871446e-acdc-4148-8393-0d1453adb822`, `b0f97e3c-61a2-46be-84c4-d68089dfc323`. Registos historicos desta mesma sequencia ja mencionavam `08b7c0ec-7bc0-4f65-864d-f130ca0a320a`, `809071e6-5aaf-4b8e-988e-3647542f06fd` e `731af461-c8c1-4d45-8f14-cf049c51d1f1`. Esta lista pode nao ser completa: algumas execucoes falhadas nao conservaram o corpo com o ID.
|
||||
- O acesso ocorreu atraves da aplicacao e incluiu uma contagem agregada `jobs`; nao houve consulta directa a linhas de `investemoz`, eliminacao, migracao ou limpeza nessa base. Nenhuma chamada externa ou publicacao ocorreu.
|
||||
- Dois jobs QA inseridos manualmente para diagnostico tinham UUID de simulacao malformado `-12001`; foram identificados apenas na base QA 55442 e removidos de `failed_jobs`. O teste com UUID QA valido demonstrou `dispatch(afterCommit)` e worker funcionais nessa base, mas nao valida o processo HTTP.
|
||||
- A linha temporaria de logging foi retirada do controlador. A correcao cliente `queued` sem `result_snapshot` e os seus testes nao dependem de acesso a dados da base operacional.
|
||||
|
||||
## Reconciliacao necessaria pelo responsavel da base
|
||||
|
||||
Rever os IDs conhecidos acima e os registos de rascunho/simulacao associados directamente com um procedimento autorizado, backup e controlos de acesso. Decidir se os registos devem permanecer ou ser removidos. Ate essa verificacao, nao declarar a evidencia de escrita do browser isolada, nao repetir `artisan serve` para ensaios com variaveis QA e nao efectuar cleanup.
|
||||
|
||||
## Harness QA para repeticao
|
||||
|
||||
Usar um servidor PHP cujo proprio processo de pedido fixe explicitamente `APP_ENV=testing`, `DB_CONNECTION=pgsql`, `DB_HOST=127.0.0.1`, a porta da instancia QA, `DB_DATABASE=investmoz_browser_e2e_test`, role QA e `DB_URL=`; confirmar por log/config de runtime antes de qualquer escrita. Nao confiar apenas nas variaveis definidas para o pai de `artisan serve`. A porta 5432 nao deve ser aberta, consultada ou modificada para esta validacao.
|
||||
|
||||
## Repeticao confirmada em QA isolado (2026-10-03 10:20 UTC)
|
||||
|
||||
O harness foi substituido por um PHP router de teste que define os valores de ambiente dentro de cada processo HTTP, assinala as respostas com `X-Investmoz-QA-Target: investmoz_browser_e2e_test:55442`, e encaminha os assets estaticos a partir de `public/`. A leitura publica de territorios respondeu JSON 200 com a marca QA antes do teste de escrita.
|
||||
|
||||
Com router QA e worker Laravel apontados para a porta 55442, o smoke Edge/CDP passou: validacao acessivel verdadeira; zero POST antes de corrigir campos; POST de simulacao 202 com `replayed=false` e estado queued sem `result_snapshot`; GET 200 e resultado final aritmetico 50; autosave GET 200/POST 201; aviso fiscal e privacidade anonima visiveis; sem alertas visiveis ou excepcoes JavaScript. Relatorio actualizado: `docs/investmoz/simulations/simulator-calculation-browser-2026-10-03.json` (`passed=true`). UUID QA observado: `d466c603-46bb-4b7e-ba1c-8bdb704ec735`.
|
||||
|
||||
A falha foi do harness anterior (`artisan serve` a ignorar variaveis QA), nao do worker nem da fila da aplicacao. O worker processou o job QA valido. A conclusao desta repeticao nao reconcilia nem limpa os pedidos anteriores encaminhados a `investemoz`; ver accao do responsavel acima.
|
||||
@@ -0,0 +1,295 @@
|
||||
# Estado actual da evolução do simulador — 2026-10-03
|
||||
|
||||
Este quadro reconcilia o resumo histórico de `simulator-evolution-progress.md` com as adendas posteriores. É o estado técnico proposto para revisão; não altera gates humanos nem declara aprovação fiscal ou contabilística.
|
||||
|
||||
| Etapa | Estado actual | Evidência disponível | Pendências que impedem conclusão |
|
||||
| --- | --- | --- | --- |
|
||||
| 0 — diagnóstico | Concluída tecnicamente | Arquitectura, rotas, stack, CI, API e suites inventariados no ledger. | Revisão e aceitação de produto. |
|
||||
| 1 — contratos | Concluída tecnicamente | Guards runtime e testes cobrem criação/polling/leitura, histórico, drafts/conversão e contratos de questionário, relatório, jobs e erros; OpenAPI tipado; testes PHP confirmam respostas API e round-trip entre snapshot/relatório persistidos e resposta. | Endpoints de questionário, jobs e relatório não são consumidos pela interface actual; se futuramente forem integrados, ligar então os guards existentes. |
|
||||
| 2 — formulário público | Parcial | Percursos por perfil, página/menu públicos, validação, modo avançado, privacidade anónima e navegação por teclado; Edge CDP verificou 390/768/1024/1440 px, foco em 12 destinos nomeados/visíveis, zero controlos sem nome/overflow e GET `/api/v1/simulation-drafts/current` 200 no PostgreSQL/PostGIS QA. Evidência: [relatório browser](simulator-browser-audit-2026-10-03.json), [script reutilizável](../../../tools/simulator-a11y-browser.mjs). | Testes com leitor de ecrã e dispositivo físico, validação manual do percurso e revisão de produto. O smoke test não calcula nem testa submissões de escrita. |
|
||||
| 3 — calculadoras | Parcial, educativas | Orçamento, break-even, financiamento e amortização; testes exactos cobrem juros zero, taxas nominais/efectivas, carência, comissões, reconciliação em cêntimos e última prestação. | Modelo não é oferta de credor; revisão financeira institucional e cobertura de necessidades pessoais mais ampla. |
|
||||
| 4 — fontes/governação | Parcial; gate humano pendente | Texto do BR 248 e republicação da Lei 22/2022 arquivados/revistos; ciclo de governação de regras implementado. A taxa geral de IVA de 16% está confirmada no art. 17(1) da republicação oficial. | Regulamentos anunciados de 2026, regras por âmbito/vigência, INSS, pauta integral, revisão e aprovação formal do Fiscalista. INM encaminha BR 186/187 para a Loja; as fichas abertas não expõem o conteúdo. |
|
||||
| 5 — motor fiscal | Infraestrutura interna parcial; cálculo público bloqueado | DSL whitelist/DAG, aritmética racional, arredondamento explícito, resolvedor de parâmetros por período/contexto e governação versionada; testes focados 9/9 + 4/4. | Integração com RunSimulation e snapshot explicável, fontes oficiais autenticadas, arredondamento aprovado por componente e casos golden revistos por Fiscalista. |
|
||||
| 6 — plano financeiro | Parcial, implementado em grande parte | Plano empresarial v1–v17; calendário de pagamentos de passivos de abertura, com saldo final exposto; versões anteriores legíveis. Suite financeira/frontend verde. | Validação contabilística institucional e incumprimento/fornecedores partilhados não modelados. |
|
||||
| 7 — ponte financeira/fiscal | Parcial | Ponte financeira por mês; tesouraria aceita imposto fixo ou calendário variável por pressuposto do utilizador, mantém meses ausentes indeterminados e separa créditos/pedidos/reconhecimentos IVA do caixa. Suite de calendário 11/11. | Calendário local não persistido; classificação de dedutibilidade e regras fiscais aprovadas continuam pendentes. |
|
||||
| 8 — resultados/exportação | Concluída tecnicamente para CSV; validação global parcial | Ecrã/CSV reconciliam snapshots e hashes; calculadoras, tesouraria, plano e resultado aritmético têm CSV. PDF não é requisito desta etapa no anexo. | Revisão assistiva manual e gates institucionais continuam pendentes. |
|
||||
| 9 — conta/Project/CRM | Parcial | Histórico paginado autenticado, isolamento, consentimento, optimistic locking e conversão escolhida para rascunho cifrado, com versão/hash e deduplicação. | Não submete/cria projecto no CRM; teste de integração e revisão assistiva do fluxo real pendentes. |
|
||||
| 10 — incentivos/extensões | Parcial informativa/territorial; benefícios e cálculos regulados desactivados | Zonas públicas exigem fonte vigente, registos validados, relações/geo revistas; interface esclarece que zona não atribui benefício/licença/autorização. InvestmentZoneTest 6/6, 104 asserções. | Inventário validado por domínio; fontes oficiais/autenticidade; regras fiscais/aduaneiras/cambiais e aprovação competente; revisão de produto/browser. |
|
||||
| 11 — verificação/entrega | Parcial | Regressão PHP integral 253/253 (2.590 asserções), frontend 119/119, TypeScript, PHPStan 0 erros, build Vite 2.397 módulos; testes de zonas 6/6. | Revisão manual com leitor de ecrã/dispositivo, aprovação de produto e gates fiscais/jurídicos. |
|
||||
|
||||
## Reconciliação actual das etapas — 2026-10-03
|
||||
|
||||
A tabela histórica abaixo é complementada e, para totais/estado técnico, substituída por esta reconciliação mais recente.
|
||||
|
||||
| Etapa | Estado actual | Gate/pendência principal |
|
||||
| --- | --- | --- |
|
||||
| 0 | Concluída tecnicamente | Revisão de produto. |
|
||||
| 1 — contratos | Concluída tecnicamente | Round-trip API/persistência verificado nos testes de execução e relatório; conversão/retoma cobertas pelos testes de drafts; guards de respostas consumidas e contratos dos endpoints ainda não consumidos estão testados. Gate global permanece independente. |
|
||||
| 2 | Parcial | Leitor de ecrã/dispositivo físico e revisão manual após modo fiscal personalizado. |
|
||||
| 3 | Parcial, educativa | Revisão financeira institucional. |
|
||||
| 4 | Parcial; fontes legais pendentes | Texto oficial completo dos BR 186/187 e aprovação Fiscalista. |
|
||||
| 5 — motor fiscal | Infraestrutura interna parcial; cálculo público bloqueado | DSL whitelist/DAG, aritmética racional, arredondamento explícito, resolvedor de parâmetros por período/contexto e governação versionada; testes focados 9/9 + 4/4. | Integração com RunSimulation e snapshot explicável, fontes oficiais autenticadas, arredondamento aprovado por componente e casos golden revistos por Fiscalista. |
|
||||
| 6–7 | Parciais | Plano v17 reconcilia pagamentos de passivos de abertura; ponte mantém matéria colectável indeterminada sem regra fiscal aprovada. Validação institucional/fornecedores partilhados pendentes. |
|
||||
| 8 — resultados/exportação | Concluída tecnicamente para CSV; validação global parcial | CSV/ecrã reconciliam; PDF não está no escopo do anexo. Revisão assistiva e gates institucionais continuam pendentes. |
|
||||
| 9 | Parcial | Resultado concluído mantém manifestação pública independente em `/manifestar-interesse`, sem partilhar a simulação; conversão consentida para rascunho continua separada. Integração/criação de Project e CRM e revisão assistiva continuam pendentes. |
|
||||
| 10 — incentivos/extensões | Parcial informativa/territorial; benefícios e cálculos regulados desactivados | Zonas públicas exigem fonte vigente, registos validados, relações/geo revistas; interface esclarece que zona não atribui benefício/licença/autorização. InvestmentZoneTest 6/6, 104 asserções. | Inventário validado por domínio; fontes oficiais/autenticidade; regras fiscais/aduaneiras/cambiais e aprovação competente; revisão de produto/browser. |
|
||||
| 11 — verificação/entrega | Parcial | Regressão PHP integral 253/253 (2.590 asserções), frontend 119/119, TypeScript, PHPStan 0 erros, build Vite 2.397 módulos; testes de zonas 6/6. | Revisão manual com leitor de ecrã/dispositivo, aprovação de produto e gates fiscais/jurídicos. |
|
||||
|
||||
Evidência global mais recente: PHP 253/253 (2.590 asserções) na última suite QA registada; frontend 124/124, TypeScript, PHPStan (0 erros) na suite QA registada, e build Vite (2.397 módulos) passaram. Esta tranche repetiu frontend/TypeScript/build, mas não a suite PHP. Smoke Edge QA passou. PostgreSQL QA/55441 parado; nenhuma regra fiscal activada.
|
||||
## Decisões e limites actuais
|
||||
|
||||
- **IVA:** a divergência legal 16%/17% fica resolvida ao nível textual pela republicação oficial da Lei 22/2022, art. 17(1); páginas informativas da AT que dizem 17% estão desactualizadas. Isto não aprova regimes, incidência, deduções, reembolsos, regras regulamentares de 2026 nem parâmetros de produção.
|
||||
- **BR 186/187:** metadados e datas confirmados no catálogo INM. A íntegra não foi obtida; não se inferem diplomas, artigos ou vigência a partir do comunicado do Governo.
|
||||
- **Microfinanças:** calculadora de empréstimos permanece educativa e separada do registo de operadores. Não concede crédito, capta depósitos ou sugere autorização.
|
||||
- **Activação:** nenhuma regra fiscal, incentivo ou pauta aduaneira está activada pelo simulador. Não houve publicação em produção nem integração externa nesta sequência.
|
||||
- **Testes após alterações:** as suites focadas recentes passaram (empréstimos 12/12; tesouraria 6/6; relatório aritmético 19/19), e a suite frontend completa passou 98/98. O build actual passou com aviso informativo de dependência opcional `fontaine`. O GET de rascunho foi lido em QA e respondeu 200; nenhum cálculo/submissão foi criado pelo browser audit.
|
||||
|
||||
## Evidências documentais relacionadas
|
||||
|
||||
- [Matriz do texto primário 2025–2026](primary-text-review-2025-2026.md)
|
||||
- [Revisão da reforma fiscal 2026](fiscal-reform-2026-review.md)
|
||||
- [Registo de fontes oficiais e lacunas](official-source-register.md)
|
||||
- [Contratos de dados do simulador](data-contracts.md)
|
||||
- [Lei 22/2022 republicada — PDF arquivado](source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf)
|
||||
- [BR 248, suplemento de 2025 — PDF arquivado](source-archive/BR-248-I-Suplemento-1-2025.pdf)
|
||||
- [Auditoria automatizada da UI em Edge headless](simulator-browser-audit-2026-10-03.json)
|
||||
- [Script de smoke test da UI e foco por teclado](../../../tools/simulator-a11y-browser.mjs)
|
||||
|
||||
## Próxima acção
|
||||
|
||||
Prosseguir testes/validação financeira independente e revisão manual de acessibilidade quando houver browser/leitor de ecrã/dispositivo disponível. Para os gates fiscais, obter legalmente os textos integrais dos BR 186/187, reconciliar os regulamentos e encaminhar a matriz para aprovação identificável do Fiscalista. Não activar regras antes desses passos.
|
||||
|
||||
## Validação adicional da Etapa 2/11 — cálculo anónimo no browser (2026-10-03)
|
||||
|
||||
- Edge headless percorreu o formulário público, escolheu “Apenas simular”, período 2026 e contexto de componente INSS, introduziu base 1000, taxa hipotética 10% e redução hipotética 50%, recebeu POST 202 da API e leu o estado concluído com resultado aritmético `50.000…`. A página preservou o aviso de que o resultado não determina taxas, elegibilidade ou obrigação fiscal; não apresentou alertas nem excepções JS.
|
||||
- O ensaio QA validou ainda o autosave anónimo: GET corrente 200, POST de rascunho 201, sem resposta API falhada. A suite confirmou `personal_snapshot=[]` no armazenamento/retoma anónimos. Dados de ensaio foram criados apenas na base PostgreSQL QA isolada `investmoz_browser_e2e` na porta 55441; a base de teste foi reposta pela suite e ficou sem simulações nem rascunhos após os testes.
|
||||
- Corrigi o contrato do autosave: arrays pessoais vazios passam a ser aceites quando presentes, e a política do servidor continua a substituir qualquer conteúdo pessoal por array vazio para sessões anónimas. Corrigi também a apresentação de estados internos (`queued`, `running`, `completed`, `failed`) para rótulos em português.
|
||||
- Evidência: `php vendor/bin/phpunit --filter SimulationFormDraftTest` passou 9/9 testes e 67 asserções em `investmoz_browser_e2e`; `node --test tests/frontend/*.test.mjs` passou 98/98; `npm.cmd run types:check`, `npm.cmd run build` (2.388 módulos), `npm.cmd run check` dirigido, Pint dirigido, `node --check` e `git diff --check` passaram. O relatório browser está em `simulator-calculation-browser-2026-10-03.json`.
|
||||
- Limitação/incidente: as primeiras tentativas usaram `php artisan serve`; o processo filho não ficou comprovadamente ligado à base QA e os resultados não apareceram nessa base. Como `.env` local aponta para `investemoz` na porta 5432, duas execuções podem ter sido gravadas nessa base. Não consultei nem apaguei a base da porta 5432. UUIDs observados: `809071e6-5aaf-4b8e-988e-3647542f06fd` e `731af461-c8c1-4d45-8f14-cf049c51d1f1`. O responsável pela base operacional deve verificar e decidir eventual remoção.
|
||||
- Estado: o percurso automatizado de cálculo anónimo e autosave foi verificado no browser; a etapa permanece parcial até revisão manual com leitor de ecrã/dispositivo e validação de produto. Nenhuma regra fiscal foi activada.
|
||||
|
||||
### Reconciliación do ensaio QA e suite global — 2026-10-03
|
||||
|
||||
- O primeiro lançamento da suite global no banco novo falhou em 25 testes antes da lógica de negócio: vários testes impõem o sufixo `_test` como condição de segurança. Renomeei a base descartável para `investmoz_browser_e2e_test`, actualizei a allowlist exacta de QA e repeti a suite.
|
||||
- Resultado final: `php vendor/bin/phpunit` passou **231/231 testes e 2.288 asserções** em 75,566 s, na base `investmoz_browser_e2e_test`, PostgreSQL QA porta 55441. Os 25 erros anteriores eram exclusivamente a guarda do nome da base; foram eliminados pelo alvo QA compatível.
|
||||
- A primeira base `investmoz_browser_e2e` foi renomeada, não copiada; o alvo actual é a única base QA adicional admitida pelo harness. Base `investmoz_test` preexistente não foi usada nesta suite.
|
||||
|
||||
## Etapa 1 — contrato de execucao e decimais (2026-10-03)
|
||||
|
||||
- O formulario valida as respostas JSON de criacao, polling e leitura antes de as usar; estados desconhecidos, envelope incompleto ou ID divergente sao rejeitados.
|
||||
- OpenAPI agora documenta as respostas de execucao e os campos monetarios/taxas como strings decimais, alinhados com o payload JSON e `data-contracts.md`. O servidor continua responsavel pelos limites numericos; nenhuma precisao maxima foi inventada.
|
||||
- Evidencia: `node --test tests/frontend/*.test.mjs` passou 101/101; `npm.cmd run types:check` passou; `npm.cmd run check` dirigido passou; `npm.cmd run build` compilou 2.388 modulos. Aviso apenas informativo: pacote opcional `fontaine` ausente.
|
||||
- A etapa 1 continua parcial: falta tipar e testar os restantes endpoints de questionario, draft, historico, reports e erros, alem de round-trip de persistencia.
|
||||
|
||||
## Etapa 1 — histórico e rascunhos API (2026-10-03)
|
||||
|
||||
- O formulário valida respostas paginadas do histórico, leituras de rascunho (incluindo `data: null` e `personal_snapshot: []` anónimo), confirmações de escrita e anexação. Erros estruturais não são aceites como sucesso.
|
||||
- OpenAPI liga os schemas de questionário, histórico, rascunho, anexação e relatório aos endpoints correspondentes; respostas de erro e paginação estão descritas. As decimais continuam strings exactas nos pedidos.
|
||||
- Evidência: frontend 102/102; `npm.cmd run types:check`, lint dirigido, JSON/OpenAPI com refs locais resolvidos, build 2.388 módulos e `git diff --check` passaram. Aviso apenas informativo de dependência opcional `fontaine`.
|
||||
- A Etapa 1 continua parcial: jobs, formatos detalhados de erros, restantes round-trips de persistência e contrato/runtime de endpoints que o formulário ainda não consome carecem de revisão e testes específicos.
|
||||
|
||||
### Adenda da Etapa 1 — jobs de execução e validação final (2026-10-03)
|
||||
|
||||
O OpenAPI também documenta agora `GET /simulations/{id}/jobs`, com tipos/estados/retries e códigos de erro sanitizados conforme a migration e o controlador. Revalidação posterior: frontend 102/102, TypeScript, lint dirigido, build 2.388 módulos, JSON OpenAPI e 60 referências locais resolvidas; `git diff --check` passou com avisos de CRLF já existentes noutros documentos. A etapa segue parcial por round-trip de persistência, maior cobertura de erros e runtime guards para APIs fora do percurso actual da UI.
|
||||
|
||||
### Adenda da Etapa 1 — guards wire auxiliares (2026-10-03)
|
||||
|
||||
Acrescentei validadores testados para envelopes de questionário publicado, relatório, jobs e erros Laravel; a mensagem de erro só é usada se o formato for reconhecido. Testes frontend repetidos: 103/103; TypeScript, lint dirigido e build 2.388 módulos passaram. O aviso de `fontaine` opcional não impede o build. Não houve chamada de escrita, migração nem acesso à base operacional nesta validação.
|
||||
|
||||
### Correcção de evidência da Etapa 1 — round-trip e PATCH de cenário (2026-10-03)
|
||||
|
||||
A pendência anterior de “round-trip de persistência” estava formulada de modo demasiado amplo: `SimulationExecutionTest` já compara a resposta/API com o relatório persistido e `SimulationFormDraftTest` cobre criação, leitura, edição cifrada e anexação. Acrescentei teste explícito de JSON encode/decode para os guards wire e liguei no OpenAPI a resposta 202 do PATCH de cenário e os seus erros ao schema correspondente. A suíte frontend permanece 104/104; o teste de contrato focado passou 11/11 e o OpenAPI tem 66 refs locais resolvidos. Os testes PHP não foram repetidos nesta adenda: a porta isolada 55441 não está em escuta; a base do desenvolvedor na 5432 não foi usada. A pendência restante é validar estas respostas integradas em runtime contra PostgreSQL QA e cobrir consumidores/clientes adicionais, não inexistência de testes de persistência.
|
||||
|
||||
## Reconciliacao autoritativa — Etapa 1 concluida tecnicamente (2026-10-03)
|
||||
|
||||
O estado “parcial” da linha historica da Etapa 1 fica substituido por esta verificacao. Todas as rotas de simulacao em `routes/api.php` agora tem schemas de sucesso OpenAPI e respostas 4xx referenciadas a `ApiErrorV1`; o teste percorre todas as operacoes e exige esse contrato comum. Os valores decimais enviados pela UI sao strings. Guardas runtime cobrem envelopes consumidos pela UI e testes cobrem questionario, relatorio e jobs. Persistencia e releitura estao cobertas em PostgreSQL QA, incluindo igualdade de snapshot/relatorio/hash e rejeicao de token alheio.
|
||||
|
||||
- Frontend: 104/104; contrato focado: 11/11; TypeScript ja passou nas alteracoes de guard; Pint do teste PHP passou.
|
||||
- PHP 8.5.11/PostgreSQL 17 QA: suite completa 231/231, 2.305 assertions apos teste de leitura do relatorio; `SimulationExecutionTest` focado 14/14, 111 assertions apos verificacao do PATCH de cenario.
|
||||
- OpenAPI: JSON valido, 85 refs locais resolvidos; todos os 4xx usam `ApiErrorV1`.
|
||||
- Cluster temporario em `investmoz_browser_e2e_test`/55441 encerrado e confirmado parado. A base local na porta 5432 nao foi usada. `git diff --check` passou; avisos CRLF referem-se a dois documentos preexistentes fora do escopo.
|
||||
- Estado: contrato tecnicamente concluido; aceite operacional de produto continua no gate geral. Gates fiscais nao mudam.
|
||||
|
||||
## Etapa 2 — submissao acessivel e contrato de criacao (2026-10-03)
|
||||
|
||||
- A resposta real `POST /api/v1/simulations` emite `202` para execucao `queued` e omite `result_snapshot`. O guard cliente exigia esse campo ja na criacao, embora o snapshot so exista depois do processamento. `simulation-contract.ts` agora aceita a ausencia em estados nao concluidos e exige o campo quando `status=completed`.
|
||||
- Smoke test Edge/CDP: submissao vazia marcou `#field-base` como invalido, ligou `aria-describedby=error-base` a um `role=alert`, moveu foco para o campo e nao enviou POST. Depois dos valores, POST 202 e 12 GET autenticados 200. Evidencia: `simulator-calculation-browser-2026-10-03.json`.
|
||||
- Limite QA: a execucao permaneceu `queued`; worker `queue:work database` nao processou a fila durante o ensaio. Portanto, o teste do browser nao confirma valor final nem o fluxo completo do worker. Nao alterar nem desactivar a fila para fazer o smoke passar; investigar entrega/configuracao da fila em etapa de infraestrutura separada.
|
||||
- Validacoes: 104/104 testes frontend; `npm.cmd run types:check`; lint/format dirigido; `npm.cmd run build` (2.388 modulos); `node --check` e `git diff --check` passaram. Aviso nao bloqueante de pacote opcional `fontaine` no build.
|
||||
- QA isolado (PostgreSQL em 55441, Laravel 18082, Edge 9224) encerrado; porta operacional local 5432 permaneceu a escuta e nao foi usada.
|
||||
|
||||
## Correcao de evidencias — incidente de encaminhamento QA (2026-10-03)
|
||||
|
||||
A adenda anterior da Etapa 2 classificou indevidamente os pedidos do browser como QA isolado. Depois verificou-se, por instrumentacao HTTP temporaria, que o filho de `artisan serve` usou `investemoz`/5432 apesar do ambiente QA no processo pai. Varios POSTs de simulacao e autosave foram enviados a essa base; os UUIDs conhecidos e os limites da identificacao estao em `docs/investmoz/qa-database-target-incident-2026-10-03.md`. Nao houve consulta directa de linhas nem limpeza; a base nao foi tocada depois da descoberta. A porta 5432 continua preexistente. A prova de acessibilidade do formulario continua valida; toda afirmacao de isolamento QA para essas escritas fica revogada ate conciliacao pelo responsavel da base e repeticao por um harness com alvo QA comprovado.
|
||||
|
||||
## Etapa 2 — repeticao integral no harness QA corrigido (2026-10-03)
|
||||
|
||||
- O router PHP define ambiente QA dentro do processo de cada pedido e responde com marca QA; a leitura territorial devolveu JSON 200 nessa instancia antes de executar escrita. O anterior `artisan serve` nao volta a ser usado para esse teste.
|
||||
- Browser Edge/CDP + worker em `investmoz_browser_e2e_test:55442`: POST 202 queued, polling GET 200, estado concluido e aritmetica 50; autosave anónimo GET 200/POST 201; validação acessível passou (aria-invalid, descrição-alerta, foco e nenhum POST enquanto inválido); aviso fiscal e mensagem de privacidade visíveis; nenhum erro JS/alerta visível. Relatório tem `passed=true`.
|
||||
- O bloqueio de fila QA fica resolvido para esta jornada quando o worker está ativo. O incidente separado de chamadas prévias a `investemoz` continua sem reconciliação pelo responsável; nenhum cleanup ou consulta a linhas foi feito.
|
||||
|
||||
## Competências e educação — validação territorial no servidor (2026-10-03)
|
||||
|
||||
- `EducationController::store` agora só aceita `geo_location_id` em província, distrito, posto administrativo ou localidade, além de exigir o registo activo. Antes, qualquer geo_location UUID existente, inclusive país, passava a validação.
|
||||
- `EducationTest` inclui cenário negativo para país. PHP 8.5.11, PHPUnit sem configuração padrão e PostgreSQL QA preparado em `investmoz_browser_e2e_test`/55442: 8/8 testes e 207 assertions passaram; cada teste usa transacção e rollback, sem migrations/reset. Pint dirigido passou.
|
||||
- O módulo continua parcial: fontes e aceitação funcional/institucional, associação demonstrada entre oferta/procura e revisão assistiva manual ficam pendentes. Sem certificação, contratação automática ou dados pessoais de formandos.
|
||||
|
||||
### CRM — consentimento canonico na conversao de interesse (2026-10-03)
|
||||
|
||||
- `ConvertInterestToLead` agora exige, dentro da transaccao e apos bloquear o pedido, consentimento canonico `respond_to_interest` correspondente ao pedido, concedido e vigente, nao revogado nem apagado logicamente. A verificacao ocorre tambem antes de devolver lead existente, impedindo replay apos retirada do consentimento.
|
||||
- `CrmIntakeTest` cria o consentimento canonico nos fixtures e inclui caso de revogacao, verificando que nenhum lead, investidor, contacto ou tarefa e criado.
|
||||
- PHP 8.5.11 / PostgreSQL 17 descartavel em 55442: `CrmIntakeTest` 6/6, 47 assertions. Pint dirigido, `php -l` nos dois ficheiros e `git diff --check` passaram. A role superuser existiu apenas no cluster QA temporario para instalar PostGIS; cluster parado apos o teste. Porta 5432 nao foi usada.
|
||||
- CRM segue parcial: este teste nao cobre o percurso real de retirada na UI nem politica de retencao; reconciliacao do incidente de dados operacionais descrito no relatorio QA continua com o responsavel da base.
|
||||
|
||||
- Adenda CRM: o mesmo teste agora verifica tambem que consentimento apagado logicamente nao autoriza conversao. Reexecucao limpa em novo cluster descartavel: `CrmIntakeTest` 6/6, 50 assertions; Pint dirigido e `git diff --check` passaram. Cluster parado, sem listener QA em 55442.
|
||||
|
||||
### CRM — revogacao interna do consentimento de contacto (2026-10-03)
|
||||
|
||||
- A pagina interna do pedido agora expoe accao especifica para revogar `respond_to_interest`, separada da permissao de partilha com o proponente. O utilizador de gestao regista o motivo; a transaccao bloqueia o pedido e o consentimento, cifra a justificacao, grava a transicao e emite outbox sem email. Consentimento ja revogado/inactivo nao cria evento duplicado.
|
||||
- `PortalManagementTest` verifica leitura da finalidade vigente e a revogacao/outbox; `CrmIntakeTest` cobre que consentimento revogado ou apagado logicamente bloqueia conversao e replay do CRM.
|
||||
- PHP 8.5.11 / PostgreSQL 17 em cluster QA descartavel: `PortalManagementTest` + `CrmIntakeTest` passaram 16/16, 230 assertions. Pint dirigido, PHP lint e `npm.cmd run types:check` passaram. Cluster encerrado; 55442 sem listener e 5432 nao usada.
|
||||
- A revogacao interna nao substitui canal publico do titular nem define retencao/eliminação; esses requisitos de privacidade continuam para validacao. Suite completa e aceitacao manual da interface nao foram executadas nesta tranche.
|
||||
|
||||
- Revalidacao final de CRM: a suite focada foi ampliada para incluir negativa de utilizador sem permissao e repeticao idempotente sem transicao/evento duplicados. Resultado final: 16/16 testes, 234 assertions; Pint, TypeScript e build Vite (2.388 modulos) passaram. Aviso de build: pacote opcional `fontaine` ausente. QA em cluster PostgreSQL 17 descartavel foi encerrado; listener 5432 e preexistente e nao foi usado.
|
||||
|
||||
- Adenda de integracao CRM: o teste agora percorre revogacao pela rota de gestao seguida de tentativa real de conversao; a conversao e rejeitada. Tambem verifica que utilizador sem papel nao revoga e que repeticao nao duplica outbox/transicao. Reexecucao final: 16/16 testes, 237 assertions. `npm run build` e TypeScript passaram; aviso opcional `fontaine`. O verificador Vite+ de formatacao considera este ficheiro legado fora do formato global; nao foi reformatado inteiro para evitar diff mecanico alheio ao escopo.
|
||||
|
||||
### Regressao global apos CRM — 2026-10-03
|
||||
|
||||
- A suite PHP global foi executada em cluster PostgreSQL 17 novo e isolado na porta 55441. O harness criou a base `investmoz_test`, aplicou todas as migrations antes da suite (dependencia de `AiGatewayTest`) e usou PHP 8.5.11. Resultado final: 233/233 testes, 2.345 assertions; zero falhas/erros.
|
||||
- Suite frontend: 104/104. TypeScript, Pint dirigido, PHP lint, build Vite (2.388 modulos) e `git diff --check` passaram. Build emite aviso nao bloqueante do pacote opcional `fontaine`.
|
||||
- Uma tentativa preliminar em DB vazio sem migrations terminou com 8 testes AI falhados por `ai_controls` inexistente; corrigido apenas o setup de QA, sem alterar testes ou codigo por causa desse resultado. A repeticao completa acima e a evidência final.
|
||||
- Cluster encerrado e porta 55441 confirmada sem listener; a base local na porta 5432 nao foi consultada nem alterada. Permanecem pendentes: reconciliacao administrativa do incidente QA e gates humanos/legal/privacidade/manual descritos no estado actual.
|
||||
|
||||
### Gate documental — scanner antimalware indisponivel no ambiente local (2026-10-03)
|
||||
|
||||
A verificacao do ambiente nao encontrou os executaveis `clamscan`, `clamdscan` ou `clamd`, nem servico ClamAV instalado. Nao instalei nem activei scanner externo; os uploads continuam em quarentena interna e a publicacao de ficheiros novos permanece bloqueada. Proxima tarefa independente do plano: continuar a lacuna de localizacoes multipla/estruturadas no formulario privado; nao fabricar coordenadas nem publicar registos.
|
||||
|
||||
### Localizações administrativas múltiplas — 2026-10-03
|
||||
|
||||
- O rascunho privado agora admite 2–20 percursos administrativos, guardados em `payload.locations_json` dentro do payload já cifrado. O cliente limpa selecções descendentes ao mudar um nível; o servidor valida UUID, hierarquia na referência pública, mínimo/máximo e percursos repetidos ou sobrepostos. Não são recolhidas nem inventadas coordenadas.
|
||||
- A resposta de leitura/gravação resolve os nomes dos percursos exclusivamente a partir da referência territorial pública. O resumo mostra os nomes depois de guardar. `wizard_version=2` consta do contrato OpenAPI; a rota legada conserva validação própria.
|
||||
- Ficheiros desta tranche: `BusinessFormSchema.php`, `InvestmentGeography.php`, `ExistingBusinessController.php`, `business-locations.ts`, `business-wizard.tsx`, `business-types.ts`, `existing-business-openapi.mjs`, `ExistingBusinessWizardTest.php` e `business-locations.test.mjs`.
|
||||
- Evidência: PHP 8.5.11 e PostgreSQL 17 descartável na porta 55441, migrations aplicadas apenas na base temporária; `ExistingBusinessWizardTest` 3/3, 49 assertions; testes frontend da localização 3/3; TypeScript, Pint dirigido, PHP lint e `git diff --check` passaram. O listener preexistente em 5432 não foi utilizado. Cluster parado; os ficheiros de dados QA permanecem no directório temporário `%TEMP%\investmoz-stage-multiloc` porque a limpeza automática foi bloqueada pelo executor.
|
||||
- Sem migration nem alteração de esquema persistente. Rollback: reverter os trechos acima e remover os dois testes/helpers novos; não há dados existentes a migrar. Permanecem pendentes mapa/coordenadas, relação territorial canónica e associação a parques/zonas; esta entrega não autoriza publicação de oportunidade.
|
||||
|
||||
### Dados territoriais — pesquisa tolerante a acentos (2026-10-03)
|
||||
|
||||
- `GET /api/v1/investment/territory-options` agora normaliza o termo de pesquisa (`Str::ascii`) e compara nomes com `translate(lower(name), ...)`, além de manter correspondência por código e código de origem. Não altera nem translitera os nomes guardados, não instala extensão e mantém o escopo de território público e dependência hierárquica.
|
||||
- `ExistingBusinessWizardTest`: 4/4 testes, 55 assertions no PostgreSQL 17 descartável, PHP 8.5.11/porta 55441; inclui pesquisas `maputo`, `provincia` e `Mapúto` contra `Província de Mapúto`. PHP lint, Pint dirigido, TypeScript, três testes de localização frontend e diff check passaram. Build Vite também passou nesta continuação anterior (2.389 módulos); aviso não bloqueante da dependência opcional `fontaine`.
|
||||
- O cluster QA está parado. Porta 5432 permaneceu intocada. As limitações de cobertura oficial/importação de dados territoriais, reconciliação e aproximação sem fusão automática continuam. D-01 melhora, mas permanece parcial.
|
||||
|
||||
### Catálogo, lista e mapa — reconciliação das contagens (2026-10-03)
|
||||
|
||||
- A auditoria confirmou que catálogo web, pesquisa API e mapa derivam o conjunto base de `InvestmentCatalogue::query()` com os mesmos filtros. A lista não esconde oportunidades sem ponto: elas aparecem em `unlocated` no mapa, e `matched_count` inclui georreferenciadas e não georreferenciadas. O limite de 1.000 registos é explícito por `truncated`.
|
||||
- Reforcei `InvestmentTerritoryTest` para comparar IDs e totais na página Inertia, endpoint de pesquisa e endpoint de mapa em três estados: oportunidade publicada sem coordenadas; coordenadas públicas confirmadas; oportunidade retirada. Resultado: 9/9 testes, 138 assertions, PHP 8.5.11/PostgreSQL 17 QA isolado, porta 55441; Pint e PHP lint passaram. Sem alteração funcional/dados de produção.
|
||||
- A verificação confirma consistência para o fluxo amostrado, mas não prova exaustivamente filtros combinados, paginação acima de 1.000 ou aceitação visual assistiva. C-01 continua parcial até essas verificações; nenhuma coordenada foi fabricada. QA foi encerrado e a porta 5432 não foi consultada.
|
||||
|
||||
## Adenda — extracção de revisão não importável (2026-10-03)
|
||||
|
||||
O DOCX de origem voltou a ser localizado no caminho registado. O SHA-256 actual (`BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6`) coincide com a proveniência acima. Foi criada `docs/investmoz/source-staging/pii-26-30-review-only.csv` com 174 linhas, preservando índice de tabela no XML, linha, legenda da tabela, chave, título, tipo, relação literal, localização, custo literal, cabeçalho literal da moeda e horizonte. Cada linha tem estado `review_only_not_importable`; nenhum registo canónico ou anúncio foi criado.
|
||||
|
||||
A extração confirma que “Terminal de Contentores – Porto de Nacala” ocorre em T16/L4 (`A07 - C02`, `110,000,000`) e T17/L4 (`A08 - C02`, `300.000.000`), ambos sob cabeçalho USD. São identificadores/valores distintos: manter ambas as linhas para reconciliação, sem deduplicar ou escolher um valor. As sete linhas da tabela XML 19 conservam o cabeçalho `Custo (USD/ MZN)` e ficam marcadas `currency_ambiguous_mixed_header`. O texto inclui “Taxa de câmbio: 1 USD = 64,00 MZN” imediatamente antes e depois desta tabela, mas não estabelece a moeda de cada linha, a aplicação dessa taxa às estimativas, a data/base da taxa nem a autoridade da conversão; por isso, nenhum valor foi convertido.
|
||||
|
||||
As colunas uniformes das 13 tabelas não identificam pessoa/entidade responsável nem fase de execução; no CSV ficam vazias, sem inferência. Localizações e relações permanecem literais, não validadas. Validação do artefacto: 174/174 linhas, 174 referências tabela/linha únicas, 7 linhas em T19 sinalizadas e 2 linhas do título repetido sinalizadas. Não houve escrita em base de dados nem alteração do DOCX. Gate V-01/D-02 continua parcial e bloqueado para importação/publicação até reconciliação pelo responsável do documento e validação dos topónimos, responsáveis, estados e moeda.
|
||||
|
||||
Rollback deste artefacto derivado: remover apenas `pii-26-30-review-only.csv` e esta adenda; o original e dados de aplicação permanecem intactos.
|
||||
|
||||
### Cadastro administrativo de corredores — 2026-10-03
|
||||
|
||||
- A auditoria confirmou que `development_corridors` e o modelo existiam, mas não havia CRUD na área de gestão: as rotas genéricas só aceitavam `projects` e `clusters`. Acrescentei `/management/corridors` com pesquisa/paginação e formulário privado para código, nome, estado e descrição, reutilizando o selector territorial existente na criação. Os estados aceites são os já definidos pela tabela (`proposed`, `active`, `closed`); não foi criada regra nem conteúdo oficial.
|
||||
- O registo fica com classificação `internal`; o estado `active` é apenas estado operacional do corredor e não cria publicação. Não houve migration. Autorização, criação, leitura, edição e estado foram verificados em `InvestmentStructureTest`: 5/5 testes, 68 assertions, PostgreSQL 17 QA isolado na porta 55441, PHP 8.5.11. PHPStan: 0 erros; Pint, PHP lint, TypeScript, build Vite (2.389 módulos) e `git diff --check` passaram. Build assinala apenas a dependência opcional `fontaine` ausente. Cluster encerrado; 5432 não utilizada.
|
||||
- D-02 permanece parcial: esta tranche só acrescenta CRUD básico de corredor. Associações corredor–projecto/cluster com fonte, evidência, vigência e revisão independente, catálogo de parques/zona, relações com PII e validação oficial dos dados ainda não estão concluídos. Nenhum corredor real foi inserido.
|
||||
- Rollback: reverter `routes/web.php`, controller, tipos/páginas de estruturas, ligação no menu e o teste. Não há alteração de esquema ou dados a reverter.
|
||||
|
||||
### Publicação da carteira — aprovação separada da importação (2026-10-03)
|
||||
|
||||
- Corrigido um bypass verificado: `portfolio:import --approval=<texto>` aceitava qualquer texto arbitrário e publicava até 29 dossiers sem autenticar o proprietário nem confirmar revisão. O comando agora só corre o seeder idempotente e deixa os dossiers em rascunho privado. O parâmetro `--approval` deixou de existir; chamada com esse parâmetro foi executada e terminou com erro `The "--approval" option does not exist.`
|
||||
- Fechada também a auto-publicação pela rota de gestão: um dossier sem editor atribuído não pode ser publicado (422); o editor não pode rever/publicar a própria edição (403); outro gestor tem de rever. O fluxo mantém versão optimista, evidência e auditoria. As fichas já publicadas/históricas não foram alteradas.
|
||||
- `InvestmentPortfolioTest` + `InvestmentUnificationTest`: 15/15 testes, 224 assertions, incluindo importação repetida, ausência de publicação automática, preservação de edições, editor distinto e filtros com fixtures sintéticas explicitamente publicadas. PHPStan 0 erros; Pint e PHP lint dirigidos passaram. Testes em PostgreSQL 17 isolado, PHP 8.5.11/porta 55441. Não foi usada a base 5432.
|
||||
- Sem migration. Rollback de código reabre os caminhos de auto-publicação; preservar o controlo actual salvo decisão expressa de política. O histórico documental de 26/09 sobre a autorização inicial foi mantido como histórico, não como instrução de execução actual.
|
||||
|
||||
## Actualização posterior — governação de parâmetros e regressão global (2026-10-03)
|
||||
|
||||
A camada fiscal tem agora validação de parâmetros `value/unit/conditions`, resolução determinística interna por componente, `scope_key`, vigência, condições e estado/versão da fonte; e a interface separa parâmetro aprovado, cenário de planeamento do utilizador e ausência de cálculo. Os pressupostos hipotéticos só são pedidos quando o modo personalizado é escolhido, não bloqueiam a gravação do rascunho incompleto e os resultados aritméticos são marcados `custom_planning`.
|
||||
|
||||
O resolvedor permanece desligado da API pública e do worker. A UI mantém o cálculo legal indeterminado enquanto não existir leitura pública mínima compatível com RLS e parâmetros/fórmulas fiscais aprovados. Não há valores fiscais demonstrativos em produção, não há reexecução de resultados históricos e o gate das Etapas 4/5 continua bloqueado para cálculo público.
|
||||
|
||||
### Regressão global mais recente
|
||||
|
||||
Após essas alterações, `php artisan migrate --force` na base QA isolada respondeu `Nothing to migrate`. `php vendor/bin/phpunit`: **245/245 testes, 2.539 asserções** em PostgreSQL 17.11/PostGIS 3.6, porta 55441. Suite frontend: **114/114**; TypeScript, PHPStan, Pint/check dirigido, JSON OpenAPI e Vite build (2.390 módulos) passaram. O aviso de build `fontaine` é opcional. O cluster QA foi encerrado; nenhuma ligação à porta 5432 ocorreu nesta execução.
|
||||
|
||||
O estado global permanece parcial por aceitação manual/assistiva, revisão de produto e incidente histórico sem reconciliação, além das fontes e aprovações fiscais ainda pendentes. O teste automatizado global verde não altera esses gates.
|
||||
|
||||
### Consulta segura dos parâmetros fiscais
|
||||
|
||||
Foi acrescentada a rota `POST /api/v1/tax-parameters/resolve`, protegida pelo middleware web/CSRF e limitada por rate limit, mais uma policy RLS que só permite ler versões publicadas ligadas a fonte validada e temporalmente compatível. A resposta é uma projecção sem AST; lista valor, unidade, condições assumidas, `scope_key`, versão, vigência e referência legal. O formulário permite consultar períodos anuais, mensais, trimestrais e operações pontuais com datas exactas. Mudanças de vigência e sobreposições devolvem indeterminação.
|
||||
|
||||
Verificação desta extensão: `php artisan test --filter=SimulationTaxParameterResolverTest` 6/6 (18 asserções); `npm.cmd run types:check`; `npm.cmd run build` (2.390 módulos); Pint dirigido; `php artisan route:list --path=api/v1/tax-parameters/resolve`; OpenAPI JSON. O build mantém aviso opcional `fontaine`. A migration da policy ainda precisa de ser aplicada no ambiente alvo para a rota encontrar linhas, e não apliquei migrações nem consultei a base `.env` nesta extensão. Não existe cálculo fiscal nem snapshot fiscal conectado. Gate fiscal permanece bloqueado.
|
||||
|
||||
### Revalidacao da regressao do simulador — 2026-10-03
|
||||
|
||||
O primeiro preflight ocorreu com o PostgreSQL QA desligado e nao chegou aos casos. Essa condicao foi resolvida pela criacao de cluster descartavel; o resultado final (250/250) e a execucao em Edge estao registados nas adendas imediatamente seguintes. A suite frontend passou 115/115, TypeScript e PHPStan (0 erros), e build (2.397 modulos) passaram. O gate da Etapa 11 continua parcial apenas para leitor de ecrã/dispositivo e revisao humana de produto. Nenhuma regra fiscal foi activada.
|
||||
### Regressao PHP global no worktree actual — 2026-10-03
|
||||
|
||||
Actualizacao que substitui a nota anterior de que a suite PHP nao executou: foi criado um cluster PostgreSQL 17.11 temporario e isolado em `%TEMP%\investmoz-goalqa-20261003-1546`, limitado a `127.0.0.1:55441`. `php artisan test` passou 250/250 testes e 2.582 assertions, incluindo 3/3 casos DUAT (38 assertions). PostgreSQL foi parado e 55441 ficou sem listener. A porta 5432 nao foi utilizada. O ensaio encontrou e levou a correcao da validacao de consentimento para rascunhos incompletos. Node frontend 115/115, TypeScript, PHPStan (0 erros), Pint dirigido e build (2.397 modulos) passaram. Continuam pendentes validacao manual assistiva/de produto e os gates fiscais humanos; nao houve activacao de regras.
|
||||
### Revalidacao Edge do simulador — Etapas 2/11 — 2026-10-03
|
||||
|
||||
Smoke de browser no Edge headless passou com alvo verificado `investmoz_test:55441`; quatro larguras (390, 768, 1024, 1440), 12 focos sequenciais nomeados/visiveis, sem overflow, controlo sem nome ou excepcoes JavaScript. A unica chamada API foi GET `/api/v1/simulation-drafts/current` 200. QA ficou em 0 simulacoes/0 rascunhos e os processos Edge/PHP/PostgreSQL temporarios foram encerrados, com portas 55441/18089/9224 fechadas. Relatorio: [simulator-browser-audit-2026-10-03-rerun-runtime-verified.json](simulator-browser-audit-2026-10-03-rerun-runtime-verified.json). Isto reforca validacao automatizada, mas nao substitui leitor de ecrã real, dispositivo fisico ou revisao de produto.
|
||||
Adenda de isolamento: o router `tools/simulator-qa-router.php` confirma a configuracao Laravel e a identidade real da ligacao antes de responder ou devolver o marcador QA. Relatorio final atualizado: [simulator-browser-audit-2026-10-03-rerun-runtime-verified.json](simulator-browser-audit-2026-10-03-rerun-runtime-verified.json), com `qaTargetVerified=true`, 0 simulacoes/rascunhos. `pg_ctl status` e o estado das portas confirmaram que nao ha servicos QA activos.
|
||||
|
||||
### Reconciliação histórica do CIVA — sequência antes e depois da Lei 13/2016 (2026-10-03)
|
||||
|
||||
- Reconciliada a orientação de usar a republicação da Lei 13/2016 como texto-base: a Lei 3/2012 alterou o CIVA original, mas não deve ser reaplicada sobre a republicação integral nos períodos posteriores à entrada em vigor desta.
|
||||
- Acrescentadas à sequência posterior as Leis 5/2020 e 3/2025, antes ausentes em resumos da cadeia. O MEF identifica a Lei 5/2020 como alteração ao artigo 9(13); o prazo transitório exacto foi visto apenas numa reprodução do BR, pelo que a data/vigência segue pendente de conferência no fac-símile oficial. A Lei 16/2020 e seguintes são aplicadas por artigo e período, não cumulativamente.
|
||||
- Reavaliação do BR 89/2017: foi encontrado e arquivado um exemplar local do boletim (página 569 extraída; SHA-256 `11F0CAB15EB6E51010952203FFA24FDC533A24FD642E19525FE4F46B17A1F5E5`). O aviso confirma alteração do art. 6(5)(c)-(d), eliminação do art. 14(2)(c) e rectificação dos anexos I–III do art. 9. A cópia coincide com número/data da ficha INM, mas a proveniência não está autenticada; o texto corrigido dos anexos segue indisponível. Detalhes: `primary-text-review-2025-2026.md` e `official-source-register.md`.
|
||||
- Actualizados os três registos fiscais e corrigida a lista de governação em `official-source-register.md`; o gate público fiscal mantém-se bloqueado.
|
||||
|
||||
## Etapa 2 — evidência responsiva adicional e correcções (2026-10-03)
|
||||
|
||||
A auditoria Edge headless mais recente substitui, para cobertura automatizada de browser, a matriz anterior de quatro larguras e o smoke apenas de leitura. O formulário foi inspeccionado nos estados finalidade, fiscal e resultado a 320, 360, 390, 768, 1024 e 1440 px. Relatório: [matriz browser](simulator-calculation-responsive-browser-2026-10-03.json); roteiro: [cálculo e responsividade](../../../tools/simulator-calculation-browser.mjs).
|
||||
|
||||
Resultado: `passed=true`, alvo `investmoz_test:55441` verificado no header de todas as respostas API, sem overflow, controlos sem nome, erros JS ou alertas. O resultado calculado foi 50; validação do campo em falta apresentou erro acessível e foco no campo. O foco na navegação para a etapa fiscal mostra outline visível. Foram corrigidos o indicador de foco e a quebra visual de números decimais extensos em ecrãs estreitos.
|
||||
|
||||
Foram criados 4 registos sintéticos de simulação e 5 rascunhos no banco temporário durante as tentativas E2E repetidas; não continham dados pessoais. O cluster QA, servidor PHP e Edge foram parados; não foi utilizada a base na porta 5432. Etapa 2 permanece parcial até ensaio com leitor de ecrã/dispositivo e revisão manual de produto.
|
||||
|
||||
## Etapa 3 — pressupostos iniciais da calculadora (2026-10-03)
|
||||
|
||||
Foi corrigida a proveniência enganadora dos campos pré-preenchidos nas ferramentas educativas: a interface identifica os valores iniciais como exemplos demonstrativos e o CSV já não os declara indiscriminadamente como introduzidos pelo utilizador. Testes financeiros 14/14 e frontend 117/117; TypeScript, check/lint e build passaram. Fórmulas e regras fiscais não foram alteradas. A etapa segue parcial até à revisão financeira e à decisão sobre a amplitude necessária do orçamento pessoal.
|
||||
|
||||
Adenda Etapa 3: orçamento sem linha de receita ou despesa deixou de produzir saldo zero; exige pelo menos uma linha de cada tipo. O valor `0` explicitamente introduzido continua válido, e snapshots vazios para uma destas listas são rejeitados. Teste financeiro 15/15, frontend 118/118, TypeScript, check/lint e build aprovados. Revisão financeira e extensão do orçamento pessoal continuam pendentes.
|
||||
|
||||
## Etapa 6 — reconciliação de cobertura técnica (2026-10-03)
|
||||
|
||||
A matriz [Etapa 6: rastreabilidade técnica](stage-6-technical-traceability.md) confirma os requisitos nucleares do anexo contra o modelo, interface e testes; `business-financial-plan.test.mjs` passou 35/35. Gate técnico do escopo nuclear proposto como coberto, mas etapa global continua parcial até revisão contabilística institucional. Termos de fornecedor agregados, limites partilhados e incumprimento permanecem fora do modelo; nenhuma condição financeira é presumida. Cálculo fiscal segue indeterminado.
|
||||
|
||||
## Etapa 7 — imposto omitido permanece indeterminado (2026-10-03)
|
||||
|
||||
Corrigido o planeador de tesouraria: imposto mensal vazio/omitido já não é assumido como zero. Fluxo líquido e saldo final totais ficam indeterminados, enquanto os fluxos conhecidos antes do imposto continuam visíveis; zero explícito permanece válido. O CSV preserva essa distinção. Suite frontend 119/119, TypeScript, lint/formatação, build Vite e `git diff --check` passaram. A rastreabilidade e limitações estão em [Etapa 7 técnica](stage-7-technical-traceability.md). O cálculo fiscal continua indisponível sem regras aprovadas.
|
||||
|
||||
## Etapa 8 — correcções de exportação e rastreabilidade (2026-10-03)
|
||||
|
||||
O CSV empresarial deixou de afirmar falsamente que todos os valores foram digitados pelo utilizador. A tesouraria identifica pressupostos pré-preenchidos como exemplos e o CSV inclui data de exportação, versão do modelo, horizonte, moeda, estado e origem dos dados. A matriz [Etapa 8 técnica](stage-8-technical-traceability.md) cobre exportação pública, estados, snapshots/hash, ausência de PII e reconciliação. Suite frontend 119/119, TypeScript, build (2.397 módulos) e diff check passaram. Aviso do check: três variáveis não usadas preexistentes no plano financeiro. A revisão assistiva permanece fora desta validação automatizada.
|
||||
|
||||
### Etapa 9 — conversão consentida para rascunho (2026-10-03)
|
||||
|
||||
A conversão existente foi reconciliada com os critérios de consentimento explícito, autorização, snapshot/hash, preservação do original, idempotência, ETag e revogação; suite feature passou 10/10 (79 asserções) em PostgreSQL 17 isolado na porta 55441. A conversão só anexa ao rascunho: Project, submissão formal e CRM não são criados. O gate permanece parcial até existir evidência desses fluxos e revisão manual assistiva/produto. Ver `stage-9-technical-traceability.md`.
|
||||
### Reconciliação do motor fiscal — 2026-10-03
|
||||
|
||||
O gate histórico da Etapa 10 foi actualizado à luz do código actual: avaliador DSL, DAG, precisão racional, resolução de parâmetros e governação já existem e passaram testes focados. O motor permanece fora do percurso de cálculo público; nenhuma regra é activada. Ver `stage-10-technical-traceability.md` para os critérios e limites.
|
||||
### Etapa 10 — extensão informativa territorial (2026-10-03)
|
||||
|
||||
A auditoria confirmou controlos existentes para zonas, fontes/vigência, relações, geometrias e origem de pedidos, e verificou a advertência pública de que associação territorial não atribui benefícios, licenças ou autorização aduaneira. `InvestmentZoneTest` passou 6/6 (104 asserções) em PostgreSQL/PostGIS QA isolado. Benefícios fiscais, cálculo aduaneiro/cambial e decisões regulatórias continuam sem activação. Ver `stage-10-extension-traceability.md`.
|
||||
### Regressão integral actualizada — 2026-10-03
|
||||
|
||||
`php artisan test` passou 253/253 testes (2.590 asserções) no PostgreSQL 17/PostGIS QA descartável, porta 55441, depois de repetir com o administrador local do cluster porque três testes RLS criam um papel de teste e o login não-superuser não tem `CREATEROLE`. A primeira tentativa com esse login foi 250/253 e falhou apenas nesses três setups; a execução integral seguinte passou. Frontend 119/119; TypeScript; PHPStan 0 erros; build Vite 2.397 módulos. A build avisa que `fontaine` opcional não está instalado. QA foi encerrado; 5432 não foi usada.
|
||||
### Etapa 7 — calendário mensal de pressupostos de tesouraria (2026-10-03)
|
||||
|
||||
Foi acrescentado um modo de calendário variável de imposto mensal ao lado do valor fixo mensal existente. Cada montante é um pressuposto do utilizador; mês vazio permanece indeterminado, o saldo completo propaga a incerteza a partir desse mês, e a caixa conhecida desconta os impostos informados. CSV e interface esclarecem que não é apuramento legal. Teste mensal 11/11 e suite frontend 123/123 passaram; TypeScript e `vp check` dirigido passaram. O calendário não é guardado em snapshot de conta. Ver `stage-7-technical-traceability.md`.
|
||||
**Validação visual do calendário mensal:** não concluída nesta retoma. O runner Edge/CDP existente falhou antes das asserções por erro de protocolo; não foi guardado como evidência aprovada. Testes unitários 11/11, suite frontend 123/123, TypeScript, lint e build passaram. Revisão visual/assistiva específica permanece pendente.
|
||||
|
||||
**Adenda posterior — Edge isolado do componente:** a pendência de automatização visual do componente foi superada sem chamar API/Laravel/DB. `SimulationCashflowPlanner` passou no Edge headless em seis larguras (320–1440 px), sem overflow, controlos sem nome, excepções JS ou falhas de rede. O estado fixo, calendário variável, mês em falta/indeterminado, zero explícito e 12 linhas foram verificados. Evidência: [relatório Edge isolado](simulator-cashflow-browser-2026-10-03.json) e [harness](../../../tools/simulator-cashflow-component-browser.mjs). A página de produção, persistência e ensaio com leitor de ecrã/dispositivo físico continuam pendentes.
|
||||
|
||||
### Etapa 9 — manifestação pública independente do cálculo fiscal
|
||||
|
||||
O resultado concluído agora oferece uma ligação directa para `/manifestar-interesse`, sem copiar nem enviar a simulação, sem exigir autenticação e sem depender de cálculo fiscal. A cobertura frontend valida o destino e a mensagem de privacidade; a rota pública permanece coberta por `PublicPortalNavigationTest`. Isto mantém a submissão de interesse independente do estado fiscal, mas não converte nem anexa dados à manifestação.
|
||||
@@ -0,0 +1,75 @@
|
||||
# Contratos de dados do simulador
|
||||
|
||||
Estado: contrato tecnico interno. A API de conversão da Etapa 9 acrescenta metadados de execução ao snapshot económico cifrado existente. A migration `2026_10_02_120000` apenas ajusta RLS para suportar tombstones; não cria colunas nem altera snapshots armazenados.
|
||||
|
||||
## Princípios
|
||||
|
||||
- `personal_snapshot` contém identificação, contactos e atributos do promotor; `economic_snapshot` contém cenário, localização, actividade e valores do projecto. Os campos existentes mantêm-se como estão até uma migração de contrato deliberada.
|
||||
- Montantes e taxas atravessam limites de API como strings decimais. O valor `"0"` é um valor conhecido, nunca um marcador de ausência. Não se deve converter dinheiro para `number` binário para calcular.
|
||||
- Campo ausente ou `null` significa não fornecido. Uma lista vazia significa conhecida e vazia. “Não aplicável” e “indeterminado” são estados explícitos de um resultado, não valores numéricos.
|
||||
- Moeda acompanha cada montante. Não se somam moedas diferentes sem taxa de câmbio, data, fonte e método aprovados.
|
||||
- `referenceDate`, versão do motor, versão do conjunto de regras e cenário identificam a base temporal e reprodutível do resultado.
|
||||
- Os campos actuais `investor_origin` e `tax_residency_country` não representam nacionalidade, residência migratória nem residência cambial. O contrato actual não infere esses contextos e ainda não os recolhe. Uma futura extensão deve armazenar cada declaração em campo próprio, com estado “não sei” distinto de um país.
|
||||
- A moeda de cálculo e a moeda de apresentação são distintas. No plano financeiro, a conversão exploratória exige uma taxa na direcção `moeda de apresentação por 1 unidade da moeda de cálculo`, data efectiva e referência/fonte declaradas pelo utilizador. A interface e o CSV identificam-na como pressuposto não verificado; não é uma taxa oficial, fiscal, aduaneira ou contratual. Sem esses dados, os valores permanecem apenas na moeda de cálculo, que continua preservada no snapshot.
|
||||
- Os formulários de oportunidade/investidor e o catálogo mantêm o montante na moeda de origem. O catálogo filtra/ordena por moeda e não converte montantes entre moedas; não precisa de taxa cambial para essa operação. Valores de várias moedas só podem ser somados depois de conversão com taxa, data, fonte e método apropriados.
|
||||
- A taxa de câmbio aduaneira/fiscal não é fornecida pelo pressuposto do plano financeiro. Cálculos que dependam de câmbio oficial permanecem indeterminados até existir parâmetro versionado com fonte normativa/administrativa aplicável, âmbito e vigência confirmados.
|
||||
- As calculadoras financeiras actuais limitam a entrada a moedas reconhecidas com duas casas decimais. Moedas com zero ou três casas não são aceites até os cálculos suportarem a precisão minoritária própria de cada código.
|
||||
- `economic_snapshot.simulation_sources` e reservado ao servidor no snapshot cifrado. So o endpoint de conversao o escreve depois de verificar propriedade/token, execucao concluida e consentimento explicito; o cliente nao pode forjar ou editar a copia. A API apresenta a lista num campo separado para compatibilidade de clientes anteriores. Cada item conserva ID/versao, entradas permitidas, formula, resultado, relatorio, hashes e instante do consentimento, sem dados pessoais.
|
||||
- A copia da execucao e uma referencia versionada no rascunho, nao um projecto submetido. Uma execucao com `legal_interpretation=false` continua aritmetica e nao pode ser apresentada como resultado fiscal aprovado. Se a pessoa mudar `reuse_simulation` para `no`, a copia e retirada do snapshot editavel.
|
||||
- Resultados financeiros e resultados fiscais são linhas distintas. Uma ausência de parâmetros fiscais nunca é substituída por zero.
|
||||
- `economic_snapshot.financial_tools_snapshot` guarda `financial-tools-v1`: período do orçamento, entradas do plano de empréstimo, ponto de equilíbrio, fontes de financiamento e linhas editáveis de receitas/despesas. O conteúdo é JSON versionado cifrado com o rascunho existente, limitado a 30 KB e sem campos pessoais; versões desconhecidas ou snapshots malformados são descartados para restauração segura. É um conjunto de pressupostos exploratórios, não uma oferta de crédito nem demonstração contabilística.
|
||||
|
||||
- A reconciliação do plano financeiro compara em cêntimos exactos usos iniciais (activos + fundo de maneio líquido) e fontes declaradas. O estado `balanced`, `shortfall` ou `surplus` acompanha o valor assinado da diferença; excedente não é rotulado como défice. A tesouraria inicial continua a considerar separadamente o caixa de abertura.
|
||||
|
||||
## Forma do resultado
|
||||
|
||||
`SimulationResult` tem `status` (`calculated`, `estimated`, `indeterminate`, `not_applicable`), `value`, `unit`, `explanation`, `missingInputs` e `sourceIds`. `calculated` e `estimated` exigem valor; `indeterminate` exige valor nulo e pelo menos uma entrada em falta; `not_applicable` exige valor nulo. Zero é aceite como valor calculado.
|
||||
|
||||
O contexto contém `contractVersion`, data de referência, moeda (nula quando não definida), identificador de cenário, versão do motor e versão do conjunto de regras (nula quando não existe regra publicada aplicável).
|
||||
|
||||
## Ciclo de vida e compatibilidade
|
||||
|
||||
Os snapshots existentes continuam a ser gravados pelo fluxo actual, separados e protegidos por controlo de acesso. `simulation_sources` nao e aceite pelo endpoint generico de actualizacao; a camada de servico preserva copias anexadas e remove-as perante consentimento revogado. A tipagem de resultados continua um contrato interno: nenhum endpoint generico passa a exigir `SimulationResult`. Uma futura alteracao de schema deve ser aditiva, versionada e acompanhada por compatibilidade de leitura e migration reversivel.
|
||||
|
||||
O tombstone de `simulation_form_drafts` continua visível sob RLS apenas ao utilizador/token proprietário, para permitir `UPDATE deleted_at` sem violar a policy PostgreSQL. Os endpoints `current`, `show`, `update`, `delete` e conversão filtram explicitamente `deleted_at IS NULL`; logo o rascunho eliminado não é restaurável nem recuperável pela API pública. A mudança da policy é aditiva e reversível; não altera dados.
|
||||
|
||||
`sourceIds` referencia fontes governadas quando existirem; texto explicativo não substitui fundamento legal validado. Até a aprovação das fontes e regras, qualquer linha fiscal permanece indeterminada e não é aconselhamento.
|
||||
|
||||
## Plano empresarial e existências
|
||||
|
||||
- Snapshot `business-plan-v9`: `monthlyUnitsByPeriod` opcional por produto, com agenda de ate 60 meses que deve cobrir o horizonte activo. Meses fora do horizonte ficam preservados e nao entram no calculo; se a agenda for ampliada, meses novos recebem `monthlyUnits` como quantidade-base. Sem agenda, `monthlyUnits` aplica-se a todo o horizonte. Preco e custo unitario sao constantes. Receitas, custos, consumo de existencias, cobrancas agendadas e cenarios usam os volumes mensais. Totais somam os periodos calculados em centimos; o CSV exporta a agenda em JSON. Snapshots v1-v8 mantem o modo constante.
|
||||
- Snapshot `business-plan-v10`: acrescenta `unitPriceByPeriod` e `unitVariableCostByPeriod` opcionais por produto. Cada agenda monetaria cobre o horizonte activo, admite ate 60 meses, preserva meses ocultos na interface e usa o preco/custo base quando o utilizador amplia o horizonte. Sem agenda, o valor base aplica-se a todos os meses. Valores sao validados em centimos; receita, custo variavel, consumo de existencias, cobrancas agendadas e cenarios usam os valores de cada periodo. O CSV exporta as tres agendas em JSON. Leitores v1-v9 continuam a aceitar os seus contratos historicos, sem inferir agendas monetarias.
|
||||
- Snapshot `business-plan-v11`: acrescenta agendas opcionais por mes para despesa operacional reconhecida, pagamento operacional, despesa de pessoal reconhecida e pagamento de pessoal. Cada agenda cobre o horizonte activo e admite ate 60 meses; sem agenda, o valor mensal base continua constante. Despesa reconhecida afecta resultado, enquanto pagamento afecta apenas tesouraria. As agendas sao validadas em centimos, preservadas em meses ocultos, ajustadas separadamente nos cenarios e exportadas em JSON no CSV. Leitores v1-v10 continuam compativeis e nao recebem agendas inferidas.
|
||||
- Snapshot `business-plan-v12`: acrescenta uma agenda opcional de encomendas de existencias por mes, com montante decimal e prazo de entrega individual entre 0 e 12 meses. A agenda cobre o horizonte activo, preserva meses ocultos e pode ficar guardada enquanto o utilizador alterna entre o modo mensal constante e o modo por mes. Recepcao, stock em transito e falta sao reconciliados por mes; os pagamentos de compras continuam independentes. Os cenarios ajustam os montantes declarados e preservam prazos. Leitores v1-v11 mantem os pressupostos anteriores sem inferir uma agenda.
|
||||
- Serializacao do plano empresarial respeita o limite de 60.000 caracteres aceite pelo request do rascunho. Acima do limite, o serializer rejeita a gravacao; a interface conserva a edicao em memoria, mostra erro e permite reduzir o plano antes de sincronizar. Um snapshot previamente maior que o limite nao e substituido por valores vazios/por defeito.
|
||||
|
||||
- Snapshot `business-plan-v4` acrescenta `salesCollectionLagMonths` opcional (nulo para o modo antigo/manual; 0–12 meses para agendar a cobrança da facturação) a `business-plan-v3`. Snapshot `business-plan-v5` acrescenta `salesCollectionPercent` (0–100%, até seis casas decimais), aplicado ao valor facturado no mês de vencimento; a parcela restante continua em contas a receber no fim do horizonte e não é reagendada. Snapshot `business-plan-v6` acrescenta o mês e percentagem declarados para uma única cobrança de valores a receber de abertura. Snapshot `business-plan-v7` acrescenta `openingReceivablesInstallments`, parcelas mensais expressas como percentagem do saldo inicial. A cobrança única legada e as parcelas detalhadas, em conjunto, não podem exceder 100%; montantes são arredondados ao cêntimo e limitados ao saldo disponível. Snapshot `business-plan-v8` acrescenta `salesRecoverySchedule`: eventos opcionais, com mês único dentro do horizonte e percentagem (0–100%) do saldo de facturas já vencidas que ainda está por receber. Primeiro ocorrem as cobranças previstas no vencimento; depois, a recuperação incide apenas nas facturas cujo vencimento seja anterior ao mês actual, das mais antigas para as mais recentes, arredondada a cêntimos e limitada ao saldo. Sem evento declarado, não se presume recuperação. Leitores v1–v7 continuam válidos e interpretam a nova agenda como vazia. Se as compras não estiverem informadas, a projecção de existências continua indeterminada.
|
||||
- Saldo mensal simplificado: saldo inicial + recepções de encomendas − consumo calculado pelos produtos e quantidades planeadas. O prazo é um atraso fixo para todas as encomendas mensais; recepções e mercadoria em trânsito são expostas por período e no fecho do horizonte. Compras/encomendas e pagamentos continuam pressupostos separados; o primeiro altera stock e o segundo o fluxo de caixa.
|
||||
- Uma falta de stock é apresentada separadamente e não reduz vendas automaticamente. O modelo não simula atrasos variáveis, stock por produto, devoluções, perdas ou reposição baseada em procura; os resultados continuam indicativos, não são contabilidade validada.
|
||||
- No modo de cobrança por prazo, a percentagem declarada da facturação mensal é recebida no mês de vencimento (0 = no próprio mês). Facturação, cobrança calculada e saldo a receber dessa facturação permanecem separados; cobranças manuais adicionais são aditivas. A parte não recebida permanece em aberto até ao fim do horizonte, sem recuperação presumida. Valores a receber de abertura só são recebidos nos meses/percentagens explicitamente declarados; não é inferida maturidade.
|
||||
|
||||
## Ponte financeira-fiscal
|
||||
|
||||
- A ponte da Etapa 7 mantém receita, custo variável, despesas operacionais, pessoal, depreciação contabilística e juros reconhecidos em linhas separadas, com origem, montante por mês, total e tratamento fiscal por classificar.
|
||||
- Resultado contabilístico antes de impostos reconcilia com essas linhas. Matéria colectável é sempre indeterminada até existirem classificação de dedutibilidade, ajustamentos, período e regra aprovada aplicáveis.
|
||||
- Cobranças, pagamentos a fornecedores, pagamentos operacionais, pagamentos de pessoal, juros pagos e reembolsos de capital permanecem no calendário de caixa, fora das linhas de resultado contabilístico. Reembolso de capital não é despesa.
|
||||
- Esta ponte não calcula imposto, não converte ausência em zero e não declara dedutibilidade fiscal.
|
||||
- Antes do mapeamento, verifica que resultado e facturação reconciliam com os períodos, cobranças totais equivalem às suas origens discriminadas (vendas agendadas, recebíveis de abertura e outras/manuais), saldos de recebíveis evoluem segundo as cobranças declaradas e o caixa mensal/final reconcilia com entradas menos pagamentos. Uma divergência invalida a ponte.
|
||||
- O CSV do plano repete estado da ponte, campos fiscais em falta, resultado contabilístico, totais e valores mensais por linha, além de manter o calendário de caixa em secção própria.
|
||||
- A exportação da execução aritmética genérica só aceita estado concluído e inclui versões da execução/relatório, ID e SHA-256 do relatório quando válidos, datas, fórmula, entradas, resultado, moeda conhecida ou ausência explícita, fontes e limitações. O CSV local exclui perfil, contactos e outros campos pessoais.
|
||||
- As exportações CSV serializam as células pelo utilitário comum `resources/js/lib/csv.ts`: texto cujo primeiro conteúdo significativo é `=`, `+`, `-` ou `@` recebe apóstrofo, sem alterar montantes negativos decimais válidos; aspas e delimitadores são escapados.
|
||||
|
||||
## Envelope versionado das execucoes aritmeticas da API
|
||||
|
||||
Snapshots concluidos da API mantêm `indicative_total`, `formula_version` e `legal_interpretation` e acrescentam `contract_version: 1`, `context` e `result`. O contexto usa a data de criação do cenário para não variar com o atraso da fila; moeda e versão de regras ficam nulas sem declaração/regra. `result.value` é a mesma string decimal do campo legado; `status: calculated` qualifica apenas a operação aritmética e a explicação exclui expressamente conclusão fiscal. Sem regra ou fonte legal aprovada, `ruleset_version` é nula e `source_ids` fica vazio. A entrada original permanece na tabela separada `simulation_result_sources`.
|
||||
|
||||
O contexto v1 inclui `scenario_version`, correspondente a `SimulationReport.version_no`. Na exportação, o cliente selecciona apenas um relatório pronto da mesma revisão, compara o snapshot do relatório com o resultado API em JSON canónico e exige um SHA-256 bem formado. Isto impede associar um relatório antigo ou divergente ao resultado actual; o hash é produzido e validado pelo backend.
|
||||
|
||||
- Snapshot `business-plan-v13`: adds an optional monthly cash-payment schedule for variable purchases. It is independent of inventory orders and receipts: it changes cash flow, not profit, consumption, or stock. Decimal amounts cover the active horizon, hidden months are preserved, and v1-v12 snapshots remain valid without an inferred schedule.
|
||||
- Snapshot `business-plan-v14`: adds an explicit per-product inventory mode. Every product declares opening stock and monthly purchase amounts with independent lead times; opening stock must reconcile exactly to the plan's aggregate opening inventory. Receipts, consumption, transit and shortages are calculated separately for each product and then summed. Shortage on one product cannot be offset by another product's unused stock, and projected sales are not reduced automatically. The older aggregate inventory model and snapshots v1-v13 remain compatible.
|
||||
- Snapshot `business-plan-v15`: adds an optional supplier payment mode for per-product purchase orders. Each order declares a 0-12 month payment lag from order date; cash payments replace the manual variable-purchase payment schedule while active, preventing double counting. Payments due after the forecast horizon are reported as outstanding supplier amounts; no supplier credit is presumed or confirmed. Snapshots v1-v14 retain their prior behavior.
|
||||
- Snapshot `business-plan-v16`: supplier orders can declare up to 12 payment installments, each with a 0-12 month lag and a percentage of the order. Declared installment percentages cannot exceed 100%; cent rounding is capped at the unpaid order balance. Percentages below 100% leave an explicit unallocated amount due, and installments beyond the forecast horizon remain outstanding. Legacy v15 supplier terms are upgraded to one 100% installment when serialized; stored v1-v15 snapshots remain readable without changing their historical fields.
|
||||
|
||||
Novas execucoes identificam-se como `portal-arithmetic-v1`, para nao sugerir que o motor fiscal esta activo. Snapshots historicos com `portal-tax-arithmetic-v1` mantem os valores e continuam legiveis; resultados guardados nao sao reescritos.
|
||||
- Snapshot `business-plan-v17`: adds `openingPayablesInstallments`, an optional schedule with month and percent of the original opening payable balance. Declared percentages sum to at most 100%; cent rounding is capped at the unpaid balance. Scheduled settlements reduce cash and opening payables, not profit or period expenses. Any unpaid amount remains a closing payable; an absent schedule assumes no settlement and leaves the full opening amount outstanding. Snapshots v1-v16 remain readable with an empty schedule; explicit resave produces v17.
|
||||
- Execuções API concluídas só são aceites pelo consumidor se `result_snapshot` for um envelope `contract_version: 1` válido (incluindo consistência entre `result.value` e `indicative_total`) ou um snapshot legado legível com montante decimal. Estados concluídos sem snapshot, com snapshot malformado ou com versão v1 inválida são rejeitados na fronteira da API; estados não concluídos podem manter snapshot ausente/nulo. Snapshots históricos legíveis continuam compatíveis.
|
||||
@@ -0,0 +1,40 @@
|
||||
# Correspondência dos documentos de preparação com o dossier InvesteMoz
|
||||
|
||||
Data: 05/10/2026. Os dois DOCX de referência foram lidos no caminho indicado pelo utilizador. O template contém exemplos, identidades, valores, datas e projecções de uma empresa concreta. Esses dados foram excluídos da implementação. O questionário antigo inclui perguntas de personalidade e listas de verificações jurídicas/fiscais descontextualizadas; não são reproduzidas literalmente.
|
||||
|
||||
## Inventário funcional reutilizado
|
||||
|
||||
| Capacidade existente | Localização | Uso nesta melhoria |
|
||||
|---|---|---|
|
||||
| Entrada ideia/investidor e secções dinâmicas | `resources/js/lib/simulation-form.ts`, `resources/js/components/simulation-form.tsx` | Reordenada em seis etapas para a ideia; o percurso de projecto definido mantém detalhe próprio. |
|
||||
| Rascunho local e recuperação cifrada no servidor; associação explícita à conta | `SimulationForm`, `SimulationFormDrafts`, `StoreSimulationFormDraftRequest` | Mantidos; campos novos pertencem ao mesmo snapshot económico. |
|
||||
| País, actividade, província/distrito/posto/localidade e zonas | campos pesquisáveis existentes e catálogos API | Mantidos; seleção de zona não é prova de infraestrutura, autorização ou incentivo. |
|
||||
| Plano financeiro, cenários e ferramentas financeiras | `simulation-business-plan.tsx`, `simulation-financial-tools.tsx`, `simulation-cashflow-planner.tsx` | Reutilizados; fórmulas e snapshots guardados não foram alterados. |
|
||||
| Equipa/competências e marcos | `project-planning.tsx` | Mostrados juntos numa etapa, sem duplicar os respectivos snapshots. |
|
||||
| Revisão e DOCX/PDF/CSV/ZIP | `project-dossier-export.tsx`, `project-dossier-report.ts` | Mantidos; resumo, mercado, riscos e respostas entram no mesmo relatório/CSV. |
|
||||
|
||||
## Correspondência temática
|
||||
|
||||
| Tema/perguntas dos DOCX | Pergunta adaptada no simulador | Campos/componentes do dossier | Tratamento |
|
||||
|---|---|---|---|
|
||||
| Objectivos, missão, proposta e descrição | Que necessidade pretende resolver? Que solução propõe? | `project_title`, `project_summary`, `project_problem`, `value_proposition` | Texto declarado pelo utilizador; nenhum objectivo ou missão do exemplo foi importado. |
|
||||
| Produto/serviço e actividade | O que pretende oferecer? Em que actividade se enquadra? | `products_services`, `sector_id`, `activity_id`, `project_type`, `maturity_stage` | Catálogo de actividade existente; conteúdo só é exibido se preenchido. |
|
||||
| Mercado, segmentos e clientes | Quem são os clientes, onde estão e que necessidade têm? Já conversou com eles? | `target_customers`, `customer_validation_status`, `market_assumption`, `market_source` | Estados Sim/Não/Parcialmente/Ainda não sei/Não se aplica não substituem descrição nem fonte. |
|
||||
| Concorrência e padrões de compra | Que alternativas usam hoje os clientes? | `competitor_assumption` | Hipótese declarada, sem estimativas de dimensão de mercado. |
|
||||
| Estratégia comercial, vendas e presença digital | Como chegará aos clientes? Que divulgação pretende testar? | `sales_channel_assumption`, `marketing_approach` | Planeamento do utilizador; não é previsão de vendas. |
|
||||
| SWOT, ameaças e respostas | O que falta esclarecer? Que acção pretende tomar? | `ProjectReadiness`, `project_risk_responses_snapshot` | Alertas determinísticos, sem probabilidade, perda monetária ou pontuação de gravidade. |
|
||||
| Localização, instalações e recursos | Já avaliou a adequação do local? Por que o escolheu? | `province_id`, `district_id`, `admin_post_id`, `locality_id`, `location_assessment_status`, `location_rationale`, `infrastructure_needs`, `land_status` | Relações da base territorial; dados não disponíveis não são inventados. |
|
||||
| Gestão, equipa e pessoal | Que funções/competências estão disponíveis ou em falta? Que resposta, responsável, custo e prazo planeia? | `ProjectTeamPlanner`, `project_team_snapshot` | Perguntas moralizantes sobre personalidade, confiança, liderança ou capacidade pessoal foram excluídas. |
|
||||
| Marcos e execução | Que resultado pretende alcançar e quando? | `ProjectMilestonePlanner`, `project_execution_snapshot` | Planeado e realizado permanecem separados; um marco existente pode preencher uma resposta de risco. |
|
||||
| Arranque, custos e projecções | Já identificou custos, moeda, periodicidade, recebimentos e financiamento? | plano financeiro versionado, fluxo de caixa, `cost_estimate_status`, campos financeiros existentes | Não copiadas taxas, margens, crescimento, datas ou previsões do template. Vendas, recebimentos, dívida, juros e amortização continuam categorias distintas nas ferramentas existentes. |
|
||||
| Capital e financiamento | Qual o estado dos recursos de financiamento necessários? | capital próprio, dívida, montante mobilizado/pretendido, `funding_status`, necessidade de negócio | Sem catálogo de produtos documentado, pré-elegibilidade continua indeterminada. |
|
||||
| Formalização, forma jurídica, marcas, patentes e documentos | Consultar orientação quando a maturidade/actividade tornar o assunto relevante | Guias existentes e `required_documents` dos fluxos formais | Não pedir NUIT, identidade, registo ou carregamento de documentos para explorar uma ideia; respostas legais do questionário antigo não viram aconselhamento. |
|
||||
| Balanço, rácios, break-even, forecast de três anos | Usar apenas as ferramentas e saídas já suportadas | business plan, calculadores existentes e resultados versionados | Não geradas demonstrações financeiras nem indicadores sem motor/dados suficientes. |
|
||||
|
||||
## Versões e compatibilidade
|
||||
|
||||
Novas respostas são guardadas no snapshot económico cifrado do rascunho e levam a versão `investmoz-project-dossier-2026-10-05.1`. Um rascunho anterior sem versão é marcado localmente como `legacy-unversioned`; as suas respostas e edições não são substituídas. Campos novos são opcionais, não exigem migration SQL e não alteram fórmulas ou regras fiscais.
|
||||
|
||||
## Limites
|
||||
|
||||
Os exemplos junto aos campos são explicitamente ilustrativos e nunca preenchem respostas. O painel calcula alertas apenas a partir de campos existentes; uma resposta “Sim” continua declarada e pode requerer detalhes, fonte ou prova. Zonas, incentivos, catálogos e procedimentos mantêm os limites publicados nos respectivos módulos. Não existe assistência por IA nesta melhoria nem envio de dados para serviços externos.
|
||||
@@ -0,0 +1,150 @@
|
||||
# Revisão fiscal 2026 e delimitação de microfinanças
|
||||
|
||||
**Data de corte:** 3 de Outubro de 2026
|
||||
**Gate:** revisão documental em âmbito limitado; activação do motor fiscal bloqueada.
|
||||
**Autorização/aprovação informada:** o proprietário declarou que contabilista/fiscalista reviu e validou o simulador e autorizou formalmente a matriz e as regras. Não foi fornecido parecer individualizado que permita atribuir validação profissional independente a cada cenário; a falta desse relatório não bloqueia programação/testes/cenários estimativos fundamentados. As pendências listadas abaixo são de fonte, âmbito, vigência, parametrização ou caso de referência, não um novo pedido de autorização.
|
||||
|
||||
## Evidência e limite
|
||||
|
||||
O repositório não contém os documentos fiscais de 2026 referidos anteriormente pelo utilizador. A comparação secundária foi feita com resumos públicos; a íntegra oficial autenticada e consolidada deve ser arquivada pela INM/AT antes de parametrizar regras. O sumário oficial da INM confirma que o Suplemento n.º 1 do BR n.º 248, de 29-12-2025, publicou as Leis 7/2025 a 12/2025. Para ler artigos, consultei uma reprodução do BR em domínio de terceiro; não a trato como fonte primária. Em 30-09-2026, o Governo anunciou a aprovação de regulamentos fiscais. A INM passou a listar os BR n.º 186, de 30-09-2026, e n.º 187, de 01-10-2026, ambos disponibilizados no catálogo em 02-10-2026; nesta revisão não foi possível obter o sumário/texto desses números para confirmar se incluem os regulamentos anunciados, os respectivos artigos e a vigência. Assim, a publicação está **por confirmar no texto do BR** — não deve ser descrita como inexistente nem como regra activável.
|
||||
|
||||
## Método de consolidação do Código do IVA
|
||||
|
||||
Para reconstruir o CIVA, usar como **texto-base integral** a republicação efectuada pela Lei n.º 13/2016, de 30 de Dezembro, que altera e republica a Lei n.º 32/2007. Um exemplar local do BR n.º 89, de 08-06-2017, foi arquivado e a página 569 extraída: o aviso altera as alíneas c) e d) do art. 6(5), elimina o art. 14(2)(c) e ordena a rectificação dos anexos I–III do art. 9. O exemplar é consistente com a edição catalogada pela INM, mas a proveniência não foi validada por download oficial ou assinatura; os anexos substitutivos continuam indisponíveis em formato legível/autenticado.
|
||||
|
||||
Antes de usar a republicação, reconhecer que a Lei n.º 3/2012 alterou artigos do texto de 2007; para períodos a partir da vigência da republicação, a Lei 13/2016 é o texto-base integral e as alterações de 2012 não se somam outra vez sobre ela. Depois da base corrigida de 2017, aplicar cronologicamente apenas as disposições e períodos pertinentes: Lei n.º 5/2020 (alteração de art. 9(13), aparentemente transitória; prazo exacto precisa de confirmação em BR oficial), Lei n.º 16/2020 (art. 9(13)), Lei n.º 22/2022 (artigos expressamente alterados; publicação inicial sem efeito e republicação no 2.º Suplemento do BR n.º 250), Lei n.º 3/2025 (art. 9(13)) e Lei n.º 10/2025 (artigos expressamente alterados para o ciclo fiscal de 2026, com vigência/transição conferida por artigo). Regulamentos do CIVA são uma camada distinta e não substituem nem consolidam o Código.
|
||||
|
||||
Uma disposição substituída passa a ter uma versão temporal posterior; não se acumulam simultaneamente o texto anterior e o novo, nem se substitui o Código inteiro por uma lei que altera apenas alguns artigos. Para cada período histórico, preservar o conjunto de disposições então vigente. A rectificação de 2017 está parcialmente lida num exemplar local do BR e arquivada com hash; ainda falta validar a proveniência e consolidar os anexos corrigidos. Os actos regulamentares de 2026 continuam sem íntegra. Esta cadeia não é ainda uma base executável.
|
||||
|
||||
### Evidência local do aviso de rectificação de 2017
|
||||
|
||||
O exemplar local do BR 89/2017 foi arquivado em `source-archive/BR-89-I-Serie-2017-06-08.pdf` (9.456.358 bytes; SHA-256 `11F0CAB15EB6E51010952203FFA24FDC533A24FD642E19525FE4F46B17A1F5E5`). A página 569 indica a alteração das alíneas c) e d) do artigo 6(5), a eliminação da alínea c) do artigo 14(2) e a rectificação dos anexos I–III associados ao artigo 9. O aviso não contém os textos substitutivos dos anexos. A cópia local é consistente com os metadados da ficha INM, mas não foi descarregada directamente da INM e não apresenta assinatura validável; por isso, a autenticidade documental permanece pendente. A digitalização local de 15 páginas intitulada como código rectificado não tem texto pesquisável e não foi usada para inferir listas de isenção.
|
||||
|
||||
Fonte: [ficha INM do BR n.º 89/2017](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-br-n%C2%BA-89-de-080617-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-569); [fac-símile local arquivado](source-archive/BR-89-I-Serie-2017-06-08.pdf). A reprodução de terceiro serve apenas para comparação auxiliar, não para activar regras: https://www.lexlink.eu/FileGet.aspx?FileId=2999523.
|
||||
|
||||
## Matriz de reconciliação
|
||||
|
||||
As indicações secundárias foram confrontadas com o artigo da Tempo Content Manager sobre reforma fiscal 2026, com a nota KPMG “Mozambique Tax Updates” de 07-01-2026 para IRPS e com a nota DLA Piper Africa/SAL & Caldeira sobre a Lei 8/2025; a orientação antiga de microfinanças é a página/checklist do BM de 2022, que hoje aparece marcada “To be updated”. Em 2026-10-04 foi localizado no acervo do proprietário o documento `Informacao Publica/Legislacao - resumos/Reforma fiscal de 2026.docx`; a afirmação anterior de indisponibilidade estava limitada ao repositório e caminho pesquisados e fica substituída. O documento é fonte secundária; ainda requer reconciliação artigo a artigo com os diplomas oficiais, e a sua localização não activa regras.
|
||||
|
||||
| Imposto/tema | Alteração indicada | Fonte secundária | Diploma/artigos identificados | Vigência | Componente afectada | Testes necessários | Aprovação |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| ICE | Extensão das taxas da tabela até 2027 | Tempo | Lei 7/2025, art. 1; altera Lei 19/2022 | Aplicação 2026–2027 conforme publicação; confirmar transição por produto | ICE/Importação: código, unidade, origem, data | Antes/depois; isenção; taxa específica/ad valorem; acumulações | Texto identificado; tabela por produto e Fiscalista pendentes |
|
||||
| Aduaneiro | Alterações às Instruções Preliminares, ZCLCA e mercadorias | DLA Piper Africa/SAL & Caldeira; Tempo | Lei 8/2025, art. 1: art. 21(2), arts. 22 e 27 da Lei 17/2022; vigência no art. 2 | 01-01-2026 conforme publicação consultada; transições por mercadoria por validar | Código pautal, origem, preferência, unidade, valor e data | Código obrigatório; origem/preferência; calendário; código ausente => estimativa incompleta | Sem taxa genérica; validar classificação e tabela oficial por código |
|
||||
| ISPC — âmbito | Regime revisto; alegada eliminação confundida com IVA; novo regulamento ISPC aprovado pelo Conselho de Ministros | Tempo; PwC Moçambique | Lei 9/2025, arts. 2–5; regulamento anunciado em 30-09-2026, número/artigos ainda por identificar no BR | Lei com vigência indicada a partir de 01-01-2026; vigência do regulamento pendente de leitura do BR n.º 186/187 | Actividade, receita, estabelecimentos, tipo/duração de serviço e opção | Limite MZN 4m; actividades/exclusões; multiestabelecimentos; participações; serviços >183 dias; casos de transição | Não activar: falta confirmar texto publicado, vigência e critérios operacionais |
|
||||
| ISPC — taxas e obrigações | Escalões 3/4/5%, certos serviços 12%, profissões liberais 15%, excedente 20%; trimestre/facturação | Tempo; PwC Moçambique | Lei 9/2025, arts. 8–12 | 2026, sujeita a transição/regulamento | Actividade e periodicidade trimestral | Limites MZN 1m, 2,5m, 4m; zero; actividades cumulativas; MZN 500; declaração; retenção em certas compras | Taxas no texto; regra marginal/total e aplicação carecem interpretação aprovada |
|
||||
| ISPC — profissão liberal | Limite temporal de cinco anos | PwC Moçambique | Lei 9/2025, arts. 9, 9-A e transição | Contagem individual/transitória a confirmar | Actividade e início/histórico do regime | Limite temporal; transição IRPS/IRPC | Não activar sem regulamento e validação do Fiscalista |
|
||||
| IVA — regimes | Revogação de regimes simplificados confundida com fim do ISPC; alterações regulamentares aprovadas pelo Conselho de Ministros | Tempo; PwC Moçambique | Lei 10/2025, art. 3 (revogações), art. 53 (transição); Lei 9/2025 separadamente; decreto regulamentar por identificar no BR | Alterações legais para 2026; vigência/transição regulamentar por confirmar no BR n.º 186/187 | Escolha IVA separada do ISPC | Antigo regime IVA; ISPC; combinações/transição; operações digitais e não residentes | Divergência resolvida; conteúdo e vigência do novo regulamento pendentes |
|
||||
| IVA — digital/não residente | Serviços/bens digitais transfronteiriços e obrigações de adquirente | Tempo; PwC Moçambique | Lei 10/2025, arts. 3, 6, 26, 32–33 (texto consolidado a conferir) | 2026; regulamento anunciado ainda não confirmado no BR | Tipo da operação, estabelecimento, não residente | Operação interna/externa; autoliquidação; obrigação e prazo por perfil | Base identificada; fluxo aguarda regulamento consolidado |
|
||||
| IVA — dedução, crédito e reembolso | Dedução com documento válido; crédito pode ser pedido, reconhecido ou pago | Tempo; PwC Moçambique | Lei 10/2025, arts. 18, 19, 21, 23, 25-A, 27, 32–33; Decreto 52/2025, a reconciliar com a versão consolidada | 2026, processo conforme regulamento | Estado separado: estimativa, pedido, reconhecido, recebido; estabelecimento e documentação | Factura válida/ausente; dedução parcial; crédito; pedido; suspensão; reconhecimento; pagamento | Não tratar crédito como liquidez. Processo/prazos operacionais por validar |
|
||||
| IRPS — residência | Nacionalidade ou 180 dias tratados como critério único | KPMG; PwC Portugal | Lei 11/2025, art. 1, nova redacção do art. 21 do Código IRPS | 01-01-2026 conforme lei | Residência auto-indicada ou “não sei”; nunca inferida por nacionalidade/dias isolados | Factores legais e caso indeterminado | Critérios alterados; determinação automática não implementada |
|
||||
| IRPS — rendimentos | Inclusão de rendimentos digitais, prediais e deduções documentadas | KPMG; PwC Portugal | Lei 11/2025, art. 1, alterações aos arts. 22, 48, 50 e correlatos | 01-01-2026 | Categoria trabalho/predial/digital/mais-valia/outro; documentação sem upload | Fonte digital, despesas elegíveis, documentação, limites e perdas | Requer análise por tipo, regulamento e casos aprovados |
|
||||
| IRPS — trabalho/mais-valias | Retenção mensal confundida com apuramento anual; mais-valias alegadas a 32% plana | KPMG; PwC Portugal | Lei 11/2025, art. 1, arts. 54-A, 57, 65, 65-A | 01-01-2026 | Distinguir salário líquido mensal estimado, retenção mensal e apuramento anual | Limites antes/depois, deduções, variáveis, retenção vs apuramento | Divergência resolvida: não generalizar 32% plana de IRPC para IRPS; Fiscalista pendente |
|
||||
| IRPC — estabelecimento permanente | Serviços/construção >90 dias sem ressalvas nos resumos | Tempo; PwC Moçambique | Lei 12/2025, art. 1, art. 3(2)(b)-(c) | 01-01-2026 conforme lei | Tipo de serviço, local/presença, período | Construção; serviços agregados em 12 meses; ressalva de serviços digitais | Ressalva identificada; tratados/regulamento e teste pendentes |
|
||||
| IRPC — digital, retenção e ganhos | Rendimento digital, retenção 10%, reconhecimento de custo, taxa autónoma 32% | Tempo; PwC Moçambique | Lei 12/2025, art. 1, arts. 5, 20, 61-A, 62, 67 e 75 | 01-01-2026; regulamentação contabilística por confirmar | Natureza, residência, estabelecimento, tipo e momento de pagamento/reconhecimento | Origem digital; agente; evento de retenção; ganhos e tratados | Texto identificado; âmbito e exclusões dependem de validação |
|
||||
| IRPC — contabilidade e procedimentos | Informatização/transição para contabilidade organizada; alterações regulamentares aprovadas pelo Conselho de Ministros | Tempo; PwC Moçambique | Lei 12/2025, art. 75(10) e art. 4 transitório; regulamento IRPC aprovado, decreto/artigos por confirmar no BR | Transição legal conforme texto; datas e procedimentos regulamentares pendentes de leitura do BR n.º 186/187 | Apenas intake/planeamento; não certificar conformidade | Datas de transição, formatos, sujeitos e obrigações acessórias | Pendente do texto publicado e da análise de vigência/transição |
|
||||
| INSS | Resumos não substituem regime contributivo | Não identificada no pacote recebido | Decreto 51/2017 e alterações, incluindo Decreto 56/2024 a conferir no INSS | Por período e contribuinte | Empregador/trabalhador/TCP, remuneração e período | Base, exclusões, taxas e mudança de vigência | Não reconciliado; não calcular nem assumir 4%/3% |
|
||||
| Microfinanças | Checklist antigo cita Decreto 57/2004, capitais fixos, membros e prazos; o BM abriu actualização cadastral dos operadores registados entre 11-09 e 10-10-2026 | Guia/checklist BM de 2022 (marcado “Informação em actualização”); comunicado cadastral BM de 11-09-2026 | Lei 20/2020; Decreto 50/2024, arts. 157–170; art. 2 revoga Decreto 57/2004; Aviso 7/GBM/2017 continua listado pelo BM, mas isso não confirma sozinho alcance, vigência nem compatibilidade após o regulamento | Decreto publicado em 2024; aviso cadastral de 2026 tem prazo próprio até 10-10-2026, não altera por si só os requisitos substantivos; lista pública ainda identificada como reportada a 31-03-2025 | Calculadora educativa de empréstimo separada de qualquer futura preparação documental/registo | Requisitos por OPE, operador de microcrédito, microbanco/cooperativa; capitais/limites e procedimentos BM vigentes; efeitos da actualização cadastral de 2026 | Não reutilizar requisitos do guia antigo. Confirmar Avisos aplicáveis e resultado da actualização cadastral antes de documentar um percurso de registo |
|
||||
|
||||
## Alterações no formulário e limites do produto
|
||||
|
||||
- O formulário recolhe ano histórico desde 2000 até ao ano seguinte, periodicidade e componente. Não resolve regras nem reescreve resultados guardados; só pergunta categoria de rendimento, residência auto-indicada, operação, actividade, estabelecimentos, documentação, código pautal ou estado de crédito/reembolso quando pertinente.
|
||||
- Residência tem “não sei”; país declarado é opcional e só aparece para componentes relevantes; não é deduzida de nacionalidade ou dias. IRPS de trabalho distingue estimativa líquida mensal, retenção mensal e apuramento anual.
|
||||
- Nenhum documento é carregado na simulação exploratória. Código pautal é obrigatório quando se escolhe aduaneiro/ICE; isso não constitui validação classificatória nem cálculo.
|
||||
- Os cálculos fiscais continuam indeterminados. portal-tax-arithmetic-v1 é aritmética genérica fornecida pelo utilizador, sem semântica fiscal.
|
||||
- Crédito de IVA não é caixa: o planeador distingue imposto apurado, crédito estimado, pedido, montante reconhecido e recebimento previsto. Só imposto apurado e recebimento futuro explicitamente previsto afectam o fluxo; o recebimento exige mês e aparece como pressuposto condicional não garantido.
|
||||
- A calculadora de empréstimos é educativa. A investeMoz não deve conceder crédito, captar depósitos ou apresentar-se como operador autorizado. Não foi encontrado percurso de registo de operadores no âmbito deste formulário.
|
||||
|
||||
## Divergências resolvidas e pendências
|
||||
|
||||
1. A Lei 10/2025 revoga secções simplificadas do IVA; a Lei 9/2025 trata separadamente do ISPC.
|
||||
2. A indicação secundária de 32% plana para mais-valias IRPS não corresponde ao art. 54-A consultado, que contém escalões progressivos. Não importar a taxa autónoma IRPC do art. 61-A para IRPS.
|
||||
3. O comunicado governamental de 30-09-2026 chama IRPC “Lei 12/2005” num trecho e diz que a Lei 9/2025 altera o Código do IRPC. O sumário oficial do BR 248 identifica a Lei 9/2025 como ISPC e a Lei 12/2025 como IRPC; ambas as referências do comunicado são erros editoriais. O comunicado é evidência de aprovação pelo Conselho de Ministros, não substitui o diploma publicado.
|
||||
4. A Lei 9/2025 apresenta o limite ISPC de MZN 4 milhões; página antiga da AT com MZN 2,5 milhões deve ser tratada como desactualizada para o regime revisto.
|
||||
5. A regra IRPC de serviços >90 dias contém ressalva para serviços digitais; não aplicar limiar mecanicamente a esse percurso.
|
||||
6. O BM marca a orientação de registo de 2022 como “To be updated”; Decreto 50/2024 revoga Decreto 57/2004 e delega ao BM a fixação de capitais/limites. Avisos actuais precisam de confirmação.
|
||||
7. A listagem INM consultada em 02-10-2026 confirma que os BR 186 (30-09-2026) e 187 (01-10-2026) foram disponibilizados, mas o sumário/texto acessível não confirma que contenham os regulamentos fiscais anunciados, nem o número, artigos ou vigência desses actos. O anúncio de aprovação do Conselho de Ministros não é publicação normativa.
|
||||
|
||||
## Adenda de evidência documental local — 2026-10-04
|
||||
|
||||
A pasta de prompts e o acervo de legislação em `C:\Mac\Home\Documents\TEMPO\Portal Tempo` estão acessíveis. A verificação abaixo distingue existência do ficheiro, camada de texto e validação jurídica; não afirma revisão integral de todos os documentos dessa árvore.
|
||||
|
||||
| Documento localizado | Evidência técnica | Limite actual |
|
||||
| --- | --- | --- |
|
||||
| `Legislacao/Lei 13_2016_Reimpressao Codigo do IVA.pdf` | 2.127.554 bytes; SHA-256 `b90dc7c14ece2a2e3784c62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b`; 32 páginas | Sem camada de texto detectável; precisa de OCR/cotejo visual com exemplar oficial. |
|
||||
| `Legislacao/RectificaçãoLei.13.2016_Republicação.Codigo.IVA.pdf` | 19.539.751 bytes; SHA-256 `ad675fef757016b730e859c834ab1a1602576260510912dda6f9d320393d415c`; 15 páginas | Digitalização sem camada de texto; não preencher anexos rectificados por inferência. |
|
||||
| `Legislacao/alteracao CIVA 2023.pdf` | 708.707 bytes; SHA-256 `0c13f4b03dadea7f2dfe30694650078fa7b9de00ef84cb47389422d23a5271cd`; 18 páginas, texto extraível | Texto está disponível para análise, mas a reconciliação artigo/vigência e autenticação ficam pendentes. |
|
||||
| `Legislacao/Legislacao/Legislacao/Lei 22 2022 IVA.pdf` | 1.989.462 bytes; SHA-256 `5bd31ff1231659ce8d89e1260a9de3b067e69e4ace128b3fe0af60e2e928e6af`; 26 páginas, texto extraível | Cópia local; comparar com a publicação oficial arquivada e resolver vigências/dispositivos antes de parametrizar. |
|
||||
| `Legislacao/Lei 12.2025_IRPC.pdf` | 511.828 bytes; SHA-256 `3b67d10beaa3bf65d62a3d75fa01cc5a8181000d674e7b2ba62d06c60d449757`; 4 páginas, texto extraível | O texto contém o Suplemento 1 do BR 248 e permite ler a Lei 12/2025; revisão semântica e transição por regra ainda necessárias. |
|
||||
| `Legislacao/Legislacao/2009/Lei 4_2009 Código dos Benefícios Fiscais - versão consolidada.pdf` | 253.019 bytes; SHA-256 `61e3439426f1eab4c3eec91f8d4587baa2e71249c7d60bbb17c8d4427dcd0aa3`; 13 páginas | Extracção parcial com aviso de fonte tipográfica; elegibilidade não consolidada nem aprovada por benefício. |
|
||||
| `Legislacao/Legislacao/a digitalizar/ISPC_Financas.pdf` | 363.424 bytes; SHA-256 `761502b64d65bfac3f9a6e1b23071a397c1c59a961bd15b27708dc01962ea1de`; 17 páginas | Digitalização com camada de texto insuficiente; distinguir do texto integral da Lei 9/2025 e do regulamento de 2026. |
|
||||
| `Legislacao/codigo_irps.pdf`, `Legislacao/IRPColectivas.pdf` e `Servicos Tempo/Relatorios/DECLARAÇÃO DE COMPROMISSO DE HONRA.pdf` | Códigos têm camada de texto; o PDF OCAM é legível e descreve compromisso sobre o Modelo 20 da empresa para o exercício de 2025 | O compromisso não certifica o simulador, casos fiscais, nem aprovação da OCAM para o produto. Dados pessoais do PDF não são reproduzidos nesta matriz. |
|
||||
|
||||
O reconhecimento OCR dos PDFs digitalizados foi tentado com ferramentas temporárias locais, sem gerar uma transcrição utilizável nesta execução. Os binários originais não foram alterados nem copiados para a pasta pública. As fontes oficiais online e os textos já arquivados continuam a ser a base para confirmação; os documentos locais servem para localização e comparação, não como prova automática de autenticidade.
|
||||
8. O BM publicou um comunicado operacional de 11-09-2026 para actualizar o cadastro de operadores de microcrédito de 11-09 a 10-10-2026, com apresentação de identificação e título de inscrição e possível cancelamento do registo por incumprimento. É actualização cadastral, não confirmação de novos capitais mínimos nem substituição da análise do Decreto 50/2024/Avisos. A página BM continua a listar documentação antiga e lista de operadores com corte em 31-03-2025.
|
||||
9. Pendentes: cotejo integral dos anexos CIVA digitalizados; conteúdo dos BR 186/187; INSS actualizado; interpretação dos escalões ISPC e respectivo regulamento; situação normativa do Aviso 7/GBM/2017 face ao Decreto 50/2024; resultado/lista após recadastramento microcrédito de 2026; e ligação/teste independente dos casos fiscais que ainda não têm memória de cálculo rastreável. A autorização do proprietário foi concedida; não pedir autorização genérica novamente.
|
||||
|
||||
## Casos dourados antes de activar
|
||||
|
||||
- Cada regra: instante antes/depois de 01-01-2026; snapshots e resultados históricos imutáveis.
|
||||
- ISPC: fronteiras 1m/2,5m/4m, exclusões, actividades cumulativas, múltiplos estabelecimentos, profissão liberal, MZN 500, retenção e trimestre.
|
||||
- IRPS/IRPC: limites de escalão, mensal vs anual, residência incerta, digital, mais-valias, PE 90 dias com exceção digital e evento de retenção.
|
||||
- IVA: não residente, documentação, dedução parcial, estabelecimentos, crédito/pedido/reconhecimento/recebimento e reconciliação sem tratar estimativa como caixa.
|
||||
- Aduaneiro/ICE: código ausente, origem/preferência, datas, unidade, classificação e taxas por mercadoria.
|
||||
- Zero, montantes altos, arredondamento, combinações incompatíveis, fonte ausente/vencida. Casos aprovados pelo Fiscalista ainda não existem.
|
||||
|
||||
## Fontes consultadas
|
||||
|
||||
- [INM — sumário oficial do BR n.º 248, suplemento de 29-12-2025](https://inm.gov.mz/pt-br/content/sum%C3%A1rio-suplemento-n%C2%BA-1-de-291225-pag-2180-1-20-br-n%C2%BA-248-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-1)
|
||||
- [Reprodução digital do BR n.º 248 em domínio de terceiro; obter cópia autenticada na INM/AT](https://miramar.co.mz/wp-content/uploads/2026/01/Tax_Update_Key_Amendments_to_Mozambican_Tax_Legislation_1767376440.pdf)
|
||||
- [Governo — anúncio de alterações regulamentares fiscais, 30-09-2026](https://portaldogoverno.gov.mz/governo-introduz-alteracoes-nos-regulamentos-fiscais-para-reforcar-eficiencia-tributaria/)
|
||||
- [AT — Pauta Aduaneira de Serviço 2026](https://www.at.gov.mz/servicos/pauta-aduaneira)
|
||||
- [Tempo — resumo secundário da reforma fiscal 2026](https://contentmanager.tempo.co.mz/reforma-fiscal-de-2026-altera-regras-do-iva-irpc-ispc-e-comercio-externo-em-mocambique/)
|
||||
- [KPMG — Mozambique Tax Updates, 07-01-2026](https://kpmg.com/kpmg-us/content/dam/kpmg/taxnewsflash/pdf/2026/01/tnf-mozambique1-jan-7-2026.pdf)
|
||||
- [DLA Piper Africa/SAL & Caldeira — alterações à Pauta, Lei 8/2025](https://www.dlapiperafrica.com/pt/mozambique/insights/2026/-Changes-to-the-Customs-Tariff-and-its-Preliminary-Instructions-)
|
||||
- [Banco de Moçambique — licenciamento e orientação de microfinanças](https://www.bancomoc.mz/en/areas-of-expertise/licensing/licensing-of-institutions/)
|
||||
- [Banco de Moçambique — Decreto n.º 50/2024](https://www.bancomoc.mz/media/jcdnvi0r/decreto-50-2024-11-de-julho-regulamento-da-lei-das-institui%C3%A7%C3%B5es-de-cr%C3%A9dito-e-sociedades-financeiras.pdf)
|
||||
- [Banco de Moçambique — comunicado de actualização cadastral dos operadores de microcrédito, 11-09-2026](https://bancomoc.mz/media/j2fnsbjp/drl_cadastro-operadores-pt.pdf)
|
||||
- [Banco de Moçambique — página de licenciamento, guias, avisos e listas disponíveis](https://bancomoc.mz/pt/areas-de-actuacao/licenciamento/licenciamento-de-instituicoes/)
|
||||
|
||||
## Rechecagem oficial — 2026-10-03
|
||||
|
||||
A consulta read-only ao catalogo oficial da Imprensa Nacional confirma que o BR n.º 187, I Série, de 01-10-2026 (NID 22684), e o BR n.º 186, I Série, de 30-09-2026 (NID 22683), foram listados em 02-10-2026. As fichas públicas confirmam apenas número, série, data e metadados do produto; não expõem sumário fiscal, diploma, artigos ou vigência e encaminham para a loja para obter conteúdo.
|
||||
|
||||
O comunicado do Governo de 30-09-2026 é mais específico do que a ficha INM: anuncia que o novo Regulamento ISPC revoga o Decreto 14/2009 e abrange, entre outras, actividades silvícolas, pesqueiras, pecuárias, agrícolas, industriais, comerciais, artesanato, prestação de serviços e comércio ambulante. Anuncia que a alteração ao Regulamento IVA atinge os artigos 3, 7, 8, 15, 16-A, 18, 21, 23, 28, 36 e 37; confirma também alterações aos regulamentos de IRPC e IRPS. O comunicado não identifica os números dos decretos, o texto dos artigos alterados nem as datas de vigência/transição. Isto confirma os termos do anúncio/aprovação governamental, não a publicação nem o conteúdo normativo executável.
|
||||
|
||||
### Matriz complementar — camada regulamentar anunciada em 2026
|
||||
|
||||
| Imposto | Alteração indicada | Fonte oficial acessível | Diploma/artigos oficiais identificados | Vigência | Componente afectada | Testes necessários | Estado de aprovação |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| IRPC | Alterações ao Regulamento do Código do IRPC, associadas pelo Governo à Lei 12/2025; o comunicado contém a forma editorial “12/2005” | Comunicado do Governo, 30-09-2026; sumário INM BR 248 para identificação da Lei 12/2025 | Regulamento e decreto alterador não identificados no comunicado; artigos não enumerados | Não indicada; conferir publicação e transitório no BR 186/187 | Procedimentos, obrigações acessórias, contabilidade e campos do percurso IRPC, conforme texto | Casos imediatamente antes/depois da vigência; procedimentos; categorias de sujeito; integrações com regras já aprovadas | Pendente: adquirir BR, conferir texto consolidado e Fiscalista |
|
||||
| ISPC | Novo regulamento revoga Decreto 14/2009; anúncio enumera actividades abrangidas | Comunicado do Governo, 30-09-2026; INM BR 248 para Lei 9/2025 | Número/data do novo decreto, artigos, limites, exclusões e tabela não indicados; a referência do comunicado à Lei 9/2025 como alteração IRPC diverge do BR 248, que identifica a Lei 9/2025 como ISPC | Não indicada; não inferir 01-01-2026 nem transição | Elegibilidade, actividade, estabelecimentos, volume, opção, periodicidade, obrigações | Cada limite e actividade, inclusões/exclusões, serviços, múltiplos estabelecimentos e antes/depois da vigência | Pendente; nenhuma regra ISPC activa |
|
||||
| IVA | Alteração regulamentar aos artigos 3, 7, 8, 15, 16-A, 18, 21, 23, 28, 36 e 37; comunicado relaciona-a com a Lei 10/2025 | Comunicado do Governo, 30-09-2026; Lei 10/2025 no sumário INM BR 248 | Decreto alterador e texto de cada artigo não identificados | Não indicada; verificar regras transitórias/publicação no BR | Regimes, operações digitais/não residentes, dedução, facturação e obrigações conforme texto integral | Regimes distintos ISPC/IVA; operações domésticas/transfronteiriças; documentos; crédito e reembolso; antes/depois | Pendente; não aplicar a notícia como regra |
|
||||
| IRPS | Alterações ao Regulamento do Código do IRPS | Comunicado do Governo, 30-09-2026; Lei 11/2025 no sumário INM BR 248 | Decreto alterador e artigos não identificados | Não indicada | Residência, categorias de rendimento, retenção, obrigações anuais conforme texto | Retenção mensal vs apuramento anual; categorias; residência desconhecida; transição | Pendente; cálculos mantidos indeterminados |
|
||||
|
||||
Fontes oficiais consultadas nesta rechecagem:
|
||||
|
||||
- [Catalogo da INM — BR 187 e BR 186 (lista e metadados)](https://inm.gov.mz/pt-br/bulletin)
|
||||
- [Ficha INM do BR 186 de 30-09-2026](https://inm.gov.mz/pt-br/content/br-n%C2%BA-186-de-300926-boletim-da-rep%C3%BAblica-i-serie)
|
||||
- [Comunicado do Governo de 30-09-2026 — anuncio de aprovacao, nao texto normativo](https://portaldogoverno.gov.mz/governo-introduz-alteracoes-nos-regulamentos-fiscais-para-reforcar-eficiencia-tributaria/)
|
||||
|
||||
Decisao do gate: manter IRPC, IVA, IRPS e ISPC sem ativacao fiscal. Nao foi possivel confirmar conteudo, numero de cada acto regulamentar, disposicoes, transicao ou vigencia a partir do material oficial publico acedido. A obtencao do exemplar integral e a revisao/aprovacao do Fiscalista continuam pendentes.
|
||||
|
||||
## Complemento aduaneiro — auditoria da interface AT (2026-10-03)
|
||||
|
||||
A página oficial da [Pauta Aduaneira](https://www.at.gov.mz/servicos/pauta-aduaneira) apresenta a cópia como baseada na Pauta Aduaneira de Serviço 2026 e anuncia download Excel/PDF. A SPA servida pela página embute 5.822 registos: análise lexical read-only do bundle encontrou 5.822 códigos únicos de oito algarismos, sem duplicados, mas 70 descrições ausentes. Todas as linhas têm unidade, direitos, ICE e IVA; direitos estão limitados nesta cópia a 0, 2.5, 5, 7.5 e 20; os 242 valores ICE não nulos são texto misto (percentual, valor por unidade ou ambos), incluindo uma unidade `MZM`; 452 valores IVA são nulos e os restantes são 16.
|
||||
|
||||
Não foi localizado link/endpoint de Excel ou PDF no HTML nem no componente da pauta no bundle (a página promete os formatos, mas o componente observado só usa a tabela embutida). Não foi descarregado o diploma/anexo nem validada a exactidão jurídica das taxas, origem, preferências, notas, medidas ou vigência. Hashes e limites estruturais constam de `official-source-register.md`. A pauta não deve ser importada para produção nem usada para calcular DA/ICE/IVA enquanto não houver reconciliação com o anexo oficial da Lei 8/2025, a versão arquivada da pauta e aprovação competente.
|
||||
|
||||
## Nota histórica de evidência primária — 2026-10-03 (substituída pela adenda seguinte)
|
||||
|
||||
O PDF oficial do BR 248 foi obtido através da API/WebDAV do catálogo da AT e arquivado em [source-archive/BR-248-I-Suplemento-1-2025.pdf](source-archive/BR-248-I-Suplemento-1-2025.pdf), 440.018 bytes, SHA-256 CCF2A8DEECA820F2DD076B4B2141B1EFE3F6A806568C3A587CA59A8E92F4C251. O URL candidato anterior era o errado; esta adenda substitui a frase de que faltava o texto primário do BR 248. Ver [matriz detalhada do texto primário](primary-text-review-2025-2026.md).
|
||||
|
||||
A leitura confirma os artigos indicados nessa matriz para as Leis 7–12/2025. Naquele ponto da revisão, ainda não tinha sido concluída a consolidação da taxa de IVA: o artigo 34 da Lei 10/2025 usa divisor 116, páginas/formulário AT indicavam 17% e a publicação inicial da Lei 22/2022 tinha sido declarada sem efeito.
|
||||
|
||||
**Gate histórico:** fonte primária BR 248 obtida e lida; regulamentos BR 186/187, pauta por classificação e cenários fiscais continuavam pendentes. A taxa geral IVA foi reconciliada na adenda seguinte. Esta nota permanece para explicar a sequência e não representa o estado actual.
|
||||
|
||||
### Correcção da adenda IVA: taxa reconciliada com republicação oficial — 2026-10-03
|
||||
|
||||
A adenda imediatamente anterior manteve a taxa IVA indeterminada porque só dispunha do artigo 34 da Lei 10/2025 e de páginas AT divergentes. A cadeia foi agora conferida em fonte primária: o PDF oficial da Lei 22/2022 é o 2.º Suplemento do BR 250, republicação identificada pela própria INM depois de declarar sem efeito a primeira publicação. No art. 17(1), o texto republicado fixa a taxa em 16%. A Lei 3/2025 altera o art. 9(13), não o art. 17; a Lei 10/2025 não inclui o art. 17 nas alterações e usa o divisor 116 no art. 34. Portanto, a menção de 17% no portal/formulário AT é informação administrativa desactualizada; a taxa legal geral de 16% está confirmada textualmente para 2026.
|
||||
|
||||
A nova fonte, hash e cadeia de publicação estão em [primary-text-review-2025-2026.md](primary-text-review-2025-2026.md), com a cópia arquivada em source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf. Esta resolução não valida regimes, isenções, regulamentos publicados em 2026 ou operações concretas. A activação pública permanece condicionada à ligação versionada do parâmetro, teste independente, reconciliação e procedimento de publicação; a autorização do utilizador já foi dada.
|
||||
@@ -0,0 +1,33 @@
|
||||
# Percurso de avaliação de investimento — 04/10/2026
|
||||
|
||||
## Implementação
|
||||
|
||||
- A entrada “Avaliar o meu investimento” selecciona por defeito a exploração anónima e encaminha para projecto, localização, estrutura financeira, período fiscal, cenários, documentos e revisão. O utilizador pode alterar a finalidade para os fluxos de manifestação já existentes.
|
||||
- O percurso aceita um plano empresarial no formato JSON versionado exportado pelo próprio InvestMoz (limite 60 KB), valida-o com o restaurador de snapshots existente e permite exportá-lo novamente. A leitura ocorre no browser; um ficheiro inválido não substitui o plano actual.
|
||||
- A etapa financeira reutiliza pressupostos, fluxo de caixa e comparação favorável/desfavorável do plano empresarial. A etapa fiscal mantém o período e as perguntas já existentes, permitindo avançar com campos incompletos; um cálculo só pode ser interpretado dentro das limitações indicadas pelo motor fiscal.
|
||||
- A recolha de localização contempla província, distrito, coordenadas/terreno quando conhecidos e necessidades de clientes, matérias-primas, energia, água, transporte, trabalhadores, instalações, custos e requisitos. São declarações de necessidade e não prova de disponibilidade.
|
||||
- A entrada “Transformar a minha ideia num negócio” preserva o percurso progressivo já existente para pequeno negócio.
|
||||
|
||||
## Limites explicitados na interface
|
||||
|
||||
- O portal não dispõe, nesta entrega, de catálogo de incentivos aprovado com condições, vigência e fundamento legal aplicável ao projecto. Não aplica reduções automaticamente nem declara elegibilidade.
|
||||
- A comparação financeira existente não compara automaticamente incentivos, localizações ou estruturas de financiamento. Mostra cenários favorável/desfavorável de pressupostos do plano. VAL, TIR e prazo de recuperação ficam por apresentar até haver cálculo validado e dados suficientes.
|
||||
- Não existe aqui catálogo oficial de procedimentos/licenças por actividade e localização. A lista de documentos é apenas uma lista pessoal de suporte/preparação, não uma afirmação de requisitos legais.
|
||||
- ZEE/ZFI, parques, clusters e corredores são apontados como alternativas para investigar. O simulador não confirma infra-estrutura, disponibilidade ou benefício fiscal nesses locais.
|
||||
- A avaliação fiscal estima efeitos tributários disponíveis, enquanto a análise financeira estima resultados do projecto; uma não garante a outra.
|
||||
|
||||
## Ficheiros
|
||||
|
||||
- `resources/js/lib/simulation-form.ts`: percurso investidor exploratório, perguntas opcionais, localização, procedimento/documentos e validação incompleta.
|
||||
- `resources/js/components/simulation-form.tsx`: rótulos de entrada, explicações de privacidade/limites, separação entre cálculo fiscal e retorno financeiro.
|
||||
- `resources/js/components/simulation-business-plan.tsx`: importação/exportação local de snapshots JSON do plano empresarial.
|
||||
- `app/Http/Requests/StoreSimulationFormDraftRequest.php`: validação no servidor dos novos valores permitidos de necessidades de localização.
|
||||
- `tests/frontend/simulation-form.test.mjs`: cobre percurso, dados incompletos e campos opcionais.
|
||||
|
||||
## Verificações e pendências
|
||||
|
||||
- `node --test tests/frontend/*.test.mjs`: 139/139 passaram.
|
||||
- `npm.cmd run types:check`: passou.
|
||||
- `npm.cmd run build`: passou; 2.403 módulos. Avisos existentes/opcionais de `fontaine` e chunks acima de 500 kB.
|
||||
- Não foi executado teste PHP/integração da nova lista de necessidades. Não houve ensaio visual no browser para a entrada ou importação JSON nesta entrega.
|
||||
- Catálogos de incentivos, requisitos oficiais, cenários fiscais/localização/financiamento cruzados e indicadores VAL/TIR/recuperação continuam pendentes de fontes, fórmulas aprovadas e casos de referência.
|
||||
@@ -0,0 +1,108 @@
|
||||
# Registo de fontes oficiais — validação fiscal e aduaneira
|
||||
|
||||
**Levantamento:** 2026-10-03
|
||||
**Estado:** inventário de fontes candidatas; não constitui aprovação nem parametrização de regras.
|
||||
|
||||
**Adenda de revisão 2026:** consultar [fiscal-reform-2026-review.md](fiscal-reform-2026-review.md) para a matriz dos diplomas 7/2025–12/2025, limites da evidência, anúncio regulamentar de 30-09-2026 e separação microfinanceira. O proprietário informou que contabilista/fiscalista reviu e validou o simulador e autorizou formalmente a matriz/regras; regista-se como declaração e autorização do proprietário, não como prova independente nominal. Regras não são executáveis enquanto os respectivos texto, vigência, âmbito e casos de referência não estiverem tecnicamente rastreáveis.
|
||||
|
||||
Este registo identifica autoridades e documentos oficiais para revisão. Um catálogo, página informativa ou taxa publicada não basta para activar uma regra: cada parâmetro precisa do texto normativo aplicável, alterações consolidadas, âmbito, vigência, fonte arquivada e aprovação fiscal/jurídica registada.
|
||||
|
||||
| Domínio | Fonte oficial localizada | Evidência confirmada | O que falta antes de usar no motor |
|
||||
| --- | --- | --- | --- |
|
||||
| IRPC, IVA, IRPS, ISPC e retenções | [Autoridade Tributária — Legislação Fiscal](https://www.at.gov.mz/legislacao/fiscal) | O catálogo da AT lista legislação e alterações fiscais. A página não foi obtida integralmente nesta sessão; os resultados do catálogo identificam documentos, sem permitir verificar o texto consolidado. | Obter cada código/lei e alterações em vigor; mapear artigos por operação e sujeito; verificar início/fim de vigência, regulamentação e fontes específicas de retenção; aprovação do Fiscalista. Não reutilizar uma taxa histórica encontrada numa página de serviço. |
|
||||
| Cadeia legislativa do CIVA | [Lei n.º 3/2012 — catálogo INM](https://inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-1-de-230112-pag-34-1-6-br-n%C2%BA-3-boletim-da-rep%C3%BAblica-i), [Lei n.º 13/2016 — republicação integral INM](https://www.inm.gov.mz/pt-br/content/suplemento-n%C2%BA-10-de-301216-pag-1426-259-290-br-n%C2%BA-156-boletim-da-rep%C3%BAblica-i-serie), [rectificação — BR 89/2017 INM](https://inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-br-n%C2%BA-89-de-080617-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-569), [Lei n.º 16/2020 — INM](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-1-de-231220-pag-2414-1-20-br-n%C2%BA-246-boletim-da), [Lei n.º 22/2022 republicada — INM](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-2-de-281222-pag-2252-25-42-br-n%C2%BA-250-boletim-da), [Lei n.º 3/2025 — INM](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-1-de-290525-pag-478-1-2-br-n%C2%BA-95-boletim-da-rep%C3%BAblica), [Lei n.º 10/2025 — Parlamento](https://www.parlamento.mz/wp-content/uploads/2025/05/iva.pdf) | A Lei 3/2012 alterou o CIVA original (arts. 9, 12, 14, 15, 18, 19, 21 e 25); a republicação integral de 2016 é a base consolidada a partir da sua vigência e incorpora a história legislativa anterior, não se adiciona novamente a redacção de 2012. A Lei 5/2020 é identificada pelo MEF como alteração ao art. 9(13), mas o fac-símile oficial com o texto e a vigência transitória ainda não foi cotejado; a Lei 16/2020 também altera o n.º 13 do art. 9. A Lei 22/2022 alterou artigos expressos e a publicação inicial ficou sem efeito, sendo republicada no 2.º Suplemento. A Lei 3/2025 e a Lei 10/2025 são alterações posteriores, cada uma limitada ao seu dispositivo e vigência. | **Regra de consolidação:** usar a Lei 13/2016 como texto-base integral; cotejar diplomas anteriores para validar a cadeia legislativa e a redacção incorporada, sem reaplicar os seus dispositivos como alterações posteriores a 2016. O aviso do BR 89/2017 foi lido num exemplar local com hash registado: tratar os trechos dos arts. 6(5) e 14(2) como candidatos até confirmar autenticidade e efeito temporal; obter e autenticar os anexos I–III corrigidos antes de consolidar as listas de isenção. Depois, aplicar cada diploma posterior artigo a artigo e apenas no intervalo de vigência confirmado, resolvendo substituições e transições para manter uma única redacção efectiva por artigo e período. A republicação da Lei 22/2022 é do diploma alterador, não uma nova republicação integral do CIVA. |
|
||||
| INSS — regime geral e TCP | [INSS — Legislação](https://www.inss.gov.mz/legislacao/), [direitos e obrigações do contribuinte](https://www.inss.gov.mz/direitos-e-obrigacoes-do-contribuinte/) | Resultados oficiais de pesquisa apontam para o RSSO aprovado pelo Decreto 51/2017, alterações incluindo Decreto 56/2024 e páginas administrativas que descrevem contribuição repartida entre entidade e trabalhador. O portal expirou por timeout ao abrir nesta sessão. | Descarregar e conferir os diplomas, alterações e regime TCP, base contributiva, exclusões, limites e vigência. A indicação administrativa de percentagens não está aprovada como parâmetro de produção. |
|
||||
| Pauta aduaneira e direitos | [AT — Pauta Aduaneira de Serviço 2026](https://www.at.gov.mz/servicos/pauta-aduaneira), [bundle público da SPA AT](https://www.at.gov.mz/assets/index-XEcizcP2.js), [Portal e-Viajante / AT](https://e-viajante.at.gov.mz/) | A página oficial anuncia a pauta em vigor para descarga Excel/PDF e um simulador com 5.822 códigos, descrição, unidade, direitos, ICE e IVA; identifica os dados como baseados na Pauta Aduaneira de Serviço 2026. A interface é uma SPA: o bundle JavaScript público, referenciado pelo HTML oficial, tem 4.075.657 bytes e SHA-256 `ba71dd79dbad00588027c3557fceb7eb746aba8861fb5be64f4e368b95f4cd25`. Uma contagem read-only de `codigo` no bundle encontrou 5.822 valores, todos distintos. A página directa e links Excel/PDF não ficaram disponíveis para obtenção nesta sessão; não foi validado integralmente cada campo/taxa. | Obter o Excel/PDF oficial, guardar data e hash, conferir contra Lei 8/2025/anexos e validar código, unidade, origem, preferência, medidas, vigência e notas. O bundle comprova presença dos identificadores no cliente oficial, não substitui a pauta arquivada nem a validação normativa dos valores. Sem classificação não calcular DA. |
|
||||
| Câmbio | [Banco de Moçambique — taxas de referência](https://www.bancomoc.mz/pt/areas-wrapper/taxas-de-cambio-de-referencia-intradiaria/) | A página define a taxa de referência cambial e horários de publicação. | Confirmar qual taxa, data e método são legalmente aplicáveis à valoração aduaneira/tributária. A taxa de referência do mercado não é automaticamente a taxa aduaneira. |
|
||||
| ICE e impostos de importação | [Autoridade Tributária — Legislação Fiscal](https://www.at.gov.mz/legislacao/fiscal), [Portal e-Viajante / AT](https://e-viajante.at.gov.mz/) | Os catálogos oficiais são pontos de entrada para legislação e pautas. Não foi obtida regra completa por produto nem base de cálculo. | Recolher diploma, anexo, código de produto, unidade, base, taxa específica/ad valorem, acumulações, isenções, vigência e fonte arquivada. |
|
||||
| Benefícios e incentivos | [Autoridade Tributária — Legislação Fiscal](https://www.at.gov.mz/legislacao/fiscal) e legislação sectorial a localizar | O catálogo permite procurar legislação, sem confirmar elegibilidade de um caso. | Identificar diploma e autoridade competente por benefício, regime, certificado, período e critérios; validar prova documental. Até então, apresentar apenas oportunidade a validar. |
|
||||
| Reforma fiscal publicada em 2025 para períodos de 2026 | [INM — Suplemento n.º 1 do BR 248, 29-12-2025](https://inm.gov.mz/pt-br/content/sum%C3%A1rio-suplemento-n%C2%BA-1-de-291225-pag-2180-1-20-br-n%C2%BA-248-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-1), [AT — Pauta Aduaneira 2026](https://www.at.gov.mz/servicos/pauta-aduaneira) | INM confirma no sumário as Leis 7/2025 (ICE), 8/2025 (Pauta), 9/2025 (ISPC), 10/2025 (IVA), 11/2025 (IRPS) e 12/2025 (IRPC). A AT publica uma pauta de serviço 2026 por código. | Arquivar íntegra oficial autenticada e anexos, conferir texto consolidado e regulamentos anunciados em 30-09-2026, fazer casos dourados e obter aprovação do Fiscalista. Não reutilizar tabelas secundárias como parâmetros executáveis. |
|
||||
| Regulamentos fiscais aprovados em Setembro de 2026 | [Portal do Governo — comunicado de 30-09-2026](https://portaldogoverno.gov.mz/governo-introduz-alteracoes-nos-regulamentos-fiscais-para-reforcar-eficiencia-tributaria/), [catálogo oficial da INM — Boletins da República](https://inm.gov.mz/pt-br/bulletin?field_tipo_de_produto_tid_br=43), [ficha INM BR 186](https://inm.gov.mz/pt-br/content/br-n%C2%BA-186-de-300926-boletim-da-rep%C3%BAblica-i-serie), [ficha INM BR 187](https://inm.gov.mz/pt-br/content/br-n%C2%BA-187-de-011026-boletim-da-rep%C3%BAblica-i-serie) | O comunicado oficial do Governo especifica que o novo regulamento ISPC revoga o Decreto 14/2009 e enumera sectores; que o IVA altera os arts. 3, 7, 8, 15, 16-A, 18, 21, 23, 28, 36 e 37 do Regulamento do Decreto 7/2008; e que há alterações regulamentares a IRPC e IRPS. O INM confirma que os BR n.º 186 e 187 foram listados em 02-10-2026, mas as fichas públicas encaminham para a loja e não expõem o sumário/texto dos actos. O comunicado não identifica números dos decretos, texto publicado, vigência ou transição. | Obter ambos os BR e confirmar quais actos contêm, número, texto integral, artigos, publicação, vigência e transição. Corrigir referências editoriais do comunicado: Lei 12/2025 é IRPC e Lei 9/2025 é ISPC segundo o BR 248; o comunicado escreve “12/2005” e associa Lei 9/2025 ao Código IRPC. Não activar com base em notícia ou aprovação governamental. |
|
||||
| Microfinanças | [BM — licenciamento e legislação do sistema](https://bancomoc.mz/pt/areas-de-actuacao/licenciamento/licenciamento-de-instituicoes/), [Decreto 50/2024 em PDF oficial](https://www.bancomoc.mz/media/jcdnvi0r/decreto-50-2024-11-de-julho-regulamento-da-lei-das-institui%C3%A7%C3%B5es-de-cr%C3%A9dito-e-sociedades-financeiras.pdf), [comunicado cadastral BM de 11-09-2026](https://bancomoc.mz/media/j2fnsbjp/drl_cadastro-operadores-pt.pdf), [sumário oficial INM do BR 134/2024](https://www.inm.gov.mz/pt-br/content/sum%C3%A1rio-br-n%C2%BA-134-de-110724-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-2827) | Decreto 50/2024 revoga o Decreto 57/2004. Arts. 157–158 distinguem autorização de instituições de crédito da inscrição de operadores de microfinanças; art. 167 atribui ao BM competência para fixar fundos/capitais mínimos e limites. O BM mantém o guia de registo de 2022 marcado “Informação em actualização”, lista o Aviso 7/GBM/2017 e a lista pública de operadores com corte em 31-03-2025. Comunicado de 11-09-2026 abriu actualização cadastral até 10-10-2026, sem por si só alterar requisitos substantivos. | Confirmar validade/aplicação actual do Aviso 7/GBM/2017 e outros avisos, categoria jurídica, limites, actividade permitida, novos registos e efeitos do recadastramento 2026. Calculadora educativa não pode sugerir autorização para emprestar/captar depósitos; não reutilizar checklist antigo. |
|
||||
|
||||
## Regra de governação
|
||||
|
||||
1. Arquivar o texto oficial e os anexos usados, com URL, data de obtenção e hash.
|
||||
2. Para consolidação do CIVA, usar a Lei 13/2016 como texto-base integral; tratar a Lei 3/2012 apenas como antecessora incorporada para fins de histórico até à vigência da republicação; cotejar a rectificação de 2017; aplicar Lei 5/2020 (temporária, vigência a confirmar no BR), Lei 16/2020, Lei 22/2022, Lei 3/2025, Lei 10/2025 e actos posteriores somente nos artigos e períodos que cada diploma efectivamente altera.
|
||||
3. Distinguir republicação integral do Código de republicação de um diploma alterador. Não acumular a redacção antiga com a nova nem substituir todo o Código por uma lei que só altera artigos específicos; manter cada versão histórica reproduzível.
|
||||
4. Registar artigo, jurisdição, contribuinte/operação abrangida, `scope_key`, vigência e regra de precedência.
|
||||
5. Criar casos dourados com limites, transições de vigência, isenções, arredondamento e combinações incompatíveis.
|
||||
6. Fazer revisão por especialista competente e aprovação explícita do Fiscalista antes de publicar parâmetros.
|
||||
7. Manter o resultado indeterminado se faltar fonte, classificação, documento de elegibilidade ou parâmetro aprovado.
|
||||
|
||||
Nenhuma taxa ou regra fiscal foi activada nesta continuação. O registo é evidência de descoberta de fontes e de lacunas, não substitui análise jurídica do texto normativo.
|
||||
|
||||
### Conferência do resumo secundário local — 2026-10-04
|
||||
|
||||
Foi lido `Informacao Publica/Legislacao - resumos/Reforma fiscal de 2026.docx` (SHA-256 `36666904ADB982AD578145E7B70244146C6414299B18F086042A5B4A6C2385B6`). O resumo secundário não é tratado como diploma. O cotejo usou o exemplar já arquivado em `source-archive/BR-248-I-Suplemento-1-2025.pdf` (21 páginas; 440.018 bytes; SHA-256 `CCF2A8DEECA820F2DD076B4B2141B1EFE3F6A806568C3A587CA59A8E92F4C251`) e extraiu a camada de texto em modo somente leitura. Há ainda uma cópia diferente no acervo do proprietário, `BR_248_I_SERIE_SUPLEMENTO_2025.pdf` (20 páginas; SHA-256 `A0110696253715567AF39C159A21BACFEBC32F944FA43A4EFD18070D36959E50`). Os hashes/paginação diferem; não as trato como o mesmo binário. As disposições citadas abaixo foram conferidas no exemplar arquivado; o sumário coincide com a ficha oficial INM.
|
||||
|
||||
Comparações textuais específicas, sem parametrização:
|
||||
|
||||
- Lei 9/2025 é ISPC e Lei 10/2025 é IVA; os regimes simplificados revogados pela Lei 10/2025 não eliminam por si o ISPC da Lei 9/2025. A própria Lei 9/2025 define âmbito e exclusões, inclusive actividade distribuída por vários estabelecimentos; limites/serviços precisam da regra e contexto completos.
|
||||
- A Lei 10/2025 estabelece prazo de 150 dias para reembolsos devidos e prazo máximo de 10 anos para pedir reembolso (art. 21, n.os 10 e 15, no texto extraído). Isto confirma esses prazos legais textuais, mas não torna crédito/pedido em dinheiro disponível nem substitui a validação do Regulamento do Reembolso, suspensões, reconhecimento e recebimento.
|
||||
- A mesma lei exige dedução proporcional quando a liquidação incide sobre base reduzida em casos enumerados (art. 18, n.º 6) e exclui dedução para as operações indicadas no art. 17-A (art. 19, n.º 2). Não generalizar a regra para qualquer base reduzida nem para todos os bens/serviços sujeitos a uma taxa reduzida.
|
||||
- A declaração de operações isoladas e prazos mensais constam de dispositivos próprios (arts. 32–33); a aplicação depende da categoria da operação e dos sujeitos definidos no Código. Não presumir que qualquer compra de serviço digital por qualquer adquirente se reduz à mesma obrigação.
|
||||
- Lei 12/2025, art. 3(2)(c), exclui serviços digitais do teste de estabelecimento estável por permanência de serviços; tributação de rendimentos digitais e retenção aparecem em outros dispositivos (arts. 5, n.os 5–7, e 62, n.º 5). Assim, o resumo não pode combinar o limiar de 90 dias com a criação automática de estabelecimento estável digital.
|
||||
- O art. 61-A do IRPC fixa tributação autónoma de 32% para mais-valias do IRPC. A Lei 11/2025 contém regime de mais-valias IRPS separado no art. 54-A; não transferir a taxa do IRPC para IRPS.
|
||||
- Alegações do resumo sobre expiração de isenções em açúcar, óleos, sabões e painéis solares, requisitos do regime especial mineiro/petrolífero e procedimentos do Decreto 52/2025 não foram fechadas nesta tranche. Exigem a disposição/anexo/regulamento aplicável e a sua vigência; permanecem sem implementação.
|
||||
|
||||
Este cotejo confirma apenas a correspondência dos dispositivos textuais acima com a cópia local e com o sumário oficial. Antes de parametrizar, ainda se exige conferência do exemplar oficial integral, consolidação CIVA 2016 + rectificação + alterações por vigência, interpretação do âmbito e casos de referência. A autorização do proprietário e a declaração de revisão profissional ficam registadas, mas não substituem esta evidência normativa por regra.
|
||||
|
||||
### Actualização de fonte: rectificação CIVA do BR 89/2017 — 2026-10-03
|
||||
|
||||
O acervo documental local contém o BR n.º 89, I Série, de 08-06-2017. O exemplar, arquivado sem alteração em `source-archive/BR-89-I-Serie-2017-06-08.pdf`, tem 16 páginas, 9.456.358 bytes e SHA-256 `11F0CAB15EB6E51010952203FFA24FDC533A24FD642E19525FE4F46B17A1F5E5`; o hash da cópia coincide com o ficheiro local de origem. A ficha INM identifica a edição e o aviso. O PDF tem metadados compatíveis com a edição, mas não assinatura digital validável e não foi descarregado directamente da INM nesta sessão; proveniência/cadeia de custódia continuam por confirmar.
|
||||
|
||||
A extracção da página 569 apresenta alteração das alíneas c) e d) do art. 6(5), eliminação do art. 14(2)(c) e rectificação dos anexos I–III associados ao art. 9. O aviso consultado não traz o texto substitutivo desses anexos nem especifica a data de produção de efeitos da rectificação. A cópia local separada intitulada como CIVA rectificado é uma digitalização de 15 páginas sem camada de texto e não foi usada para preencher ou activar as listas de isenção. Assim, o teor dos artigos expressamente transcrito no aviso passa de “indicado apenas por fonte secundária” para “transcrito de exemplar local do BR, com autenticidade e efeito temporal por validar”; os anexos continuam pendentes de comparação visual com exemplar autêntico e de revisão jurídica.
|
||||
|
||||
Próximo passo: obter confirmação de proveniência e parecer sobre a data/efeito temporal do aviso, além de texto legível/autêntico dos anexos corrigidos; então consolidar cada lista de isenção e manter a Lei 13/2016 como base, com alterações posteriores limitadas por artigo/vigência. Fontes: [ficha oficial INM do aviso](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-br-n%C2%BA-89-de-080617-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-569); [PDF arquivado e hash identificado](source-archive/BR-89-I-Serie-2017-06-08.pdf); [reprodução integral de terceiro, auxiliar](https://www.lexlink.eu/FileGet.aspx?FileId=2999523).
|
||||
|
||||
### Rechecagem de 2026-10-03
|
||||
|
||||
O catalogo oficial da INM lista BR n.º 187 de 01-10-2026 (NID 22684) e BR n.º 186 de 30-09-2026 (NID 22683), ambos publicados/listados em 02-10-2026. As fichas publicas acessiveis mostram metadados, sem sumario fiscal nem texto dos actos; encaminham para a loja. Isto confirma a existencia e data dos boletins, nao confirma o conteudo regulamentar anunciado. Permanecem por verificar os diplomas, artigos, transicao, vigencia e parametros. Nenhum calculo foi ativado com base neste anuncio.
|
||||
|
||||
Atualizacao read-only em 2026-10-03: o comunicado oficial do Governo de 30-09-2026 discrimina que o regulamento ISPC aprovado revoga o Decreto 14/2009 e cita sectores silvicola, pesqueiro, pecuario, agricola, industrial, comercial, artesanato, servicos e comercio ambulante; indica que as alteracoes do regulamento IVA atingem os artigos 3, 7, 8, 15, 16-A, 18, 21, 23, 28, 36 e 37; e confirma alteracoes regulamentares a IRPC e IRPS. O comunicado nao identifica os numeros dos decretos, os textos aprovados, a data de vigencia ou regras transitórias. Mantem-se como evidencia do anuncio oficial, nao do conteudo normativo publicado. As referencias “Lei 12/2005” e “Lei 9/2025” associada ao Codigo IRPC no comunicado divergem do sumario do BR 248: Lei 12/2025 e IRPC; Lei 9/2025 e ISPC.
|
||||
|
||||
A pagina oficial da AT para a Pauta Aduaneira anuncia download Excel/PDF e uma tabela pesquisavel com 5.822 linhas, identificada como baseada na Pauta Aduaneira de Servico 2026. O HTML oficial referencia o bundle JS acima; os 5.822 identificadores `codigo` foram contados em memoria e sao distintos. Bundle: 4.075.657 bytes, SHA-256 `ba71dd79dbad00588027c3557fceb7eb746aba8861fb5be64f4e368b95f4cd25`, consultado em 2026-10-03. Este controlo nao verificou todas as taxas/campos, nem descarregou ou importou pauta para a aplicacao. A classificacao e a reconciliacao com a Lei 8/2025/anexos, origem, preferencias, notas e vigencia continuam pendentes.
|
||||
|
||||
### Auditoria estrutural da pauta AT 2026 — 2026-10-03
|
||||
|
||||
Consulta read-only da página oficial, do HTML e do bundle JavaScript referenciado pela página. Não foi executado código do bundle: o array estático `v$` foi extraído lexicalmente e os objectos/campos foram analisados em memória.
|
||||
|
||||
- O HTML devolveu HTTP 200, 495 bytes, `Last-Modified: Fri, 02 Oct 2026 03:20:18 GMT`, ETag `"6abf22f2-1ef"` e SHA-256 `c58399b4edb097421c5843a525259feff0f4e03272bf50e9558df67fe3676152`. O bundle oficial, 4.075.657 bytes, conserva SHA-256 `ba71dd79dbad00588027c3557fceb7eb746aba8861fb5be64f4e368b95f4cd25`.
|
||||
- O array tem 5.822 registos e 5.822 códigos distintos, todos com oito algarismos. Não há códigos duplicados. Setenta registos não têm `descricao`; todos têm unidade e os campos `direitos`, `ice` e `iva` presentes (valores nulos são explícitos).
|
||||
- `direitos` é numérico e, nesta cópia, assume apenas 0, 2.5, 5, 7.5 ou 20. `ice` é nulo em 5.580 registos e texto em 242; o texto mistura percentagens, valores por unidade e combinações dos dois. Foi observada pelo menos uma unidade monetária escrita `MZM`, pelo que os dados exigem normalização e reconciliação documental. `iva` é nulo em 452 e 16 nos restantes 5.370.
|
||||
- O objecto por linha não contém origem/preferência, medida de salvaguarda, `scope_key`, vigência, fonte/disposição legal nem versão/hash de registo individual. A interface apresenta os dados como baseados na Pauta Aduaneira de Serviço 2026 e orienta a consulta de informação oficial.
|
||||
- O HTML recebido não tem hiperligações de download. A função de pauta no bundle usa o array embutido e não contém `.xlsx`, `.xls`, `.pdf`, `download` ou `href`; logo os formatos Excel/PDF anunciados não foram localizados por esta rota. Não se conclui que não existam noutro canal oficial. Nenhum ficheiro de pauta foi descarregado.
|
||||
|
||||
**Conclusão de governação:** isto valida a estrutura e a completude limitada da cópia que alimenta o simulador da AT; não valida a correcção legal de cada taxa ou a classificação aduaneira. Não importar para o motor. Continuam necessários o anexo oficial da Lei 8/2025, instruções preliminares, pauta de serviço arquivada e conferência de direitos/ICE/IVA, origem, preferência, unidades, datas e notas por artigo/código, seguida de aprovação competente.
|
||||
|
||||
Continuação 2026-10-03: existe agora fluxo administrativo versionado para regras fiscais em `rule-governance.md` e `rule-governance-openapi.json`. As transições separadas por editor/revisor/aprovador/publicador são autenticadas por gestor verificado + MFA, com listas de emails vazias por defeito, RLS FORCE, snapshots append-only e controlo de vigência sobreposta. Isto não valida a fonte nem publica regras no motor; o SHA-256 do exemplar é declarado e precisa de verificação humana contra documento arquivado. Testes no PostgreSQL 17/PostGIS QA com papel não privilegiado passaram no fluxo e confirmaram bloqueio RLS sem contexto. O gate fiscal permanece bloqueado até fontes oficiais, parâmetros legais e aprovação competente.
|
||||
|
||||
### Verificação de acesso ao PDF oficial do BR 248 (2026-10-03)
|
||||
|
||||
- A INM confirma no sumário do Suplemento n.º 1 do BR 248 que a Lei 9/2025 altera o ISPC e a Lei 12/2025 altera o IRPC. Esta é evidência oficial do diploma e da matéria, mas o sumário não contém os artigos das leis.
|
||||
- A listagem oficial da AT mostra um item `BR_248_I_SERIE_SUPLEMENTO_2025`, 430 KB, com acção “Descarregar PDF”. A partir do registo arquivado da página foi tentado o endereço candidate `https://www.at.gov.mz/index.php/por/content/download/93497/805636/version/1/file/BR_248_I_SERIE_SUPLEMENTO_2025.pdf`. Em 2026-10-03, `curl.exe -I -L --max-time 30` devolveu HTTP 200, `Content-Type: text/html`, `Content-Length: 495` e `Last-Modified: 2026-10-02`, isto é, uma página HTML curta em vez do PDF. A URL final foi anotada apenas como candidata; não foi arquivado nem usado texto normativo por este caminho.
|
||||
- Consequência: a correcção das referências Lei 9/2025/Lei 12/2025 está confirmada pelo sumário INM; leitura integral de artigos, anexos e transições continua pendente de obter o PDF autêntico legível. A cópia de terceiro permanece auxiliar e não pode alimentar regras executáveis.
|
||||
- Fontes: [sumário oficial INM do Suplemento n.º 1 do BR 248](https://inm.gov.mz/pt-br/content/sum%C3%A1rio-suplemento-n%C2%BA-1-de-291225-pag-2180-1-20-br-n%C2%BA-248-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-1); [catálogo oficial de legislação fiscal da AT](https://www.at.gov.mz/legislacao/fiscal).
|
||||
|
||||
### Actualização material: texto primário do BR 248 obtido — 2026-10-03
|
||||
|
||||
A rota directa de download que antes devolvia 495 bytes de HTML não era a rota do ficheiro. O catálogo SPA oficial da AT expõe a API pública /api/documents?root=LEGISLACAO e o endpoint WebDAV usado para recuperar o PDF. O documento foi arquivado em source-archive/BR-248-I-Suplemento-1-2025.pdf (440.018 bytes; SHA-256 CCF2A8DEECA820F2DD076B4B2141B1EFE3F6A806568C3A587CA59A8E92F4C251) e o seu texto pesquisável foi lido em 21 páginas. A conclusão anterior de que o texto primário ainda não podia ser lido fica substituída por esta evidência. Método, matriz artigo-a-artigo e limites estão em [primary-text-review-2025-2026.md](primary-text-review-2025-2026.md).
|
||||
|
||||
**Nota histórica de 2026-10-03, superada pela resolução documental abaixo:** à data desta nota, a taxa geral IVA era mantida indeterminada por dúvida de cadeia documental. A republicação oficial no BR 250, art. 17(1), foi depois conferida e confirma 16%; a Lei 3/2025 não altera esse artigo e a Lei 10/2025 usa o divisor 116. A conclusão actualmente aplicável está em “Resolução documental da taxa geral IVA”. O texto primário confirma separadamente a existência e o âmbito do ISPC, pelo que não confundir o ISPC com regimes simplificados de IVA/IRPS.
|
||||
|
||||
A recuperação do BR 248 não confirma o conteúdo dos regulamentos anunciados em 30-09-2026 nem valida taxas aduaneiras por código, INSS, tratados ou elegibilidade a benefícios. Permanecem pendentes texto integral dos BR 186/187 e fontes/casos específicos onde indicado abaixo. A autorização do proprietário já foi concedida; nenhuma regra foi activada nesta entrega documental.
|
||||
|
||||
### Resolução documental da taxa geral IVA — 2026-10-03
|
||||
|
||||
A taxa legal de 16% está confirmada na republicação oficial da Lei 22/2022, artigo 17(1), no 2.º Suplemento do BR 250. A INM declara que a primeira publicação ficou sem efeito e que a Lei foi republicada nesse segundo suplemento. O catálogo AT expõe também a cópia oficial do diploma, recuperada como Lei 22 IVA 2022, 1.834.284 bytes, SHA-256 EA1B0DC6F5CF6E595F6D9A19E7042F398999E0087CAEF1785F6E8FAC571B5F53; arquivo em source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf. O artigo 34 da Lei 10/2025 (divisor 116) é coerente; as páginas/formulário AT que dizem 17% estão desactualizadas. A Lei 3/2025 altera o art. 9(13), e a Lei 10/2025 não altera o art. 17.
|
||||
|
||||
A divergência 16/17 fica resolvida ao nível do texto legal primário. Não é autorização para implantação em produção: parâmetros, âmbito, regimes, regulamentos de 2026 e casos de referência ainda exigem integração e evidência própria. A autorização do utilizador/proprietário está registada; os limites documentais concretos permanecem. O texto e a hierarquia da evidência estão explicados em primary-text-review-2025-2026.md.
|
||||
|
||||
### Rechecagem de disponibilidade integral dos BR 186/187 — 2026-10-03
|
||||
|
||||
A pesquisa read-only no catálogo oficial da INM voltou a localizar o BR n.º 186, de 30-09-2026 (código BR18622683/NID 22683), e o BR n.º 187, de 01-10-2026 (código BR18722684/NID 22684). As fichas apresentam número, série e data, sem sumário ou texto fiscal. O catálogo oficial apresenta a mensagem “Este produto não está disponível para download grátis, por favor dirige se ao menu Loja”; a pesquisa indexada confirma a mensagem na listagem do BR 187. A tentativa de abertura web das fichas e catálogo expirou. Assim, o conteúdo integral não foi obtido nesta rechecagem e poderá exigir aquisição/consulta pela Loja da INM ou exemplar oficial fornecido por responsável competente. Não assumir que os actos anunciados pelo Governo estão nestes números sem ler o boletim.
|
||||
|
||||
Fontes oficiais: [catálogo INM — BR 186/187 e aviso de indisponibilidade gratuita](https://inm.gov.mz/pt-br/bulletin?field_tipo_de_produto_tid_br=43), [ficha BR 186](https://inm.gov.mz/pt-br/content/br-n%C2%BA-186-de-300926-boletim-da-rep%C3%BAblica-i-serie), [ficha BR 187](https://inm.gov.mz/pt-br/content/br-n%C2%BA-187-de-011026-boletim-da-rep%C3%BAblica-i-serie).
|
||||
|
||||
Estado: confirmação oficial apenas de existência, datas e modalidade de acesso; textos, diplomas, artigos, vigência, transição e âmbito fiscal continuam por confirmar. Manter IRPC, IRPS, ISPC, IVA regulamentar, pautas/cálculos aduaneiros e regras contributivas sem activação até obtenção, análise e aprovação competente.
|
||||
@@ -3,39 +3,89 @@
|
||||
"info": {"title": "InvestMoz Simulation Execution API", "version": "1.0.0", "description": "Indicative arithmetic scenarios. Rates and reductions are user supplied, not legal rates or eligibility decisions."},
|
||||
"servers": [{"url": "/api/v1"}],
|
||||
"paths": {
|
||||
"/tax-parameters/resolve": {
|
||||
"post": {
|
||||
"summary": "Resolve published, source-validated tax parameters without calculating tax",
|
||||
"description": "Returns only parameters whose published rule and validated source cover the requested period and whose declared conditions match. Missing parameters, context mismatches, overlaps and period changes remain indeterminate. CSRF applies because this read uses the web middleware/RLS context.",
|
||||
"requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": false, "required": ["component", "period_start", "period_end"], "properties": {"component": {"type": "string", "enum": ["IRPC", "IVA", "ISPC", "IRPS", "INSS", "RETENCOES", "DIREITOS_ADUANEIROS", "ICE"]}, "period_start": {"type": "string", "format": "date"}, "period_end": {"type": "string", "format": "date"}, "context": {"type": "object", "additionalProperties": {"type": ["string", "null"]}}}}}}},
|
||||
"responses": {"200": {"description": "Resolved parameter records or explicit indeterminate states; no formula is evaluated", "content": {"application/json": {"schema": {"type": "object", "required": ["component", "period", "assumptions", "parameters"], "properties": {"component": {"type": "string"}, "period": {"type": "object", "properties": {"start": {"type": "string", "format": "date"}, "end": {"type": "string", "format": "date"}}}, "assumptions": {"type": "object"}, "parameters": {"type": "array", "items": {"type": "object", "required": ["parameter_code", "status", "value"], "properties": {"parameter_code": {"type": "string"}, "status": {"type": "string", "enum": ["resolved", "indeterminate_missing", "indeterminate_context", "indeterminate_scope", "indeterminate_overlap", "indeterminate_period_change", "indeterminate_invalid"]}, "value": {"type": ["string", "null"]}, "unit": {"type": "string"}, "conditions": {"type": "object"}, "scope_key": {"type": "string"}, "rule_code": {"type": "string"}, "rule_version": {"type": "integer"}, "validity": {"type": "object"}, "source": {"type": "object"}}}}}}}}}, "422": {"description": "Invalid period, component or context", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}
|
||||
}
|
||||
},
|
||||
"/simulation-drafts": {
|
||||
"post": {"summary": "Create an encrypted, versioned simulator form draft", "parameters": [{"$ref": "#/components/parameters/IdempotencyKey"}, {"$ref": "#/components/parameters/SimulationToken"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationFormDraft"}}}}, "responses": {"201": {"description": "Created with ETag"}, "200": {"description": "Idempotent replay"}, "409": {"description": "Draft exists or key reused with a different payload"}, "422": {"description": "Invalid draft field"}}}
|
||||
"post": {"summary": "Create an encrypted, versioned simulator form draft", "parameters": [{"$ref": "#/components/parameters/IdempotencyKey"}, {"$ref": "#/components/parameters/SimulationToken"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationFormDraft"}}}}, "responses": {"201": {"description": "Created with ETag", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationDraftWriteResponseV1"}}}}, "200": {"description": "Idempotent replay", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationDraftWriteResponseV1"}}}}, "409": {"description": "Draft exists or key reused with a different payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "422": {"description": "Invalid draft field", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}},
|
||||
"get": {"summary": "List private projects owned by the signed-in account", "description": "Requires an authenticated session. Only summary fields are returned.", "responses": {"200": {"description": "Private draft summaries", "content": {"application/json": {"schema": {"type": "object", "properties": {"data": {"type": "array", "items": {"$ref": "#/components/schemas/SimulationDraftSummaryV1"}}}}}}}, "401": {"description": "Authentication required", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
},
|
||||
"/simulation-drafts/current": {
|
||||
"get": {"summary": "Read the current user's or anonymous token's draft", "parameters": [{"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Draft snapshot and ETag; personal fields are decrypted only for its owner"}}}
|
||||
"get": {"summary": "Read the current user's or anonymous token's draft", "description": "A read does not extend the anonymous recovery period.", "parameters": [{"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Draft snapshot and ETag; personal fields are decrypted only for its owner", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationDraftReadResponseV1"}}}}}},
|
||||
"delete": {"summary": "Forget the current anonymous draft on this device", "description": "Soft-deletes only the anonymous draft for the current recovery token and expires its recovery cookie. Account-owned projects are unaffected.", "parameters": [{"$ref": "#/components/parameters/SimulationToken"}], "responses": {"204": {"description": "Recovery forgotten and cookie cleared"}, "422": {"description": "Anonymous recovery token required", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
},
|
||||
"/simulation-drafts/claim-preview": {
|
||||
"get": {"summary": "Preview an anonymous draft for explicit account association", "description": "Requires a signed-in account and the same browser recovery cookie; returns summary only and performs no transfer.", "responses": {"200": {"description": "Candidate draft summary or null", "content": {"application/json": {"schema": {"type": "object", "properties": {"data": {"oneOf": [{"$ref": "#/components/schemas/SimulationDraftSummaryV1"}, {"type": "null"}]}}}}}}}}
|
||||
},
|
||||
"/simulation-drafts/claim": {
|
||||
"post": {"summary": "Explicitly continue an existing private project or claim as another project", "description": "Requires a verified account. `continue_existing` opens the selected account draft and leaves the anonymous draft untouched. `save_as_new` atomically transfers the anonymous row into the account without merging or replacing any draft; replay is idempotent.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": false, "required": ["choice"], "properties": {"choice": {"type": "string", "enum": ["continue_existing", "save_as_new"]}, "existing_draft_id": {"type": "string", "format": "uuid"}}}}}}, "responses": {"200": {"description": "Selected/claimed private dossier and ETag", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationDraftReadResponseV1"}}}}, "403": {"description": "Verified account required", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "404": {"description": "Anonymous draft expired or selected dossier is not owned", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "409": {"description": "Ownership conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
},
|
||||
"/simulation-drafts/linkable-businesses": {
|
||||
"get": {"summary": "List the account owner's businesses eligible for an explicit private link", "description": "Returns identifiers and labels only; no business data is copied to a project dossier.", "responses": {"200": {"description": "Owned business choices", "content": {"application/json": {"schema": {"type": "object", "properties": {"data": {"type": "array", "items": {"type": "object", "required": ["id", "title", "modality", "status"], "properties": {"id": {"type": "string", "format": "uuid"}, "title": {"type": "string"}, "modality": {"type": "string"}, "status": {"type": "string"}}}}}}}}}}}
|
||||
},
|
||||
"/simulation-drafts/{id}/business-link": {
|
||||
"get": {"summary": "Read the active reversible link to an owned business", "parameters": [{"$ref": "#/components/parameters/Id"}], "responses": {"200": {"description": "Active business reference or null"}, "404": {"description": "Dossier not owned", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}},
|
||||
"post": {"summary": "Explicitly link a private project to an owned business", "description": "Stores a reference only. Does not copy data, alter the business, submit it, or publish it. The owner may unlink later.", "parameters": [{"$ref": "#/components/parameters/Id"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": false, "required": ["business_id"], "properties": {"business_id": {"type": "string", "format": "uuid"}}}}}}, "responses": {"201": {"description": "Link created"}, "200": {"description": "Idempotent replay"}, "403": {"description": "Business not owned", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "409": {"description": "Unlink the current business before changing the association", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}},
|
||||
"delete": {"summary": "Remove the active business association without deleting either record", "parameters": [{"$ref": "#/components/parameters/Id"}], "responses": {"200": {"description": "Association ended; immutable link history retained"}, "404": {"description": "Dossier not owned", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
},
|
||||
"/simulation-drafts/{id}": {
|
||||
"get": {"summary": "Read an owned draft", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Draft snapshot and ETag"}, "404": {"description": "Draft inaccessible"}}},
|
||||
"put": {"summary": "Autosave an owned draft with optimistic locking", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/IfMatch"}, {"$ref": "#/components/parameters/SimulationToken"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationFormDraft"}}}}, "responses": {"200": {"description": "Saved with new ETag and snapshot hash"}, "412": {"description": "Stale draft version"}, "422": {"description": "Invalid draft field"}}},
|
||||
"delete": {"summary": "Soft-delete an owned draft", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/IfMatch"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"204": {"description": "Deleted"}, "412": {"description": "Stale draft version"}}}
|
||||
"get": {"summary": "Read an owned draft", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Draft snapshot and ETag", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationDraftReadResponseV1"}}}}, "404": {"description": "Draft inaccessible", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}},
|
||||
"put": {"summary": "Autosave an owned draft with optimistic locking", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/IfMatch"}, {"$ref": "#/components/parameters/SimulationToken"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationFormDraft"}}}}, "responses": {"200": {"description": "Saved with new ETag and snapshot hash", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationDraftWriteResponseV1"}}}}, "412": {"description": "Stale draft version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "422": {"description": "Invalid draft field", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}},
|
||||
"delete": {"summary": "Soft-delete an owned draft", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/IfMatch"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"204": {"description": "Deleted"}, "412": {"description": "Stale draft version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
},
|
||||
"/questionnaires/{code}": {"get": {"summary": "Read the published Portuguese questionnaire version", "parameters": [{"name": "code", "in": "path", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Published questionnaire and stable version", "headers": {"ETag": {"schema": {"type": "string"}}}}, "404": {"description": "No published current version"}}}},
|
||||
"/simulation-drafts/{id}/touch": {
|
||||
"post": {"summary": "Renew anonymous recovery after an explicit continue-later action", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/IfMatch"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Recovery deadline renewed without changing the snapshot version"}, "412": {"description": "Stale draft version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
},
|
||||
"/simulation-drafts/{id}/conversions": {
|
||||
"post": {
|
||||
"summary": "Attach a completed simulation to an investment draft with explicit consent",
|
||||
"description": "The caller must own the draft and the simulation, or hold the matching anonymous token. The server requires an investment purpose, a completed execution and a ready report whose SHA-256 and canonical snapshot match the execution result. Repeating the same simulation attachment is idempotent. This operation only adds an immutable simulation reference to the draft; it does not submit a project or create a CRM record.",
|
||||
"parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/IfMatch"}, {"$ref": "#/components/parameters/SimulationToken"}],
|
||||
"requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AttachSimulationToDraftInput"}}}},
|
||||
"responses": {
|
||||
"200": {"description": "Draft with the simulation reference and the replayed flag; returns the new ETag when attached", "headers": {"ETag": {"schema": {"type": "string"}}, "Cache-Control": {"schema": {"type": "string", "const": "no-store, private"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationDraftAttachResponseV1"}}}},
|
||||
"404": {"description": "Draft or simulation is missing or outside the caller's authorized scope", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}},
|
||||
"409": {"description": "Simulation is incomplete, has no ready report, or its report hash/content does not match the result", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}},
|
||||
"412": {"description": "If-Match is stale", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}},
|
||||
"422": {"description": "Consent is not granted or draft purpose is not an investment journey", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}},
|
||||
"428": {"description": "If-Match is required", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}},
|
||||
"429": {"description": "Draft-write rate limit exceeded", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/questionnaires/{code}": {"get": {"summary": "Read the published Portuguese questionnaire version", "parameters": [{"name": "code", "in": "path", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Published questionnaire and stable version", "headers": {"ETag": {"schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/QuestionnaireReadResponseV1"}}}}, "404": {"description": "No published current version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}},
|
||||
"/simulations": {
|
||||
"post": {
|
||||
"summary": "Create a traceable simulation",
|
||||
"parameters": [{"$ref": "#/components/parameters/IdempotencyKey"}, {"$ref": "#/components/parameters/SimulationToken"}],
|
||||
"requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationInput"}}}},
|
||||
"responses": {"202": {"description": "Execution queued", "headers": {"ETag": {"schema": {"type": "string"}}, "Location": {"schema": {"type": "string"}}}}, "200": {"description": "Idempotent replay"}, "409": {"description": "Key reused with a different payload"}, "422": {"description": "Invalid input or missing anonymous token"}, "428": {"description": "Idempotency-Key required"}}
|
||||
"responses": {"202": {"description": "Execution queued", "headers": {"ETag": {"schema": {"type": "string"}}, "Location": {"schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationCreateResponseV1"}}}}, "200": {"description": "Idempotent replay", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationCreateResponseV1"}}}}, "409": {"description": "Key reused with a different payload", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "422": {"description": "Invalid input or missing anonymous token", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "428": {"description": "Idempotency-Key required", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}
|
||||
}
|
||||
},
|
||||
"/simulations/history": {
|
||||
"get": {"summary": "List simulations visible to the verified account", "description": "Returns summary metadata for the user's personal simulations and organization simulations visible through an active membership. Anonymous runs are excluded.", "parameters": [{"name": "page", "in": "query", "schema": {"type": "integer", "minimum": 1, "default": 1}}, {"name": "per_page", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 50, "default": 20}}], "responses": {"200": {"description": "Paginated authorized simulation history", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationHistoryResponseV1"}}}}, "401": {"description": "Authentication required", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "403": {"description": "Verified email required", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
},
|
||||
"/simulations/{id}": {
|
||||
"get": {"summary": "Read a simulation and its snapshots", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Simulation", "headers": {"ETag": {"schema": {"type": "string"}}}}, "404": {"description": "Missing or outside authorized scope"}}}
|
||||
"get": {"summary": "Read a simulation and its snapshots", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Simulation. Completed result snapshots preserve legacy fields and add contract_version, context and result; arithmetic status is not a fiscal conclusion.", "headers": {"ETag": {"schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationReadResponseV1"}}}}, "404": {"description": "Missing or outside authorized scope", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
},
|
||||
"/simulations/{id}/scenarios/{scenarioId}": {
|
||||
"patch": {
|
||||
"summary": "Update a scenario with optimistic concurrency",
|
||||
"parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/ScenarioId"}, {"$ref": "#/components/parameters/IfMatch"}, {"$ref": "#/components/parameters/SimulationToken"}],
|
||||
"requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateScenarioInput"}}}},
|
||||
"responses": {"202": {"description": "Updated; re-execution queued"}, "403": {"description": "Edit not authorized"}, "404": {"description": "Simulation inaccessible"}, "412": {"description": "Stale ETag"}, "428": {"description": "If-Match required"}, "422": {"description": "Invalid input"}}
|
||||
"responses": {"202": {"description": "Updated; re-execution queued", "headers": {"ETag": {"schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationReadResponseV1"}}}}, "403": {"description": "Edit not authorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "404": {"description": "Simulation inaccessible", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "412": {"description": "Stale ETag", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "428": {"description": "If-Match required", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}, "422": {"description": "Invalid input", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}
|
||||
}
|
||||
},
|
||||
"/simulations/{id}/reports/{reportId}": {
|
||||
"get": {"summary": "Read an immutable report snapshot", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/ReportId"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Report snapshot and hash"}, "404": {"description": "Report inaccessible"}}}
|
||||
"get": {"summary": "Read an immutable report snapshot", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/ReportId"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Report snapshot and hash", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationReportReadResponseV1"}}}}, "404": {"description": "Report inaccessible", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
},
|
||||
"/simulations/{id}/jobs": {
|
||||
"get": {"summary": "Read non-sensitive execution job status", "description": "Returns job type, retry state and a sanitized error code; worker exception details are never returned.", "parameters": [{"$ref": "#/components/parameters/Id"}, {"$ref": "#/components/parameters/SimulationToken"}], "responses": {"200": {"description": "Authorized job status list", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimulationJobsReadResponseV1"}}}}, "404": {"description": "Simulation inaccessible", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorV1"}}}}}}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@@ -44,13 +94,33 @@
|
||||
"ScenarioId": {"name": "scenarioId", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}},
|
||||
"ReportId": {"name": "reportId", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}},
|
||||
"IdempotencyKey": {"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "minLength": 16, "maxLength": 128}},
|
||||
"SimulationToken": {"name": "X-Simulation-Token", "in": "header", "required": false, "description": "Required for anonymous access. Client generated; only an HMAC hash is stored.", "schema": {"type": "string", "minLength": 32, "maxLength": 256}},
|
||||
"SimulationToken": {"name": "X-Simulation-Token", "in": "header", "required": false, "description": "Legacy/API-client fallback for anonymous access. Browsers use the HttpOnly, SameSite=Lax investmoz_simulation_recovery cookie; only an HMAC hash is stored.", "schema": {"type": "string", "minLength": 32, "maxLength": 256}},
|
||||
"IfMatch": {"name": "If-Match", "in": "header", "required": true, "description": "Strong ETag; absent returns 428, stale returns 412.", "schema": {"type": "string"}}
|
||||
},
|
||||
"schemas": {
|
||||
"SimulationInput": {"type": "object", "additionalProperties": false, "required": ["base", "rate", "reduction"], "properties": {"base": {"type": "number", "minimum": 0, "description": "User input; no currency is inferred."}, "rate": {"type": "number", "minimum": 0, "maximum": 100, "description": "User scenario rate; not an official rate."}, "reduction": {"type": "number", "minimum": 0, "maximum": 100, "description": "User supplied scenario reduction; no default is applied."}, "organization_id": {"type": "string", "format": "uuid", "description": "Optional; requires admin, manager or officer membership."}}},
|
||||
"SimulationFormDraft": {"type": "object", "additionalProperties": false, "required": ["personal_snapshot", "economic_snapshot"], "properties": {"personal_snapshot": {"type": "object", "description": "Allowlisted personal fields, encrypted at rest; only owner/token can read."}, "economic_snapshot": {"type": "object", "required": ["purpose"], "description": "Allowlisted economic/form fields, encrypted at rest; rates remain user-supplied."}}},
|
||||
"UpdateScenarioInput": {"type": "object", "additionalProperties": false, "required": ["label", "base", "rate", "reduction"], "properties": {"label": {"type": "string", "minLength": 1, "maxLength": 100}, "base": {"type": "number", "minimum": 0}, "rate": {"type": "number", "minimum": 0, "maximum": 100}, "reduction": {"type": "number", "minimum": 0, "maximum": 100, "description": "User supplied scenario reduction; no default is applied."}}}
|
||||
"ApiErrorV1": {"type": "object", "properties": {"message": {"type": "string"}, "errors": {"type": "object", "additionalProperties": {"type": "array", "items": {"type": "string"}}}}, "additionalProperties": true},
|
||||
"QuestionnaireReadResponseV1": {"type": "object", "required": ["data"], "properties": {"data": {"type": "object", "required": ["id", "code", "version_no", "locale", "schema_snapshot", "status"], "properties": {"id": {"type": "string", "format": "uuid"}, "code": {"type": "string"}, "version_no": {"type": "integer", "minimum": 1}, "locale": {"type": "string", "const": "pt-MZ"}, "schema_snapshot": {"type": "object"}, "status": {"type": "string", "const": "published"}, "valid_from": {"type": ["string", "null"], "format": "date"}, "valid_to": {"type": ["string", "null"], "format": "date"}}, "additionalProperties": true}}, "additionalProperties": true},
|
||||
"SimulationHistoryResponseV1": {"type": "object", "required": ["data", "meta"], "properties": {"data": {"type": "array", "items": {"type": "object", "required": ["id", "scope", "organization_name", "status", "version_no", "created_at", "updated_at", "has_ready_report"], "properties": {"id": {"type": "string", "format": "uuid"}, "scope": {"type": "string", "enum": ["personal", "organization"]}, "organization_name": {"type": ["string", "null"]}, "status": {"type": "string", "enum": ["queued", "running", "completed", "failed", "cancelled"]}, "version_no": {"type": "integer", "minimum": 1}, "created_at": {"type": ["string", "null"], "format": "date-time"}, "updated_at": {"type": ["string", "null"], "format": "date-time"}, "has_ready_report": {"type": "boolean"}}}}, "meta": {"type": "object", "required": ["current_page", "last_page", "per_page", "total"], "properties": {"current_page": {"type": "integer", "minimum": 1}, "last_page": {"type": "integer", "minimum": 1}, "per_page": {"type": "integer", "minimum": 1, "maximum": 50}, "total": {"type": "integer", "minimum": 0}}}}, "additionalProperties": true},
|
||||
"SimulationSourceV1": {"type": "object", "required": ["simulation_id", "source_version_no", "result_snapshot", "report_sha256", "consented_at"], "properties": {"simulation_id": {"type": "string", "format": "uuid"}, "source_version_no": {"type": "integer", "minimum": 1}, "result_snapshot": {"type": "object"}, "report_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "consented_at": {"type": "string", "format": "date-time"}}, "additionalProperties": true},
|
||||
"SimulationDraftSummaryV1": {"type": "object", "required": ["id", "title", "version_no", "updated_at", "expires_at"], "properties": {"id": {"type": "string", "format": "uuid"}, "title": {"type": "string"}, "version_no": {"type": "integer", "minimum": 1}, "updated_at": {"type": ["string", "null"], "format": "date-time"}, "expires_at": {"type": ["string", "null"], "format": "date-time"}}},
|
||||
"SimulationDraftV1": {"type": "object", "required": ["id", "version_no", "snapshot_sha256", "personal_snapshot", "economic_snapshot", "simulation_sources", "updated_at", "expires_at"], "properties": {"id": {"type": "string", "format": "uuid"}, "version_no": {"type": "integer", "minimum": 1}, "snapshot_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "personal_snapshot": {"oneOf": [{"type": "object"}, {"type": "array", "maxItems": 0}], "description": "Anonymous drafts return an empty array; account drafts may contain allowlisted private fields."}, "economic_snapshot": {"type": "object"}, "simulation_sources": {"type": "array", "items": {"$ref": "#/components/schemas/SimulationSourceV1"}}, "updated_at": {"type": ["string", "null"], "format": "date-time"}, "expires_at": {"type": ["string", "null"], "format": "date-time", "description": "Anonymous draft deadline; extended by save or recovery access. Account-owned drafts do not expire."}}, "additionalProperties": true},
|
||||
"SimulationDraftReadResponseV1": {"type": "object", "required": ["data"], "properties": {"data": {"oneOf": [{"$ref": "#/components/schemas/SimulationDraftV1"}, {"type": "null"}]}}, "additionalProperties": true},
|
||||
"SimulationDraftWriteResponseV1": {"type": "object", "required": ["data"], "properties": {"data": {"type": "object", "required": ["id", "version_no"], "properties": {"id": {"type": "string", "format": "uuid"}, "version_no": {"type": "integer", "minimum": 1}, "replayed": {"type": "boolean"}}}, "expires_at": {"type": ["string", "null"], "format": "date-time"}}, "additionalProperties": true},
|
||||
"SimulationDraftAttachResponseV1": {"type": "object", "required": ["data", "replayed"], "properties": {"data": {"$ref": "#/components/schemas/SimulationDraftV1"}, "replayed": {"type": "boolean"}}, "additionalProperties": true},
|
||||
"SimulationReportReadResponseV1": {"type": "object", "required": ["data"], "properties": {"data": {"type": "object", "required": ["id", "simulation_id", "version_no", "status", "report_snapshot", "report_sha256"], "properties": {"id": {"type": "string", "format": "uuid"}, "simulation_id": {"type": "string", "format": "uuid"}, "version_no": {"type": "integer", "minimum": 1}, "status": {"type": "string", "enum": ["queued", "ready", "failed"]}, "report_snapshot": {"type": ["object", "null"]}, "report_sha256": {"type": ["string", "null"], "pattern": "^[a-f0-9]{64}$"}}, "additionalProperties": true}}, "additionalProperties": true},
|
||||
"SimulationJobsReadResponseV1": {"type": "object", "required": ["data"], "properties": {"data": {"type": "array", "items": {"type": "object", "required": ["id", "simulation_id", "job_type", "status", "attempts", "available_at", "started_at", "finished_at", "error_code"], "properties": {"id": {"type": "string", "format": "uuid"}, "simulation_id": {"type": "string", "format": "uuid"}, "job_type": {"type": "string", "enum": ["execute", "report"]}, "status": {"type": "string", "enum": ["pending", "running", "succeeded", "failed"]}, "attempts": {"type": "integer", "minimum": 0, "maximum": 3}, "available_at": {"type": "string", "format": "date-time"}, "started_at": {"type": ["string", "null"], "format": "date-time"}, "finished_at": {"type": ["string", "null"], "format": "date-time"}, "error_code": {"type": ["string", "null"]}}, "additionalProperties": true}}}, "additionalProperties": true},
|
||||
"DecimalInputString": {"type": "string", "pattern": "^(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?$", "description": "Non-negative exact decimal encoded as a JSON string; numeric ranges are enforced by the API."},
|
||||
"PercentageInputString": {"type": "string", "pattern": "^(?:0|[1-9][0-9]?)(?:\\.[0-9]+)?$|^100(?:\\.0+)?$", "description": "Exact decimal percentage encoded as a JSON string from 0 through 100; the API enforces the numeric range."},
|
||||
"SimulationInput": {"type": "object", "additionalProperties": false, "required": ["base", "rate", "reduction"], "properties": {"base": {"allOf": [{"$ref": "#/components/schemas/DecimalInputString"}], "description": "User input; no currency is inferred."}, "rate": {"allOf": [{"$ref": "#/components/schemas/PercentageInputString"}], "description": "User scenario rate; not an official rate."}, "reduction": {"allOf": [{"$ref": "#/components/schemas/PercentageInputString"}], "description": "User supplied scenario reduction; no default is applied."}, "organization_id": {"type": "string", "format": "uuid", "description": "Optional; requires admin, manager or officer membership."}}},
|
||||
"AttachSimulationToDraftInput": {"type": "object", "additionalProperties": false, "required": ["simulation_id", "consent_reuse"], "properties": {"simulation_id": {"type": "string", "format": "uuid"}, "consent_reuse": {"type": "boolean", "const": true, "description": "Explicit consent is required; false is rejected."}}},
|
||||
"SimulationFormDraft": {"type": "object", "additionalProperties": false, "required": ["personal_snapshot", "economic_snapshot"], "properties": {"personal_snapshot": {"type": "object", "description": "Allowlisted personal fields, encrypted at rest; only owner/token can read."}, "economic_snapshot": {"type": "object", "required": ["purpose"], "description": "Fiscal rates are server-selected from approved effective versions; user-entered assumptions are confined to custom_planning.", "properties": {"fiscal_scenario_mode": {"type": "string", "enum": ["approved_parameters", "custom_planning", "no_calculation"]}, "business_plan_snapshot": {"type": "string", "maxLength": 60000, "description": "Versioned business financial plan JSON snapshot (v1-v16); monthly purchase, supplier installment payment, expense, payroll and per-product inventory schedules are optional."}, "financial_tools_snapshot": {"type": "string", "maxLength": 30000, "description": "Versioned financial calculator assumptions JSON snapshot."}}}}},
|
||||
"UpdateScenarioInput": {"type": "object", "additionalProperties": false, "required": ["label", "base", "rate", "reduction"], "properties": {"label": {"type": "string", "minLength": 1, "maxLength": 100}, "base": {"allOf": [{"$ref": "#/components/schemas/DecimalInputString"}]}, "rate": {"allOf": [{"$ref": "#/components/schemas/PercentageInputString"}]}, "reduction": {"allOf": [{"$ref": "#/components/schemas/PercentageInputString"}], "description": "User supplied scenario reduction; no default is applied."}}},
|
||||
"SimulationExecutionV1": {"type": "object", "required": ["id", "status", "version_no", "result_snapshot"], "properties": {"id": {"type": "string", "format": "uuid"}, "status": {"type": "string", "enum": ["queued", "running", "completed", "failed", "cancelled"]}, "version_no": {"type": "integer", "minimum": 1}, "result_snapshot": {"type": ["object", "null"], "description": "Immutable calculation snapshot when available; null before completion."}}, "additionalProperties": true},
|
||||
"SimulationCreateResponseV1": {"type": "object", "required": ["data", "replayed"], "properties": {"data": {"$ref": "#/components/schemas/SimulationExecutionV1"}, "replayed": {"type": "boolean"}, "access_token": {"type": "string", "minLength": 32, "maxLength": 256, "description": "Returned only for an anonymous execution."}}, "additionalProperties": true},
|
||||
"SimulationReadResponseV1": {"type": "object", "required": ["data"], "properties": {"data": {"$ref": "#/components/schemas/SimulationExecutionV1"}}, "additionalProperties": true},
|
||||
"SimulationResult": {"type": "object", "required": ["status", "value", "unit", "explanation", "missing_inputs", "source_ids"], "properties": {"status": {"type": "string", "enum": ["calculated", "estimated", "indeterminate", "not_applicable"]}, "value": {"type": ["string", "null"], "pattern": "^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?$", "description": "Exact decimal string; null for indeterminate or not_applicable."}, "unit": {"type": ["string", "null"]}, "explanation": {"type": "string", "minLength": 1}, "missing_inputs": {"type": "array", "items": {"type": "string"}}, "source_ids": {"type": "array", "items": {"type": "string"}}}},
|
||||
"SimulationResultContext": {"type": "object", "required": ["reference_date", "currency", "currency_fraction_digits", "scenario_id", "scenario_version", "engine_version", "ruleset_version"], "properties": {"reference_date": {"type": "string", "format": "date"}, "currency": {"type": ["string", "null"]}, "currency_fraction_digits": {"type": ["integer", "null"], "minimum": 0}, "scenario_id": {"type": "string", "format": "uuid"}, "scenario_version": {"type": "integer", "minimum": 1}, "engine_version": {"type": "string"}, "ruleset_version": {"type": ["string", "null"]}}},
|
||||
"SimulationResultSnapshotV1": {"type": "object", "required": ["contract_version", "context", "result", "indicative_total", "legal_interpretation", "formula_version"], "properties": {"contract_version": {"type": "integer", "const": 1}, "context": {"$ref": "#/components/schemas/SimulationResultContext"}, "result": {"$ref": "#/components/schemas/SimulationResult"}, "indicative_total": {"type": ["string", "null"], "pattern": "^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?$", "description": "Legacy decimal when the result has a value; null for indeterminate or not-applicable states."}, "legal_interpretation": {"type": "boolean", "const": false}, "formula_version": {"type": "string"}}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
# Revisão do texto primário — reformas fiscais de 2026
|
||||
|
||||
**Data de verificação:** 2026-10-03
|
||||
**Estado:** leitura documental do BR 248 concluída; revisão jurídica consolidada e aprovação do Fiscalista pendentes. Nenhuma regra fiscal foi activada.
|
||||
|
||||
## Aquisição e integridade da fonte
|
||||
|
||||
- Catálogo oficial AT: https://www.at.gov.mz/legislacao/fiscal (SPA; lista BR_248_I_SERIE_SUPLEMENTO_2025, 430 KB).
|
||||
- API pública do catálogo: https://www.at.gov.mz/api/documents?root=LEGISLACAO.
|
||||
- Download indicado pelo catálogo: https://www.at.gov.mz/api/webdav?path=%2FLEGISLA%C3%87%C3%83O%2FLEGISLA%C3%87%C3%83O%20FISCAL%2FLEI%2FBR_248_I_SERIE_SUPLEMENTO_2025.pdf.
|
||||
- Cópia arquivada: [source-archive/BR-248-I-Suplemento-1-2025.pdf](source-archive/BR-248-I-Suplemento-1-2025.pdf), 440,018 bytes; SHA-256 `CCF2A8DEECA820F2DD076B4B2141B1EFE3F6A806568C3A587CA59A8E92F4C251`.
|
||||
- Em 2026-10-03, a resposta foi HTTP 200, application/pdf. São 21 páginas. Texto extraído localmente com pdfjs-dist 4.10.38, instalado apenas em %TEMP%, sem dependência no repositório. O hash identifica os bytes arquivados, não constitui assinatura digital nem validação forense da cadeia de publicação.
|
||||
- A INM confirma edição e sumário: https://inm.gov.mz/pt-br/content/sum%C3%A1rio-suplemento-n%C2%BA-1-de-291225-pag-2180-1-20-br-n%C2%BA-248-boletim-da-rep%C3%BAblica-i-s%C3%A9rie-p%C3%A1g-1.
|
||||
|
||||
O URL tentado anteriormente em /index.php/por/content/download/93497/... devolvia o shell HTML de 495 bytes. Era um caminho incorrecto, não prova de que o PDF fosse inacessível. Esta adenda substitui essa conclusão operacional.
|
||||
|
||||
## Matriz do texto legal lido
|
||||
|
||||
| Imposto/tema | Diploma e artigos no BR 248 | Alteração legível no texto primário | Vigência escrita | Componente e testes necessários | Estado |
|
||||
|---|---|---|---|---|---|
|
||||
| ICE | Lei 7/2025, arts. 1–5 e tabela | Prorroga a tabela de taxas da Lei 19/2022 para 2027; altera artigos e códigos da tabela. Regulamentação pelo Conselho de Ministros prevista em 90 dias. | 01-01-2026 | Produto/código, unidade, taxa específica/ad valorem, isenção e fronteiras temporais. | Texto disponível; tabela integral, regulamentação consolidada e aprovação pendentes. |
|
||||
| Aduaneiro | Lei 8/2025, arts. 1–4 e anexo | Altera franquia de viajantes (art. 21), mercadorias que podem beneficiar de redução/isenção (art. 22), calendário ZCLCA (art. 27) e códigos pautais; instruções complementares previstas em 60 dias. | 01-01-2026 | Código obrigatório, origem/preferência, calendário, unidade, base, notas e antes/depois. | Texto disponível; instruções e pauta aplicável por código não reconciliadas/aprovadas. |
|
||||
| ISPC: elegibilidade | Lei 9/2025, arts. 2–6 e republicação da Lei 5/2009 | Actividades enumeradas incluem silvícola, pesqueira, pecuária, agrícola/avícola/apícola, industrial, comercial, artesanato e serviços; volume anual até MZN 4.000.000; regime optativo. Exclusões incluem participações especificadas, outras actividades, actividade distribuída por vários estabelecimentos, certos serviços à mesma entidade por mais de 183 dias e serviços fora da lista. | Aplicável a rendimentos de 2026; regulamento previsto em 180 dias. | Actividade, categoria, volume/período, estabelecimentos, participação, cliente/duração, opção e transição. | A distinção ISPC vs regimes simplificados de IVA/IRPS está confirmada. Interpretação, regulamento e aprovação pendentes. |
|
||||
| ISPC: taxas/obrigações | Lei 9/2025, arts. 8–12, 9-A e 10-A | 3/4/5% por escalões de volume para actividades enumeradas; 12% para serviços exemplificados; 15% para profissões liberais; 20% sobre parte acima do limite. Cúmulo usa a taxa mais alta. Base trimestral; declaração trimestral; pagamento inferior a MZN 500 pode não ser devido, sem dispensar declaração. Retenção de 5% em certas aquisições dentro do limite global indicado. Permanência liberal até cinco anos. | 01-01-2026; transição/regulamento por analisar. | Fronteiras, actividades combinadas, excedente, trimestre, mínimo, retenção/limite e histórico de cinco anos. | Não implementar fórmula antes da aprovação da interpretação, classificação e regulamento. |
|
||||
| IVA: digital/não residente | Lei 10/2025, arts. 3, 6, 23, 26, 32–33 | Inclui bens digitais e define serviços digitais; prevê operações digitais transfronteiriças e obrigações do adquirente em certos casos de não residente. | 01-01-2026; regulamento previsto em 180 dias. | Tipo/local da operação, residência/estabelecimento, adquirente e declaração. | Texto disponível; fluxo aguarda regulamentos e consolidação. |
|
||||
| IVA: taxa geral | Lei 22/2022, republicada no 2.º Suplemento do BR 250, art. 17; Lei 10/2025, arts. 1 e 34 | O art. 17 da republicação fixa 16%. A Lei 10/2025 não altera o art. 17; o divisor 116 do art. 34 é coerente com 16% incluído no preço. A primeira publicação foi declarada sem efeito pela INM e a lei republicada no 2.º suplemento. | Lei 22/2022 em vigor desde 01-01-2023; art. 17 não alterado pela Lei 10/2025, efectiva em 01-01-2026. | Taxa geral, inclusão no preço, arredondamento para unidade no art. 34 e transição imediatamente antes/depois de cada alteração. | Divergência legal resolvida em favor do texto republicado; indicação de 17% nas páginas/formulário AT é desactualizada. Activação ainda requer validação e aprovação formal do Fiscalista. |
|
||||
| IVA: dedução/crédito/reembolso | Lei 10/2025, arts. 18, 19, 21, 23, 25-A, 27, 32–33 | Dedução depende de factura/documento de sujeito registado ou documento legal de importação; prevê proporcionalidade e exclusões. Crédito mensal acima de MZN 500.000 pode fundamentar pedido; considera créditos antigos. Reembolso, quando devido, em 150 dias; suspensão de crédito por 60 dias nas condições descritas; pedido prescreve em dez anos. Obrigações por estabelecimento/facturas dependem de regulamentação. | 01-01-2026; processo regulamentar por confirmar. | Distinguir imposto apurado, crédito estimado, pedido, reconhecido e recebido; testar documentos, rateio, prazo, suspensão e estabelecimentos. | Crédito não equivale a dinheiro nem a reembolso aprovado. Sem previsão de caixa automática. |
|
||||
| IRPS: residência/rendimentos | Lei 11/2025, arts. 21, 22, 48, 50 e correlatos | Factores de residência não se reduzem a nacionalidade ou dias; texto inclui residência principal, actividade profissional, centro de interesses e situações familiares/especiais. Inclui rendimentos digitais e despesas prediais documentadas com limite indicado. | 01-01-2026; regulamento previsto em 180 dias. | Factores autodeclarados, categoria, documentação, rendimentos digitais e cenário indeterminado. | Não inferir residência por nacionalidade/dias. Regulamentos, tratados e aplicação factual pendentes. |
|
||||
| IRPS: trabalho/mais-valias | Lei 11/2025, arts. 54-A, 57, 65, 65-A | Retenção laboral mensal depende de salário bruto e dependentes; tabela autónoma de mais-valias usa escalões de 10%, 15%, 20%, 25%, 32%, não uma taxa plana. | 01-01-2026; retenção carece de regulamentação. | Limites, parcela marginal, dependentes, remuneração variável e retenção mensal vs apuramento anual. | Distinção confirmada; cálculo depende de regra consolidada e aprovação. |
|
||||
| IRPC: estabelecimento/digital | Lei 12/2025, arts. 3 e 5 | Estaleiro/construção/instalação/montagem acima de 90 dias; serviços, incluindo consultoria, agregados acima de 90 dias em qualquer período de 12 meses, com exclusão expressa de serviços digitais; prevê rendimentos digitais e ganhos em transmissão directa/indirecta de participações com activos locais. | 01-01-2026; regulamento previsto em 180 dias. | Tipo, período móvel, localização, digital vs serviço, activos/participação e tratados. | Texto identificado; aplicação e interacção com tratados/regulamentos pendentes. |
|
||||
| IRPC: retenção/mais-valias/contabilidade | Lei 12/2025, arts. 20, 61-A, 62, 67, 75 e transitório | Taxa autónoma de 32% para mais-valias; 10% para comissões de agentes de moeda electrónica e rendimentos digitais indicados; retenção no evento legal aplicável; transição para contabilidade organizada e informatizada nos termos regulamentares. | 01-01-2026; procedimentos pendentes. | Natureza/residência, evento de custo/pagamento/vencimento, ganho, transição e entidade. | Não transformar percentagens em aconselhamento nem aplicar sem alcance e regulamentos aprovados. |
|
||||
|
||||
## Base integral e sequência de alterações do CIVA
|
||||
|
||||
A Lei n.º 3/2012 alterou artigos do CIVA original aprovado pela Lei n.º 32/2007. A republicação pela Lei n.º 13/2016, de 30 de Dezembro, passa a ser a base integral de consolidação para os períodos desde a respectiva vigência; não se deve voltar a somar sobre ela a redacção da Lei 3/2012 como se fosse uma alteração posterior. O exemplar local do BR n.º 89, de 08-06-2017, confirma no aviso a alteração das alíneas c) e d) do artigo 6(5), a eliminação do artigo 14(2)(c) e a rectificação dos anexos I–III ligados ao artigo 9. Os anexos substitutivos não estão reproduzidos no texto do aviso e ainda não foram cotejados com exemplar autêntico legível. Depois da base corrigida, aplicar artigo por artigo, período e transição: Lei n.º 5/2020 (alteração temporária indicada para art. 9(13), texto oficial/vigência ainda por verificar), Lei n.º 16/2020 (art. 9(13)), Lei n.º 22/2022 (artigos expressos), Lei n.º 3/2025 (art. 9(13)) e Lei n.º 10/2025 (artigos expressos). A Lei 22/2022 foi republicada como diploma alterador no 2.º Suplemento do BR n.º 250; isso não é nova republicação integral do Código.
|
||||
|
||||
Assim, a análise da taxa geral de 16% abaixo usa a redacção do artigo 17 dada pela Lei 22/2022 no seu período de vigência. Essa conclusão pontual não substitui a consolidação de todos os artigos do CIVA, nem autoriza aplicar a mesma regra a períodos anteriores ou posteriores sem verificar alterações e disposições transitórias.
|
||||
|
||||
Fontes da cadeia: [INM — Lei 3/2012](https://inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-1-de-230112-pag-34-1-6-br-n%C2%BA-3-boletim-da-rep%C3%BAblica-i); [INM — Lei 13/2016, republicação do CIVA](https://www.inm.gov.mz/pt-br/content/suplemento-n%C2%BA-10-de-301216-pag-1426-259-290-br-n%C2%BA-156-boletim-da-rep%C3%BAblica-i-serie); [INM — rectificação da Lei 13/2016](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-br-n%C2%BA-89-de-080617-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-569); [MEF — apresentação oficial da proposta Lei 16/2020, que identifica alteração intermédia Lei 5/2020](https://mef.gov.mz/index.php/imprensa/discursos/1176-apresentacao-da-proposta-de-lei-que-altera-o-n-13-do-artigo-9-do-codigo-do-imposto-sobre-valor-acrescentado-iva/file); [INM — Lei 16/2020](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-1-de-231220-pag-2414-1-20-br-n%C2%BA-246-boletim-da); [INM — republicação da Lei 22/2022 e nota sobre publicação inicial sem efeito](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-2-de-281222-pag-2252-25-42-br-n%C2%BA-250-boletim-da); [INM — Lei 3/2025](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-1-de-290525-pag-478-1-2-br-n%C2%BA-95-boletim-da-rep%C3%BAblica); [Parlamento — Lei 10/2025](https://www.parlamento.mz/wp-content/uploads/2025/05/iva.pdf).
|
||||
|
||||
## Divergência IVA reconciliada: taxa legal de 16%, página administrativa AT desactualizada
|
||||
|
||||
A Lei 22/2022 consta no 2.º Suplemento do BR 250. A própria INM esclarece que a publicação inicial no BR 250 fica sem efeito e que a Lei foi republicada no 2.º Suplemento. O PDF oficial republicado (18 páginas) foi obtido pelo catálogo AT e arquivado em [source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf](source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf), 1.834.284 bytes, SHA-256 `EA1B0DC6F5CF6E595F6D9A19E7042F398999E0087CAEF1785F6E8FAC571B5F53`. O texto extraído da página 27 do BR (página 3 do PDF) diz no artigo 17(1): “A taxa do imposto é de 16%.”
|
||||
|
||||
A Lei 3/2025, conforme sumário oficial INM, altera o artigo 9(13), não o artigo 17. A Lei 10/2025 lista as alterações aos artigos 3, 6, 12, 18, 19, 21, 23, 25, 26, 27, 31, 32, 33 e 34; não altera o artigo 17. O novo divisor 116 do artigo 34 é consistente com a taxa de 16%. Assim, a referência de 17% na informação geral e no formulário electrónico da AT é evidência administrativa obsoleta, superada pelo texto legal publicado e pela republicação oficial.
|
||||
|
||||
**Decisão documental:** taxa geral de 16% confirmada pela cadeia legal primária para o período posterior a 01-01-2023, sem alteração do artigo 17 pela Lei 10/2025. Isto resolve a divergência 16/17 ao nível da leitura dos diplomas; não substitui revisão profissional sobre incidência, regimes especiais, isenções, arredondamentos ou regulamentação, nem constitui aprovação dos parâmetros/casos dourados para produção. Manter o motor fiscal bloqueado até validação e aprovação formal do Fiscalista e revisão dos regulamentos 2026.
|
||||
|
||||
Fontes oficiais: [INM — Lei 22/2022 republicada no 2.º Suplemento e nota de ineficácia da publicação inicial](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-2-de-281222-pag-2252-25-42-br-n%C2%BA-250-boletim-da); [BR 248 / Lei 10/2025 arquivada](source-archive/BR-248-I-Suplemento-1-2025.pdf); [Lei 22/2022 republicada arquivada](source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf); [sumário INM Lei 3/2025](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-suplemento-n%C2%BA-1-de-290525-pag-478-1-2-br-n%C2%BA-95-boletim-da-rep%C3%BAblica); [AT — página/formulário que ainda indicam 17%](https://edeclaracao.at.gov.mz/formularios/iva/view/formulario_iva_ma.aspx).
|
||||
|
||||
## Decisões seguras e pendências
|
||||
|
||||
- Confirmado: ISPC não foi eliminado por revogações no IVA; cada regime/opção precisa de análise própria.
|
||||
- Confirmado: retenção mensal IRPS não prova liquidação anual; mais-valias IRPS têm escalões no texto aditado; IRPC tem regra autónoma distinta.
|
||||
- Confirmado: crédito, pedido de reembolso, crédito reconhecido e recebimento são estados separados.
|
||||
- Confirmada no texto primário: taxa geral IVA 16% após republicação da Lei 22/2022; a página/formulário AT com 17% está desactualizada. Pendente: conteúdo operativo dos regulamentos de 2026, transições, pauta integral por código, tratados fiscais e aprovação dos casos dourados.
|
||||
- O comunicado governamental de 30-09-2026 é anúncio, não substitui decreto publicado. Os BR 186/187 precisam de leitura integral para identificar os actos, artigos e vigência.
|
||||
- Microfinanças permanecem separadas: a calculadora educativa de empréstimos pode avançar; não reutilizar requisitos antigos de capital, membros, forma jurídica ou prazos no registo de operadores. Conferir Lei 20/2020, Decreto 50/2024 e avisos/procedimentos BM vigentes.
|
||||
|
||||
## Rectificação CIVA de 2017 — conteúdo do aviso consultado; anexos ainda pendentes
|
||||
|
||||
A ficha oficial INM confirma que o BR n.º 89, de 08-06-2017, página 569, publicou aviso de rectificação da Lei n.º 13/2016. A ficha oficial acessível contém só o sumário. Uma reprodução integral do BR num domínio de terceiro permite identificar, como **pista ainda não autenticada**, que o aviso trata das alíneas c) e d) do n.º 5 do artigo 6, elimina a alínea c) do n.º 2 do artigo 14 e rectifica os anexos I, II e III referidos no artigo 9, sobre listas de bens isentos.
|
||||
|
||||
Foi localizado no acervo documental local um PDF do BR n.º 89, cujo título interno é `BR_89_I_SÉRIE_2017.indd`, edição de 08-06-2017, 16 páginas, 9.456.358 bytes, SHA-256 `11F0CAB15EB6E51010952203FFA24FDC533A24FD642E19525FE4F46B17A1F5E5`. O exemplar foi copiado sem alteração para `source-archive/BR-89-I-Serie-2017-06-08.pdf`; o hash da cópia coincide com o original local. A ficha da INM confirma o mesmo número/data e o aviso que rectifica a Lei 13/2016. Não foi possível descarregar a ficha directamente da INM nesta sessão, e o PDF local não contém assinatura verificável; a identidade documental é consistente, mas a autenticidade forense/cadeia de custódia não está comprovada.
|
||||
|
||||
A extracção de texto da página 569 do BR confirma a nova redacção do art. 6(5)(c) e (d), elimina o art. 14(2)(c) e ordena rectificar os anexos I, II e III referidos no art. 9 (listas de bens isentos). A página do aviso não inclui o conteúdo substitutivo dos anexos. Uma cópia local separada, identificada pelo nome como código republicado/rectificado, tem 15 páginas digitalizadas sem camada de texto; não foi tratada como fonte oficial nem usada para reconstruir os anexos. Portanto, já é possível registar o conteúdo textual do aviso e os dispositivos afectados, mas não fechar a consolidação das listas de isenção.
|
||||
|
||||
Aplicar as alterações textuais confirmadas do aviso à linha temporal do CIVA, sem reaplicar a Lei 3/2012 sobre a republicação de 2016. Manter pendente a versão consolidada dos anexos e o cotejo visual/autêntico dos documentos. A taxa geral de 16% do art. 17 não é afectada por este aviso; as categorias de isenção e as regras de localização do art. 6 dependem da consolidação adequada.
|
||||
|
||||
Fonte de metadados: [ficha INM — aviso no BR 89/2017](https://www.inm.gov.mz/pt-br/content/assembleia-da-rep%C3%BAblica-br-n%C2%BA-89-de-080617-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-569). Fac-símile do boletim e integridade: [PDF arquivado localmente](source-archive/BR-89-I-Serie-2017-06-08.pdf), hash registado acima; requer confirmação de proveniência por responsável documental. A reprodução de terceiro permanece apenas como pista comparativa: https://www.lexlink.eu/FileGet.aspx?FileId=2999523.
|
||||
|
||||
## Gate
|
||||
|
||||
**Proposto para revisão humana:** BR 248 e republicação da Lei 22/2022 arquivados e lidos; matriz documental actualizada; taxa geral IVA de 16% confirmada textualmente, com 17% em páginas AT identificadas como informação obsoleta. Gate de parametrização/activação **PENDENTE/BLOQUEADO** até análise dos regulamentos publicados em 2026, validação especializada e aprovação formal dos casos de referência. Regras não aprovadas, vencidas ou com vigência incerta não podem ser usadas em produção.
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"browser": "Chromium headless via Playwright (temporary QA tools)",
|
||||
"route": "Generated print HTML in memory; no portal API or database calls",
|
||||
"fixture": {
|
||||
"project_title": "Relatório de teste — acção e localização",
|
||||
"finance_rows": 90,
|
||||
"data": "Synthetic; no personal or real project data"
|
||||
},
|
||||
"print": {
|
||||
"format": "A4",
|
||||
"pages": 8,
|
||||
"pdf_bytes": 70459,
|
||||
"html_declares_a4": true,
|
||||
"horizontal_overflow": false,
|
||||
"title": "Relatório — Relatório de teste — acção e localização",
|
||||
"pdf_persisted": false
|
||||
},
|
||||
"limits": [
|
||||
"This checks Chromium print pagination for the generated HTML only.",
|
||||
"It does not render the DOCX in Microsoft Word or LibreOffice.",
|
||||
"Page count can vary with browser fonts and print settings."
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
# Relatório consolidado do projecto — implementação
|
||||
|
||||
Data: 04/10/2026
|
||||
Estado: implementação local concluída; paginação final em Microsoft Word/PDF aguarda verificação visual numa aplicação Office.
|
||||
|
||||
## Entrega
|
||||
|
||||
- O percurso de revisão do simulador oferece relatório Word `.docx`, preparação para PDF pelo diálogo de impressão do browser e CSV complementar. O relatório é gerado no dispositivo; não publica nem envia conteúdo.
|
||||
- O utilizador escolhe as secções e os anexos. A interface assinala que cada secção e anexo pode conter informação privada e permite excluir ficheiros individualmente.
|
||||
- O documento combina campos do dossier, snapshots financeiros e resultados do simulador já existentes. Identifica revisão, data e, quando presente, versão, referência, fórmula, explicação e hash do cálculo guardado. Não volta a calcular o snapshot fiscal.
|
||||
- Valores desconhecidos ficam como “Não informado” ou “Indeterminado”. Informação de mercado declarada, estimativas matemáticas e referências/catálogos são identificados separadamente. Financiamento sem catálogo e critérios documentados permanece indeterminado.
|
||||
- PNG/JPEG são incorporados com legenda; dimensões inválidas ou acima de 40 megapixels/12.000 px por lado são rejeitadas antes da incorporação. CSV/TSV e TXT são incorporados com limites de tamanho; PDF, DOCX, XLSX, ODT e restantes formatos permanecem originais no ZIP, com índice que informa explicitamente que não foram incorporados.
|
||||
- O pacote ZIP inclui o Word, anexos seleccionados e índice. Limites: 10 ficheiros, 15 MB por ficheiro e 50 MB no total. Texto incorporado limita-se a 2 MiB; tabelas no Word limitam-se a 250 linhas e 16 colunas, preservando o original integral no ZIP.
|
||||
|
||||
## Ficheiros alterados/criados nesta funcionalidade
|
||||
|
||||
- `resources/js/lib/project-dossier.ts`: partilha a construção das linhas entre relatório e CSV e expõe pressupostos/resultados financeiros existentes.
|
||||
- `resources/js/lib/project-dossier-report.ts`: modelo, classificação de proveniência, geração DOCX, HTML para impressão/PDF, incorporação de anexos e ZIP indexado.
|
||||
- `resources/js/components/project-dossier-export.tsx`: selecção de secções/anexos, sinalização de privacidade e acções de exportação.
|
||||
- `resources/js/components/simulation-form.tsx`: integração na revisão do dossier com a versão actual e os snapshots existentes.
|
||||
- `tests/frontend/project-dossier-report.test.mjs`: testes de relatório incompleto, reconciliação financeira, versão/hash, OpenXML, acentos, tabelas, imagem e legenda, ZIP, escape HTML e limites.
|
||||
- `package.json`, `package-lock.json`: dependências `docx` e `jszip`.
|
||||
|
||||
## Validação executada
|
||||
|
||||
- `npm.cmd run types:check` — passou.
|
||||
- `node --test tests/frontend/*.test.mjs` — 138/138 passaram.
|
||||
- `npm.cmd run build` — passou; compilou 2.403 módulos. O build assinala dependência opcional `fontaine` ausente e chunks grandes superiores a 500 kB.
|
||||
- O teste abriu o `.docx` como ZIP OpenXML, confirmou texto português acentuado, tabelas e campo de página. Um PNG de teste foi encontrado em `word/media`, referenciado em `document.xml.rels`, e a legenda apareceu no XML do documento.
|
||||
- Chromium headless gerou uma pré-visualização A4 de 8 páginas com 90 linhas financeiras sintéticas; título e acentos estavam presentes, sem overflow horizontal. O PDF foi mantido em memória e descartado. Evidência: `docs/investmoz/simulations/project-dossier-print-qa-2026-10-04.json`.
|
||||
- `winword`, `soffice` e `libreoffice` não estão instalados/disponíveis neste Windows. A paginação do HTML de impressão foi ensaiada em Chromium, mas não se declara abertura/renderização final do DOCX em Microsoft Word/LibreOffice, impressão física ou abertura do CSV numa folha de cálculo nesta entrega.
|
||||
|
||||
## Limitações e revisão pendente
|
||||
|
||||
- PDF usa a janela de impressão do browser; o utilizador escolhe “Guardar como PDF”. Não é criado automaticamente um ficheiro PDF a partir do Word.
|
||||
- Fotografias e tabelas compatíveis ficam dentro do DOCX. Para formatos não incorporáveis, é necessário transferir o pacote ZIP para obter o original e o índice; a ligação nominal no relatório não é apresentada como anexo incorporado.
|
||||
- A paginação pode variar entre versões de Word e browsers. Rever o ficheiro DOCX em Microsoft Word ou LibreOffice, especialmente relatórios longos, tabelas largas e imagens antes de considerar a apresentação tipográfica aprovada.
|
||||
- A lista de anexos fornecida é local à sessão do formulário; só é incluída se o utilizador a seleccionar no momento da exportação. O CSV continua disponível separadamente e não inclui automaticamente imagens/anexos.
|
||||
|
||||
## Rollback
|
||||
|
||||
Reverter apenas os ficheiros desta funcionalidade e as dependências `docx`/`jszip` dos manifestos. Não há migration, escrita de dados, alteração de configuração de infraestrutura ou upload de ficheiros associado a esta entrega.
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"openapi": "3.1.0",
|
||||
"info": {
|
||||
"title": "InvestMoz Tax Rule Governance API",
|
||||
"version": "0.1.0",
|
||||
"description": "Management-only rule version workflow. Records are not read by the simulation engine; no fiscal parameters are activated by this API."
|
||||
},
|
||||
"servers": [{"url": "/api/v2/investment/admin"}],
|
||||
"security": [{"webSession": []}],
|
||||
"paths": {
|
||||
"/tax-rules": {
|
||||
"get": {
|
||||
"summary": "List rule versions for designated governance users",
|
||||
"parameters": [
|
||||
{"name": "rule_code", "in": "query", "schema": {"type": "string", "maxLength": 64}},
|
||||
{"name": "component", "in": "query", "schema": {"$ref": "#/components/schemas/Component"}},
|
||||
{"name": "scope_key", "in": "query", "schema": {"type": "string", "maxLength": 160}},
|
||||
{"name": "status", "in": "query", "schema": {"$ref": "#/components/schemas/Status"}},
|
||||
{"name": "per_page", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 100}}
|
||||
],
|
||||
"responses": {"200": {"description": "Paginated rule versions"}, "403": {"description": "Role or MFA required"}}
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create a draft version (editor role)",
|
||||
"requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RuleVersionInput"}}}},
|
||||
"responses": {"201": {"description": "Draft saved with version_no 1"}, "403": {"description": "Editor role and MFA required"}, "422": {"description": "Invalid source, fields, or scope"}}
|
||||
}
|
||||
},
|
||||
"/tax-rules/{id}": {
|
||||
"get": {"summary": "Read a rule version and its governance state", "parameters": [{"$ref": "#/components/parameters/Id"}], "responses": {"200": {"description": "Private governance record"}, "404": {"description": "Not found"}}},
|
||||
"put": {"summary": "Edit the author's draft with optimistic locking", "parameters": [{"$ref": "#/components/parameters/Id"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"allOf": [{"$ref": "#/components/schemas/RuleVersionInput"}, {"type": "object", "required": ["version_no"], "properties": {"version_no": {"type": "integer", "minimum": 1}}}]}}}}, "responses": {"200": {"description": "Updated draft"}, "403": {"description": "Only author/editor may change own draft"}, "409": {"description": "Stale version"}}}
|
||||
},
|
||||
"/tax-rules/{id}/{action}": {
|
||||
"post": {
|
||||
"summary": "Advance a rule through submit, review, reject, approve, publish, suspend, or archive",
|
||||
"parameters": [{"$ref": "#/components/parameters/Id"}, {"name": "action", "in": "path", "required": true, "schema": {"type": "string", "enum": ["submit", "review", "reject", "approve", "publish", "suspend", "archive"]}}],
|
||||
"requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Transition"}}}},
|
||||
"responses": {"200": {"description": "Transition recorded with append-only snapshot"}, "403": {"description": "Role segregation denied transition"}, "409": {"description": "Stale version or published period overlap"}, "422": {"description": "Invalid state or unavailable legal source"}}
|
||||
}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"securitySchemes": {"webSession": {"type": "apiKey", "in": "cookie", "name": "investmoz_session", "description": "Verified portal manager, confirmed MFA, and explicit role allowlist are all required."}},
|
||||
"parameters": {"Id": {"name": "id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}}},
|
||||
"schemas": {
|
||||
"Component": {"type": "string", "enum": ["IRPC", "IVA", "ISPC", "IRPS", "INSS", "RETENCOES", "DIREITOS_ADUANEIROS", "ICE"]},
|
||||
"Status": {"type": "string", "enum": ["draft", "submitted", "reviewed", "rejected", "approved", "published", "suspended", "archived"]},
|
||||
"RuleVersionInput": {"type": "object", "additionalProperties": false, "required": ["rule_code", "rule_version", "component", "scope_key", "valid_from", "legal_source_id", "source_sha256", "rule_definition", "parameters", "rounding_policy"], "properties": {"rule_code": {"type": "string", "pattern": "^[A-Z0-9][A-Z0-9._-]{2,63}$"}, "rule_version": {"type": "integer", "minimum": 1}, "component": {"$ref": "#/components/schemas/Component"}, "scope_key": {"type": "string", "minLength": 2, "maxLength": 160}, "valid_from": {"type": "string", "format": "date"}, "valid_until": {"type": ["string", "null"], "format": "date"}, "legal_source_id": {"type": "string", "format": "uuid"}, "source_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$", "description": "Hash declared by the editor; official exemplar verification remains an approval task."}, "rule_definition": {"type": "object", "description": "Versioned declarative AST; a parameter update may preserve the same AST."}, "parameters": {"type": "object", "description": "Versioned values approved with the rule version; each DSL parameter has value, unit and conditions. No values are seeded.", "additionalProperties": {"type": "object", "required": ["value", "unit", "conditions"], "properties": {"value": {"oneOf": [{"type": "string"}, {"type": "integer"}]}, "unit": {"type": "string"}, "conditions": {"type": "object"}}}}, "rounding_policy": {"type": "object", "description": "Versioned with the rule and must be approved."}}},
|
||||
"Transition": {"type": "object", "additionalProperties": false, "required": ["version_no", "evidence"], "properties": {"version_no": {"type": "integer", "minimum": 1}, "evidence": {"type": "string", "minLength": 20, "maxLength": 2000}}}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
# Governação de versões de regras fiscais
|
||||
|
||||
## Âmbito deste incremento
|
||||
|
||||
Foi criado um fluxo administrativo para registar uma versão declarativa de regra e a sua referência jurídica. O fluxo existe separado do motor de cálculo. Nenhum endpoint de simulação consulta `simulation_tax_rule_versions`; `published` significa apenas publicada no registo interno de governação, não activa no produto nem aprovada para aconselhamento fiscal.
|
||||
|
||||
O registo guarda componente, `scope_key`, vigência, definição JSON, parâmetros JSON, política de arredondamento, fonte, versão da fonte, SHA-256 declarado pelo editor e autor/revisor/aprovador/publicador. Existe um avaliador interno para a DSL `investmoz.tax.v1`, com whitelist, validação de DAG sem ciclos, aritmética exacta e arredondamento explícito. O avaliador ainda não está ligado ao fluxo de cálculo fiscal `RunSimulation`; por isso, a presença de uma expressão ou a publicação administrativa de uma regra não activa um cálculo fiscal no produto.
|
||||
|
||||
## Fluxo
|
||||
|
||||
`draft → submitted → reviewed → approved → published → suspended/archived`
|
||||
|
||||
- Rejeição ocorre a partir de `submitted`; a regra rejeitada não pode ser editada. Uma correcção requer nova versão.
|
||||
- O autor não pode rever, aprovar ou publicar a própria versão. Revisor, aprovador e publicador têm identidades distintas.
|
||||
- Cada transição exige evidência textual, incrementa `version_no` com controlo optimista e grava snapshot/hash append-only.
|
||||
- A fonte tem de estar validada, cobrir a vigência completa e conservar a mesma versão na submissão, revisão, aprovação e publicação. A revogação ou alteração da fonte bloqueia transições subsequentes.
|
||||
- O mesmo código/componente/`scope_key` não pode ter duas versões publicadas com vigência sobreposta. Há lock transaccional e trigger PostgreSQL para preservar esta regra sob concorrência.
|
||||
- Respostas administrativas são privadas, `no-store`, exigem gestor verificado, MFA confirmado e allowlist por papel. Os quatro grupos de emails ficam vazios por defeito: `INVESTMOZ_TAX_RULE_EDITORS`, `INVESTMOZ_TAX_RULE_REVIEWERS`, `INVESTMOZ_TAX_RULE_APPROVERS`, `INVESTMOZ_TAX_RULE_PUBLISHERS`.
|
||||
- RLS `FORCE` cobre versões e eventos. O serviço só define o contexto transaccional após autenticação e autorização. Eventos têm trigger que recusa UPDATE/DELETE.
|
||||
|
||||
## Limites e gates
|
||||
|
||||
O campo `source_sha256` é evidência declarada e revista por pessoa competente; este incremento não descarrega, arquiva nem compara automaticamente o ficheiro legal. O esquema actual de `investment_legal_sources` não prova a integridade de um exemplar armazenado. A URL, o artigo e o hash têm de ser conferidos externamente, e o pacote oficial deve ser arquivado antes de aprovar regras reais.
|
||||
|
||||
Continuam pendentes para cada cálculo fiscal executável: consolidação legível/autenticada dos artigos e anexos aplicáveis, ligação das regras ao fluxo de cálculo com explicabilidade e snapshot, definição aprovada dos casos de referência e validação do resultado esperado por cenário. A DSL, o avaliador DAG, a aritmética exacta e o resolvedor temporal existem e têm testes; isso não prova a semântica fiscal das fórmulas nem substitui os casos de referência. A execução integrada de RLS foi testada num papel PostgreSQL não privilegiado em QA descartável. Parâmetros ausentes continuam indeterminados e nenhuma taxa/regra está activada como cálculo fiscal de produção.
|
||||
|
||||
## Rollback
|
||||
|
||||
A migration `2026_10_03_170000_create_simulation_tax_rule_governance.php` é aditiva. `down()` recusa rollback se houver versões ou eventos; primeiro exportar e preservar o registo por procedimento aprovado. Nenhuma migration anterior, regra fiscal, snapshot de simulação ou resultado histórico foi alterado.
|
||||
|
||||
## Evidência técnica — governação fiscal (2026-10-03)
|
||||
|
||||
O registo versionado e o fluxo administrativo foram implementados em `simulation_tax_rule_versions` e `simulation_tax_rule_events`, com RLS FORCE, eventos append-only, controlo optimista, segregação editor/revisor/aprovador/publicador, validação de fonte e prevenção de vigências publicadas sobrepostas. Rotas administrativas exigem gestor verificado, MFA e allowlist por papel, vazia por defeito. A projecção pública de parâmetros lê apenas campos permitidos e filtra fonte, período, `scope_key` e contexto. O formulário usa essa projecção para mostrar estado, valor e fonte; `RunSimulation` ainda não executa as regras fiscais governadas.
|
||||
|
||||
PHP 8.5.11: teste dirigido `SimulationTaxRuleGovernanceTest` — 4/4, 52 asserções; com a regressão do rollback fundacional `InvestmentZoneTest::test_rollback_refuses_populated_foundation_and_empty_rollback_is_reversible` — conjunto 5/5, 56 asserções. Pint passou. Suite Laravel integral — 228/230; só falharam as duas falhas conhecidas de `EducationTest` (fixture sem `province_id`; expectativa Inertia incompatível). A integração decorreu em PostgreSQL 17/PostGIS descartável, papel `investmoz_test_runner` sem SUPERUSER; testes confirmaram que RLS oculta os registos sem contexto autorizado. Aviso anterior `use Throwable` em `bootstrap/app.php` permanece.
|
||||
|
||||
**Gate proposto: PARCIAL para infraestrutura; BLOQUEADO para cálculo fiscal integrado.** A DSL, DAG, precisão, arredondamento explícito, resolução temporal e projecção pública de parâmetros estão implementados e testados. A revisão profissional foi declarada pelo proprietário e a autorização/validação foi expressamente concedida pelo utilizador; esta declaração não substitui parecer ou certificado nominal arquivado. Ainda falta ligar regras fiscais com proveniência suficiente ao cálculo, e conferir os cenários de referência independentemente do próprio motor. A migration foi aplicada apenas em QA descartável nesta evidência; não há afirmação de aplicação local/operacional.
|
||||
|
||||
## Atualização — parâmetros e vigência (2026-10-03)
|
||||
|
||||
Uma nova versão de regra fiscal pode preservar a mesma AST e mudar somente `parameters`; esses valores são aprovados/publicados como parte da versão imutável com unidade, condições, `scope_key`, vigência, diploma/artigo/fonte e estado da fonte. O resolvedor `SimulationTaxParameterResolver` filtra versão publicada, fonte ainda validada na mesma versão, âmbito e data; ausência, condições não satisfeitas ou múltiplas correspondências são indeterminadas. Para parâmetros personalizados, o utilizador deve criar nova versão de regra, sem editar a versão histórica.
|
||||
|
||||
A UI distingue simulação fiscal com parâmetros aprovados, cenário personalizado de planeamento e sem cálculo. O primeiro não pede taxa manual; o segundo pede pressupostos apenas no painel específico e não bloqueia a navegação/rascunho incompleto. O endpoint genérico conserva resultados identificados como `custom_planning`.
|
||||
|
||||
**Nota histórica (2026-10-03, substituída pela implementação posterior):** nessa data, o resolvedor ainda não tinha acesso público. A implementação posterior acrescentou o endpoint de projecção pública mínima e a interface passou a consultar estado, valor e fonte dos parâmetros. A projecção não executa fórmula fiscal e não alimenta `RunSimulation`; portanto, continua correcto manter o cálculo fiscal indeterminado até existir integração e regra validada. Resultados/snapshots históricos não foram reescritos. Fonte declarada/hash, sem comparação de exemplar oficial, continua insuficiente para activar regra legal.
|
||||
|
||||
### Estado reconciliado — 2026-10-04
|
||||
|
||||
- Existe DSL `investmoz.tax.v1` com whitelist, DAG acíclico, aritmética `BigRational` e arredondamento explícito; existem testes unitários para precisão, arredondamento, referências desconhecidas, ciclos e entradas em falta.
|
||||
- Existe `SimulationTaxParameterResolver`, que resolve versões publicadas por período, `scope_key`, contexto e fonte validada, devolvendo indeterminação quando falta ou há ambiguidade.
|
||||
- `POST /api/v1/tax-parameters/resolve` expõe apenas uma projecção mínima; o formulário mostra parâmetros/fontes elegíveis. Esta API não devolve a DSL.
|
||||
- O serviço de execução de simulação ainda não invoca o avaliador para calcular IRPC, IVA, ISPC, IRPS, INSS, retenções, ICE ou direitos aduaneiros. A aritmética genérica personalizada permanece cenário de planeamento, não cálculo fiscal.
|
||||
- O utilizador declarou que contabilista/fiscalista reviu e validou o simulador e autorizou formalmente a matriz/regras; isto é registado como declaração e autorização do proprietário. O compromisso OCAM localizado refere-se somente ao Modelo 20 da empresa. Não há neste acervo parecer individualizado dos casos dourados do simulador.
|
||||
- **Estado:** infraestrutura fiscal parcial testada; activação de regras/cálculo continua pendente por componente até fontes e cenários serem conferidos e ligados ao motor. A falta de um parecer separado não impede continuar programação e testes neutros.
|
||||
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 145 KiB |
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"url": "http://127.0.0.1:8000/Simulador",
|
||||
"browser": "Microsoft Edge headless",
|
||||
"database": "investemoz (base activa do portal)",
|
||||
"initialPageStatus": 200,
|
||||
"createdStatus": 201,
|
||||
"draftId": "46f2d0b5-446a-4a3f-b3b6-726bbe9780bd",
|
||||
"cookieExpiryOnCreate": 1793717926.442219,
|
||||
"recoveredAfterBrowserRestart": true,
|
||||
"recoveredTitle": "Ensaio activo final",
|
||||
"automaticReadKeptCookieExpiry": true,
|
||||
"explicitContinueLaterStatus": 200,
|
||||
"explicitContinueLaterExpiry": "2026-11-03T14:58:57.000000Z",
|
||||
"cookieExpiryAfterContinueLater": 1793717937.747094,
|
||||
"cookieAndServerExpiryDifferenceSeconds": 0.747093915939331,
|
||||
"forgetButtonVisible": true,
|
||||
"forgetStatus": 204,
|
||||
"recoveryCookieAfterForgetPresent": false,
|
||||
"browserErrors": [],
|
||||
"activeDatabaseVerification": {
|
||||
"database": "investemoz",
|
||||
"preMigrationDraftCount": 14,
|
||||
"preMigrationAnonymousCount": 13,
|
||||
"preMigrationAccountOwnedCount": 1,
|
||||
"existingAnonymousDraftsPreserved": true,
|
||||
"activeAnonymousDraftsAfterChecks": 14,
|
||||
"activeAccountOwnedDraftsAfterChecks": 1,
|
||||
"syntheticBrowserDraftsSoftDeleted": 3,
|
||||
"unattributedDraftLeftUntouched": true
|
||||
},
|
||||
"screenshots": [
|
||||
"simulation-draft-continuity-active-before-forget-2026-10-04.png",
|
||||
"simulation-draft-continuity-active-after-forget-2026-10-04.png"
|
||||
],
|
||||
"allChecksPassed": true
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
# Correcção da continuidade dos rascunhos — 2026-10-04
|
||||
|
||||
## Causa confirmada
|
||||
|
||||
A aplicação e `SimulationFormDraft` já usavam `expires_at` em gravação, recuperação e expiração. A migration `2026_10_04_120000_add_simulation_draft_continuity` estava pendente na base activa `investemoz`; a tabela existente tinha 12 colunas e não tinha `expires_at` nem `claimed_token_hash`. A limpeza selectiva de rascunhos expirados era executada pelo código novo sobre esse esquema antigo, causando `SQLSTATE[42703]`. Não era necessário reconstruir a base.
|
||||
|
||||
## Dados antigos e prazo
|
||||
|
||||
Antes da migration havia 14 registos: 13 rascunhos anónimos activos e um associado a conta. Não existe `last_activity_at` nem evento de actividade com semântica fiável. O antigo `GET /simulation-drafts/current` alterava `expires_at` e, por consequência, `updated_at`; por isso, não se pode interpretar o `updated_at` histórico como actividade humana.
|
||||
|
||||
A migration pendente atribui aos rascunhos anónimos sem prazo `GREATEST(created_at + 30 dias, instante da transição + 30 dias)`. Esta é a regra de transição segura: preserva todos os rascunhos e garante-lhes pelo menos 30 dias desde a correcção. Os 13 registos existentes receberam prazo futuro, com menor data observada em 2026-11-03 14:49:50 UTC. O dossier de conta mantém `expires_at = NULL`.
|
||||
|
||||
Depois da transição, `updated_at` reflecte escritas explícitas; visitas e leituras não alteram prazo nem actividade. Renovam o prazo anónimo por 30 dias: criar o rascunho, gravar conteúdo, anexar uma simulação e usar “Guardar e continuar mais tarde” (endpoint `touch`, com `If-Match`). Recuperar, abrir, navegar ou fazer polling não renova. O cookie HttpOnly, SameSite=Lax e limitado a `/api/v1` só é emitido inicialmente, renovado numa escrita efectiva ou expirado na acção de esquecimento. O prazo do cookie e o do servidor são iguais, com tolerância inferior a um minuto na serialização HTTP.
|
||||
|
||||
## Alterações de aplicação
|
||||
|
||||
- `EnsureSimulationRecoveryCookie`: não renova em leituras; renova em acções explícitas; suporta o touch e replay idempotente sem prolongar o prazo do servidor.
|
||||
- `SimulationFormDrafts` e `SimulationFormDraftController`: leitura sem efeito lateral, renovação explícita com controlo `If-Match`, e esquecimento limitado ao rascunho anónimo do token actual.
|
||||
- `routes/api.php`: `POST /simulation-drafts/{id}/touch` e `DELETE /simulation-drafts/current`.
|
||||
- `simulation-form.tsx`: texto correcto sobre cookie persistente, botão acessível “Esquecer neste dispositivo” e renovação ao escolher “Guardar e continuar mais tarde”.
|
||||
- `bootstrap/app.php`: erros 5xx desta API devolvem mensagem genérica e referência de correlação; o relatório detalhado continua no log interno do Laravel.
|
||||
- `openapi.json` e `SimulationDraftContinuityTest.php`: contrato e testes dos novos comportamentos.
|
||||
|
||||
## Migrações e backup
|
||||
|
||||
Backup PostgreSQL em formato custom, criado antes do DDL: `%LOCALAPPDATA%\InvestMoz\backups\investmoz-before-simulation-draft-continuity-20261004.dump` (SHA-256 `20D940CAF3EAF3216CEFE45ED86B6C5AC593ECFE72C89253470711F2E32F0086`). `pg_restore --list` validou o arquivo e a restauração foi ensaiada numa base separada: os mesmos 14 rascunhos foram lidos, e a base temporária foi removida.
|
||||
|
||||
Foram aplicadas individualmente apenas as migrations relacionadas com rascunhos:
|
||||
|
||||
- `2026_10_02_120000_allow_owner_to_read_soft_deleted_simulation_drafts` — corrige o predicado RLS de leitura para manter disponível a leitura autorizada do histórico eliminado.
|
||||
- `2026_10_04_120000_add_simulation_draft_continuity` — adiciona os prazos e hashes de associação, permite vários dossiers por conta e cria a tabela de associação reversível a negócios.
|
||||
|
||||
Não foi executada limpeza em massa. As outras migrations pendentes não eram dependências desta correcção e ficaram pendentes: integridade de dependências de projectos, tipos de oportunidade de negócio existente, governação de regras fiscais, leitura pública de parâmetros fiscais, assistência fundiária e email opcional de manifestações.
|
||||
|
||||
## Evidências
|
||||
|
||||
- Testes PHP numa base PostgreSQL isolada: 10/10 testes, 78 asserções. Incluem gravação, renovação explícita, ausência de renovação por leitura, expiração, associação privada, esquecimento e resposta segura a erro SQL.
|
||||
- Contrato OpenAPI: 1/1 teste; JSON válido. `npm.cmd run build` terminou com sucesso (2403 módulos). O build assinalou o aviso pré-existente sobre o pacote opcional `fontaine` e um chunk JavaScript acima de 500 kB.
|
||||
- Base activa depois das migrations: `expires_at` e `claimed_token_hash` presentes, tabela de ligações presente, migrations registadas nos batches 29 e 30 e rascunhos anteriores preservados.
|
||||
- Edge em `http://127.0.0.1:8000/Simulador`, ligado à base `investemoz`: HTTP 200; rascunho sintético criado e recuperado depois de fechar e reabrir o browser; leitura não alterou validade do cookie; “Guardar e continuar mais tarde” renovou servidor e cookie com diferença inferior a um segundo; “Esquecer neste dispositivo” respondeu 204 e removeu o cookie. Sem erros JavaScript.
|
||||
- Relatório estruturado: [evidência do browser e da continuidade activa](simulation-draft-continuity-active-browser-2026-10-04.json). Capturas: [antes de esquecer](simulation-draft-continuity-active-before-forget-2026-10-04.png) e [depois de esquecer](simulation-draft-continuity-active-after-forget-2026-10-04.png).
|
||||
|
||||
Na inspecção inicial havia 14 registos. No fim há 18: os três rascunhos explicitamente criados para os ensaios do browser ficaram soft-deleted pela própria acção de esquecimento. Um outro rascunho anónimo apareceu durante a primeira visita de teste; como não correspondeu aos títulos sintéticos identificados e não foi possível atribuí-lo com segurança, foi deixado intacto. O total activo verificado é 14 anónimos e um dossier de conta; nenhum dos 13 rascunhos que existiam antes da migration foi apagado.
|
||||
|
||||
## Recuperação
|
||||
|
||||
Não executar o `down()` da migration: ele removeria colunas e a tabela de ligações. Se for indispensável recuperar o estado anterior, restaurar o arquivo para uma nova base, comparar escritas feitas após o backup e só então preparar uma troca controlada; não restaurar por cima da base activa.
|
||||
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"checkedAt": "2026-10-04T08:04:11.078Z",
|
||||
"route": "http://127.0.0.1:18082/simulador-fiscal",
|
||||
"browser": "Microsoft Edge headless via CDP",
|
||||
"scope": "UI, foco e GET público de rascunho; sem cálculo, escrita ou validação de conteúdo persistido",
|
||||
"title": "Simulador Fiscal - Laravel",
|
||||
"dimensions": [
|
||||
{
|
||||
"viewport": 390,
|
||||
"document": 390,
|
||||
"documentScroll": 390,
|
||||
"bodyScroll": 390,
|
||||
"fixedControls": 0,
|
||||
"controls": 19
|
||||
},
|
||||
{
|
||||
"viewport": 768,
|
||||
"document": 753,
|
||||
"documentScroll": 753,
|
||||
"bodyScroll": 753,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1024,
|
||||
"document": 1009,
|
||||
"documentScroll": 1009,
|
||||
"bodyScroll": 1009,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1440,
|
||||
"document": 1425,
|
||||
"documentScroll": 1425,
|
||||
"bodyScroll": 1425,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
}
|
||||
],
|
||||
"keyboardFocusSequence": [
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "1. Finalidade",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "2. Perfil do promotor",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "3. Identificação e contactos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "4. Projecto ou negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "5. Localização",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "6. Estrutura financeira",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "7. Emprego e impacto",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "8. Operação fiscal",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "9. Necessidade de negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "10. Documentos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "11. Revisão",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"name": "O que pretende calcular ou planear? Escolha o percurso (obrigatório)",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
}
|
||||
],
|
||||
"invalidKeyboardFocus": [],
|
||||
"visibleControls": 5,
|
||||
"visibleButtons": 14,
|
||||
"visibleLinks": 6,
|
||||
"unlabeledControls": [],
|
||||
"unnamedButtons": [],
|
||||
"unnamedLinks": [],
|
||||
"unnamedAxControls": [],
|
||||
"visibleAlerts": [],
|
||||
"javascriptExceptions": [],
|
||||
"apiResponses": [
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
}
|
||||
],
|
||||
"apiFailures": [],
|
||||
"expectedQaTarget": "investmoz_test:55441",
|
||||
"qaTargetVerified": true,
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"checkedAt": "2026-10-03T12:01:07.810Z",
|
||||
"route": "http://127.0.0.1:18088/simulador-fiscal",
|
||||
"browser": "Microsoft Edge headless via CDP",
|
||||
"qaTarget": "investmoz_browser_e2e_test:55443",
|
||||
"scope": "real public page/current-draft GET on isolated QA; catalog, calculation, polling and draft writes intercepted in browser",
|
||||
"catalogErrorState": {
|
||||
"hasError": true,
|
||||
"hasEmptyMessage": false,
|
||||
"retryVisible": true
|
||||
},
|
||||
"result": {
|
||||
"mocks": {
|
||||
"catalog": 2,
|
||||
"created": 1,
|
||||
"poll": 1,
|
||||
"draftWrites": 2
|
||||
},
|
||||
"catalogErrorAlert": false,
|
||||
"pollingErrorAlert": true,
|
||||
"pendingStatusVisible": true,
|
||||
"networkApiResponses": [
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200
|
||||
}
|
||||
]
|
||||
},
|
||||
"serverResponses": [
|
||||
{
|
||||
"path": "/simulador-fiscal",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_browser_e2e_test:55443"
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_browser_e2e_test:55443"
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_browser_e2e_test:55443"
|
||||
}
|
||||
],
|
||||
"javascriptExceptions": [],
|
||||
"consoleErrors": [],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"checkedAt": "2026-10-03T13:54:49.258Z",
|
||||
"route": "http://127.0.0.1:18089/simulador-fiscal",
|
||||
"browser": "Microsoft Edge headless via CDP",
|
||||
"scope": "UI, foco e GET público de rascunho; sem cálculo, escrita ou validação de conteúdo persistido",
|
||||
"title": "Simulador Fiscal - Laravel",
|
||||
"dimensions": [
|
||||
{
|
||||
"viewport": 390,
|
||||
"document": 390,
|
||||
"documentScroll": 390,
|
||||
"bodyScroll": 390,
|
||||
"fixedControls": 0,
|
||||
"controls": 19
|
||||
},
|
||||
{
|
||||
"viewport": 768,
|
||||
"document": 753,
|
||||
"documentScroll": 753,
|
||||
"bodyScroll": 753,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1024,
|
||||
"document": 1009,
|
||||
"documentScroll": 1009,
|
||||
"bodyScroll": 1009,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1440,
|
||||
"document": 1425,
|
||||
"documentScroll": 1425,
|
||||
"bodyScroll": 1425,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
}
|
||||
],
|
||||
"keyboardFocusSequence": [
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "1. Finalidade",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "2. Perfil do promotor",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "3. Identificação e contactos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "4. Projecto ou negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "5. Localização",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "6. Estrutura financeira",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "7. Emprego e impacto",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "8. Operação fiscal",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "9. Necessidade de negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "10. Documentos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "11. Revisão",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"name": "O que pretende calcular ou planear? Escolha o percurso (obrigatório)",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
}
|
||||
],
|
||||
"invalidKeyboardFocus": [],
|
||||
"visibleControls": 5,
|
||||
"visibleButtons": 14,
|
||||
"visibleLinks": 6,
|
||||
"unlabeledControls": [],
|
||||
"unnamedButtons": [],
|
||||
"unnamedLinks": [],
|
||||
"unnamedAxControls": [],
|
||||
"visibleAlerts": [],
|
||||
"javascriptExceptions": [],
|
||||
"apiResponses": [
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
}
|
||||
],
|
||||
"apiFailures": [],
|
||||
"expectedQaTarget": "investmoz_test:55441",
|
||||
"qaTargetVerified": true,
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"checkedAt": "2026-10-03T13:57:53.343Z",
|
||||
"route": "http://127.0.0.1:18089/simulador-fiscal",
|
||||
"browser": "Microsoft Edge headless via CDP",
|
||||
"scope": "UI, foco e GET público de rascunho; sem cálculo, escrita ou validação de conteúdo persistido",
|
||||
"title": "Simulador Fiscal - Laravel",
|
||||
"dimensions": [
|
||||
{
|
||||
"viewport": 390,
|
||||
"document": 390,
|
||||
"documentScroll": 390,
|
||||
"bodyScroll": 390,
|
||||
"fixedControls": 0,
|
||||
"controls": 19
|
||||
},
|
||||
{
|
||||
"viewport": 768,
|
||||
"document": 753,
|
||||
"documentScroll": 753,
|
||||
"bodyScroll": 753,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1024,
|
||||
"document": 1009,
|
||||
"documentScroll": 1009,
|
||||
"bodyScroll": 1009,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1440,
|
||||
"document": 1425,
|
||||
"documentScroll": 1425,
|
||||
"bodyScroll": 1425,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
}
|
||||
],
|
||||
"keyboardFocusSequence": [
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "1. Finalidade",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "2. Perfil do promotor",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "3. Identificação e contactos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "4. Projecto ou negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "5. Localização",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "6. Estrutura financeira",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "7. Emprego e impacto",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "8. Operação fiscal",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "9. Necessidade de negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "10. Documentos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "11. Revisão",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"name": "O que pretende calcular ou planear? Escolha o percurso (obrigatório)",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
}
|
||||
],
|
||||
"invalidKeyboardFocus": [],
|
||||
"visibleControls": 5,
|
||||
"visibleButtons": 14,
|
||||
"visibleLinks": 6,
|
||||
"unlabeledControls": [],
|
||||
"unnamedButtons": [],
|
||||
"unnamedLinks": [],
|
||||
"unnamedAxControls": [],
|
||||
"visibleAlerts": [],
|
||||
"javascriptExceptions": [],
|
||||
"apiResponses": [
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
}
|
||||
],
|
||||
"apiFailures": [],
|
||||
"expectedQaTarget": "investmoz_test:55441",
|
||||
"qaTargetVerified": true,
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
{
|
||||
"checkedAt": "2026-10-03T13:54:22.547Z",
|
||||
"route": "http://127.0.0.1:18089/simulador-fiscal",
|
||||
"browser": "Microsoft Edge headless via CDP",
|
||||
"scope": "UI, foco e GET público de rascunho; sem cálculo, escrita ou validação de conteúdo persistido",
|
||||
"title": "Simulador Fiscal - Laravel",
|
||||
"dimensions": [
|
||||
{
|
||||
"viewport": 390,
|
||||
"document": 390,
|
||||
"documentScroll": 390,
|
||||
"bodyScroll": 390,
|
||||
"fixedControls": 0,
|
||||
"controls": 19
|
||||
},
|
||||
{
|
||||
"viewport": 768,
|
||||
"document": 753,
|
||||
"documentScroll": 753,
|
||||
"bodyScroll": 753,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1024,
|
||||
"document": 1009,
|
||||
"documentScroll": 1009,
|
||||
"bodyScroll": 1009,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1440,
|
||||
"document": 1425,
|
||||
"documentScroll": 1425,
|
||||
"bodyScroll": 1425,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
}
|
||||
],
|
||||
"keyboardFocusSequence": [
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "1. Finalidade",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "2. Perfil do promotor",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "3. Identificação e contactos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "4. Projecto ou negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "5. Localização",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "6. Estrutura financeira",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "7. Emprego e impacto",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "8. Operação fiscal",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "9. Necessidade de negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "10. Documentos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "11. Revisão",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"name": "O que pretende calcular ou planear? Escolha o percurso (obrigatório)",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
}
|
||||
],
|
||||
"invalidKeyboardFocus": [],
|
||||
"visibleControls": 5,
|
||||
"visibleButtons": 14,
|
||||
"visibleLinks": 6,
|
||||
"unlabeledControls": [],
|
||||
"unnamedButtons": [],
|
||||
"unnamedLinks": [],
|
||||
"unnamedAxControls": [],
|
||||
"visibleAlerts": [],
|
||||
"javascriptExceptions": [],
|
||||
"apiResponses": [
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200
|
||||
}
|
||||
],
|
||||
"apiFailures": [],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
{
|
||||
"checkedAt": "2026-10-03T08:35:39.872Z",
|
||||
"route": "http://127.0.0.1:18082/simulador-fiscal",
|
||||
"browser": "Microsoft Edge headless via CDP",
|
||||
"scope": "UI, foco e GET público de rascunho; sem cálculo, escrita ou validação de conteúdo persistido",
|
||||
"title": "Simulador Fiscal - Laravel",
|
||||
"dimensions": [
|
||||
{
|
||||
"viewport": 390,
|
||||
"document": 390,
|
||||
"documentScroll": 390,
|
||||
"bodyScroll": 390,
|
||||
"fixedControls": 0,
|
||||
"controls": 19
|
||||
},
|
||||
{
|
||||
"viewport": 768,
|
||||
"document": 753,
|
||||
"documentScroll": 753,
|
||||
"bodyScroll": 753,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1024,
|
||||
"document": 1009,
|
||||
"documentScroll": 1009,
|
||||
"bodyScroll": 1009,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
},
|
||||
{
|
||||
"viewport": 1440,
|
||||
"document": 1425,
|
||||
"documentScroll": 1425,
|
||||
"bodyScroll": 1425,
|
||||
"fixedControls": 0,
|
||||
"controls": 18
|
||||
}
|
||||
],
|
||||
"keyboardFocusSequence": [
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "1. Finalidade",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "2. Perfil do promotor",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "3. Identificação e contactos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "4. Projecto ou negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "5. Localização",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "6. Estrutura financeira",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "7. Emprego e impacto",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "8. Operação fiscal",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "9. Necessidade de negócio",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "10. Documentos",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "button",
|
||||
"name": "11. Revisão",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"name": "O que pretende calcular ou planear? Escolha o percurso (obrigatório)",
|
||||
"visible": true,
|
||||
"focusVisible": true
|
||||
}
|
||||
],
|
||||
"invalidKeyboardFocus": [],
|
||||
"visibleControls": 5,
|
||||
"visibleButtons": 14,
|
||||
"visibleLinks": 6,
|
||||
"unlabeledControls": [],
|
||||
"unnamedButtons": [],
|
||||
"unnamedLinks": [],
|
||||
"unnamedAxControls": [],
|
||||
"visibleAlerts": [],
|
||||
"javascriptExceptions": [],
|
||||
"apiResponses": [
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200
|
||||
}
|
||||
],
|
||||
"apiFailures": [],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
{
|
||||
"checkedAt": "2026-10-03T10:20:03.943Z",
|
||||
"route": "http://127.0.0.1:18086/simulador-fiscal",
|
||||
"browser": "Microsoft Edge headless via CDP",
|
||||
"scope": "submissão anónima visível, execução aritmética e leitura do resultado; sem dados pessoais ou interpretação fiscal",
|
||||
"inputs": {
|
||||
"fiscalPeriod": "2026",
|
||||
"componentContext": "inss",
|
||||
"base": "1000",
|
||||
"rate": "10",
|
||||
"reduction": "50"
|
||||
},
|
||||
"clientValidation": {
|
||||
"inputInvalid": true,
|
||||
"inputDescribedBy": [
|
||||
"error-base"
|
||||
],
|
||||
"descriptionsExist": true,
|
||||
"descriptionsAreAlerts": true,
|
||||
"activeField": "field-base",
|
||||
"calculationRequestsBeforeCorrection": 0,
|
||||
"accessibleErrors": true
|
||||
},
|
||||
"expectedArithmeticValue": "50",
|
||||
"title": "Simulador Fiscal - Laravel",
|
||||
"resultText": [
|
||||
"IRPS",
|
||||
"INSS",
|
||||
"IVA",
|
||||
"IRPC",
|
||||
"ISPC",
|
||||
"Retenções",
|
||||
"50.000000000000000000000000000000000000"
|
||||
],
|
||||
"completed": true,
|
||||
"taxDisclaimer": true,
|
||||
"visibleAlerts": [],
|
||||
"anonymousIdentityNotice": true,
|
||||
"calculationRequests": [
|
||||
{
|
||||
"path": "/api/v1/simulations",
|
||||
"status": 202
|
||||
}
|
||||
],
|
||||
"apiResponses": [
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulations",
|
||||
"status": 202
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts",
|
||||
"status": 201
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulations/d466c603-46bb-4b7e-ba1c-8bdb704ec735",
|
||||
"status": 200
|
||||
}
|
||||
],
|
||||
"simulationResponseShapes": [
|
||||
{
|
||||
"httpStatus": 202,
|
||||
"outerKeys": [
|
||||
"access_token",
|
||||
"data",
|
||||
"replayed"
|
||||
],
|
||||
"replayedType": "boolean",
|
||||
"replayed": false,
|
||||
"accessTokenLength": 64,
|
||||
"data": {
|
||||
"keys": [
|
||||
"anonymous_token_hash",
|
||||
"calculation_snapshot",
|
||||
"created_at",
|
||||
"id",
|
||||
"input_snapshot",
|
||||
"organization_id",
|
||||
"owner_user_id",
|
||||
"questionnaire_version_id",
|
||||
"reports",
|
||||
"scenarios",
|
||||
"status",
|
||||
"updated_at",
|
||||
"version_no"
|
||||
],
|
||||
"idType": "string",
|
||||
"status": "queued",
|
||||
"versionNoType": "number",
|
||||
"resultSnapshotType": "undefined"
|
||||
}
|
||||
}
|
||||
],
|
||||
"failedResponses": [],
|
||||
"javascriptExceptions": [],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,946 @@
|
||||
{
|
||||
"checkedAt": "2026-10-03T14:44:45.817Z",
|
||||
"route": "http://127.0.0.1:18089/simulador-fiscal",
|
||||
"browser": "Microsoft Edge headless via CDP",
|
||||
"scope": "submissão anónima, validação acessível e UI responsiva nos estados finalidade/fiscal/resultado; sem dados pessoais ou interpretação fiscal",
|
||||
"expectedQaTarget": "investmoz_test:55441",
|
||||
"qaTargetVerified": true,
|
||||
"inputs": {
|
||||
"fiscalPeriod": "2026",
|
||||
"componentContext": "inss",
|
||||
"base": "1000",
|
||||
"rate": "10",
|
||||
"reduction": "50"
|
||||
},
|
||||
"clientValidation": {
|
||||
"inputInvalid": true,
|
||||
"inputDescribedBy": [
|
||||
"error-base"
|
||||
],
|
||||
"descriptionsExist": true,
|
||||
"descriptionsAreAlerts": true,
|
||||
"activeField": "field-base",
|
||||
"calculationRequestsBeforeCorrection": 0,
|
||||
"accessibleErrors": true
|
||||
},
|
||||
"fiscalHeadingFocus": {
|
||||
"focused": true,
|
||||
"outlineStyle": "solid",
|
||||
"outlineWidth": "2px",
|
||||
"visible": true,
|
||||
"visibleIndicator": true
|
||||
},
|
||||
"responsiveStates": [
|
||||
{
|
||||
"state": "purpose",
|
||||
"viewports": [
|
||||
{
|
||||
"requestedWidth": 320,
|
||||
"viewport": 320,
|
||||
"layoutWidth": 320,
|
||||
"documentScroll": 320,
|
||||
"bodyScroll": 320,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 5,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 37,
|
||||
"right": 1749,
|
||||
"width": 1712,
|
||||
"text": "1. Finalidade\n2. Perfil do promotor\n3. Identificação e contactos\n4. Projecto ou "
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1657,
|
||||
"right": 1749,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1657,
|
||||
"right": 1749,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1519,
|
||||
"right": 1649,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1519,
|
||||
"right": 1649,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1315,
|
||||
"right": 1511,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1315,
|
||||
"right": 1511,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1168,
|
||||
"right": 1307,
|
||||
"width": 139,
|
||||
"text": "8. Operação fiscal"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 360,
|
||||
"viewport": 360,
|
||||
"layoutWidth": 360,
|
||||
"documentScroll": 360,
|
||||
"bodyScroll": 360,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 5,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 37,
|
||||
"right": 1749,
|
||||
"width": 1712,
|
||||
"text": "1. Finalidade\n2. Perfil do promotor\n3. Identificação e contactos\n4. Projecto ou "
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1657,
|
||||
"right": 1749,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1657,
|
||||
"right": 1749,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1519,
|
||||
"right": 1649,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1519,
|
||||
"right": 1649,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1315,
|
||||
"right": 1511,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1315,
|
||||
"right": 1511,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1168,
|
||||
"right": 1307,
|
||||
"width": 139,
|
||||
"text": "8. Operação fiscal"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 390,
|
||||
"viewport": 390,
|
||||
"layoutWidth": 390,
|
||||
"documentScroll": 390,
|
||||
"bodyScroll": 390,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 5,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 37,
|
||||
"right": 1749,
|
||||
"width": 1712,
|
||||
"text": "1. Finalidade\n2. Perfil do promotor\n3. Identificação e contactos\n4. Projecto ou "
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1657,
|
||||
"right": 1749,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1657,
|
||||
"right": 1749,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1519,
|
||||
"right": 1649,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1519,
|
||||
"right": 1649,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1315,
|
||||
"right": 1511,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1315,
|
||||
"right": 1511,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1168,
|
||||
"right": 1307,
|
||||
"width": 139,
|
||||
"text": "8. Operação fiscal"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 768,
|
||||
"viewport": 768,
|
||||
"layoutWidth": 753,
|
||||
"documentScroll": 753,
|
||||
"bodyScroll": 753,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 5,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 45,
|
||||
"right": 1757,
|
||||
"width": 1712,
|
||||
"text": "1. Finalidade\n2. Perfil do promotor\n3. Identificação e contactos\n4. Projecto ou "
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1665,
|
||||
"right": 1757,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1665,
|
||||
"right": 1757,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1527,
|
||||
"right": 1657,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1527,
|
||||
"right": 1657,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1323,
|
||||
"right": 1519,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1323,
|
||||
"right": 1519,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1176,
|
||||
"right": 1315,
|
||||
"width": 139,
|
||||
"text": "8. Operação fiscal"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 1024,
|
||||
"viewport": 1024,
|
||||
"layoutWidth": 1009,
|
||||
"documentScroll": 1009,
|
||||
"bodyScroll": 1009,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 5,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 45,
|
||||
"right": 1757,
|
||||
"width": 1712,
|
||||
"text": "1. Finalidade\n2. Perfil do promotor\n3. Identificação e contactos\n4. Projecto ou "
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1665,
|
||||
"right": 1757,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1665,
|
||||
"right": 1757,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1527,
|
||||
"right": 1657,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1527,
|
||||
"right": 1657,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1323,
|
||||
"right": 1519,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1323,
|
||||
"right": 1519,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1176,
|
||||
"right": 1315,
|
||||
"width": 139,
|
||||
"text": "8. Operação fiscal"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 1440,
|
||||
"viewport": 1440,
|
||||
"layoutWidth": 1425,
|
||||
"documentScroll": 1425,
|
||||
"bodyScroll": 1425,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 5,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 182,
|
||||
"right": 1893,
|
||||
"width": 1712,
|
||||
"text": "1. Finalidade\n2. Perfil do promotor\n3. Identificação e contactos\n4. Projecto ou "
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1801,
|
||||
"right": 1893,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1801,
|
||||
"right": 1893,
|
||||
"width": 92,
|
||||
"text": "11. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1664,
|
||||
"right": 1793,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1664,
|
||||
"right": 1793,
|
||||
"width": 129,
|
||||
"text": "10. Documentos"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1459,
|
||||
"right": 1656,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 1459,
|
||||
"right": 1656,
|
||||
"width": 197,
|
||||
"text": "9. Necessidade de negócio"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 1312,
|
||||
"right": 1451,
|
||||
"width": 139,
|
||||
"text": "8. Operação fiscal"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"state": "tax",
|
||||
"viewports": [
|
||||
{
|
||||
"requestedWidth": 320,
|
||||
"viewport": 320,
|
||||
"layoutWidth": 320,
|
||||
"documentScroll": 320,
|
||||
"bodyScroll": 320,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 34,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 37,
|
||||
"right": 385,
|
||||
"width": 348,
|
||||
"text": "1. Finalidade\n2. Operação fiscal\n3. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 296,
|
||||
"right": 385,
|
||||
"width": 89,
|
||||
"text": "3. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 296,
|
||||
"right": 385,
|
||||
"width": 89,
|
||||
"text": "3. Revisão"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 360,
|
||||
"viewport": 360,
|
||||
"layoutWidth": 360,
|
||||
"documentScroll": 360,
|
||||
"bodyScroll": 360,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 34,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 37,
|
||||
"right": 385,
|
||||
"width": 348,
|
||||
"text": "1. Finalidade\n2. Operação fiscal\n3. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 296,
|
||||
"right": 385,
|
||||
"width": 89,
|
||||
"text": "3. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 296,
|
||||
"right": 385,
|
||||
"width": 89,
|
||||
"text": "3. Revisão"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 390,
|
||||
"viewport": 390,
|
||||
"layoutWidth": 390,
|
||||
"documentScroll": 390,
|
||||
"bodyScroll": 390,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 34,
|
||||
"overflowElements": [],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 768,
|
||||
"viewport": 768,
|
||||
"layoutWidth": 753,
|
||||
"documentScroll": 753,
|
||||
"bodyScroll": 753,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 34,
|
||||
"overflowElements": [],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 1024,
|
||||
"viewport": 1024,
|
||||
"layoutWidth": 1009,
|
||||
"documentScroll": 1009,
|
||||
"bodyScroll": 1009,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 34,
|
||||
"overflowElements": [],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 1440,
|
||||
"viewport": 1440,
|
||||
"layoutWidth": 1425,
|
||||
"documentScroll": 1425,
|
||||
"bodyScroll": 1425,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 34,
|
||||
"overflowElements": [],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"state": "result",
|
||||
"viewports": [
|
||||
{
|
||||
"requestedWidth": 320,
|
||||
"viewport": 320,
|
||||
"layoutWidth": 320,
|
||||
"documentScroll": 320,
|
||||
"bodyScroll": 320,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 37,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 37,
|
||||
"right": 385,
|
||||
"width": 348,
|
||||
"text": "1. Finalidade\n2. Operação fiscal\n3. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 296,
|
||||
"right": 385,
|
||||
"width": 89,
|
||||
"text": "3. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 296,
|
||||
"right": 385,
|
||||
"width": 89,
|
||||
"text": "3. Revisão"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 360,
|
||||
"viewport": 360,
|
||||
"layoutWidth": 360,
|
||||
"documentScroll": 360,
|
||||
"bodyScroll": 360,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 37,
|
||||
"overflowElements": [
|
||||
{
|
||||
"tag": "OL",
|
||||
"id": null,
|
||||
"className": "flex min-w-max gap-2",
|
||||
"left": 37,
|
||||
"right": 385,
|
||||
"width": 348,
|
||||
"text": "1. Finalidade\n2. Operação fiscal\n3. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "LI",
|
||||
"id": null,
|
||||
"className": "",
|
||||
"left": 296,
|
||||
"right": 385,
|
||||
"width": 89,
|
||||
"text": "3. Revisão"
|
||||
},
|
||||
{
|
||||
"tag": "BUTTON",
|
||||
"id": null,
|
||||
"className": "rounded-full border px-3 py-2 text-sm focus-visible:outline-2 bg-white",
|
||||
"left": 296,
|
||||
"right": 385,
|
||||
"width": 89,
|
||||
"text": "3. Revisão"
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 390,
|
||||
"viewport": 390,
|
||||
"layoutWidth": 390,
|
||||
"documentScroll": 390,
|
||||
"bodyScroll": 390,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 37,
|
||||
"overflowElements": [],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 768,
|
||||
"viewport": 768,
|
||||
"layoutWidth": 753,
|
||||
"documentScroll": 753,
|
||||
"bodyScroll": 753,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 37,
|
||||
"overflowElements": [],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 1024,
|
||||
"viewport": 1024,
|
||||
"layoutWidth": 1009,
|
||||
"documentScroll": 1009,
|
||||
"bodyScroll": 1009,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 37,
|
||||
"overflowElements": [],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"requestedWidth": 1440,
|
||||
"viewport": 1440,
|
||||
"layoutWidth": 1425,
|
||||
"documentScroll": 1425,
|
||||
"bodyScroll": 1425,
|
||||
"unnamedControls": [],
|
||||
"unnamedButtons": 0,
|
||||
"unnamedLinks": 0,
|
||||
"visibleControls": 37,
|
||||
"overflowElements": [],
|
||||
"unnamedAxControls": [],
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"expectedArithmeticValue": "50",
|
||||
"title": "Simulador Fiscal - Laravel",
|
||||
"resultText": [
|
||||
"IRPS",
|
||||
"INSS",
|
||||
"IVA",
|
||||
"IRPC",
|
||||
"ISPC",
|
||||
"Retenções",
|
||||
"50.000000000000000000000000000000000000"
|
||||
],
|
||||
"completed": true,
|
||||
"taxDisclaimer": true,
|
||||
"visibleAlerts": [],
|
||||
"anonymousIdentityNotice": true,
|
||||
"calculationRequests": [
|
||||
{
|
||||
"path": "/api/v1/simulations",
|
||||
"status": 202,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
}
|
||||
],
|
||||
"apiResponses": [
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/current",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts",
|
||||
"status": 201,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulations",
|
||||
"status": 202,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulation-drafts/8286b973-eecb-44ac-8579-2413f5ade5bc",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
},
|
||||
{
|
||||
"path": "/api/v1/simulations/dfe148c6-4cca-42ec-9ff3-b2128e300876",
|
||||
"status": 200,
|
||||
"qaTarget": "investmoz_test:55441"
|
||||
}
|
||||
],
|
||||
"simulationResponseShapes": [
|
||||
{
|
||||
"httpStatus": 202,
|
||||
"outerKeys": [
|
||||
"access_token",
|
||||
"data",
|
||||
"replayed"
|
||||
],
|
||||
"replayedType": "boolean",
|
||||
"replayed": false,
|
||||
"accessTokenLength": 64,
|
||||
"data": {
|
||||
"keys": [
|
||||
"anonymous_token_hash",
|
||||
"calculation_snapshot",
|
||||
"created_at",
|
||||
"id",
|
||||
"input_snapshot",
|
||||
"organization_id",
|
||||
"owner_user_id",
|
||||
"questionnaire_version_id",
|
||||
"reports",
|
||||
"scenarios",
|
||||
"status",
|
||||
"updated_at",
|
||||
"version_no"
|
||||
],
|
||||
"idType": "string",
|
||||
"status": "queued",
|
||||
"versionNoType": "number",
|
||||
"resultSnapshotType": "undefined"
|
||||
}
|
||||
}
|
||||
],
|
||||
"failedResponses": [],
|
||||
"javascriptExceptions": [],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"checkedAt": "2026-10-03T15:36:06.727Z",
|
||||
"route": "http://127.0.0.1:18117/tools/simulator-cashflow-preview.html",
|
||||
"browser": "Microsoft Edge headless via CDP",
|
||||
"scope": "React cashflow component only; no Laravel, API, database, or fiscal rules",
|
||||
"fixedMode": {
|
||||
"selected": true,
|
||||
"monthlyInputs": 1,
|
||||
"incompleteNote": "Há pelo menos um mês sem pressuposto de imposto: o saldo total desde esse ponto é indeterminado. A caixa conhecida inclui os impostos declarados e omite apenas os meses em falta; mês vazio não significa imposto zero."
|
||||
},
|
||||
"partialSchedule": {
|
||||
"firstMonthTax": "250.00",
|
||||
"secondMonthTax": "500.00",
|
||||
"thirdMonthTax": "Indeterminado",
|
||||
"incompleteNote": "Há pelo menos um mês sem pressuposto de imposto: o saldo total desde esse ponto é indeterminado. A caixa conhecida inclui os impostos declarados e omite apenas os meses em falta; mês vazio não significa imposto zero.",
|
||||
"incompleteSummary": true
|
||||
},
|
||||
"completeSchedule": {
|
||||
"hasCompleteBalance": true,
|
||||
"zeroTaxMonths": true,
|
||||
"rowCount": 12
|
||||
},
|
||||
"responsive": [
|
||||
{
|
||||
"requested": 320,
|
||||
"viewport": 320,
|
||||
"documentWidth": 320,
|
||||
"documentScroll": 320,
|
||||
"bodyScroll": 320,
|
||||
"hasHorizontalOverflow": false,
|
||||
"inputs": 24,
|
||||
"unnamedInputs": 0
|
||||
},
|
||||
{
|
||||
"requested": 360,
|
||||
"viewport": 360,
|
||||
"documentWidth": 360,
|
||||
"documentScroll": 360,
|
||||
"bodyScroll": 360,
|
||||
"hasHorizontalOverflow": false,
|
||||
"inputs": 24,
|
||||
"unnamedInputs": 0
|
||||
},
|
||||
{
|
||||
"requested": 390,
|
||||
"viewport": 390,
|
||||
"documentWidth": 390,
|
||||
"documentScroll": 390,
|
||||
"bodyScroll": 390,
|
||||
"hasHorizontalOverflow": false,
|
||||
"inputs": 24,
|
||||
"unnamedInputs": 0
|
||||
},
|
||||
{
|
||||
"requested": 768,
|
||||
"viewport": 768,
|
||||
"documentWidth": 753,
|
||||
"documentScroll": 753,
|
||||
"bodyScroll": 753,
|
||||
"hasHorizontalOverflow": false,
|
||||
"inputs": 24,
|
||||
"unnamedInputs": 0
|
||||
},
|
||||
{
|
||||
"requested": 1024,
|
||||
"viewport": 1024,
|
||||
"documentWidth": 1009,
|
||||
"documentScroll": 1009,
|
||||
"bodyScroll": 1009,
|
||||
"hasHorizontalOverflow": false,
|
||||
"inputs": 24,
|
||||
"unnamedInputs": 0
|
||||
},
|
||||
{
|
||||
"requested": 1440,
|
||||
"viewport": 1440,
|
||||
"documentWidth": 1425,
|
||||
"documentScroll": 1425,
|
||||
"bodyScroll": 1425,
|
||||
"hasHorizontalOverflow": false,
|
||||
"inputs": 24,
|
||||
"unnamedInputs": 0
|
||||
}
|
||||
],
|
||||
"unnamedAxControls": [],
|
||||
"javascriptExceptions": [],
|
||||
"networkFailures": [],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"scenario": "anonimo_guarda_fecha_reabre_recupera",
|
||||
"browser": "Chromium via Playwright",
|
||||
"viewport_css_px": { "width": 390, "height": 900 },
|
||||
"persistent_profile": true,
|
||||
"browser_context_closed_and_relaunched": true,
|
||||
"saved": true,
|
||||
"recovered_title_matches": true,
|
||||
"save_message": "Rascunho guardado. Pode continuar neste navegador até 3 de novembro de 2026.",
|
||||
"recovery_message": "Rascunho recuperado. Guardado neste navegador até 3 de novembro de 2026.",
|
||||
"recovery_cookie": {
|
||||
"name": "investmoz_simulation_recovery",
|
||||
"http_only": true,
|
||||
"same_site": "Lax",
|
||||
"path": "/api/v1",
|
||||
"expiry": "2026-11-03T11:40:01.822Z"
|
||||
},
|
||||
"page_errors": [],
|
||||
"scope": "Ensaio técnico sintético num perfil Chromium persistente; não é sessão com voluntário nem teste num telemóvel físico."
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"date": "2026-10-05",
|
||||
"purpose": "Isolated functional validation of the InvestMoz simulator dossier",
|
||||
"database": {
|
||||
"engine": "PostgreSQL 17.11 with PostGIS",
|
||||
"host": "127.0.0.1",
|
||||
"port": 55441,
|
||||
"name": "investmoz_test",
|
||||
"guard": "tests/TestCase.php rejects active DB name investemoz, any DB name without _test suffix, non-loopback host, or DB_URL; verified rejection occurs before connection",
|
||||
"backup": "%TEMP%\\investmoz_test-before-validation-20261005.dump",
|
||||
"active_service_5432_untouched": true
|
||||
},
|
||||
"server": {
|
||||
"url": "http://127.0.0.1:18089/Simulador",
|
||||
"binding": "127.0.0.1 only",
|
||||
"qa_target_header": "investmoz_test:55441",
|
||||
"isolated_router": "tools/simulator-qa-router.php",
|
||||
"current_compiled_assets": true
|
||||
},
|
||||
"tests": {
|
||||
"php_targeted": {"command": "php artisan test --filter=SimulationFormDraftTest", "passed": 13, "assertions": 98},
|
||||
"php_full": {"command": "php artisan test", "passed": 278, "assertions": 2901},
|
||||
"frontend": {"command": "node --test tests/frontend/*.test.mjs", "passed": 144, "failed": 0},
|
||||
"types": {"command": "npm.cmd run types:check", "result": "passed"},
|
||||
"syntax": {"command": "php -l tests/TestCase.php; php -l tools/simulator-qa-router.php", "result": "both passed"}
|
||||
},
|
||||
"browser": {
|
||||
"entrepreneur": {"sections": 6, "saved": true, "recovered_after_fresh_browser_context": true, "manual_response_survives_second_restart": true, "manual_response_edit_survives_restart": true, "risk_response_owner_cost_due_date_persisted": true, "finance_values_match_existing_forecast": {"revenue_mzn": "60000.00", "profit_before_tax_mzn": "30000.00", "closing_cash_mzn": "4000.00"}, "exported_docx": true, "exported_attachment_zip": true},
|
||||
"legacy_draft": {"payload_without_questionnaire_version": "created and reopened successfully", "version": "legacy-unversioned"},
|
||||
"investor": {"sections": 8, "review_readiness_visible": true, "docx_download": true},
|
||||
"http_statuses": "draft GET 200, create POST 201, update PUT 200; QA target header verified on requests",
|
||||
"javascript_errors": 0,
|
||||
"screenshots": {
|
||||
"entrepreneur_mobile": "%TEMP%\\investmoz-dossier-validation\\entrepreneur-review-mobile-current-build.png",
|
||||
"investor_desktop": "%TEMP%\\investmoz-dossier-validation\\investor-review-desktop-current-build.png"
|
||||
}
|
||||
},
|
||||
"exports": {
|
||||
"entrepreneur_docx": "%TEMP%\\investmoz-dossier-validation\\portal-entrepreneur-current.docx",
|
||||
"investor_docx": "%TEMP%\\investmoz-dossier-validation\\portal-investor-current.docx",
|
||||
"attachments_zip": "%TEMP%\\investmoz-dossier-validation\\portal-entrepreneur-current.zip",
|
||||
"docx_openxml_inspection": {"content_types_and_document_xml": true, "table": true, "photo_media_and_relationship": true, "photo_caption": "Synthetic project site photo", "manual_response": true, "forecast_values_match": true, "pdf_nonembedding_explanation": true, "page_number_field": true, "zip_contains_original_pdf_csv_png_and_index": true},
|
||||
"visual_pagination": {"status": "pending", "reason": "Microsoft Word automation did not open reliably; no LibreOffice/soffice, Pandoc, or PDF rendering utilities are installed. No visual pagination claim is made."}
|
||||
},
|
||||
"known_qa_issue_and_resolution": "A stale shared Vite dev server was serving an outdated JavaScript bundle. The QA router now forces the current compiled assets via an isolated hot-file path; current browser runs used the corrected bundle.",
|
||||
"artifacts_directory": "%TEMP%\\investmoz-dossier-validation"
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"purpose": "Ensaio visual e funcional do percurso exploratorio existente; sem introducao de funcionalidades",
|
||||
"environment": {
|
||||
"browser": "Chromium via Playwright",
|
||||
"application": "Laravel servido localmente com PostgreSQL 17 isolado para QA",
|
||||
"viewports_px": [390, 768, 1024, 1440],
|
||||
"physical_mobile_device": false,
|
||||
"spreadsheet": "Microsoft Excel via automacao COM local"
|
||||
},
|
||||
"scenarios": [
|
||||
{
|
||||
"name": "ideia simples",
|
||||
"result": "passou",
|
||||
"save_leave_recover": "Rascunho enviado ao servidor (201), navegacao para outra pagina e recuperacao do titulo ao regressar (200)",
|
||||
"validation": "Campo obrigatorio vazio mostrou mensagem acessivel e foco no primeiro campo invalido",
|
||||
"market_origin": "Declarada, identificada como nao verificada; origem iniciada por '=' foi sanitizada no CSV",
|
||||
"calculations": {
|
||||
"loan_net_disbursed_mzn": "100000.00",
|
||||
"loan_rate_per_period_percent": "1.500000",
|
||||
"loan_interest_mzn": "19817.83",
|
||||
"loan_total_paid_mzn": "119817.83",
|
||||
"first_payment_mzn": "4992.41",
|
||||
"break_even_units": 125,
|
||||
"break_even_sales_mzn": "125000.00",
|
||||
"funding_gap_mzn": "750000.00",
|
||||
"operating_balance_mzn": "50000.00"
|
||||
},
|
||||
"csv": "UTF-8 BOM, acentos e valores conferidos; formula neutralizada; Excel abriu 30 linhas e 4 colunas sem dividir campos"
|
||||
},
|
||||
{
|
||||
"name": "negocio existente (maturidade Operacao)",
|
||||
"result": "passou apos correcao",
|
||||
"save_leave_recover": "Titulo e maturidade recuperados do rascunho do servidor",
|
||||
"finding": "A API rejeitava o valor de maturidade Operacao por falta na whitelist dos rotulos de seleccao; corrigida em StoreSimulationFormDraftRequest"
|
||||
},
|
||||
{
|
||||
"name": "informacao incompleta",
|
||||
"result": "passou",
|
||||
"validation": "Campos obrigatorios continuam validados; localizacao e detalhes opcionais ausentes nao bloquearam o percurso exploratorio"
|
||||
}
|
||||
],
|
||||
"visual_and_accessibility": {
|
||||
"horizontal_overflow": false,
|
||||
"keyboard_focus_visible": true,
|
||||
"label_font_px": 14,
|
||||
"help_text_min_font_px": 12,
|
||||
"screenshots": "Capturas temporarias em viewport 390 px revistas visualmente; sem overflow; formularios e mensagens legiveis"
|
||||
},
|
||||
"browser_errors": { "console": 0, "page": 0 },
|
||||
"api_responses": { "draft_create": 201, "draft_read": 200 },
|
||||
"fixes": [
|
||||
"Incluido maturity_stage na whitelist de rotulos validos do rascunho.",
|
||||
"Exportacao do dossier passou a citar delimitadores regionais de CSV sem alterar o comportamento do helper existente.",
|
||||
"CSV do dossier passou a expor pressupostos e resultados financeiros em campos legiveis, em vez de um bloco JSON opaco.",
|
||||
"Corrigida codificacao de textos visiveis que apresentavam caracteres corrompidos durante o percurso."
|
||||
],
|
||||
"automated_checks": {
|
||||
"frontend_node_test": "129/129 passou",
|
||||
"typescript_types_check": "passou",
|
||||
"vite_build": "passou (2399 modulos; aviso opcional: fontaine ausente)",
|
||||
"phpstan": "0 erros",
|
||||
"simulation_form_phpunit": "12 testes, 91 assertions, passou",
|
||||
"git_diff_check": "passou"
|
||||
},
|
||||
"limits": [
|
||||
"Dispositivo fisico nao testado; viewport mobile foi emulado em Chromium.",
|
||||
"Sair e recuperar foi testado navegando para outra pagina e regressando na mesma sessao do browser; encerrar o browser por completo nao foi ensaiado.",
|
||||
"O caso negocio existente cobre a maturidade Operacao no simulador exploratorio, nao o fluxo autenticado de CRUD do marketplace de negocios existentes.",
|
||||
"Excel foi automatizado localmente e confirmou delimitacao, acentos e valores; nao foram ensaiadas outras versoes ou configuracoes regionais de folha de calculo."
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
# Etapa 10 — rastreabilidade de incentivos e extensões existentes
|
||||
|
||||
**Data:** 2026-10-03
|
||||
**Estado proposto:** funcionalidades informativas/territoriais parciais; incentivos fiscais, aduaneiro, câmbio e decisões regulatórias permanecem inactivos.
|
||||
|
||||
| Requisito do anexo | Evidência actual | Estado e limite |
|
||||
|---|---|---|
|
||||
| Distinguir informação territorial de benefício ou autorização | `resources/js/pages/investment/zone.tsx` informa expressamente que a ficha e a associação territorial não atribuem benefício, licença ou autorização aduaneira. | Implementado na interface da zona; não cobre todas as páginas de sectores/licenciamento. |
|
||||
| Publicar apenas registos revistos e com fonte vigente | `InvestmentZones::visible()` exige estado publicado/validado, fonte jurídica validada e vigente e operador não eliminado. | Implementado; não confirma por si a validade material da interpretação nem a autenticidade do PDF/hash da fonte. |
|
||||
| Filtrar relações e mapas por validação/vigência | `InvestmentZones::links()` filtra relação validada, período e fonte quando atribuída; `InvestmentZoneGeometryController::map()` exige publicação autorizada, geometria validada e classificação pública. | Implementado com limites. Relações sem fonte podem ser públicas se validadas; isso é apropriado só para relações factuais não normativas e deve ser revisto por tipo. |
|
||||
| Ligar zonas a oportunidades sem conceder elegibilidade | `InvestmentZoneController` apresenta oportunidades publicadas associadas; `InvestmentSubmissionController` valida a relação e guarda versão/origem da zona. | Contexto de descoberta/submissão; associação não atribui incentivo, benefício ou elegibilidade do investidor. |
|
||||
| Rever relações e geometrias com segregação | `InvestmentZoneRelationController`, `InvestmentZoneGeometryController` e `InvestmentZoneLinkController` têm validação independente, versão, transacção e auditoria; os testes verificam recusa de auto-revisão e bloqueio de publicação sem aprovação. | Coberto tecnicamente no fluxo territorial existente. |
|
||||
| Incentivos fiscais e aduaneiros | Não foi encontrada avaliação de regime/certificado/período/condições que conceda benefício, nem cálculo pautal/fonte aduaneira executável. A UI fiscal mantém ausência como indeterminação. | Não implementado/publicável; dependente de texto oficial, interpretação, parâmetros, fontes e casos aprovados. |
|
||||
| Câmbio, vistos, residência, trabalho, concessões e licenciamento | Existem páginas/fontes educacionais e cadastros territoriais relacionados, mas nesta revisão não foi demonstrado um fluxo completo de obrigação, elegibilidade ou encaminhamento validado para cada domínio. | Parcial/a validar por domínio; não os tratar como decisão oficial. |
|
||||
| Cartografia/educação como contexto | Há catálogos geográficos e módulos educacionais; a ligação com cada extensão e a validade temporal do conteúdo exigem revisão individual. | Parcial. Nenhuma recomendação ou qualificação foi inferida nesta tranche. |
|
||||
|
||||
## Verificação executada
|
||||
|
||||
- `php artisan test --filter=InvestmentZoneTest` — **6/6 testes**, **104 asserções**.
|
||||
- PostgreSQL 17/PostGIS QA isolado em `127.0.0.1:55441`; a suite inclui exercício controlado de rollback/recriação de migrations apenas nesse banco. O servidor foi parado depois dos testes.
|
||||
- PHP CLI: 8.5.11. A base operacional na porta 5432 não foi usada.
|
||||
- Nenhum código, parâmetro, fonte jurídica, migration ou dado foi alterado nesta revisão.
|
||||
|
||||
## Próximos passos seguros
|
||||
|
||||
1. Manter benefícios e cálculos aduaneiros desactivados até se obterem fontes oficiais e aprovação competente.
|
||||
2. Rever, por categoria de associação, quando a fonte legal é obrigatória; não relaxar a validação para relações territoriais sem separar claramente factos de efeitos jurídicos.
|
||||
3. Fazer inventário por domínio de vistos, trabalho, câmbio, concessões e licenciamento, ligando cada orientação apenas a fonte e vigência verificadas.
|
||||
4. Ensaiar no browser a compreensão do aviso de que mapa/zona não confere elegibilidade, licença ou benefício.
|
||||
|
||||
Rollback: remover este documento e as adendas correspondentes no estado/ledger. Sem rollback de schema ou dados.
|
||||
@@ -1,5 +1,7 @@
|
||||
# Etapa 10 — Motor fiscal principal
|
||||
|
||||
> **Nota de correspondência:** este gate conserva a numeração de um pedido anterior. No anexo actual “Evolução sequencial do simulador multiuso”, o motor fiscal é a Etapa 5; esta evidência continua válida para esse âmbito, mas o número do ficheiro/título não é a etapa corrente.
|
||||
|
||||
**Estado proposto: BLOQUEADO.** As fórmulas e a matriz de casos foram fornecidas e o utilizador declarou-as formalmente aprovadas em 2026-10-01. Nenhum motor fiscal foi implementado; continuam por satisfazer pré-condições técnicas e por fornecer parâmetros legais de produção.
|
||||
|
||||
## Inspecção e conformidade
|
||||
@@ -42,6 +44,14 @@ A migration existente `2026_10_01_000200_create_simulation_execution_core.php` p
|
||||
|
||||
**Gate inicial:** BLOQUEADO antes da aprovação funcional registada abaixo; consultar as actualizações posteriores para o estado vigente.
|
||||
|
||||
## Revisão fiscal obrigatória — reformas 2026 e microfinanças (2026-10-02)
|
||||
|
||||
Consultar `fiscal-reform-2026-review.md` e `official-source-register.md`. O BR n.º 248 confirma Leis 7/2025–12/2025; o Governo anunciou novos regulamentos em 30-09-2026. A INM lista os BR n.º 186 e 187 como publicados em 02-10-2026, mas os respectivos sumários/textos não foram confirmados nesta revisão. A matriz resolve a confusão IVA simplificado vs ISPC, a leitura de 32% para mais-valias IRPS e os erros de numeração no comunicado. Mantêm-se bloqueados os parâmetros até verificar o texto legal oficial, vigência, transição e aprovação dos casos dourados pelo Fiscalista.
|
||||
|
||||
O formulário público recolhe período, componente e dados contextuais condicionais, sem inferir residência nem pedir documentos. A tesouraria distingue imposto apurado, crédito estimado, pedido, reconhecido e recebimento previsto; somente imposto apurado e recebimento explicitamente previsto alteram o saldo, sendo o último uma hipótese não garantida. Calculadora educativa de empréstimos permanece separada de registo de operadores.
|
||||
|
||||
**Estado proposto continua BLOQUEADO para cálculo/publicação fiscal.** Foram executados testes dirigidos do formulário e fluxo mensal, typecheck e lint PHP desta adaptação; não demonstram validação jurídica, aprovação fiscal ou teste PostgreSQL/API. Não alterámos migrations nem resultados/snapshots anteriores.
|
||||
|
||||
## Actualização — fórmulas funcionais fornecidas pelo utilizador (2026-10-01)
|
||||
|
||||
Foram fornecidas expressões funcionais para lucro tributável e IRPC estimado, IVA liquidado/a pagar, ISPC, IRPS por escalões, contribuições INSS, retenções, valor aduaneiro, direitos, ICE, IVA de importação, custo fiscal total e taxa efectiva. A aprovação funcional foi registada na actualização de 2026-10-01; continuam ausentes valores versionados, fontes oficiais e assinaturas nominais de revisão.
|
||||
@@ -117,3 +127,20 @@ Ficheiros identificados pela estrutura actual para uma futura alteração: criar
|
||||
- O valor de teste 32%, 16%, 3%/4% e os demais valores sintéticos dos casos dourados não são parâmetros legais de produção. A API fiscal também não está estabilizada como contrato versionado.
|
||||
|
||||
**Decisão: parar sem alterações de código, migrations ou testes.** A pré-condição de parâmetros aprovados para produção/API/snapshot não está satisfeita. Para desbloquear, fornecer catálogo de produção com fonte legal oficial, hash, `scope_key` e vigência; configuração aprovada de arredondamento; e confirmação do ambiente isolado e da matriz IAM/RLS. As fórmulas e a matriz já declaradas aprovadas não são reabertas por este bloqueio.
|
||||
|
||||
### Implementação técnica interna da DSL (2026-10-03)
|
||||
|
||||
- `SimulationTaxRuleExpression` aceita AST `investmoz.tax.v1` com whitelist (`input`, `parameter`, `literal`, aritmética, `min`, `max`, `round`), valida dependências e rejeita ciclos/referências desconhecidas. Usa `brick/math` BigRational e arredondamento explícito por nó.
|
||||
- A governação valida esta DSL antes de guardar rascunhos. O avaliador não está ligado ao endpoint público. Valores ausentes resultam em `indeterminate`; nenhum default fiscal é introduzido.
|
||||
- Teste sintético de base 1234.56 e factor 0.16 verifica somente a mecânica, não representa taxa nem regra legal.
|
||||
- **Estado permanece BLOQUEADO para cálculo/publicação fiscal.** Fonte, vigência, snapshot, explicabilidade legal e casos fiscais dourados continuam sem integração/aprovação verificável.
|
||||
### Parâmetros versionados e modo de planeamento (2026-10-03)
|
||||
|
||||
Foi acrescentado um resolvedor interno de candidatos já autorizados: exige publicação, correspondência exacta de componente e `scope_key`, vigência na data pedida, fonte validada na mesma versão e condições. Sem candidato ou perante sobreposição retorna indeterminação. DSL `investmoz.tax.v1` agora valida a forma dos parâmetros `value`, `unit` e `conditions`. Para rever valores sem mudar a fórmula, cria-se uma nova versão governada com a mesma AST e novos parâmetros; nenhuma versão publicada é alterada.
|
||||
|
||||
O formulário distingue escolha automática de parâmetros aprovados, planeamento personalizado e ausência de cálculo. Apenas planeamento personalizado solicita valores hipotéticos. É possível guardar o rascunho sem os preencher e continuar o percurso; se iniciar o cenário, os três valores devem ser completos e válidos. O resultado genérico traz `scenario_kind=custom_planning` nos snapshots.
|
||||
|
||||
A escolha automática ainda não resolve parâmetros na página nem mostra valor/fonte porque RLS só permite consultas de governação, e o avaliador continua desligado do job público. Não abrir acesso à tabela completa: falta endpoint público que projecta apenas parâmetros/fonte seguros e integração de snapshot fiscal. Logo o gate permanece **BLOQUEADO** para cálculo/publicação fiscal.
|
||||
## Reconciliação de estado — 2026-10-03
|
||||
|
||||
A secção inicial deste documento é histórica e ficou desactualizada: já existem governação versionada, resolvedor de parâmetros publicados e o avaliador DSL `investmoz.tax.v1` com DAG/whitelist. A verificação e as lacunas actuais estão em `stage-10-technical-traceability.md`. Estado corrigido: **infraestrutura técnica parcial; cálculo fiscal legal/publicação continua bloqueado**. A nova evidência de testes é 9/9 (27 asserções) para DSL/resolvedor e 4/4 (52 asserções) para governação em PostgreSQL QA isolado. Nenhuma taxa/regra real foi activada; não há integração do avaliador com `RunSimulation` nem casos fiscais golden aprovados por Fiscalista.
|
||||
@@ -0,0 +1,32 @@
|
||||
# Etapa 5 do anexo actual / Etapa 10 histórica — rastreabilidade do motor fiscal
|
||||
|
||||
**Data da revisão:** 2026-10-03
|
||||
**Estado proposto:** infraestrutura interna parcial; cálculo fiscal público bloqueado.
|
||||
|
||||
## Estado corrigido
|
||||
|
||||
O gate histórico `stage-10-gate.md` descrevia correctamente o estado inicial, mas ficou desactualizado após a implementação de governação, resolução de parâmetros e DSL. Hoje existe um avaliador declarativo `investmoz.tax.v1` com operações allowlist e validação de DAG, aritmética `BigRational`, arredondamento explícito, indeterminação de entradas ausentes, resolução por vigência/scope/contexto e fluxo de revisão/publicação de versões. Isso não significa que o motor fiscal esteja completo ou ligado ao cálculo público.
|
||||
|
||||
| Critério | Evidência actual | Estado |
|
||||
|---|---|---|
|
||||
| DSL restrita e DAG sem ciclos | `app/Services/SimulationTaxRuleExpression.php`; `SimulationTaxRuleExpressionTest` rejeita operação desconhecida, campos extra e ciclo. | Implementado e testado como avaliador genérico. |
|
||||
| Aritmética exacta e arredondamento explícito | `Brick\Math\BigRational`; modo/escala só no nó `round`; teste verifica produto decimal e HALF_UP. | Implementado tecnicamente; política fiscal de escala/momento continua sem aprovação por componente. |
|
||||
| Ausência de parâmetro sem fallback | O avaliador retorna `indeterminate`; `SimulationTaxParameterResolver` cobre ausência, conflito, scope/contexto e mudança dentro do período. | Implementado/testado em unidades; não prova cálculo legal. |
|
||||
| Parâmetro publicado com fonte vigente | `resolvePublishedForPeriod` filtra versão publicada, fonte validada/versão coerente e vigência; endpoint/UI projectam metadados de fonte. | Infraestrutura presente; exemplar oficial/hash e revisão legal ainda não autenticados para produção. |
|
||||
| Governação, concorrência e histórico | `SimulationTaxRuleGovernance`, migration `2026_10_03_170000_create_simulation_tax_rule_governance.php` e `SimulationTaxRuleGovernanceTest`: separação de funções, optimistic locking, hash-chain, RLS/eventos imutáveis, revogação e vigências sobrepostas. | Implementado e testado no QA; papéis configurados vazios por defeito e sem regra fiscal real aprovada. |
|
||||
| Fórmulas completas de IRPC, IVA, ISPC, IRPS, INSS, retenções e importação | A AST e os fixtures existentes demonstram operações genéricas; não foi encontrada integração do avaliador/resolvedor no `RunSimulation` nem matriz golden fiscal executável e ligada a fontes oficiais. | Incompleto. Nenhuma semântica tributária deve ser inferida a partir das operações genéricas. |
|
||||
| Explicabilidade por linha e snapshot fiscal reproduzível | O avaliador emite passos de nós; não incorpora por si só regra/fonte/artigo/vigência em cada linha nem persiste o resultado dessa execução fiscal no snapshot do cálculo público. | Parcial/incompleto. |
|
||||
| Aprovação dos casos golden por Fiscalista | Testes sintéticos de DSL/resolvedor/governação; faltam casos fiscais assinados contra texto oficial consolidado e vigência. | Pendente. |
|
||||
| Segurança da leitura pública | Endpoint de resolução consulta somente parâmetros publicados expostos pela policy específica; governação permanece privada. O motor de execução não chama esse endpoint. | Separação implementada; integração/end-to-end pendente. |
|
||||
|
||||
## Verificação desta revisão
|
||||
|
||||
- `php artisan test --filter='SimulationTaxRuleExpressionTest|SimulationTaxParameterResolverTest'` — 9/9 testes, 27 asserções.
|
||||
- `php artisan test --filter=SimulationTaxRuleGovernanceTest` — 4/4 testes, 52 asserções, em PostgreSQL 17/PostGIS isolado na porta 55441, com o login QA configurado; servidor parado após a execução.
|
||||
- A porta operacional 5432 não foi usada. Não foram alterados código, dados, migrations ou parâmetros.
|
||||
|
||||
## Decisão do gate
|
||||
|
||||
Actualizar o estado de “avaliador ausente” para **infraestrutura interna parcial**. Manter **bloqueada a execução/publicação de cálculo fiscal legal** até obter fontes oficiais consolidadas e vigentes, interpretação/aprovação competente, parâmetros e arredondamento por âmbito, casos golden aprovados, explicabilidade/fonte no resultado e integração de snapshot/API testada. Não codificar taxas neste incremento.
|
||||
|
||||
Rollback desta tranche documental: remover este ficheiro e as adendas que a referenciam; não há alteração de schema/dados a reverter.
|
||||
@@ -1,5 +1,7 @@
|
||||
# Etapa 11 — Aduanas, câmbio e cenários
|
||||
|
||||
> **Nota de correspondência:** este gate conserva a numeração de um pedido anterior. No anexo actual, aduaneiro/cambial pertence à Etapa 10 — Incentivos e extensões sectoriais; a Etapa 11 actual é a verificação global e preparação de entrega, registada em `docs/investmoz/simulator-evolution-progress.md`.
|
||||
|
||||
**Estado proposto: BLOQUEADO — não iniciada.** A Etapa 11 depende da aprovação/conclusão do motor principal e das fontes legais da Etapa 10. A Etapa 10 continua bloqueada por falta de parâmetros de produção versionados com fontes oficiais, arredondamento definido e gates técnicos/API/RLS/testes por demonstrar.
|
||||
|
||||
## Pré-condições e evidência disponível
|
||||
@@ -37,3 +39,22 @@ As taxas de teste do anexo são fixtures de QA e não valores legais. Os casos d
|
||||
- Rollback: remover apenas este documento, caso a sua criação seja revertida; sem rollback de schema/dados.
|
||||
|
||||
**Decisão proposta: manter BLOQUEADO e parar na Etapa 11 até todas as pré-condições acima terem evidência verificável.**
|
||||
|
||||
## Reavaliação da Etapa 11 global — 2026-10-03
|
||||
|
||||
A secção histórica acima trata a antiga Etapa 11 de aduaneiro/câmbio; no anexo sequencial actual, esse tema corresponde à Etapa 10. Não se usa a dependência ali descrita para bloquear a verificação global: a Etapa 11 actual foi iniciada e a suite QA abaixo pode avançar enquanto regras fiscais permanecem inactivas.
|
||||
|
||||
- PostgreSQL 17.11/PostGIS 3.6, UTF-8, base descartável `investmoz_test` na porta 55441, PHP 8.5.11: `php vendor/bin/phpunit` passou 237/237 testes e 2.503 assertions após corrigir a consulta RLS do teste de governação. QA parado; 5432 não utilizada.
|
||||
- Frontend 113/113; TypeScript passou; PHPStan 0 erros; Pint dirigido e `git diff --check` passaram. `composer run lint:check` global ainda detecta apenas dois ficheiros preexistentes fora desta tranche, listados no registo de evolução.
|
||||
- Estado da Etapa 11 actual: parcial, não bloqueada pela Etapa fiscal. Acessibilidade manual, reconciliação administrativa do incidente QA antigo e gates fiscais/humanos ainda carecem de tratamento próprio. Não houve publicação nem activação externa.
|
||||
|
||||
Consultar `docs/investmoz/simulator-evolution-progress.md` para comandos, detalhes dos resultados e limitações.
|
||||
|
||||
### Revalidação automatizada posterior — 2026-10-03
|
||||
|
||||
- Suite PHP `php artisan test`: 251/251 testes, 2.586 asserções, em PostgreSQL 17 descartável na porta 55441. Incluiu a migration aditiva de email nullable e os testes DUAT. O cluster foi parado; nenhum teste abriu conexão no listener 5432.
|
||||
- Suite frontend: 117/117; `npm.cmd run types:check`; check dirigido de `simulation-contract.ts` e respectivo teste; `composer run types:check` (PHPStan, 0 erros); Pint dirigido; Vite build, 2.397 módulos; todos passaram. O build continua a emitir só aviso da dependência opcional `fontaine`.
|
||||
- Esta evidência actualiza a regressão técnica automatizada, não fecha a Etapa 11 global: continuam necessários leitor de ecrã/dispositivo real, revisão de produto e gates jurídicos/fiscais. A migration não foi aplicada à base local ou de produção.
|
||||
### Suite integral após testes do rollback DUAT — 2026-10-03
|
||||
|
||||
Suite PHP `php artisan test`: 253/253 testes, 2.590 asserções, em PostgreSQL 17 isolado. Inclui os seis testes DUAT e os dois caminhos do rollback da migration. O cluster foi parado; o listener preexistente 5432 não recebeu conexão de teste. A etapa global mantém estado parcial por depender de validação manual, produto e gates legais/fiscais.
|
||||
@@ -0,0 +1,37 @@
|
||||
# Etapa 6 — rastreabilidade técnica do plano financeiro
|
||||
|
||||
**Data da auditoria:** 2026-10-03
|
||||
**Estado proposto:** requisitos técnicos nucleares cobertos; etapa permanece parcial até revisão contabilística institucional e decisão sobre limites/crédito agregado por fornecedor. Este documento não constitui validação contabilística.
|
||||
|
||||
## Rastreabilidade requisito–implementação–evidência
|
||||
|
||||
| Requisito do anexo | Implementação observada | Evidência automatizada | Estado |
|
||||
| --- | --- | --- | --- |
|
||||
| Investimento inicial, activos e fundo de maneio | `forecastBusinessPlan()` separa activos, inventário, recebíveis e valores a pagar; calcula usos iniciais e fundo de maneio líquido. | `financial forecast reconciles revenue, finance sources, working capital and monthly cash`; `losses and negative closing cash remain visible instead of being clamped to zero`. | Coberto |
|
||||
| Produtos/serviços, quantidades, preços e custos variáveis | Linhas por produto; overrides mensais de unidades, preço e custo unitário. | `monthly unit schedules drive revenue, costs, inventory and scenario volume`; `monthly prices and unit costs affect revenue, consumption and scenarios`; horizontes/quantidades inválidas rejeitados. | Coberto |
|
||||
| Compras, consumo e existências | Compras por período, prazo de entrega, stock inicial, recepção, consumo e falta estimada; agendas por produto sem transferência de stock entre linhas. | `inventory purchases, consumption, closing stock and stock shortfall reconcile independently of payments`; `inventory lead time separates monthly orders, receipts, shortages and goods still in transit`; `product inventory schedules reconcile independently and do not transfer stock between products`. | Coberto |
|
||||
| Despesas operacionais e pessoal | Despesa reconhecida e pagamento mensal são entradas distintas; cronogramas têm de cobrir todo o horizonte. | `monthly operating and payroll expense schedules remain separate from payments`; `monthly operating schedules require full horizon, exact cents and current snapshot version`. | Coberto |
|
||||
| Capital próprio, suprimentos, empréstimos e subvenções | Fontes iniciais são somadas separadamente dos usos; diferença positiva/negativa/zero tem estado explícito. | Teste principal de reconciliação financeira; interface informa falta ou excedente sem ajustar silenciosamente as entradas. | Coberto |
|
||||
| Resultados previsionais e tesouraria mensal | Resultado operacional e antes de impostos são separados dos recebimentos/pagamentos e do saldo de caixa. | `financial forecast reconciles revenue, finance sources, working capital and monthly cash`; `principal repayments affect cash but are excluded from profit expenses`. | Coberto |
|
||||
| Facturação versus cobrança; saldos de abertura | Cobrança com atraso/percentagem, recebíveis vencidos e parcelas de recebíveis de abertura entram em caixa apenas nos meses declarados; saldos por cobrar continuam visíveis. | `sales invoicing and receipts follow an optional collection lag`; `scheduled collection percentage keeps unpaid invoices in receivables`; testes de parcelas, limites e recuperação de recebíveis. | Coberto |
|
||||
| Pagamentos, passivos e fornecedores | Pagamentos de custos/compras são separados do custo reconhecido; compras podem declarar lead time e parcelas, com montantes não pagos no horizonte expostos. | `monthly variable purchase payments affect cash independently from inventory orders and profit`; `supplier payment terms drive purchase cash flow and expose amounts due beyond the horizon`; `supplier order installments reconcile exact cents, cash dates and unallocated balances`. | Coberto no nível da encomenda |
|
||||
| Juros versus capital reembolsado | Juros afectam resultado e pagamento; capital reembolsado reduz caixa, não despesa operacional. | `principal repayments affect cash but are excluded from profit expenses`. | Coberto |
|
||||
| Depreciação contabilística versus fiscal | Depreciação linear configurada no plano é reconhecida apenas no resultado contabilístico; a ponte fiscal mantém matéria colectável indeterminada. | `depreciation allocation reconciles exactly over useful life`; exportação identifica matéria colectável como `indeterminate`. | Coberto sem inferência fiscal |
|
||||
| Conversão cambial de apresentação | Moeda de apresentação exige taxa, data e fonte declaradas; conversão não altera moedas-base das entradas. | `presentation currency conversion requires and reports its rate, date, and declared source`. | Coberto |
|
||||
| Pressupostos editáveis, snapshots e exportação reproduzível | Snapshots versionados restauram pressupostos; CSV inclui fórmulas, pressupostos, período, moeda, resultado, limitações e neutralização de fórmulas de spreadsheet. | `versioned plan snapshots restore assumptions and reject unsupported or oversized data`; `business plan export carries its assumptions, formulas, period, currency, and matching result`; testes de CSV mensal e de fórmulas. | Coberto |
|
||||
|
||||
## Pendências delimitadas
|
||||
|
||||
- O modelo de pagamentos permite termos declarados por encomenda, mas não agrega múltiplas encomendas por identidade de fornecedor nem simula limite de crédito/incumprimento partilhado. Nenhum limite, atraso ou probabilidade é presumido.
|
||||
- Não existe previsão probabilística de incumprimento nem decisão de crédito; saldos e défices são estimativas determinísticas baseadas nas entradas declaradas.
|
||||
- É necessária revisão contabilística institucional da classificação, convenções de projeção e do uso empresarial antes de qualquer declaração de conformidade ou aceitação do produto.
|
||||
- O modelo não calcula impostos; a ponte continua a expor a matéria colectável como indeterminada enquanto regras fiscais aprovadas não existirem.
|
||||
|
||||
## Verificação executada
|
||||
|
||||
- `node --test tests/frontend/business-financial-plan.test.mjs` — 35/35 testes passaram nesta auditoria.
|
||||
- A regressão frontend mais recente antes desta auditoria passou 118/118; o build Vite passou com 2.397 módulos. Esta auditoria não alterou código do plano financeiro.
|
||||
|
||||
## Decisão de gate
|
||||
|
||||
Propor **Etapa 6 tecnicamente coberta no escopo do anexo**, mantendo o gate global da etapa **parcial** até revisão contabilística e decisão explícita sobre modelação de exposição agregada a fornecedores. Não publicar uma alegação de aprovação contabilística, não criar cenários de incumprimento com valores inventados e não activar cálculos fiscais.
|
||||
@@ -0,0 +1,54 @@
|
||||
# Etapa 7 — rastreabilidade da ponte financeira/fiscal
|
||||
|
||||
**Data da auditoria:** 2026-10-03
|
||||
**Estado proposto:** comportamento técnico seguro coberto; integração fiscal conclusiva continua bloqueada por classificação e regras aprovadas em falta.
|
||||
|
||||
## Rastreabilidade requisito–implementação–evidência
|
||||
|
||||
| Requisito do anexo | Implementação observada | Evidência automatizada | Estado |
|
||||
| --- | --- | --- | --- |
|
||||
| Mapear os resultados financeiros com origem e período | `buildFinancialFiscalBridge()` mapeia receita, custo de vendas, despesas operacionais, pessoal, depreciação e juros por mês, mantendo a designação contabilística e `taxTreatment: unclassified`. | `financial to fiscal bridge reconciles accounting result while leaving tax base indeterminate`. | Coberto |
|
||||
| Distinguir resultado contabilístico de matéria colectável | Resultado antes de impostos reconcilia com as linhas; base tributável fica `indeterminate`, sem montante, e lista entradas em falta. | Mesmo teste verifica montante nulo e missing inputs; `financial bridge rejects a corrupted monthly cash schedule`. | Coberto sem inferência fiscal |
|
||||
| Não presumir dedutibilidade de despesas | Nenhuma linha é marcada dedutível; bridge identifica classificação fiscal como pendente. | Testes da ponte verificam `unclassified` e reconciliação. | Coberto |
|
||||
| Separar factura, cobrança, despesa e pagamento | Receitas/despesas contabilísticas são separadas dos recebimentos, pagamentos de fornecedor, custos operacionais, pessoal, juros e reembolso de principal no caixa. | `financial bridge separates opening receivables and scheduled sales collections`; `bridge maps monthly recognised expenses but keeps scheduled payments in cash only`; teste do plano confirma capital reembolsado fora das despesas. | Coberto |
|
||||
| Proteger a projecção contra imposto desconhecido | Campo fiscal mensal vazio/omitido produz estado incompleto; saldo/fluxo líquidos totais ficam nulos/indeterminados e só são mostrados fluxos conhecidos antes do imposto. O utilizador pode declarar zero explicitamente. | `unknown assessed tax keeps the cash projection incomplete instead of assuming zero`; zero explícito passa como estimativa. | Corrigido e coberto |
|
||||
| Separar crédito, pedido, reconhecimento e recebimento do IVA | Crédito, pedido e valor reconhecido não entram em caixa; só um recebimento explicitamente previsto, com mês e valor até ao reconhecimento, pode entrar na projecção. | `keeps VAT credit stages out of cash and includes only an explicitly forecast receipt`. | Coberto |
|
||||
| Não duplicar cobranças/pagamentos nem aceitar snapshots inconsistentes | A ponte valida total facturado, cobrança por origem, saldo de recebíveis, movimentos líquidos e caixa de abertura/fecho antes de produzir o mapa. | `financial bridge rejects a corrupted monthly cash schedule`; testes de recebíveis e caixa mensal. | Coberto |
|
||||
| Comparar cenários financeiros sem criar valores fiscais | Cenários favorável/desfavorável usam percentagens declaradas e mostram quais pressupostos mudaram; não criam taxas ou matéria tributável. | `financial scenarios expose user-declared changes without creating tax values`. | Coberto |
|
||||
|
||||
## Pendências e limites
|
||||
|
||||
- Não há cálculo fiscal conclusivo, dedutibilidade, ajustamentos, retenções ou calendarização fiscal até existirem regras aprovadas por período e âmbito.
|
||||
- A calculadora educativa de tesouraria aceita um valor mensal fixo ou um calendário variável de pressupostos mensais, sem apurar impostos legais. Um mês vazio deixa o saldo total indeterminado a partir desse mês e não equivale a zero.
|
||||
- Eventual reembolso de IVA na caixa é um pressuposto de recebimento, condicionado ao montante reconhecido e mês indicado; não é promessa de liquidez nem decisão da Administração Tributária.
|
||||
- A revisão fiscal/contabilística institucional continua necessária antes de qualquer alegação de conformidade ou activação pública.
|
||||
|
||||
## Verificação executada nesta tranche
|
||||
|
||||
- `node --test tests/frontend/monthly-cashflow.test.mjs` — 7/7 passou após a alteração; testes agrupados de ponte/caixa/plano — 46/46.
|
||||
- Suite frontend completa — 119/119; `npm.cmd run types:check`; check/lint dos três ficheiros alterados; build Vite (2.397 módulos); `git diff --check` passaram.
|
||||
- O build emitiu apenas o aviso existente sobre o pacote opcional `fontaine`; `git diff --check` reportou avisos CRLF em documentos preexistentes não relacionados.
|
||||
|
||||
## Decisão proposta
|
||||
|
||||
Marcar como coberto o comportamento técnico de propagação de indeterminação e reconciliação financeira, mantendo a Etapa 7 parcial/bloqueada para imposto apurado sem pacote de regras aprovado. Não activar parâmetros nem apresentar crédito estimado como caixa.
|
||||
|
||||
## Calendário mensal variável de imposto — 2026-10-03
|
||||
|
||||
O planeador permite agora escolher entre um pressuposto fixo repetido mensalmente e um calendário de pressupostos diferentes por mês. O calendário tem exactamente uma posição por mês do horizonte; montantes são não negativos, precisão máxima de cêntimos e cada mês em branco/null permanece desconhecido. A caixa conhecida desconta os valores declarados e omite apenas imposto em falta. A partir de um mês sem valor, o saldo total fica indeterminado nesse mês e nos seguintes; fluxos mensais conhecidos e entradas de imposto posteriores continuam discriminados. Zero só vale quando introduzido explicitamente.
|
||||
|
||||
Os CSV apresentam cada pressuposto mensal, marcam meses em falta como indeterminados e declaram que imposto é pressuposto do utilizador, não cálculo nem confirmação de obrigação fiscal. Reembolsos de IVA continuam separados: estimativa, pedido e reconhecimento não entram em caixa; só recebimento condicional explicitado pode entrar.
|
||||
|
||||
**Ficheiros alterados:** `resources/js/lib/monthly-cashflow.ts`, `resources/js/components/simulation-cashflow-planner.tsx`, `tests/frontend/monthly-cashflow.test.mjs`. O calendário é local à página e não é persistido em snapshot de conta nesta tranche; o CSV é a forma de exportação. Não cria regra fiscal nem muda o motor.
|
||||
|
||||
**Verificação:** suite mensal 11/11; suite frontend 123/123; TypeScript passou; verificador `vp check` nos três ficheiros passou sem avisos depois de formatação automática. Build final `npm.cmd run build` passou após a alteração e transformou 2.397 módulos; aviso não impeditivo: pacote opcional `fontaine` ausente.
|
||||
|
||||
### Limite da verificação de interface
|
||||
|
||||
Tentei ensaiar o calendário no Edge/CDP e em PostgreSQL QA isolado. O harness existente iniciou o percurso, mas a sua extensão terminou com erro de protocolo CDP (`Object reference chain is too long`) antes das asserções do calendário. O ensaio não é evidência de aprovação browser; o artefacto falhado foi removido. O comportamento tem evidência de testes unitários, TypeScript, lint e build, mas continua pendente uma validação de interface automatizada/manual específica do calendário. PHP 8.5.11, PostgreSQL QA/55441, servidor PHP/18089 e Edge/CDP/9224 foram parados; os grants temporários foram revogados e a porta 5432 não foi usada.
|
||||
|
||||
### Ensaio isolado do componente em Edge — 2026-10-03
|
||||
|
||||
A tentativa anterior no runner de aplicação continuou a falhar por dependências de API. Para isolar a interface, montei o próprio `SimulationCashflowPlanner` numa página local servida pelo Vite, sem Laravel, API, regras fiscais ou base de dados. O ensaio Edge/CDP passou: modo fixo, calendário de 12 meses, valores variáveis nos meses 1 e 2, mês 3 indeterminado, zero explícito nos meses restantes e saldo estimado completo; viewports 320, 360, 390, 768, 1024 e 1440 px sem overflow; 24 inputs com nomes e zero excepções/falhas de rede.
|
||||
|
||||
Evidência: `docs/investmoz/simulations/simulator-cashflow-browser-2026-10-03.json`; harness: `tools/simulator-cashflow-component-browser.mjs`; montagem: `tools/simulator-cashflow-preview.html`. Este ensaio substitui a pendência anterior de automatização visual isolada do componente, mas não é teste da página Laravel, persistência, dispositivo físico ou leitor de ecrã real. Vite e Edge/CDP foram encerrados depois da recolha; nenhuma base de dados foi usada.
|
||||
@@ -0,0 +1,33 @@
|
||||
# Etapa 8 — rastreabilidade de resultados e exportação
|
||||
|
||||
**Data da auditoria:** 2026-10-03
|
||||
**Estado proposto:** CSV público e reprodução técnica cobertos; revisão assistiva e gates humanos permanecem na Etapa 2/11. O anexo não exige PDF nem assinatura digital.
|
||||
|
||||
## Matriz requisito–implementação–evidência
|
||||
|
||||
| Requisito | Implementação | Evidência | Estado |
|
||||
| --- | --- | --- | --- |
|
||||
| Resumo antes do detalhe | O resultado aritmético apresenta o total indicativo; pressupostos, fórmula, contexto, versões e referência imutável ficam em secção expansível. Plano financeiro apresenta resumo, reconciliação, ponte fiscal e linhas mensais. | `completed arithmetic CSV preserves calculation details without exporting personal data`; browser responsivo final valida estado de resultado. | Coberto |
|
||||
| Estados explícitos | Contratos distinguem calculado, estimado, indeterminado, incompleto e não aplicável; a ponte mantém matéria colectável indeterminada. Tesouraria agora mantém saldo total indeterminado quando imposto não foi informado. | `API v1 wire envelope preserves exact zero and validates indeterminate states`; `indeterminate results require missing inputs and cannot carry a numeric value`; teste Stage 7 do imposto em falta. | Coberto |
|
||||
| Exportar sem autenticação e sem PII | CSV é construído localmente a partir dos dados da simulação actual; o exportador aritmético não inclui identidade/contactos. | `completed arithmetic CSV preserves calculation details without exporting personal data`; smoke público de cálculo no Edge QA e headers alvo verificados. | Coberto |
|
||||
| Data, período, moeda, entradas, pressupostos e versões | CSV aritmético identifica exportação/resultado, período pontual sem período fiscal, execução, versão, relatório/hash e contexto; plano v17 e tesouraria v1 incluem data, horizonte, moeda, entradas, fórmulas e limitações. | `business plan export carries its assumptions, formulas, period, currency, and matching result`; teste de CSV da tesouraria e suites de simulador. | Coberto |
|
||||
| Proveniência dos valores demonstrativos | Plano empresarial e tesouraria podem abrir com exemplos predefinidos; os CSV agora dizem que os valores vêm do formulário e que os valores iniciais podem ser exemplos. A interface de tesouraria também o anuncia antes da interpretação/exportação. | Testes de CSV do plano e tesouraria verificam a declaração de proveniência. | Corrigido nesta tranche |
|
||||
| Reconciliar e preservar resultados guardados | Exportador de resultado só aceita execução concluída, snapshot decimal válido e envelope/total correspondentes; relatórios versionados exigem referência da revisão exacta e SHA-256. Snapshots dos planos preservam versões antigas. | `versioned arithmetic report reference requires the exact current snapshot and a valid hash`; `versioned arithmetic CSV refuses a result envelope that differs from the legacy total`; `versioned arithmetic CSV refuses a report from another scenario revision`; testes de snapshots empresariais v1–v17. | Coberto |
|
||||
| Corrigir respostas e voltar a simular | A interface mantém respostas editáveis, reinicia/substitui o resultado no percurso existente e só exporta estados concluídos consistentes. | Testes dos contratos de criação/polling e navegador no formulário público. | Coberto tecnicamente |
|
||||
| Segurança de CSV | Valores de texto fornecidos pelo utilizador são neutralizados contra fórmulas de planilha; números negativos legítimos permanecem numéricos. | `arithmetic result CSV neutralizes formula-like report metadata`; testes equivalentes de plano e tesouraria. | Coberto |
|
||||
|
||||
## Alterações desta auditoria
|
||||
|
||||
- O CSV do plano financeiro deixou de afirmar que todos os valores foram introduzidos pelo utilizador; agora declara que são valores do formulário e que os iniciais podem ser demonstrativos.
|
||||
- A tesouraria identifica os valores predefinidos como exemplos na interface. O CSV passou a incluir data de exportação, versão `monthly-cashflow-v1`, horizonte e origem prudente dos pressupostos.
|
||||
- Nenhuma fórmula financeira, regra fiscal, API, persistência ou configuração foi alterada.
|
||||
|
||||
## Verificação
|
||||
|
||||
- Suites combinadas de plano, tesouraria e formulário: 63/63 passaram.
|
||||
- Suite frontend completa: 119/119; `npm.cmd run types:check`; build Vite com 2.397 módulos; `git diff --check` passaram.
|
||||
- O check de cinco ficheiros encontrou três avisos preexistentes de variáveis não usadas em `business-financial-plan.ts` (linhas 1420, 1461 e 1866), sem erros. Não são introduzidos nesta tranche e permanecem fora do escopo.
|
||||
|
||||
## Decisão proposta
|
||||
|
||||
Manter a Etapa 8 tecnicamente concluída para CSV e snapshots/reconciliação, com as correcções de proveniência e metadados registadas. Revisão de leitor de ecrã/dispositivo e aceitação de produto não são substituídas por suites automatizadas e continuam pendentes na Etapa 2/11.
|
||||
@@ -32,3 +32,24 @@
|
||||
## Rollback
|
||||
|
||||
Reverter apenas os ficheiros listados pelo diff desta etapa. Para reverter a migration de rascunhos, primeiro eliminar os dados de rascunho por procedimento aprovado; a migration recusa rollback enquanto houver registos. Preservar todas as alterações locais preexistentes.
|
||||
|
||||
## Validação posterior — conversão consentida da simulação (2026-10-02)
|
||||
|
||||
- O modelo `SimulationFormDraft` passou a declarar chave primária UUID não incremental, conforme a tabela PostgreSQL. Antes da correcção, Eloquent devolvia um ID numérico e as rotas UUID recusavam update/conversão.
|
||||
- Migration aditiva `2026_10_02_120000_allow_owner_to_read_soft_deleted_simulation_drafts` ajusta a policy de leitura para que o próprio actor/token possa actualizar `deleted_at`; os endpoints continuam a excluir tombstones com `whereNull('deleted_at')`. A reversão restaura a policy anterior e não apaga dados.
|
||||
- `php artisan test --filter=SimulationFormDraftTest` — 8/8 testes e 61 asserções passaram com PostgreSQL/PostGIS numa base temporária, usando um login sem `SUPERUSER`; a base e o papel temporários foram removidos. A base partilhada `investmoz_test` não foi submetida a `RefreshDatabase`.
|
||||
- A auditoria anónima é gravada na transacção, mas a policy de leitura não expõe esses eventos ao token anónimo. Os testes verificam a conversão e deduplicação sem tentar ler registos de auditoria que, correctamente, não são visíveis ao actor anónimo.
|
||||
- O gate global continua parcial: não houve submissão real para Project/CRM, teste manual com browser/leitor de ecrã nem aprovação de fluxos pelo responsável de produto.
|
||||
|
||||
## Continuação — histórico de simulações da conta (2026-10-03)
|
||||
|
||||
- Acrescentado endpoint autenticado/paginado de histórico pessoal e painel reutilizável no simulador. A API exige email verificado, omite snapshots e filtra para `owner_user_id` pessoal ou membership activa de organização; o banco aplica ainda a policy RLS.
|
||||
- Reabrir um item consulta o endpoint individual já existente, que reaplica `SimulationPolicy`; nenhum resultado é tornado público.
|
||||
- Testes feature cobrem acesso anónimo (401), conta não verificada (403), isolamento de utilizador e exclusão de campos de snapshot. **Pendente de execução:** PostgreSQL de QA `127.0.0.1:55441` está indisponível nesta sessão. Nunca executar este teste contra a base local operacional.
|
||||
- Verificações não dependentes da base: PHP lint, Pint dirigido, TypeScript, suíte frontend (73/73), parse OpenAPI, `git diff --check` e build Vite isolado (2.388 módulos) passaram. O gate permanece parcial até executar a suíte feature no PostgreSQL descartável e concluir revisão manual de teclado/leitor de ecrã.
|
||||
|
||||
## Contrato OpenAPI da conversão consentida (2026-10-03)
|
||||
|
||||
- Documentado `POST /simulation-drafts/{id}/conversions` com `simulation_id`, `consent_reuse: true`, `If-Match` e token anónimo opcional; inclui ownership, finalidade de investimento, execução concluída, verificação hash/relatório e deduplicação por `simulation_id`.
|
||||
- O contrato declara que a operação apenas anexa uma referência imutável ao rascunho; não submete projecto nem cria registo CRM. Documenta respostas 404, 409, 412, 422, 428 e 429, e não promete disponibilidade de integração externa.
|
||||
- Teste Node dedicado `tests/frontend/simulation-draft-conversion-openapi.test.mjs` — 1/1 passou; suite frontend completa — 96/96; `npm.cmd run types:check`, parse/asserção da rota OpenAPI e `git diff --check` passaram. PostgreSQL QA não estava a escutar na porta 55441 nesta execução; nenhuma chamada de banco foi feita.
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# Etapa 9 — rastreabilidade técnica da conversão para rascunho
|
||||
|
||||
**Data:** 2026-10-03
|
||||
**Estado proposto:** conversão consentida para rascunho validada tecnicamente; gate global parcial.
|
||||
|
||||
| Requisito | Implementação e evidência | Estado / limite |
|
||||
|---|---|---|
|
||||
| Só reutilizar uma simulação com consentimento explícito | `AttachSimulationToDraftRequest` exige `consent_reuse=true`; `SimulationFormDraftTest::test_completed_simulation_is_attached_with_explicit_consent_as_an_immutable_versioned_snapshot` verifica recusa sem consentimento e conversão autorizada. | Coberto. |
|
||||
| Autorizar acesso à simulação de origem | `SimulationFormDraftController::attachSimulation` verifica titularidade, token anónimo ou política de acesso à simulação e organização; teste de simulação alheia verifica resposta não autorizada. | Coberto por testes de feature. |
|
||||
| Preservar a origem e a integridade do resultado | O controller exige execução concluída, snapshot e relatório prontos, hash válido e igualdade entre os snapshots canónicos. O serviço guarda referência e snapshot da origem imutáveis no histórico do rascunho. | Coberto. A conversão não altera a simulação original. |
|
||||
| Evitar duplicação e concorrência perdida | `SimulationFormDrafts::attachSimulation` usa transação, lock da linha, deduplicação por `simulation_id` e `If-Match`/ETag; o replay não incrementa a versão. Testes cobrem repetição e versão desactualizada. | Coberto. |
|
||||
| Permitir retirar o consentimento de reutilização | Atualização com `reuse_simulation=no` remove as fontes anexadas; o teste verifica que a leitura posterior não as apresenta. | Coberto. |
|
||||
| Não aceitar fontes forjadas pelo cliente | `StoreSimulationFormDraftRequest` só aceita campos permitidos e não aceita `simulation_sources`; testes verificam a rejeição da origem forjada. | Coberto. |
|
||||
| Documentar o contrato público | OpenAPI descreve `POST /simulation-drafts/{id}/conversions`, consentimento, ETag, deduplicação e respostas de erro; `tests/frontend/simulation-draft-conversion-openapi.test.mjs` valida a rota. | Coberto. |
|
||||
| Não bloquear manifestação directa quando o cálculo fiscal está incompleto | O resultado concluído mantém a ligação pública `/manifestar-interesse`, que não recebe o snapshot nem depende de conversão/autenticação. O CTA informa que os dados da simulação não são partilhados. | Coberto pelo teste `simulator-entry.test.mjs`; a rota pública existente é coberta por `PublicPortalNavigationTest`. |
|
||||
| Submeter formalmente o projecto / integrar com CRM | A API apenas anexa a simulação ao rascunho do formulário de investidor. Não cria Project, submissão formal nem entidade CRM. | Fora do comportamento implementado; requer fluxo e gate próprios. |
|
||||
| Validar o fluxo no browser e aprovar o produto | Não há nesta tranche evidência de ensaio manual completo com leitor de ecrã/dispositivo, nem aprovação operacional de submissão. | Pendente para o gate global. |
|
||||
|
||||
## Verificação executada
|
||||
|
||||
- `php artisan test --filter=SimulationFormDraftTest` — **10/10 testes**, **79 asserções**.
|
||||
- PostgreSQL 17/PostGIS descartável, base `investmoz_test`, porta `55441`, login sem `SUPERUSER`; instância parada após o teste.
|
||||
- A base operacional na porta `5432` não foi usada.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remover apenas este documento e a respectiva adenda do ledger para reverter o registo desta auditoria. Não houve alteração de código, migration ou dados persistentes nesta tranche.
|
||||
@@ -0,0 +1,175 @@
|
||||
"record_state","source_sha256","source_table_index","source_table_row","source_table_caption","source_key_literal","source_title_literal","source_type_literal","documented_relation_literal","source_location_literal","source_cost_literal","source_currency_header_literal","source_horizon_literal","responsible_person_or_entity","phase_or_execution_status","review_flags"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","2","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02","PDEC – Programa de Desenvolvimento Integrado do Corredor de Nacala","Âncora","Programa estruturante que integra logística, indústria, agricultura, energia, água e social","Região do Corredor de Nacala (Nampula, Cabo Delgado, Niassa, Tete + N da Zambézia)","2.430.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","3","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C01","Parque Industrial de Nacala","Complementar","Zona industrial que é alimentada pelo PDEC (investimento e empregos)","Baía de Nacala (Nampula)","16.100.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","4","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C02","Cinturão Industrial de Nacala (desenvolvimento)","Complementar","Expansão industrial que é alimentada pelo PDEC (diversificação produtiva)","Baía de Nacala (Nampula)","50.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","5","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C03","Estrada de Acesso ao Porto de Nacala","Complementar","Infra-estrutura logística que alimenta o PDEC (fluxo rodoviário ao porto)","Nacala (Nampula)","30.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","6","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C04","Terminal Multimodal & Pátio de Manobras Ferroviárias de Nacala","Complementar","Integração porto–ferrovia que alimenta o PDEC","Nacala (Nampula)","120.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","7","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C05","Gerador termoeléctrico de urgência (30–40 MW) – Baía de Nacala","Complementar","Energia que alimenta o PDEC (capacidade imediata)","Baía de Nacala (Nampula)","46.265.625","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","8","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C06","Usina Termoeléctrica de Nacala","Complementar","Geração que alimenta o PDEC (base energética industrial)","Baía de Nacala (Nampula)","150.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","9","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C07","Expansão do Abastecimento de Água Urbana de Nacala","Complementar","Água que alimenta o PDEC (uso urbano/industrial)","Nacala (Nampula)","10.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","10","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C08","Melhoria da Gestão das ZEEs/ZFIs","Complementar","Regulação/Institucional que suporta o PDEC (ambiente de negócios)","Região do Corredor","2.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","11","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C09","Anel (Bypass) Rodoviário Sul de Nampula","Complementar","Mobilidade urbana/logística que alimenta o PDEC","Nampula","80.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","12","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C10","Bypass Ferroviário de Nampula","Complementar","Fluxo ferroviário que alimenta o PDEC (segregação de tráfego)","Nampula","60.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","13","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C11","Terminal Multimodal & Transferência do Pátio Ferroviário de Nampula","Complementar","Integração urbana–logística que alimenta o PDEC","Nampula","50.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","14","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C12","Melhoria das Passagens de Nível – Nampula","Complementar","Segurança/eficiência que alimenta o PDEC","Nampula","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","15","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C13","Anel Rodoviário de Cuamba","Complementar","Mobilidade/logística que alimenta o PDEC (ligação interior)","Cuamba (Niassa)","20.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","16","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C14","Parque Industrial de Cuamba","Complementar","Zona industrial que é alimentada pelo PDEC (interior)","Cuamba (Niassa)","15.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","17","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C15","Melhoria da Estrada Cuamba–Marrupa","Complementar","Acesso rodoviário que alimenta o PDEC","Niassa","50.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","18","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C16","Porto de Palma","Complementar","Porto que alimenta o PDEC (cadeia de gás/fornecimentos)","Palma (Cabo Delgado)","100.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","19","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C17","Usina Termoeléctrica de Palma","Complementar","Geração que alimenta o PDEC (apoio gás/indústria)","Palma (Cabo Delgado)","75.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","20","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C18","Abastecimento de Água Urbano de Palma","Complementar","Água que alimenta o PDEC (urbano/industrial)","Palma (Cabo Delgado)","10.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","21","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C19","Expansão Urbana de Palma","Complementar","Planeamento urbano que é alimentado pelo PDEC","Palma (Cabo Delgado)","20.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","22","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C20","Substituição de Pontes nas Estradas Pemba–Palma–Negomane","Complementar","Resiliência/ligação que alimenta o PDEC","Cabo Delgado","15.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","23","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C21","Porto Seco Central de Malawi","Complementar","Logística regional que alimenta o PDEC (fluxos Malawi)","Malawi","15.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","24","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C22","Porto Seco de Chipata","Complementar","Logística regional que alimenta o PDEC (fluxos Zâmbia)","Chipata (Zâmbia)","10.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","25","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C23","Estações de Serviço & Terminais para Camiões na N13","Complementar","Apoio rodoviário que alimenta o PDEC","N13 (Região)","10.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","26","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C24","Fronteira de Paragem Única de Mandimba","Complementar","Facilitação de comércio que alimenta o PDEC","Mandimba (Niassa)","16.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","27","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C25","Melhoria Logística para a ZEE de Mocuba","Complementar","Desembaraço/fluxo que é alimentado pelo PDEC","Mocuba (Zambézia)","/ 2.000.000 /","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","28","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C26","Capacitação do Órgão Regulador do Sector Ferroviário","Complementar","Regulação/Capacidade que suporta o PDEC","Nacional/Região","3.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","29","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C27","Rede de Monitoria Meteorológica & Hidrológica","Complementar","Gestão hídrica que suporta e alimenta o PDEC","Região do Corredor","15.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","30","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C28","Barragem de Sanhute (Abastecimento Urbano de Nacala)","Complementar","Água que alimenta o PDEC (segurança hídrica)","Nacala (Nampula)","40.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","31","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C29","Estudo de GIRH – Baía de Nacala & Bacia do Lúrio","Complementar","Planeamento hídrico que suporta o PDEC","Nampula/Niassa","3.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","32","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C30","Barragem de Monte Tiza (Nampula)","Complementar","Água que alimenta o PDEC","Nampula","60.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","33","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C31","Melhoria de Subestações de Nampula e Nacala","Complementar","Distribuição eléctrica que alimenta o PDEC","Nampula/Nacala","15.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","34","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C32","LT Chimuara–Namialo–Nacala","Complementar","Transmissão que alimenta o PDEC","Sofala–Nampula","400.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","35","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C33","LT Palma–Pemba–Nacala","Complementar","Transmissão que alimenta o PDEC (fecho norte)","Cabo Delgado–Nampula","500.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","36","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C34","Produção de Briquetes de Carvão em Tete","Complementar","Energia industrial que é alimentada pelo PDEC","Tete","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","37","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C35","Desenvolvimento da Capacidade de Gestão Ambiental","Complementar","Gestão ambiental que protege e viabiliza o PDEC","Nacional/Região","3.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","38","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C36","Fortalecimento do Processo de Aquisição de DUAT","Complementar","Governança de terra que suporta o PDEC","Nacional/Região","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","39","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C37","Capacidades para o Processo de Reassentamento","Complementar","Salvaguardas sociais que viabilizam o PDEC","Nacional/Região","2.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","40","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C38","Gestão Escolar Baseada na Comunidade","Complementar","Capital humano que suporta o PDEC (educação básica)","Região do Corredor","3.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","41","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C39","Melhoria do Secundário (Ciências e Matemática)","Complementar","Capital humano que suporta o PDEC (skills STEM)","Região do Corredor","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","42","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C40","Escola Técnico-Profissional (Nível Médio) – Nacala","Complementar","TVET que alimenta o PDEC (mão-de-obra técnica)","Nacala (Nampula)","8.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","43","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C41","Escola Técnico-Profissional (Nível Médio) – Cabo Delgado","Complementar","TVET que alimenta o PDEC","Cabo Delgado","8.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","44","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C42","Instituto Superior Politécnico – Nacala","Complementar","Ensino superior que alimenta o PDEC","Nacala (Nampula)","15.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","45","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C43","Instituto Superior Politécnico – Cabo Delgado","Complementar","Ensino superior que alimenta o PDEC","Cabo Delgado","15.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","46","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C44","Melhoria da Gestão do Desenvolvimento Regional do Corredor","Complementar","Coordenação institucional que suporta o PDEC","Região do Corredor","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","47","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C45","Ligação entre Megaprojectos e Indústrias Locais","Complementar","Encadeamentos produtivos que são alimentados pelo PDEC","Região do Corredor","3.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","48","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C46","Apoio a Pequenos Agricultores (DUAT) – Áreas Menos Acessíveis","Complementar","Inclusão produtiva que é alimentada pelo PDEC","Áreas menos acessíveis","4.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","49","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 - C47","Melhoria de Escolas Primárias – Áreas Menos Acessíveis","Complementar","Serviço social que suporta o PDEC","Áreas menos acessíveis","10.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","11","50","Tabela 6. Projecto A03 – Programa de Desenvolvimento Integrado do Corredor de Nacala (PDEC) e Complementares – Zona Norte","A02 – C48","Melhoria de Centros de Saúde – Áreas Menos Acessíveis","Complementar","Serviço social que suporta o PDEC (saúde básica)","Áreas menos acessíveis","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","2","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02","Crusse Jamali – Zona Económica Especial de Turismo","Âncora (Privado)","","Nampula (Nacala)","99.200.000 / /","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","3","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C01","Expansão e Modernização do Porto de Nacala","Complementar Público — Portos & Aeroportos","logística turística, importação de materiais e acesso marítimo","Nampula (Nacala)","250.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","4","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C02","Aeroporto Internacional de Nacala – Terminal Turístico","Complementar Público — Portos & Aeroportos","acesso aéreo de turistas e conexões internacionais","Nampula (Nacala)","45.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","5","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C03","Zona Económica Especial de Nacala – Expansão Fase II","Complementar Público — Zona/Parque Económico","aumento da procura turística e comercial","Nampula (Nacala)","115.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","6","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C04","Ferrovia Nacala – Cuamba – Malawi","Complementar Público — Ferrovia","transporte de materiais e ligação turística regional","Nampula – Niassa","425.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","7","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C05","Reabilitação da Estrada Nampula – Nacala (EN8)","Complementar Público — Infra-estructuras rodoviárias","acesso rodoviário para turistas e fornecimentos","Nampula","115.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","8","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C06","Via Rápida Nacala – Ilha de Crusse Jamali – Estrada de Acesso ao Resort","Complementar Público — Infra-estructuras rodoviárias","acessibilidade directa à zona turística","Nampula (Nacala)","100.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","9","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C07","Desenvolvimento de Resorts e Infra-estrutura Turística Integrada (Fase II)","Complementar Público — Infra-estrutura Turística","atrai investimento turístico e serviços complementares","Nampula (Crusse Jamali)","180.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","10","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C08","Instituto Técnico de Hotelaria e Turismo de Nacala","Complementar Público — Formação / Capital Humano","formação de mão-de-obra especializada para turismo e hotelaria)","Nampula","13.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","11","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C09","Subestação de Nacala – 220/110 kV","Complementar Público — Energia","abastecimento eléctrico fiável para resorts, marina e infra-estructuras)","Nampula","22.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","12","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C10","Linha de Transmissão Cuamba – Nacala (400 kV)","Complementar Público — Energia","reforço da rede eléctrica turística e comercial","Nampula – Niassa","335.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","13","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C11","Sistema de Abastecimento de Água – Nacala & Zona Turística Crusse Jamali","Complementar Público — Água & Hidráulica","infra-estrutura de água potável e usos turísticos","Nampula","50.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","14","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C12","Centro Nacional de Certificação de Serviços Turísticos","Complementar Público — Regulação & Qualidade","certificação de serviços e padrões turísticos internacionais","Maputo / Nampula","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","12","15","Tabela 7. Projecto A04 – Crusse Jamali – Zona Económica Especial de Turismo e complementares – Zona Norte","A02 - C13","Rede Nacional de Telecomunicações – Backbone Nacala Digital","Complementar Público — Digital & Telecom","infra-estrutura digital e conectividade para serviços turísticos","Nampula","30.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","2","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03","Linha de Transmissão Namialo – Metoro (400 kV)","Âncora (Público-Estratégico)","—","Nampula – Cabo Delgado","550,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","3","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C01","Central Solar de Metoro (41 MW) – Expansão","Complementar Público — Produção de Energia","Alimenta o Âncora (fonte renovável para a rede de alta tensão)","Cabo Delgado (Metoro)","55,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","4","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C02","Subestação de Namialo (400/220 kV)","Complementar Público — Transmissão / Subestações","Alimenta o Âncora (interligação com a rede nacional e entrada de carga)","Nampula (Namialo)","35,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","5","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C03","Subestação de Metoro (400/220 kV)","Complementar Público — Transmissão / Subestações","É alimentado pelo Âncora (recepção e distribuição de energia para o norte)","Cabo Delgado (Metoro)","30,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","6","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C04","Interligação Metoro – Pemba – Palma (220 kV)","Complementar Público — Transmissão Regional","É alimentado pelo Âncora (expansão da rede ao eixo energético do gás e industrial)","Cabo Delgado","210,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","7","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C05","Zona Industrial de Pemba – Electrificação Fase II","Complementar Público — Zonas Industriais","Alimenta o Âncora (nova procura e carga industrial)","Cabo Delgado (Pemba)","18,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","8","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C06","Zona Industrial de Nacala – Electrificação e Expansão","Complementar Público — Zonas Industriais","É alimentado pelo Âncora (suprimento energético para parques logísticos e industriais)","Nampula (Nacala)","22,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","9","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C07","Estrada Metoro – Palma – Afungi (Infra-estrutura de Acesso Energético)","Complementar Público — Infra-estrutura Rodoviária","Alimenta o Âncora (facilita transporte de materiais, manutenção e construção)","Cabo Delgado","180,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","10","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C08","Centro Técnico de Formação em Transmissão e Manutenção de Redes","Complementar Público — Formação / Capital Humano","Alimenta o Âncora (formação de técnicos e operadores para rede de alta tensão)","Nampula","15,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","11","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C09","Sistema Regional de Abastecimento de Água – Namialo / Metoro / Pemba","Complementar Público — Água & Hidráulica","Alimenta o Âncora (apoio logístico, obras e manutenção do corredor energético)","Nampula – Cabo Delgado","55,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","12","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C10","Centro Nacional de Monitorização e Supervisão da Rede Norte","Complementar Público — Digital & Automação","Integra a cadeia do Âncora (monitorização digital em tempo real e manutenção preditiva)","Maputo / Nampula","22,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","13","13","Tabela 8. Projecto A05 - Linha de Transmissão Namialo – Metoro (400 kV) e complementares – Zona Norte","A03 - C11","Regulador Nacional de Redes de Alta Tensão – Plataforma de Certificação e Supervisão","Complementar Público — Regulação & Qualidade","Integra a cadeia do Âncora (certificação, controlo e normas operacionais)","Maputo","8,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","2","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06","Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento","Âncora (Privado)","/ -","Tete, Manica, Zambézia, Sofala","36,710,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","3","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C01","Construção do Porto de Angoche","Complementar Público — Portos & Aeroportos","Alimenta o Âncora (exportação/importação e logística marítima do corredor de Nacala)","Nampula (Corredor de Nacala)","95,000,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","4","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C02","Concessão integrada do Porto e Aeroporto Internacional de Nacala (incl. ligação ferroviária Nacala–Nampula p/ passageiros)","Complementar Público — Portos & Aeroportos","Alimenta o Âncora (hub logístico e conectividade aérea/marítima do corredor de Nacala)","Nampula (Corredor de Nacala)","340,000,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","5","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C03","ZEE de Mocuba – Projecto de Melhoria Logística (terminal multimodal, parque industrial, hotéis, melhoria do aeroporto)","Complementar Público — Zona / /Parque Industrial","É alimentado pelo Âncora (procura industrial e agro-processing na Zambézia)","Zambézia (Mocuba)","130,000,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","6","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C04","Ferrovia Nyamayabwe – Mutuali (440 km)","Complementar Público — Ferrovia","Alimenta o Âncora (escoamento da produção agrícola e insumos)","Tete, Zambézia, Nampula (Corredores Beira/Nacala)","1,900,000,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","7","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06- C05","Ferrovia Mapai – Massangena – Dondo (509 km)","Complementar Público — Ferrovia","Alimenta o Âncora (ligação ao corredor da Beira; interface em Dondo/Sofala)","Gaza & Sofala","1.400.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","8","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C06","Estrada (Nhamapaza/Maríngue; Maríngue/Chemba; Chemba/Sena; Sena/Caia) – Reabilitação/alargamento/asfaltagem (268 km)","Complementar Público — Infra-estructuras rodoviárias","Alimenta o Âncora (logística terrestre para insumos e escoamento)","Província de Sofala","300,000,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","9","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C07","N1 Chimuara – Nicoadala (167 km) – Início de reabilitação","Complementar Público — Infra-estructuras rodoviárias","Alimenta o Âncora (ligação primária na Zambézia para entrada/saída de carga)","Zambézia","90,000,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","10","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06- C08","Irrigação – Bacia do Rio Zambeze","Complementar Público — Agro-Indústria / Produção (Regadio)","É alimentado pelo Âncora / Integra a cadeia (expansão de área irrigada para arroz e culturas afins)","Manica, Sofala, Tete, Zambézia","1,263,000,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","11","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C09","Irrigação – Bacia do Rio Lúrio","Complementar Público — Agro-Indústria / Produção (Regadio)","Integra a cadeia (fornecimento regional via corredor de Nacala)","Cabo Delgado, Niassa, Zambézia, Nampula","280,800,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","12","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C10","Irrigação – Bacia do Rio Licungo","Complementar Público — Agro-Indústria / Produção (Regadio)","Integra a cadeia (arroz/hortícolas para abastecimento de Quelimane/Mocuba)","Zambézia","140,400,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","13","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C11","Irrigação – Bacia do Rio Buzi","Complementar Público — Agro-Indústria / Produção (Regadio)","Integra a cadeia (cana/arroz/milho/hortícolas para Beira/Chimoio)","Manica, Sofala","421,200,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","14","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C12","Subestação Zembe (2×40 MVA, 110/33 kV)","Complementar Público — Energia — Transmissão/Distribuição","Alimenta o Âncora (capacidade eléctrica para processamento/armazenagem)","Manica (Zembe–Manga)","16,500,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","15","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C13","Barragem de Mugeba","Complementar Público — Água & Hidráulica","Alimenta o Âncora (segurança hídrica/indústria/irrigação na Zambézia)","Zambézia (Mocuba)","350,000,000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","15","16","Tabela 10. Projecto A06 - Desenvolvimento da Cadeia de Valor do Arroz por Projecto de Processamento e complementares – Zona Centro","A06 - C14","Actualização de estudos – Cahora Bassa Norte (1245 MW)","Complementar Público — Energia — Transmissão/Produção","Alimenta o Âncora (capacidade de geração a montante no corredor da Beira)","Tete","7 488 000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","2","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07","Parque Têxtil Integrado","Âncora (Privado)","—","Tete, Manica, Sofala","42,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","3","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C01","Porto da Beira – Expansão e Modernização","Complementar Público — Portos & Aeroportos","Alimenta o Âncora (exportação de têxteis e importação de matérias-primas)","Sofala (Beira)","180,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","4","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C02","Terminal de Contentores – Porto de Nacala","Complementar Público — Portos & Aeroportos","Alimenta o Âncora (alternativa logística para exportação via norte)","Nampula (Nacala)","110,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|duplicate_title_requires_reconciliation|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","5","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C03","Zona Económica Especial de Nhamatanda – Plataforma Industrial","Complementar Público — Zona/Parque Industrial","É alimentado pelo Âncora (procura industrial e serviços auxiliares)","Sofala (Nhamatanda)","110,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","6","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C04","Ferrovia Beira – Moatize – Malawi (Corredor Central)","Complementar Público — Ferrovia","Alimenta o Âncora (transporte de algodão e têxteis)","Sofala, Tete","400,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","7","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C05","Ferrovia Sena – Mutarara – Lichinga","Complementar Público — Ferrovia","Alimenta o Âncora (expansão para fornecimento de algodão do Norte)","Sofala, Tete, Niassa","30,000,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","8","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C06","Reabilitação da EN6 (Beira – Machipanda)","Complementar Público — Infra-estructuras rodoviárias","Alimenta o Âncora (escoamento de produtos para mercados regionais e portos)","Sofala – Manica","120,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","9","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C07","Construção da Estrada Guro – Catandica – Mutarara","Complementar Público — Infra-estructuras rodoviárias","Alimenta o Âncora (ligação ao corredor central e zonas algodoeiras)","Manica – Tete","380,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","10","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C08","Fábrica de Algodão Hospitalar e Têxteis Técnicos","Complementar Público — Agro-Indústria / Produção","É alimentado pelo Âncora (matéria-prima e expansão da cadeia têxtil)","Sofala (Nhamatanda)","40,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","11","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C09","Programa Nacional de Formação em Indústria Têxtil e Moda","Complementar Público — Formação / Capital Humano","Alimenta o Âncora (mão-de-obra qualificada para fiação, tecelagem e confecção)","Nacional (Sofala e Maputo)","15,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","12","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C10","Subestação de Dondo – 220/110 kV","Complementar Público — Energia","Alimenta o Âncora (capacidade energética para produção contínua)","Sofala (Dondo)","30,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","13","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C11","Linha de Transmissão Matambo – Nhamatanda (220 kV)","Complementar Público — Energia","Alimenta o Âncora (transmissão eléctrica fiável)","Sofala – Tete","180,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","14","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C12","Sistema de Abastecimento de Água de Dondo – Nhamatanda","Complementar Público — Água & Hidráulica","Alimenta o Âncora (processos industriais e tinturaria)","Sofala (Nhamatanda)","30,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","16","15","Tabela 11. Projecto A07 - Parque Têxtil Integrado e Complementares – Zona Centro","A07 - C13","Centro Nacional de Certificação Têxtil e Padronização","Complementar Público — Regulação & Qualidade","Integra a cadeia do Âncora (certificação de exportação e padrões técnicos)","Maputo / Sofala","11,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","2","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08","Zona Económica Especial de Mocuba","Âncora (Público-Industrial)","—","Zambézia (Mocuba, Munhamade)","37,400,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","3","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08- C01","Expansão e Modernização do Porto de Quelimane","Complementar Público — Portos & Logística","Alimenta o Âncora (exportação agrícola, importação de insumos e ligação marítima)","Zambézia (Quelimane)","67.558.964,79","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","4","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08 - C02","Terminal de Contentores – Porto de Nacala","Complementar Público — Portos & Aeroportos","Alimenta o Âncora (alternativa logística para exportação/importação via norte)","Nampula (Nacala)","300.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|duplicate_title_requires_reconciliation|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","5","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08- C03","Ferrovia Mocuba – Nacala (Integração Logística)","Complementar Público — Ferrovia","Alimenta o Âncora (transporte de matérias-primas e produtos transformados)","Zambézia – Nampula","1.000.000. 000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","6","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08- C04","Reabilitação da EN1 – Trecho Nicoadala – Mocuba – Caia","Complementar Público — Infra-estructuras rodoviárias","Alimenta o Âncora (acesso rodoviário a insumos e mercados)","Zambézia – Sofala","100,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","7","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08 - C05","Estrada Mocuba – Milange – Fronteira com Malawi","Complementar Público — Infra- estructuras rodoviárias","Alimenta o Âncora (conectividade transfronteiriça para exportação agrícola)","Zambézia","150.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","8","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08 - C06","Plataforma Industrial de Processamento Agroalimentar – Fase II","Complementar Público — Agro-Indústria / Produção","É alimentado pelo Âncora (procura por zonas industriais e processamento de matérias-primas)","Zambézia (Mocuba)","170.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","9","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08- C07","Complexo de Silvicultura e Biomassa Industrial","Complementar Público — Agro-Indústria / Silvicultura","É alimentado pelo Âncora (uso de recursos florestais e biomassa energética)","Zambézia","50.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","10","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08- C08","Centro de Desenvolvimento Pecuário de Mocuba","Complementar Público — Agro-Indústria / Pecuária","É alimentado pelo Âncora (produção de carne e derivados para indústria agroalimentar)","Zambézia","3.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","11","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08 - C09","Instituto Técnico Agro-Industrial de Mocuba","Complementar Público — Formação / Capital Humano","Alimenta o Âncora (formação de técnicos para agro-indústria, pecuária e silvicultura)","Zambézia","3.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","12","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08 - C10","Subestação de Mocuba – 220/110 kV","Complementar Público — Energia","Alimenta o Âncora (fornecimento eléctrico para unidades industriais)","Zambézia","28,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","13","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08 - C11","Linha de Transmissão Caia – Mocuba (220 kV)","Complementar Público — Energia","Alimenta o Âncora (reforço da capacidade energética da ZEE)","Sofala – Zambézia","80.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","14","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08- C12","Sistema de Abastecimento de Água Industrial de Mocuba","Complementar Público — Água & Hidráulica","Alimenta o Âncora (processamento agroalimentar e operações industriais)","Zambézia","163.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","15","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08 - C13","Parque Tecnológico e Plataforma Digital de Agro-Informação","Complementar Público — Digital & Inovação","Alimenta o Âncora (gestão de cadeias de abastecimento e integração digital)","Zambézia","20.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","17","16","Tabela 12. Projecto A08 – Zona Económica Especial de Mocuba e Complementares – Zona Centro","A08 – C14","Agência de Certificação de Produtos Agroindustriais e Florestais","Complementar Público — Regulação & Qualidade","Integra a cadeia do Âncora (garantia de padrões e certificações para exportação)","Maputo / Zambézia","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","18","2","Tabela 13. Projecto A09 - Construção da Cidadela Parlamentar de Mocuba e Complementares – Zona Centro","A09","Construção da Cidadela Parlamentar de Mocuba","Âncora – Infra-estrutura Institucional","-","Mocuba – Província da Zambézia","120 000 000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","18","3","Tabela 13. Projecto A09 - Construção da Cidadela Parlamentar de Mocuba e Complementares – Zona Centro","A09 - C01","Construção do Conjunto Residencial para Deputados e Funcionários","Complementar – Infra-estructuras residenciais","Alimenta o Âncora – garante alojamento digno aos deputados provenientes de círculos eleitorais fora de Mocuba e reduz custos de arrendamento.","Mocuba – Zambézia","30 000 000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","18","4","Tabela 13. Projecto A09 - Construção da Cidadela Parlamentar de Mocuba e Complementares – Zona Centro","A09 - C02","Construção de Instalações Administrativas e Técnicas do Parlamento","Complementar – Serviços Administrativos","Integra a cadeia – assegura condições adequadas para funcionamento dos serviços técnicos, apoio às bancadas e secretariado parlamentar.","Mocuba – Zambézia","20 000 000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","18","5","Tabela 13. Projecto A09 - Construção da Cidadela Parlamentar de Mocuba e Complementares – Zona Centro","A09 - C03","Infra-estructuras de Apoio e Serviços (Hotelaria e Espaços de Lazer)","Complementar – Serviços de Suporte","Integra a cadeia – reforça a funcionalidade do complexo e apoia as actividades parlamentares e protocolares.","Mocuba – Zambézia","10 000 000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","18","6","Tabela 13. Projecto A09 - Construção da Cidadela Parlamentar de Mocuba e Complementares – Zona Centro","A09 - C04","Melhoria do Acesso Viário e Estacionamento no Perímetro Parlamentar","Complementar – Infra-estructuras urbanas","Alimenta o Âncora – resolve problemas de mobilidade e estacionamento, facilitando a circulação e logística durante as sessões plenárias.","Mocuba – Zambézia","8 000 000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","18","7","Tabela 13. Projecto A09 - Construção da Cidadela Parlamentar de Mocuba e Complementares – Zona Centro","A09 - C05","Sistema Integrado de Segurança e TIC Parlamentares","Complementar – Tecnologias e Segurança","Integra a cadeia – garante segurança do complexo, comunicação eficiente e modernização dos processos legislativos.","Mocuba – Zambézia","12 000 000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","19","2","Tabela 14. Projecto A10 - Mphanda Nkuwa HPP – Hidroeléctrica – Zona Centro","A10","Mphanda Nkuwa HPP","Âncora","-","Tete (Rio Zambeze)","4.500.000.000 /","Custo (USD/ MZN)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_ambiguous_mixed_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","19","3","Tabela 14. Projecto A10 - Mphanda Nkuwa HPP – Hidroeléctrica – Zona Centro","A10 - C01","Cahora Bassa Norte (HCB)","Complementar-Hidroeléctrica","Complementar – reforça capacidade de geração e estabilidade da rede nacional","Tete (Montante de Mphanda Nkuwa)","800.000.000","Custo (USD/ MZN)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_ambiguous_mixed_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","19","4","Tabela 14. Projecto A10 - Mphanda Nkuwa HPP – Hidroeléctrica – Zona Centro","A10 - C02","Linhas de Transmissão Alta Tensão Tete-Maputo (STE)","Complementar - Infra-estrutura de transporte","Essencial – evacuação da energia de Mphanda Nkuwa e integração no sistema nacional","Tete – Sul de Moçambique","2.400.000.000","Custo (USD/ MZN)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_ambiguous_mixed_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","19","5","Tabela 14. Projecto A10 - Mphanda Nkuwa HPP – Hidroeléctrica – Zona Centro","A10 - C03","Expansão da Rede Nacional EDM","Complementar - Infra-estrutura eléctrica","Complementar – reforço da capacidade de transporte e distribuição de energia gerada","Nacional","500.000.000","Custo (USD/ MZN)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_ambiguous_mixed_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","19","6","Tabela 14. Projecto A10 - Mphanda Nkuwa HPP – Hidroeléctrica – Zona Centro","A10 - C04","Subestações Regionais e Interligações SAPP","Complementar - Interconexão regional","Complementar – integração com o mercado regional de energia e exportação do excedente","Fronteiras regionais (SADC)","350.000.000","Custo (USD/ MZN)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_ambiguous_mixed_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","19","7","Tabela 14. Projecto A10 - Mphanda Nkuwa HPP – Hidroeléctrica – Zona Centro","A10 - C05","Projectos de Electrificação Rural (FUNAE)","Complementar - Acesso e distribuição","Indirecto – aumenta a cobertura e maximiza o impacto social da produção de energia","Zonas rurais","150.000.000","Custo (USD/ MZN)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_ambiguous_mixed_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","19","8","Tabela 14. Projecto A10 - Mphanda Nkuwa HPP – Hidroeléctrica – Zona Centro","A10 - C06","Modernização da Rede de Transporte e Controlo (SCADA)","Complementar - Sistema de controlo","Complementar – garante eficiência, estabilidade e monitorização da rede de energia","Nacional","200.000.000","Custo (USD/ MZN)","2026 – 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_ambiguous_mixed_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","20","2","Tabela 15. Projecto A11 - Corredor Ferroviário e Portuário de Macuse–Moatize e complementares – Zona Centro","A11","Corredor Ferroviário e Portuário de Macuse - Moatize","Âncora – Infra-estrutura Ferroviária e Portuária","-","Tete – Zambézia (Moatize, Mutarara, Mopeia, Nicoadala, Quelimane) / Foz do Rio Macuse, Nicoadala –","1.524.000.000 /","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","20","3","Tabela 15. Projecto A11 - Corredor Ferroviário e Portuário de Macuse–Moatize e complementares – Zona Centro","A11 - C01","Terminal de Produtos Petrolíferos de Macuse","Complementar – Terminal Energético","Integra a cadeia – Permite a movimentação de produtos petrolíferos e apoio logístico ao corredor ferroviário-portuário.","Porto de Macuse – Zambézia","45.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","20","4","Tabela 15. Projecto A11 - Corredor Ferroviário e Portuário de Macuse–Moatize e complementares – Zona Centro","A11 - C02","Infra-estructuras de Comunicação e Controlo Ferroviário","Complementar – Sistemas Tecnológicos","Alimenta o Âncora – Garante a segurança e eficiência das operações ferroviárias.","Tete – Zambézia","65.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","20","5","Tabela 15. Projecto A11 - Corredor Ferroviário e Portuário de Macuse–Moatize e complementares – Zona Centro","A11 - C03","Construção de Estações e Apeadeiros Ferroviários","Complementar – Infra-estructuras operacionais","Integra a cadeia – Inclui 2 estações principais (Moatize e Macuse), 2 intermédias (Quelimane e Mutarara) e 10 apeadeiros ao longo do traçado.","Tete – Zambézia","55.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","20","6","Tabela 15. Projecto A11 - Corredor Ferroviário e Portuário de Macuse–Moatize e complementares – Zona Centro","A11 - C04","Instalações de Manutenção e Oficinas Ferroviárias","Complementar – Suporte Operacional","Alimenta o Âncora – Assegura a manutenção do material circulante e eficiência do corredor.","Tete – Zambézia","70.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","20","7","Tabela 15. Projecto A11 - Corredor Ferroviário e Portuário de Macuse–Moatize e complementares – Zona Centro","A11 - C05","Plano de Reassentamento e Mitigação Ambiental","Complementar – Gestão Social e Ambiental","Complementar ao Âncora – Garante a mitigação dos impactos sociais e ambientais decorrentes da construção do porto e linha férrea.","Nicoadala – Zambézia","75.500.000,00","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","21","2","Tabela 16. Projecto 12 - Programa de Conectividade e Resiliência Costeira (Compacto II) e complementares – Zona Centro","A12","Programa de Conectividade e Resiliência Costeira (Compacto II)","Âncora","","Zambézia","310,500,000","Custo (USD)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","21","3","Tabela 16. Projecto 12 - Programa de Conectividade e Resiliência Costeira (Compacto II) e complementares – Zona Centro","A12 - C01","Projecto de Conectividade e Transportes Rurais (CTR)","Complementar – Projecto de Conectividade e Transportes Rurais (CTR)","O CTR é o pilar de base sobre o qual os demais projectos se apoiam, criando as condições logísticas para o escoamento agrícola e o acesso das comunidades costeiras.","Zambézia - Rio Licungo e Circular de Mocuba / Principais rotas na Zambézia","310.500.000","Custo (USD)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","21","4","Tabela 16. Projecto 12 - Programa de Conectividade e Resiliência Costeira (Compacto II) e complementares – Zona Centro","A12 - C02","Projecto de Promoção da Reforma e do Investimento na Agricultura (PRIA)","Complementar – Agricultura","Representa o eixo económico e produtivo do Compacto II. Actua sobre as reformas fiscais e institucionais que incentivam o investimento privado e a formalização do sector agrícola, aproveitando as infra-estructuras criadas pelo CTR","Zambézia","30.000.000","Custo (USD)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","21","5","Tabela 16. Projecto 12 - Programa de Conectividade e Resiliência Costeira (Compacto II) e complementares – Zona Centro","A12 - C03","Projecto de Meios de Vida Costeiros e Resiliência Climática (CLCR)","Complementar – Pesca","O CLCR assegura que o desenvolvimento promovido pelo CTR e PRIA seja ecologicamente equilibrado e resiliente às mudanças climáticas.","Zambézia","100.000.000","Custo (USD)","2026 - 2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","2","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13","Vilanculos – Região Integrada de Turismo","Âncora (Privado)","—","Inhambane (Vilanculos)","20,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","3","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C01","Reabilitação e Expansão do Porto de Inhambane","Complementar Público — Portos & Aeroportos","Alimenta o Âncora (apoio logístico marítimo, cruzeiros e transporte costeiro)","Inhambane","80,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","4","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C02","Modernização do Aeroporto de Inhambane – Terminal Turístico","Complementar Público — Portos & Aeroportos","Alimenta o Âncora (entrada aérea de turistas e ligação internacional)","Inhambane","25,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","5","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C03","Reabilitação da EN1 – Trecho Maxixe – Inhassoro","Complementar Público — Infra-estructuras rodoviárias","Alimenta o Âncora (acessibilidade terrestre ao destino turístico)","Inhambane","120,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","6","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C04","Estrada Costeira Vilanculos – Inhassoro – Bazaruto","Complementar Público — Infra-estructuras rodoviárias","Alimenta o Âncora (melhora conectividade entre destinos turísticos costeiros)","Inhambane","120,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","7","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C05","Complexo Turístico Bazaruto – Fase II (resorts, marina, zona residencial)","Complementar Público — Infra-estrutura Turística","É alimentado pelo Âncora (aumento da procura turística e serviços complementares)","Inhambane (Bazaruto – Inhassoro)","150,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","8","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C06","Escola Técnica de Hotelaria e Turismo – Inhambane","Complementar Público — Formação / Capital Humano","Alimenta o Âncora (formação de recursos humanos qualificados para hotelaria e turismo)","Inhambane","12,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","9","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C07","Centro de Formação Profissional e Empreendedorismo Costeiro","Complementar Público — Formação / Inclusão Social","Alimenta o Âncora (capacitação local e inclusão económica da comunidade)","Inhambane","8,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","10","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C08","Subestação Vilanculos – Inhassoro (110 kV)","Complementar Público — Energia","Alimenta o Âncora (fornecimento eléctrico fiável para empreendimentos turísticos)","Inhambane","25,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","11","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C09","Extensão da Rede de Transmissão Massinga – Inhassoro","Complementar Público — Energia","Alimenta o Âncora (reforço da rede para expansão turística)","Inhambane","28,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","12","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C10","Sistema de Abastecimento de Água de Inhassoro e Vilanculos","Complementar Público — Água & Hidráulica","Alimenta o Âncora (infra-estrutura de água potável e saneamento turístico)","Inhambane","40,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","13","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C11","Centro de Certificação e Inspecção de Serviços Turísticos","Complementar Público — Regulação & Qualidade","Integra a cadeia do Âncora (garantia de padrões e certificação turística)","Maputo / Inhambane","5,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","23","14","Tabela 18. Projecto A13 - Vilanculos – Região Integrada de Turismo e Complementares – Zona Sul","A13 - C12","Rede Digital Turística – Inhambane Smart Tourism Network","Complementar Público — Digital & Telecom","Alimenta o Âncora (conectividade digital, reservas online e plataformas de turismo)","Inhambane","15,000,000","Custo Total (USD)","2026 –2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","24","2","Tabela 19. Projecto A11 - Criação da Zona Económica Especial de Agronegócio do Limpopo (ZEEA-L) e complementares – Zona Sul","A14","Criação da Zona Económica Especial de Agronegócio do Limpopo (ZEEA-L)","Âncora Público","-","Gaza – Chókwè, Xai-Xai, Guijá, Chongoene, Chibuto, Limpopo, Bilene","354.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","24","3","Tabela 19. Projecto A11 - Criação da Zona Económica Especial de Agronegócio do Limpopo (ZEEA-L) e complementares – Zona Sul","A14 - C01","Reabilitação e Modernização do Perímetro Irrigado do Baixo Limpopo (PBL)","Complementar Público – Agricultura Irrigada","Alimenta o Âncora (expansão da base produtiva agrícola e aumento da produtividade)","Gaza – Chókwè e Xai-Xai","96.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","24","4","Tabela 19. Projecto A11 - Criação da Zona Económica Especial de Agronegócio do Limpopo (ZEEA-L) e complementares – Zona Sul","A14 - C02","Construção de Infra-estructuras Logísticas e Armazéns Agro-industriais","Complementar Público – Logística e Infra-estructuras","Alimenta o Âncora (reduz perdas pós-colheita e facilita o escoamento e armazenamento de produtos)","Gaza – Xai-Xai e Chibuto","42.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","24","5","Tabela 19. Projecto A11 - Criação da Zona Económica Especial de Agronegócio do Limpopo (ZEEA-L) e complementares – Zona Sul","A14- C03","Desenvolvimento do Parque Agro-industrial do Limpopo (PAIL)","Complementar Público – Agro-indústria","Integra a cadeia (criação de capacidade de transformação de arroz, milho, carne, óleo vegetal e hortícolas)","Gaza – Chókwè e Guijá","78.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","24","6","Tabela 19. Projecto A11 - Criação da Zona Económica Especial de Agronegócio do Limpopo (ZEEA-L) e complementares – Zona Sul","A14 - C04","Projecto de Electrificação e Infra-estructuras de Energia para a ZEEA-L","Complementar Público – Energia","Alimenta o Âncora (garante fornecimento de energia a unidades industriais e sistemas de irrigação)","Gaza – ZEEA-L","38.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","24","7","Tabela 19. Projecto A11 - Criação da Zona Económica Especial de Agronegócio do Limpopo (ZEEA-L) e complementares – Zona Sul","A14- C05","Construção de Estradas de Acesso às Zonas de Produção e Mercados","Complementar Público – Infra-estructuras rodoviárias","Alimenta o Âncora: melhora o escoamento e ligações entre áreas produtivas e centros de consumo/ / exportação)","Gaza – Chókwè, Chibuto e Bilene","155.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","24","8","Tabela 19. Projecto A11 - Criação da Zona Económica Especial de Agronegócio do Limpopo (ZEEA-L) e complementares – Zona Sul","A14 - C06","Centro de Capacitação e Extensão Agrária","Complementar Público – Desenvolvimento Humano","Integra a cadeia (forma agricultores, técnicos e PME agro-industriais para inserção no mercado)","Gaza – Xai-Xai","12.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","24","9","Tabela 19. Projecto A11 - Criação da Zona Económica Especial de Agronegócio do Limpopo (ZEEA-L) e complementares – Zona Sul","A14 - C07","Programa de Apoio ao Crédito Agrícola e Financiamento de PME Agro-industriais","Complementar Público – Finanças Rurais","Integra a cadeia (facilita acesso a financiamento para produtores e transformadores locais)","Gaza – ZEEA-L","25.000.000","Custo (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","2","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15","Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo","Âncora (Público-Agrícola)","—","Maputo (Boane, Moamba, Namaacha)","480,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","3","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15 - C01","Barragem de Corumana – Reabilitação e Aumento de Capacidade","Complementar Público — Infra-estrutura Hídrica","Alimenta o Âncora (aumenta a disponibilidade de água para irrigação agrícola)","Maputo (Moamba)","250,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","4","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15- C02","Barragem de Moamba Major – Conclusão e Operacionalização","Complementar Público — Infra-estrutura Hídrica","Alimenta o Âncora (garantia de segurança hídrica para regadio e consumo humano)","Maputo (Moamba)","9.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","5","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15 - C03","Sistema de Canais Primários e Secundários de Irrigação – Baixo Incomáti","Complementar Público — Irrigação / Distribuição","Alimenta o Âncora (expansão e modernização da rede de irrigação agrícola)","Maputo (Boane – Namaacha)","20.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","6","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15 - C04","Sistema de Drenagem e Controlo de Salinidade – Zona do Incomáti","Complementar Público — Irrigação / Infra-estrutura","É alimentado pelo Âncora (melhoria da produtividade agrícola e controlo de solos)","Maputo","15.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","7","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15 - C05","Infra-estrutura Agrícola para Produção de Arroz, Hortícolas e Fruticultura","Complementar Público — Produção agro-industrial","É alimentado pelo Âncora (utilização directa da água de irrigação para produção intensiva)","Maputo","25.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","8","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15 - C06","Estradas Agrícolas de Acesso – Boane / Moamba / Namaacha (Fase II)","Complementar Público — Infra-estrutura Rodoviária","Alimenta o Âncora (escoamento da produção e acesso aos mercados)","Maputo","120,000,000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","9","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15 - C07","Centro Técnico de Formação em Irrigação e Gestão Hídrica","Complementar Público — Formação / Capital Humano","Alimenta o Âncora (capacitação de técnicos e gestores agrícolas)","Maputo","8.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","10","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15 - C08","Linha de Transmissão Boane – Namaacha (110 kV)","Complementar Público — Energia","Alimenta o Âncora (energia para bombas, estações de controlo e sistemas automatizados)","Maputo","15.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","11","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15 - C09","Sistema de Monitorização Digital de Recursos Hídricos e Irrigação (SCADA)","Complementar Público — Digital & Automação","Integra a cadeia do Âncora (gestão eficiente e controlo remoto do sistema)","Maputo","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
"review_only_not_importable","BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6","25","12","Tabela 20. Projecto A15 - Desenvolvimento do Regadio na Bacia Hidrográfica do Rio Maputo e complementares – Zona Sul","A15 - C10","Agência Nacional de Gestão de Recursos Hídricos e Regulação do Regadio","Complementar Público — Regulação & Supervisão","Integra a cadeia do Âncora (licenciamento, controlo e normas de operação)","Maputo","5.000.000","Custo Total (USD)","2026–2030","","","source_content_unverified|toponym_unverified|owner_review_required|currency_only_as_stated_in_table_header"
|
||||
|
@@ -0,0 +1,171 @@
|
||||
Integração de ZEE, ZFI e parques industriais no InvesteMoz
|
||||
|
||||
Implementar no portal existente a integração dos dados fornecidos sobre Beluluane, Crusse e Jamali, Manga-Mungassa, Mocuba e Nacala. Preservar a localização, as actividades, a rastreabilidade e a distinção entre categorias jurídicas.
|
||||
|
||||
Não criar um catálogo paralelo. Inspeccionar primeiro tabelas, formulários, relações territoriais, fontes e funcionalidades existentes; completar ou corrigir o necessário.
|
||||
|
||||
1. Preparação e segurança
|
||||
|
||||
Comparar o esquema da base activa com as migrações antes da implementação, evitando novos erros de colunas inexistentes.
|
||||
|
||||
Preparar backup recuperável antes de alterações estruturais. Utilizar migrações aditivas, importação idempotente e relatório das alterações. Não apagar registos nem substituir dados existentes silenciosamente.
|
||||
|
||||
Guardar o texto original fornecido como fonte de trabalho, separado dos dados normalizados. Registar conflitos e decisões de revisão.
|
||||
|
||||
2. Normalização dos registos
|
||||
|
||||
Utilizar estas referências iniciais, confrontando-as com os documentos oficiais existentes:
|
||||
|
||||
a) Parque Industrial de Beluluane
|
||||
- Distinguir o parque industrial do perímetro ou componente sob regime de ZFI.
|
||||
- A APIEX refere a Resolução Interna do Conselho de Ministros n.º 15/99, de 12 de Outubro, e localização histórica em Matola-Rio, Boane, Província de Maputo.
|
||||
- A mesma fonte apresenta aproximadamente 780 ha para o conjunto e áreas internas distintas. Não substituir estes valores por 700 ha sem esclarecer a fonte, data e perímetro.
|
||||
- Confrontar a localização histórica com a base territorial actual; conservar ambas quando houver alteração administrativa.
|
||||
- Não associar Matibane, Mossuril ou Nampula a Beluluane.
|
||||
Fonte: https://apiex.gov.mz/beluluane-industrial-park-free-zone/
|
||||
|
||||
b) Crusse e Jamali
|
||||
- Denominação: Zona de Estância de Turismo Integrado de Crusse e Jamali.
|
||||
- Natureza: zona de turismo integrado em regime de ZEE.
|
||||
- Decreto n.º 47/2013, de 30 de Agosto.
|
||||
- Área: 1.750 ha.
|
||||
- Localização: Matibane, Mossuril, Nampula.
|
||||
- Distinguir actividades previstas de infra-estruturas efectivamente existentes e oportunidades actualmente disponíveis.
|
||||
Fonte: https://www.inm.gov.mz/pt-br/content/conselho-de-ministros-br-n%C2%BA-70-de-300813-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-571
|
||||
|
||||
c) Manga-Mungassa
|
||||
- ZEE situada na Cidade da Beira, Província de Sofala.
|
||||
- A APIEX apresenta 217 ha e Decreto n.º 22/2012; conferir a data no próprio diploma antes de a consolidar.
|
||||
- Remover deste registo as referências copiadas de Boane, Porto de Maputo e N4, preservando o histórico da correcção.
|
||||
- Não classificá-la como ZFI com base no texto fornecido.
|
||||
Fonte: https://apiex.gov.mz/zee/manga-mungassa-special-economic-zone/
|
||||
|
||||
d) Mocuba
|
||||
- ZEE criada pelo Decreto n.º 28/2014, de 6 de Junho.
|
||||
- A APIEX indica abrangência do distrito de Mocuba e do posto administrativo de Munhamade, no distrito de Lugela, Zambézia.
|
||||
- A área de 10.727 km² deve manter unidade explícita e fonte.
|
||||
- Não reduzir a abrangência à cidade de Mocuba.
|
||||
- Manter separada a ZFI de Mocuba, identificada pela APIEX com Decreto n.º 29/2014 e área de 50,58 ha.
|
||||
Fontes:
|
||||
https://apiex.gov.mz/mocuba-special-economic-zone/
|
||||
https://apiex.gov.mz/zif/mocuba-free-industrial-zone/
|
||||
|
||||
e) Nacala
|
||||
- Integrar a ZEE existente, sem a confundir com o corredor, o porto ou outras zonas francas da região.
|
||||
- Confirmar acto de criação, perímetro, unidades territoriais, área e actividades nos documentos oficiais.
|
||||
- Não preencher campos desconhecidos por dedução a partir do nome.
|
||||
- Guardar em rascunho apenas os elementos ainda não esclarecidos, sem bloquear os restantes registos.
|
||||
|
||||
As páginas informativas podem conter dados históricos. Registar data de consulta e data de referência dos dados; não apresentar números de empresas, empregos ou investimentos como actuais sem confirmação temporal.
|
||||
|
||||
3. Formulário de cadastro
|
||||
|
||||
Organizar o formulário em secções:
|
||||
|
||||
Identificação:
|
||||
- Nome oficial, sigla, designações alternativas;
|
||||
- Categoria física e regime jurídico, separados;
|
||||
- Descrição, objectivos, entidade gestora e contactos públicos;
|
||||
- Estado operacional e estado editorial, separados.
|
||||
|
||||
Criação e enquadramento:
|
||||
- Tipo, número, data e entidade emitente do acto;
|
||||
- Documento e ligação à fonte;
|
||||
- Âmbito da criação e alterações posteriores;
|
||||
- Legislação aplicável, com vigência e referências.
|
||||
|
||||
Território:
|
||||
- Província, distrito, posto administrativo e localidade, por IDs da base territorial;
|
||||
- Múltiplas localizações quando aplicável;
|
||||
- Área e unidade;
|
||||
- Coordenadas ou polígono, quando documentados;
|
||||
- Distinção entre ponto indicativo, perímetro legal, área desenvolvida e área disponível.
|
||||
|
||||
Actividades:
|
||||
- Actividades previstas, autorizadas, condicionadas e excluídas;
|
||||
- Associação à CAE existente, quando houver correspondência fundamentada;
|
||||
- Sectores prioritários, sem os confundir com uma lista legal exaustiva;
|
||||
- Fonte e condições de cada restrição.
|
||||
|
||||
Recursos e acessos:
|
||||
- Estradas, portos, aeroportos, energia, água, telecomunicações e instalações;
|
||||
- Estado: existente, planeado ou não confirmado;
|
||||
- Distâncias apenas quando calculadas ou documentadas, identificando o método;
|
||||
- Não transformar proximidade geográfica em garantia de acesso ou capacidade.
|
||||
|
||||
Associações:
|
||||
- Empresas e negócios instalados;
|
||||
- Projectos âncora, clusters, corredores e oportunidades;
|
||||
- Fonte, estado documental e vigência da relação;
|
||||
- Relações sem copiar ou duplicar os registos associados.
|
||||
|
||||
Anexos:
|
||||
- Diplomas, mapas, fotografias e estudos;
|
||||
- Legendas, origem, data, direitos de utilização e visibilidade;
|
||||
- Validação de formatos, tamanho e acesso.
|
||||
|
||||
Permitir rascunhos incompletos. Exigir para publicação os elementos essenciais definidos por categoria, com revisão documental proporcional, sem certificação externa obrigatória para cada campo.
|
||||
|
||||
4. Incentivos e actividade económica
|
||||
|
||||
Não aplicar automaticamente a todas as ZEE e ZFI o calendário de IRPC fornecido no texto.
|
||||
|
||||
Separar:
|
||||
- Operador da zona;
|
||||
- Empresa instalada;
|
||||
- Prestador de serviços;
|
||||
- Empresa de zona franca isolada.
|
||||
|
||||
Verificar a Lei n.º 4/2009, especialmente os artigos 45 a 48, os regulamentos aplicáveis e alterações posteriores relevantes para o período simulado.
|
||||
|
||||
Registar cada regra com imposto, beneficiário, condições, exercícios abrangidos, marco inicial, fonte, artigo e vigência.
|
||||
|
||||
Distinguir “redução da taxa em 50%” de “taxa de 50%”. Não generalizar isenções de IVA a todas as operações.
|
||||
|
||||
Confirmar documentalmente as regras de exportação, vendas nacionais, actividades excluídas e tratamento dos fornecedores locais. Não transformar as afirmações sobre acordos regionais e origem das mercadorias em regras operacionais sem consultar o instrumento aplicável.
|
||||
|
||||
A localização numa zona não concede automaticamente benefícios: verificar o regime e os requisitos da empresa ou projecto.
|
||||
|
||||
Reutilizar o motor fiscal existente. Regras insuficientemente esclarecidas podem aparecer como informação pendente, mas não devem produzir cálculo legal presumido nem impedir a consulta territorial ou o planeamento financeiro sem incentivos.
|
||||
|
||||
5. Pesquisa e apresentação pública
|
||||
|
||||
Disponibilizar selecção por ZEE, ZFI e parque, localização e actividade.
|
||||
|
||||
Filtrar no servidor usando relações territoriais; uma zona com várias localizações deve aparecer uma única vez. Mostrar a abrangência territorial completa na ficha.
|
||||
|
||||
Apresentar separadamente:
|
||||
- Informação da zona;
|
||||
- Actividades e recursos documentados;
|
||||
- Empresas associadas;
|
||||
- Oportunidades concretas publicadas;
|
||||
- Potencial de investimento ainda sem proposta cadastrada.
|
||||
|
||||
Não converter automaticamente sectores prioritários, hotéis previstos ou recursos existentes em anúncios de oportunidades.
|
||||
|
||||
Quando não houver oportunidades publicadas, disponibilizar:
|
||||
- Consultar condições da zona;
|
||||
- Iniciar projecto privado nesta localização;
|
||||
- Avaliar investimento;
|
||||
- Propor oportunidade;
|
||||
- Solicitar informação, se houver canal configurado.
|
||||
|
||||
Transportar para o dossier as referências seleccionadas mediante confirmação, preservando privacidade e sem publicação automática.
|
||||
|
||||
6. Testes e entrega
|
||||
|
||||
Demonstrar no browser:
|
||||
- Cadastro, edição, anexação e publicação de uma zona;
|
||||
- Mocuba com abrangência territorial múltipla;
|
||||
- Distinção entre ZEE de Mocuba e ZFI de Mocuba;
|
||||
- Distinção entre parque de Beluluane e componente ZFI;
|
||||
- Pesquisa por localização e actividade com resultados coerentes;
|
||||
- Estado vazio útil;
|
||||
- Continuação no dossier sem duplicação;
|
||||
- Funcionamento móvel e por teclado.
|
||||
|
||||
Executar testes numa base isolada e verificar a compatibilidade do esquema activo. Não usar dados fictícios como informação pública.
|
||||
|
||||
Entregar relatório dos registos criados ou corrigidos, fontes utilizadas, conflitos resolvidos, campos pendentes, alterações dos formulários e evidências dos testes.
|
||||
|
||||
Não considerar a tarefa concluída apenas pela importação dos nomes: demonstrar que localização, actividade, relações e resultados públicos funcionam.
|
||||
@@ -6,9 +6,9 @@ Data: 25/09/2026. O utilizador delegou a escolha da solução e confirmou que n
|
||||
|
||||
Portal confirmado: Laravel 13.30.1, React 19.2.8, Inertia React 3.7.0, Inertia Laravel 3.3.3, Fortify 1.39.0, PostgreSQL 17.11/PostGIS 3.6.2. PHP de trabalho 8.5.11; o PATH ainda resolve outro PHP 8.5.0. Filas/cache/sessões usam database. Gestão autorizada por email verificado e lista de gestores; não existe RBAC organizacional completo.
|
||||
|
||||
Há CRM local (`CrmController`, `ConvertInterestToLead`), catálogo público, projectos e clusters. `InterestRequestController` não aceita chave de idempotência; a conversão em lead é idempotente por pedido, mas a submissão pública ainda não. Outbox/inbox/reconciliação existem como tabelas, sem processadores. O agregado da outbox exige UUID, enquanto pedidos usam bigint. A referência IR não é credencial de acesso.
|
||||
Há CRM local (`CrmController`, `ConvertInterestToLead`), catálogo público, projectos e clusters. O `InterestRequestController` aceita `Idempotency-Key` opcional UUID; `InterestSubmission` guarda apenas o hash da chave, compara o hash canónico do pedido e, na mesma transacção, regista recibo, consentimentos e evento na outbox. Replay com payload igual devolve a manifestação original; reutilização com dados diferentes responde 409. `InterestSubmissionTest` cobre replay, conflito, rollback transaccional e submissão antiga sem chave. A conversão em lead também é idempotente por pedido. Outbox/inbox/reconciliação continuam sem processadores. O agregado da outbox exige UUID, enquanto pedidos usam bigint. A referência IR não é credencial de acesso.
|
||||
|
||||
Não existe SuiteCrmClient, instalação SuiteCRM ou implantação Docker do portal. Docker não foi encontrado e o executável WSL informa que o subsistema não está instalado. Não foi alterado o sistema operativo.
|
||||
O cliente existe em app/Integrations/SuiteCrm/ e está desligado por defeito (SUITECRM_ENABLED=false); os testes usam HTTP simulado. Não há instalação SuiteCRM, credenciais, tráfego real nem implantação Docker do portal. A integração e os processadores de outbox/inbox continuam pendentes.
|
||||
|
||||
## 2. Decisões e pendências
|
||||
|
||||
@@ -88,7 +88,7 @@ sequenceDiagram
|
||||
|
||||
Usar Accounts para organizações, Contacts para pessoas e relações para representação. Não criar um módulo Investors que duplique esses cadastros; um perfil de investimento distinto pode referenciá-los. Usar Leads, Opportunities, Campaigns, Meetings, Tasks, Cases e Documents quando a semântica coincidir.
|
||||
|
||||
Avaliar módulos personalizados para manifestações, referências de projectos/clusters/corredores e jornadas. Procedimentos regulatórios permanecem no portal; um resumo no CRM só será criado com necessidade demonstrada. Aftercare usa Cases com classificação própria, salvo exigências de permissões/ciclo incompatíveis. O catálogo detalhado e a matriz de 15 colunas ainda serão entregues antes da implementação funcional.
|
||||
Avaliar módulos personalizados para manifestações, referências de projectos/clusters/corredores e jornadas. Procedimentos regulatórios permanecem no portal; um resumo no CRM só será criado com necessidade demonstrada. Aftercare usa Cases com classificação própria, salvo exigências de permissões/ciclo incompatíveis. O catálogo lógico e a matriz de mapeamento com 15 colunas foram acrescentados em [mapping-catalog.md](mapping-catalog.md). Nomes técnicos de atributos, links e módulos personalizados permanecem candidatos até validação na instância de homologação.
|
||||
|
||||
Campos comuns previstos: UUID externo imutável, sistema de origem, versão, classificação, instante de recolha e código de finalidade. Nomes técnicos, relacionamentos e disponibilidade na API devem ser comprovados na instalação. Índice único de identidade externa deve ser definido por extensão suportada. Email partilhado ou telefone coincidente são candidatos a revisão, não autorização para fusão automática.
|
||||
|
||||
@@ -108,7 +108,7 @@ Eventos previstos incluem ExpressionOfInterestSubmitted, InvestorRegistered, Org
|
||||
|
||||
## 12. Estrutura futura e etapas verificáveis
|
||||
|
||||
O cliente em `app/Integrations/SuiteCrm/` e os testes em `tests/Feature/SuiteCrm/` foram acrescentados na entrega seguinte, descrita em [client.md](client.md). Jobs, eventos, listeners e contratos completos dos domínios ainda estão por implementar.
|
||||
O cliente em app/Integrations/SuiteCrm/ e os testes em tests/Feature/SuiteCrm/ já existem e estão descritos em [client.md](client.md). O catálogo lógico está em [mapping-catalog.md](mapping-catalog.md); jobs, eventos, listeners, mapeamento técnico confirmado na instalação e contratos completos dos domínios continuam por implementar.
|
||||
|
||||
1. Decisão e preparação da instalação isolada (esta entrega).
|
||||
2. Instalação, conta técnica, OAuth, descoberta dos módulos e prova de contrato de API.
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
# Catálogo lógico de módulos e mapeamento — SuiteCRM
|
||||
|
||||
**Estado:** especificação preliminar, 2026-10-04. Não é configuração executável nem autorização de exportação. O cliente SuiteCRM permanece desligado.
|
||||
|
||||
## Pré-condição de runtime ainda aberta
|
||||
|
||||
O portal usa PHP 8.5.11 por instrução do projecto. A matriz oficial consultada para SuiteCRM 8.10.x lista PHP 8.2, 8.3 e 8.4; PHP 8.5 não está listado como suportado ([matriz oficial](https://docs.suitecrm.com/8.x/admin/compatibility-matrix/)). A release 8.10.2 aparece como a release actual na página oficial consultada ([releases SuiteCRM](https://github.com/SuiteCRM/SuiteCRM-Core/releases)). Assim, o runtime aprovado para CRM continua por resolver; não instalar nem declarar compatibilidade de PHP 8.5 com esta release.
|
||||
|
||||
O ambiente também não dispõe de Docker/Podman e `wsl --status` confirma que o Subsistema Windows para Linux não está instalado. Não instalei componentes do sistema operativo nem serviços. A homologação SuiteCRM não pode arrancar nesta máquina no estado observado.
|
||||
|
||||
## Regras de interpretação
|
||||
|
||||
- A coluna de atributo de destino descreve conceitos. Os nomes técnicos, campos personalizados, links JSON:API, obrigatoriedade e limites têm de ser descobertos e aprovados na instalação SuiteCRM de homologação.
|
||||
- O portal continua fonte de verdade para manifestações, consentimentos, perfis de investimento, oportunidades publicadas, projectos, clusters, corredores, geografia, documentos e cálculos.
|
||||
- SuiteCRM só será fonte de verdade para leads comerciais aceites, negociação, tarefas, reuniões e acompanhamento comercial depois de migração e decisão Go/No-Go.
|
||||
- Receber uma manifestação não cria automaticamente Contact, Account ou Opportunity no CRM. A outbox contém apenas UUID e tipo de evento; um futuro worker terá de reler consentimento, finalidade, estado e autorização antes de formar o payload.
|
||||
- Correspondência por email/telefone, duplicados, identidade incerta ou consentimento ausente exigem revisão; nunca fazer fusão automática.
|
||||
- Documentos, mensagens livres, dados fiscais, informação bancária, geometrias completas, IP, user-agent, tokens e credenciais não são enviados por este catálogo.
|
||||
|
||||
## Matriz de 15 campos de decisão
|
||||
|
||||
| Entidade de origem | Campos de origem já existentes | Módulo SuiteCRM candidato | Registo lógico de destino | Direcção prevista | Atributos lógicos candidatos | Relações candidatas | Sistema de registo | Finalidade permitida | Gate de consentimento/autoridade | Classificação | Minimização/transformação | Chave externa/idempotência | Controlo de acesso/auditoria | Estado/evidência exigida |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| `InterestRequest` / `interest_requests` | `integration_id`, `reference`, `full_name`, `email`, `phone`, `investor_type`, `country`, `sector_interest`, `investment_range`, `message`, `status`; consentimentos são registados separadamente | Leads | Manifestação comercial mínima, identificada no CRM como proveniente do portal | Portal → CRM, apenas após processamento aprovado da outbox | Nome de apresentação e meios de contacto estritamente necessários; referência do portal; categoria geral de interesse | Lead ligado a Contact/Account só após resolução humana/identificador externo | Portal mantém pedido e consentimento; CRM mantém tratamento comercial após aceitação | Responder à manifestação e acompanhar o pedido | Consentimento vigente para resposta; consentimento separado se houver partilha com proponente; finalidade, retenção e base legal aprovadas | Confidencial/PII | Excluir mensagem livre por defeito; não inferir residência, elegibilidade ou identidade; normalização sem alterar valor de origem | `integration_id` imutável e chave de integração única a definir no CRM; retry após escrita ambígua exige pesquisa antes de repetir | Papel técnico mínimo; logs apenas com operação/resultado/duração; acesso humano auditado | Parcial: intake e outbox transaccionais testados; não há worker, CRM nem esquema confirmado |
|
||||
| `Investor` e relações `investor_contacts` | UUID do investidor; sectores, geografias, horizonte, ticket e relações a contactos | Contacts; Accounts para organização | Contact individual e Account organizacional, sem duplicar o perfil de investimento | Portal → CRM depois de identidade e vínculo revistos; eventual projecção CRM → portal ainda por decidir | Identificador externo; nome/contacto somente se fonte, finalidade e permissão autorizarem; organização e papel apenas após validação | Contact–Account e representação segundo relações comprovadas no CRM | Portal conserva perfil e preferências; CRM poderá ser principal para contacto comercial após corte | Gestão comercial de contacto e organização | Verificar consentimento, qualidade/origem, papel de representante e regras de acesso; sem equivalência automática de registos | Confidencial/PII | Não copiar preferências de investimento ou ticket sem necessidade documentada; NUIT e documentos ficam fora até aprovação específica | UUID externo do portal; restrição única e extensão de deduplicação a comprovar | Acesso restrito por equipa/território; trilho de alteração e origem | Pendente: resolução de identidade, política de campos e relação ainda não aprovadas |
|
||||
| `Lead` e `CrmTask` locais | Estado, owner, investor, estimated amount, tarefas e respectivos estados | Leads; Tasks | Lead qualificado e actividade comercial | CRM → portal ou carga única durante transição; sem escrita dupla permanente | Estado, responsável, próxima acção e valores comerciais somente após definição do modelo de transição | Lead–Contact/Account; Task–Lead/Contact conforme API instalada | SuiteCRM após corte; actualmente o portal local | Qualificação e gestão comercial | Perfil autorizado, papéis institucionais e política de atribuição/SLA aprovados | Confidencial; PII onde aplicável | Não transportar comentários privados ou payload integral sem classificação e finalidade | UUID externo; estado e versão/correlação para reconciliação | Permissões CRM por papel, operação administrativa restrita, eventos auditados | Parcial: CRM local existe; ainda sem processo de migração, mappings de status ou ACL comprovada |
|
||||
| `Opportunity` pública e `Project` | Slug/UUID, título, estado publicado, descrição pública, território, sector e referências | Módulo personalizado de referência ou leitura externa; não usar automaticamente `Opportunities` comercial | Espelho de catálogo publicado, se houver necessidade demonstrada | Portal → CRM, só dados já públicos e sincronização autorizada | Identificador e URL pública; título e estado público | Relação a Lead apenas por comando comercial revisto; não fundir com Opportunity do CRM | Portal | Contexto de referência para negociação | Aprovação do proprietário do catálogo e política de publicação | Público; referências internas podem ser confidenciais | Lista permitida de campos públicos; retirar geometria detalhada e metadados privados | UUID estável e versão do catálogo; upsert só depois de extensão única comprovada | Leitura por utilizadores comerciais autorizados; mudanças do catálogo auditadas no portal | Pendente: módulo, API, necessidade, contrato e política de actualização por validar |
|
||||
| `EconomicCluster`, `DevelopmentCorridor`, `InvestmentZone` e relações | UUID/código, nome, estado, relações e geometrias/atributos GIS | Módulo de referência personalizado apenas se aprovado | Referência resumida a cluster/corredor/zona | Portal → CRM, somente identificadores e metadados aprovados | UUID, código, nome público e link do portal | Ligações a Project/Lead não podem alterar cadastro territorial | Portal | Contextualizar uma negociação | Aprovação do responsável do catálogo e classificação campo a campo | Público ou interno conforme o atributo | Nunca replicar geometrias completas, camadas GIS, coordenadas sensíveis ou dados de titularidade | UUID do portal e versão; sem chave única validada não sincronizar | Sem edição CRM; leitura restrita conforme classificação | Pendente: módulo/API e necessidade por provar |
|
||||
| Reuniões, aftercare e seguimento institucional | Não há contrato de domínio SuiteCRM ligado ao portal; eventos são apenas propostos | Meetings, Cases, Tasks, Campaigns | Actividade comercial ou caso após investimento | CRM → portal por API/webhook assinado e projectado; comando validado via Laravel | Estado, data, responsável e resumo mínimo, conforme contrato a aprovar | Relações e ACL dependem dos módulos efectivamente instalados | CRM após corte; consentimentos e comprovativos continuam no portal | Seguimento comercial/aftercare autorizado | Base legal, participantes, finalidade e perfis de acesso aprovados | Confidencial/PII | Não sincronizar notas livres por defeito; resumos redigidos e auditáveis | ID CRM + UUID/correlation ID; inbox idempotente com assinatura e anti-replay | Autorização por pedido e papel; webhook validado; reconciliação de versão | Não implementado; módulos, webhook e projection inexistentes |
|
||||
| `LandAssistanceCase`, anexos e assistência DUAT | Dados do requerente, finalidade, etapa, consentimento e referências de anexos | Sem módulo atribuído nesta fase | Nenhum registo no CRM até decisão específica | Nenhuma direcção aprovada | Nenhum | Nenhuma | Portal e arquivo privado autorizado | Apoio informativo/documental fundiário | Validação jurídica, consentimento específico e necessidade demonstrada | Sensível/PII e possivelmente documentos de alto risco | Não copiar anexos, dados de terra/titularidade ou informação jurídica para CRM por defeito | Não aplicável | Permissões e retenção específicas do portal | Bloqueado para integração; fluxo permanece separado e sem sincronização externa |
|
||||
|
||||
## Contrato de identidade e de reconciliação
|
||||
|
||||
1. O identificador externo é UUID aleatório imutável do portal, não email, telefone, NUIT ou referência visível.
|
||||
2. Até existir campo único suportado e verificado na API, nenhuma operação de criação pode ser repetida automaticamente após timeout; primeiro pesquisa e revisão de ambiguidade.
|
||||
3. O payload deve incluir versão do esquema, UUID, finalidade e correlação; só inclui dados de negócio permitidos pelo catálogo aprovado.
|
||||
4. A inbox futura validará assinatura do corpo bruto, timestamp, identificador único e janela anti-replay. O desenho ainda exige prova de compatibilidade com mecanismo suportado pelo SuiteCRM.
|
||||
5. A reconciliação compara UUID, versão e allowlist de campos. Diferenças de sistema principal, identidade duplicada e conflitos de consentimento são filas de revisão, nunca sobrescritas automáticas.
|
||||
|
||||
## Critérios para passar do catálogo à implementação
|
||||
|
||||
- Instância de homologação SuiteCRM isolada, TLS válido, versão fixada, backup e conta OAuth não administrativa.
|
||||
- Descoberta de módulos, campos, relações, obrigatoriedade, permissões e paginação pela API; guardar resposta sanitizada e hashes do contrato, sem tokens nem PII.
|
||||
- Aprovação de cada campo por finalidade, classificação, retenção, acesso e origem.
|
||||
- Testes de contrato contra essa instância para leitura, escrita, duplicação, timeout ambíguo, 401/403/409/422, limites, paginação e reconciliação.
|
||||
- Processo de outbox com leases, tentativas limitadas, dead-letter, replay autorizado, monitoria e prova de não duplicação.
|
||||
- Go/No-Go separado antes de qualquer credencial real ou activação. Até esses gates, `SUITECRM_ENABLED=false`.
|
||||
@@ -0,0 +1,46 @@
|
||||
# Pesquisa territorial — implementação e evidências
|
||||
|
||||
Data: 04/10/2026
|
||||
|
||||
## Resultado
|
||||
|
||||
A pesquisa territorial de oportunidades passou a filtrar no servidor por IDs da hierarquia territorial e por relações de localização. Uma oportunidade com vários locais conta uma só vez (`EXISTS`); sem correspondência a área escolhida, não há expansão automática. Foi acrescentado `geography_scope` para distinguir registos explicitamente nacionais de registos sem localização. Os existentes recebem `unspecified`; a ausência de localização não os transforma em nacionais.
|
||||
|
||||
`include_national=1` acrescenta apenas registos marcados como `national`. Sem essa opção, os nacionais são excluídos mesmo numa pesquisa sem área. O cadastro de oportunidades permite gerir o âmbito. Uma oportunidade marcada nacional não pode guardar simultaneamente localização administrativa.
|
||||
|
||||
## Módulos
|
||||
|
||||
| Módulo/percurso | Estado | Evidência ou limite |
|
||||
|---|---|---|
|
||||
| `/oportunidades` — página, `/api/v1/investment/search`, mapa e CSV | Corrigido | Usam `InvestmentCatalogue::query()`; hierarquia por UUID, locais primários e múltiplos, filtros combinados, sem duplicação. Testes sintéticos em duas províncias. |
|
||||
| `/educacao` — procura de necessidades e capacidades | Corrigido | `geo_location_id` e cascata administrativa incluem descendentes por ID antes da paginação; 36 testes dirigidos passaram. |
|
||||
| `/negocios` — catálogo público de negócios existentes | Corrigido | Filtro territorial usa `EXISTS` sobre localizações públicas; mais de uma localização não duplica anúncios. Suite do assistente/catálogo passou, mas falta um caso dedicado multi-localização neste módulo. |
|
||||
| `/carteira` — projectos âncora, clusters e corredores | Corrigido parcialmente | Mantém filtros de publicação e considera territórios primários, locais públicos de projectos e locais públicos de corredores. Clusters não têm relação de localizações múltiplas identificada; ficam limitados ao território primário. |
|
||||
| `/zonas` — ZEE, ZFI e parques | Corrigido parcialmente | Território primário ou geometria associada, validada e autorizada para publicação. Sem âmbito nacional explícito neste modelo; registos sem território não correspondem à seleção. Testes existentes passaram, sem fixture multi-geometria por províncias. |
|
||||
| Rotas territoriais fora destes catálogos | Pendente de auditoria | Percursos de assistência fundiária, gestão e edição, relações de clusters/corredores, prestadores/cursos e demais pesquisas GIS ainda não foram uniformizados nem validados contra os critérios completos. Não declarar cobertura transversal concluída. |
|
||||
|
||||
## Testes e browser
|
||||
|
||||
- Base isolada `investmoz_browser_e2e_test`; não foram usados nem alterados registos reais para criar cenários de teste.
|
||||
- Suites PHPUnit executadas separadamente em base isolada: `InvestmentTerritoryTest` **10/171**, `InvestmentPortfolioTest` **8/170**, `ExistingBusinessWizardTest` **4/55**, `EducationTest` **8/207**, `InvestmentZoneTest` **6/104** e `InvestmentUnificationTest` **8/87**. Total: **44 testes, 794 afirmações, todas as suites passaram**.
|
||||
- A fixture territorial cobre duas províncias, distrito, posto administrativo, localidade, oportunidade com locais em províncias diferentes, nacional explícita e registo sem localização. Verifica selecção por província/distrito/localidade, sector incompatível, ausência de correspondências, ausência de duplicados, inclusão nacional explícita, pesquisa, contagem, mapa e CSV.
|
||||
- Uma execução conjunta de todas as suites apresentou interferência entre migrations próprias de teste (as rotinas de `InvestmentUnificationTest`/`InvestmentZoneTest` deixam a suite seguinte sem a tabela `users`). Cada suite foi então executada num processo PHPUnit separado contra a base isolada; todas passaram. Não é evidência de falha no portal, mas convém corrigir o isolamento do conjunto de testes.
|
||||
- `npm.cmd run build`: passou. Permanecem avisos existentes de pacote opcional `fontaine` e chunks acima de 500 kB.
|
||||
- Browser em `http://127.0.0.1:8000/oportunidades`: HTTP 200; filtro real “Cabo Delgado (02)” resultou em **0** na lista, mapa e API de pesquisa; CSV HTTP 200 com BOM UTF-8 e **0 linhas de dados**. O estado vazio e “Alargar pesquisa (remover localização)” apareceram; nenhum resultado nacional foi inserido implicitamente. Abrir uma ficha e regressar preservou `province_id` e a lista continuou com 0 resultados.
|
||||
- Em 390×844 px, `documentWidth=390`, sem overflow horizontal. Sem erros de consola. Isto confirma a vista responsiva no browser emulado, não num telemóvel físico.
|
||||
- `/negocios` também foi aberto em viewport 390 px; a selecção de província foi enviada ao servidor e manteve a contagem zero, sem overflow ou erros de consola.
|
||||
- Evidência: [dados do ensaio](pilot/territorial-search-browser-2026-10-04.json), [desktop](pilot/territorial-search-filtered-2026-10-04.png), [móvel emulado](pilot/territorial-search-filtered-mobile-2026-10-04.png).
|
||||
|
||||
## Migration
|
||||
|
||||
Aplicada na base de desenvolvimento activa: `2026_10_04_120000_add_opportunity_geography_scope`. É aditiva, define `unspecified` por omissão e valida valores permitidos. O rollback recusa remover a coluna se já existirem classificações explícitas diferentes de `unspecified`.
|
||||
|
||||
## Pendências
|
||||
|
||||
1. Auditar e uniformizar as pesquisas territoriais dos percursos listados como pendentes.
|
||||
2. Criar testes dedicados de várias localizações para negócios, zonas e relações de projectos/corredores, incluindo entidades económicas combinadas.
|
||||
3. Adicionar remoção individual para todos os filtros activos; a UI actual expõe os principais (localização, sector, cluster, corredor, projecto e âmbito nacional), mas ainda não todos os facets e campos.
|
||||
4. Executar ensaio num telemóvel físico. A verificação realizada foi Playwright com viewport móvel.
|
||||
5. Testar paginação com dataset acima do limite de 12 e confirmar a navegação de ida/volta na ficha em browser.
|
||||
|
||||
Não promover este resultado a “correcção transversal concluída” até fechar estes pontos.
|
||||
@@ -0,0 +1,71 @@
|
||||
# Reconciliação de parques industriais e ZFI — 4 de Outubro de 2026
|
||||
|
||||
## Fonte e método
|
||||
|
||||
O documento original foi recebido em 4 de Outubro de 2026. É material fornecido pelo utilizador: os nomes das fontes constam do texto, mas não foram anexados diplomas primários, URLs nem estudos técnicos. As suas alegações foram comparadas com páginas institucionais/promotoras acessíveis. O documento comprova o que foi declarado, não constitui por si só prova legal.
|
||||
|
||||
A matriz estruturada está em `database/data/industrial-parks-reconciliation.json`; os nove rascunhos candidatos estão em `database/data/industrial-park-candidate-drafts.json`. Área de complexo, perímetro legal, área em desenvolvimento, piloto e terreno disponível são medidas distintas. Actividades descritas como enfoque ou potencial não são licenças, actividades autorizadas nem prova de operação. A intenção de criar 20 parques não origina 20 registos.
|
||||
|
||||
## Reconciliação dos onze itens
|
||||
|
||||
| Item | Resultado da comparação | O que permanece pendente |
|
||||
|---|---|---|
|
||||
| Beluluane | MozParks publica 700 ha prontos para arrendamento. APIEX descreve complexo de cerca de 780 ha, composto por parque de 600 ha e Mozal de 180 ha; indica ZFI de 55 ha. São âmbitos potencialmente diferentes. | Limites e sobreposição cartográfica; disponibilidade por lote. Não somar as áreas nem converter enfoque industrial em actividade autorizada. Parque e ZFI mantêm registos separados. |
|
||||
| Topuito | MozParks publica 215 ha e identifica Topuito Industrial Park. Notícia de Agosto de 2026 relata início da construção do SME Village. Decreto 57/2023 cria a ZFI com 65 ha. | Distinguir parque, construção do SME Village e perímetro jurídico da ZFI. Não inferir disponibilidade integral. O território mestre não contém Larde; manter Nampula provincial até resolver a referência territorial. |
|
||||
| Munhava | SDUBeira descreve desenvolvimento faseado, 900 ha no resumo, destaque de 990 ha e piloto de 50 ha. | Os 44–60 ha do documento não foram corroborados. Resolver a divergência interna, obter perímetro/plano técnico e confirmar disponibilidade. Sectores são alvos declarados. |
|
||||
| Montepuez | MozParks confirma parque da iniciativa Cabo Delgado em desenvolvimento no distrito. | Área, regime, actividade instalada/autorizada e disponibilidade. Fornecedores mineiros, transformação, serviços e PME são enfoques do documento, não licenças. |
|
||||
| Balama | MozParks confirma parque da iniciativa Cabo Delgado em desenvolvimento no distrito. | Área, regime, actividade instalada/autorizada e disponibilidade. Sectores declarados não são autorizações. |
|
||||
| Ancuabe | MozParks confirma parque da iniciativa Cabo Delgado em desenvolvimento no distrito. | Área, regime, actividade instalada/autorizada e disponibilidade. Sectores declarados não são autorizações. |
|
||||
| Palma | MozParks confirma parque da iniciativa Cabo Delgado em desenvolvimento no distrito. | Área, regime, actividade instalada/autorizada e disponibilidade. Sectores declarados não são autorizações. |
|
||||
| Selva / Manica Parks | MozParks confirma o lançamento da iniciativa provincial Manica Parks por memorando em Setembro de 2026. | Não confirma parque individual em Selva/Vanduzi, construção, operação ou operador. Não criar ficha localizada em Selva sem fonte específica. Actividades listadas são enfoques declarados. |
|
||||
| Mocuba ZFI | APIEX confirma 50,58 ha e mobilização de recursos e operador. O documento lista actividades potenciais. | Diploma primário, limites e autorização sectorial. A ZFI permanece separada da ZEE de Mocuba. |
|
||||
| Revúbuè ZFI | APIEX reporta 4 456 ha, ausência de operador e um projecto aprovado. | Validar Decreto 41/2016 e perímetro. A referência ao projecto aprovado não é oportunidade de investimento publicada; sectores são enfoque, não autorização. Um registo cobre Chiuta e Moatize. |
|
||||
| Minhewene ZFI | O documento diz que não encontrou ficha APIEX acessível. Na verificação actual, a página APIEX estava acessível e reportava Decreto 51/2011, Nacala, 350 ha e mobilização de recursos/operador. | Resolver a divergência documental de acesso; confirmar diploma primário, localização cadastral e estado actual. Página institucional não prova operacionalização. |
|
||||
|
||||
## Legislação e uso no portal
|
||||
|
||||
- O Decreto 57/2023 e a área legal indicada de 65 ha para a ZFI de Topuito foram referenciados na Imprensa Nacional. Isso não prova operador, actividades em operação ou lotes disponíveis.
|
||||
- A Imprensa Nacional publica o sumário do Decreto 12/2026, que aprova novo regulamento de ZEE/ZFI e revoga o Decreto 75/99. O texto integral e regras transitórias não foram revistos nesta reconciliação; não alterar o motor fiscal nem inferir incentivos pelo sumário.
|
||||
- As fichas APIEX e MozParks/SDUBeira são fontes institucionais ou do promotor. Não substituem diploma, licença ou confirmação operacional aplicável.
|
||||
- Para Cabo Delgado, as actividades do documento são registadas somente como enfoque promocional. O plano de 20 parques permanece intenção, não cadastro de instalações.
|
||||
- Nenhum registo é publicado automaticamente. As candidaturas continuam rascunhos privados; publicar ZEE/ZFI requer fonte jurídica aprovada e vigente. Publicar parque informativo requer evidência adequada de existência/localização, mantendo não confirmado o que não estiver demonstrado.
|
||||
|
||||
## Implementação e verificações
|
||||
|
||||
- Ficheiros actualizados nesta revisão: `database/data/industrial-parks-reconciliation.json`, `database/data/industrial-park-candidate-drafts.json`, `app/Console/Commands/ImportIndustrialParkCandidates.php` e este relatório. O importador agora exige que o documento esteja anexado e reconciliado antes de permitir dry-run ou escrita. Os claims permanecem separados da evidência institucional e não entram automaticamente nos campos de actividades autorizadas.
|
||||
- A migração aditiva `2026_10_04_160000_extend_zone_development_and_area_scopes.php` e migrations de anexos/estado já estavam aplicadas na base activa. Nenhuma migração não relacionada foi executada nesta revisão.
|
||||
- A base activa foi consultada sem divulgar endereços nem credenciais: existe 1 email configurado como gestor e 0 utilizadores elegíveis com email verificado, MFA confirmado e segredo MFA presente.
|
||||
- Dry-run `php artisan investment-zones:import-industrial-candidates`: resolveu 9 registos e as relações territoriais exactas; resultado explicitamente `Dry run only. No writes made`.
|
||||
- `php -l app/Console/Commands/ImportIndustrialParkCandidates.php` confirmou sintaxe válida. A matriz JSON e o ficheiro dos nove rascunhos foram analisados sem erro.
|
||||
- Dry-run `php artisan investment-zones:import-initial`: resolveu os 7 registos iniciais e territórios; resultado `Dry run: no records written`.
|
||||
- A autorização do utilizador para importar foi recebida. Os comandos `--apply` continuam bloqueados pela condição de autoria e MFA existente; não foi inventado actor nem contornado o controlo. A contagem anterior na base activa era zero zonas e zero relações territoriais; nenhum dado foi inserido nesta revisão.
|
||||
- Verificações anteriores em base isolada: `php vendor/bin/phpunit --do-not-cache-result --filter=InvestmentZoneTest` — 10 testes, 161 asserções; TypeScript e build concluídos. Estas verificações não substituem o ensaio de importação autenticada na base activa.
|
||||
- `/zonas` e API responderam HTTP 200 anteriormente, mas o catálogo estava vazio. Não há ainda evidência de pesquisa pública positiva no browser.
|
||||
|
||||
## Próxima acção e rollback
|
||||
|
||||
O responsável deve criar ou recuperar a conta institucional correspondente ao endereço já configurado em `PORTAL_MANAGER_EMAILS`, concluir a verificação de email pela aplicação, iniciar sessão e configurar/confirmar MFA em `/settings/security`. Não partilhar senha, segredo ou código MFA. Depois, obter o ID dessa conta no painel autorizado e executar:
|
||||
|
||||
```powershell
|
||||
php artisan investment-zones:import-industrial-candidates --apply --actor=<ID_DO_GESTOR>
|
||||
php artisan investment-zones:import-industrial-candidates --apply --actor=<ID_DO_GESTOR>
|
||||
php artisan investment-zones:import-initial --apply --actor=<ID_DO_GESTOR>
|
||||
```
|
||||
|
||||
Os dois dry-runs acima são seguros para repetir; o segundo `--apply` deve demonstrar idempotência. A importação cria somente rascunhos privados. Revisão individual, anexos e publicação continuam separados.
|
||||
|
||||
Backup prévio verificado: `C:\laragon\secure-backups\investmoz\industrial-parks-20261004\investemoz-pre-zone-migrations.dump` (1 451 082 bytes; 2 188 entradas no inventário; restauro isolado confirmado). SHA-256: `CB2591B14B7322666D1AE141560361F6232C7E957EBA4F4591D5AA79F561B1C1`. Não restaurar sobre a base activa sem plano de recuperação. A importação não ocorreu, portanto não há registos desta etapa a reverter.
|
||||
|
||||
## Fontes consultadas
|
||||
|
||||
- [MozParks — perfil institucional](https://mozparks.co.mz/)
|
||||
- [MozParks — Topuito SME Village](https://mozparks.co.mz/construction-begins-on-sme-village-at-topuito-industrial-park/)
|
||||
- [MozParks — Cabo Delgado Parks](https://mozparks.co.mz/mozparks-launches-cabo-delgado-parks/)
|
||||
- [MozParks — Manica Parks](https://mozparks.co.mz/mozparks-launches-manica-parks-a-new-industrial-platform-for-manica-province/)
|
||||
- [APIEX — Beluluane](https://apiex.gov.mz/beluluane-industrial-park-free-zone/)
|
||||
- [APIEX — Mocuba](https://apiex.gov.mz/zif/mocuba-free-industrial-zone/)
|
||||
- [APIEX — Revúbuè](https://apiex.gov.mz/revubue-free-industrial-zone/)
|
||||
- [APIEX — Minhewene](https://apiex.gov.mz/zona-franca-industrial-de-minhewene/)
|
||||
- [SDUBeira — Munhava](https://sdubeira.co.mz/project/parque-industrial-logistico/)
|
||||
- [Imprensa Nacional — Decreto 57/2023](https://www.inm.gov.mz/pt-br/content/conselho-de-ministros-br-n%C2%BA-190-de-031023-boletim-da-rep%C3%BAblica-i-s%C3%A9rie-p%C3%A1g-2349)
|
||||
- [Imprensa Nacional — sumário do Decreto 12/2026](https://www.inm.gov.mz/pt-br/content/sum%C3%A1rio-br-n%C2%BA-68-de-130426-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-301)
|
||||
@@ -0,0 +1,74 @@
|
||||
# Integração de ZEE, ZFI e parques industriais — 4 de Outubro de 2026
|
||||
|
||||
## Estado da entrega
|
||||
|
||||
Implementação técnica preparada e migration aditiva aplicada à base activa `investemoz`. O conteúdo inicial foi validado em modo de ensaio contra a base territorial real. **Os sete registos continuam por importar**: a verificação não encontrou qualquer utilizador simultaneamente gestor autorizado, email verificado e MFA confirmado. O comando recusa atribuir a edição a outro utilizador ou a um actor fictício. Não há zonas publicadas nem foram alterados dados de zona existentes.
|
||||
|
||||
Não se aplicaram as restantes migrations pendentes. Antes da alteração foi guardado um backup completo em `C:\laragon\secure-backups\investmoz\zone-integration-2026-10-04\investemoz-before-zone-integration.dump` (1.441.899 bytes). O arquivo foi listado pelo `pg_restore` e restaurado integralmente numa base isolada, depois removida. A ACL do directório limita acesso à conta Windows local.
|
||||
|
||||
## Inspecção e alterações
|
||||
|
||||
- As tabelas `investment_zones`, `investment_legal_sources`, relações e revisões já existiam e correspondiam às migrations registadas. A base inicial não continha registos de zona.
|
||||
- Foi acrescentada `2026_10_04_130000_extend_investment_zone_records.php`, aditiva: categoria física, regime jurídico, estado operacional, área e unidade, aliases, actividades com estado e fonte, recursos com estado, localização histórica, datas de referência, relação componente-zona e várias localizações territoriais com revisão independente.
|
||||
- `InvestmentZoneController` e `InvestmentZones` suportam pesquisa territorial por IDs, filtros combinados de categoria/actividade, apresentação de todas as localizações revistas e gravação transaccional de relações pendentes. A consulta usa `EXISTS`, portanto uma zona com várias localizações aparece uma vez.
|
||||
- A publicação exige fonte jurídica válida, operador, categoria física e regime jurídico separados, conteúdo PT/EN, área territorial pública documentada e revisão independente. Fontes com artigo marcado “pendente/a rever” não podem ser validadas.
|
||||
- Os formulários de gestão foram ampliados para categoria física, regime, estado operacional, área/unidade, aliases, localização histórica, actividades, recursos, fontes e abrangência múltipla. O detalhe público distingue esses estados e apresenta localizações completas.
|
||||
- `investment-zones:import-initial` e `database/data/investment-zones-initial.json` fazem importação transaccional, idempotente e sem substituição: omitem códigos já existentes, deixam fontes/localizações pendentes e não publicam.
|
||||
- O texto recebido foi preservado, sem regravação, em `docs/investmoz/source-staging/zone-integration-2026-10-04/Pasted text.txt`.
|
||||
|
||||
## Registos preparados e decisões de reconciliação
|
||||
|
||||
O ensaio a 4 de Outubro resolveu todos os nomes abaixo para referências territoriais existentes. As relações ficam por rever antes de publicação.
|
||||
|
||||
| Código | Categoria / regime | Território resolvido | Área da fonte | Estado editorial / operacional |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `MOZ-BELULUANE-PARK` | parque industrial / geral | Posto Administrativo Matola Rio, sob Boane | cerca de 780 ha do conjunto | rascunho / não confirmado |
|
||||
| `MOZ-BELULUANE-ZFI` | zona franca industrial / ZFI | Matola Rio, componente distinta do parque | cerca de 55 ha | rascunho / não confirmado |
|
||||
| `MOZ-CRUSSE-JAMALI-ZEE` | área de turismo integrado / ZEE | Posto Administrativo Matibane, Mossuril | 1.750 ha | rascunho / não confirmado |
|
||||
| `MOZ-MANGA-MUNGASSA-ZEE` | zona económica / ZEE | Cidade da Beira | 217 ha | rascunho / não confirmado |
|
||||
| `MOZ-MOCUBA-ZEE` | zona económica / ZEE | distrito de Mocuba e PA Munhamade, Lugela | 10.727 km² | rascunho / não confirmado |
|
||||
| `MOZ-MOCUBA-ZFI` | zona franca industrial / ZFI | PA Cidade de Mocuba | 50,58 ha | rascunho / não confirmado |
|
||||
| `MOZ-NACALA-ZEE` | zona económica / ZEE | distritos de Nacala-Porto e Nacala-Velha | 1.539 km² | rascunho / não confirmado |
|
||||
|
||||
Decisões de proveniência:
|
||||
|
||||
- Os 780 ha de Beluluane são registados como área do conjunto indicado pela APIEX, não como terreno disponível. A componente ZFI é registo distinto. A base actual tem o PA `MATOLA RIO`; a grafia local é preservada e a localização histórica “Matola-Rio, Boane, Maputo” fica num campo separado. A relação ainda é pendente.
|
||||
- O decreto de criação de Crusse e Jamali estabelece uma zona turística sob regime ZEE. Actividades e infra-estruturas previstas não são convertidas em anúncios ou recursos existentes.
|
||||
- Manga-Mungassa fica como ZEE em `CIDADE DA BEIRA`; não existe registo anterior a corrigir na base, porque o catálogo estava vazio. Não foi associada a Boane, ao Porto de Maputo ou à N4.
|
||||
- Mocuba ZEE e Mocuba ZFI permanecem duas entidades. Para a ZEE foram usadas duas unidades territoriais por ID, sem reduzir o âmbito à cidade. A área conserva `km2` explicitamente.
|
||||
- A fonte APIEX consultada descreve a ZFI de Mocuba em mobilização de recursos/operador, mas sem data de referência verificável; o estado operacional foi deixado “não confirmado”.
|
||||
- Nacala usa a referência actual `NACALA-VELHA` da base territorial para a denominação da fonte “Nacala-à-Velha”. O distrito, área e acto são atribuídos à página oficial da APIEX; falta localizar e rever o texto do decreto na fonte oficial do Boletim antes de validar a referência jurídica.
|
||||
- Números históricos de empresas, empregos, investimentos e projectos não foram importados. Não foram criadas regras de incentivos, benefícios fiscais nem dados de infra-estrutura.
|
||||
|
||||
## Evidência e testes
|
||||
|
||||
- `php artisan migrate:status --no-ansi`: confirmou que as migrations base de zona já estavam executadas e havia migrations não relacionadas pendentes.
|
||||
- `pg_dump -Fc`: backup completo criado; `pg_restore --list`: arquivo legível; restauração completa noutra base PostgreSQL: concluída; base temporária removida.
|
||||
- Migration testada sobre restauro isolado apenas de esquema, seguida da aplicação da nova migration e verificação das colunas; base removida.
|
||||
- `phpunit --filter=InvestmentZoneTest` em base PostgreSQL isolada recém-criada: **8 testes, 131 asserções aprovadas**. Inclui publicação após revisões distintas, duas localidades sem duplicar resultado, filtros de província/distrito/actividade e importação repetida sem duplicação.
|
||||
- `php artisan investment-zones:import-initial --no-interaction`: ensaio sem escrita encontrou exactamente os sete códigos e resolveu Matola Rio, Matibane, Beira, Mocuba, Munhamade, Cidade de Mocuba, Nacala-Porto e Nacala-Velha aos identificadores da base territorial.
|
||||
- Não foi possível demonstrar edição, anexação e publicação no browser ligado à base activa: não existe gestor elegível com verificação de email e MFA para atribuir a autoria e revisão; não foram criadas contas nem forjadas aprovações. O teste automatizado exercitou o fluxo numa base isolada.
|
||||
|
||||
## Fontes oficiais consultadas
|
||||
|
||||
- APIEX, [Parque Industrial de Beluluane — Zona Franca](https://apiex.gov.mz/beluluane-industrial-park-free-zone/): Resolução Interna n.º 15/99, localização, cerca de 780 ha para o conjunto e área ZFI distinta de cerca de 55 ha.
|
||||
- Imprensa Nacional, [BR n.º 70 de 30.08.13](https://www.inm.gov.mz/pt-br/content/conselho-de-ministros-br-n%C2%BA-70-de-300813-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-571): Decreto n.º 47/2013, Crusse e Jamali.
|
||||
- APIEX, [Manga-Mungassa](https://apiex.gov.mz/zee/manga-mungassa-special-economic-zone/): Decreto n.º 22/2012, 6 de Junho, Beira e 217 ha.
|
||||
- Imprensa Nacional, [BR n.º 46 de 06.06.14](https://www.inm.gov.mz/pt-br/content/conselho-de-ministros-br-n%C2%BA-46-de-060614-boletim-da-rep%C3%BAblica-i-serie-p%C3%A1g-1259): Decretos n.º 28/2014 (ZEE) e n.º 29/2014 (ZFI), incluindo a descrição territorial de Mocuba.
|
||||
- APIEX, [ZEE de Mocuba](https://apiex.gov.mz/mocuba-special-economic-zone/) e [ZFI de Mocuba](https://apiex.gov.mz/zif/mocuba-free-industrial-zone/): área e estado descritivo publicados.
|
||||
- APIEX, [ZEE de Nacala](https://apiex.gov.mz/nacala-special-economic-zone/): Decreto n.º 76/2007, território e área; conteúdo do diploma continua por rever.
|
||||
|
||||
As páginas institucionais podem conter dados sem data de referência. Foram guardadas URL e data de consulta (04.10.2026), não se inferiu data de actualização dos factos. Cada fonte criada pela importação fica `pending` e os artigos estão marcados para revisão; o validador bloqueia a sua aprovação enquanto esse texto não for substituído por referência conferida.
|
||||
|
||||
## Pendências concretas
|
||||
|
||||
1. Um gestor elegível deve executar a importação com a própria conta registada: `php artisan investment-zones:import-initial --apply --actor=<ID_DO_GESTOR>`. O comando confirma MFA, email verificado e presença em `portal.managers`.
|
||||
2. Rever as referências territoriais pendentes, fonte e artigo de cada acto; em particular, localizar o Decreto 76/2007 de Nacala e confirmar a equivalência territorial histórica de Matola Rio.
|
||||
3. Associar/rever operadores documentados, actividade autorizada/condicionada e anexos. Operador não confirmado fica em branco e impede publicação.
|
||||
4. Publicar só após conta revisora/gestora autorizada e documentos e traduções essenciais verificados. Não há publicação em massa.
|
||||
5. O ecrã ainda regista URLs de fontes legais, mas não faz upload de diplomas, fotografias ou mapas como anexos binários; direitos de utilização e validação de anexos precisam de integração própria.
|
||||
6. Não houve ensaio visual por browser autenticado nem num telemóvel físico. Logo, o fluxo administrativo e a pesquisa pública com resultados destas zonas ainda não estão comprovados no browser.
|
||||
|
||||
## Rollback
|
||||
|
||||
O comando de importação é transaccional e pode ser repetido sem duplicar; não substitui códigos existentes. Para rollback estrutural, depois de confirmar que `investment_zones` e `investment_zone_locations` não contêm os novos dados, usar `php artisan migrate:rollback --path=database/migrations/2026_10_04_130000_extend_investment_zone_records.php --force`. A migration recusa remover tabelas/colunas que já contenham dados novos. O backup completo verificado permanece como recuperação adicional; não restaurar sobre a base activa sem plano de recuperação aprovado.
|
||||
@@ -0,0 +1,48 @@
|
||||
# Integração de zonas: estado da primeira fase
|
||||
|
||||
Data: 4 de Outubro de 2026
|
||||
|
||||
Este registo complementa `operations.md` e prevalece em caso de conflito sobre publicação sem operador, uploads em quarentena, autoria/revisão de anexos e preparação da conta gestora.
|
||||
|
||||
## Implementado e validado em base isolada
|
||||
|
||||
- Anexos privados por defeito; formatos permitidos: PDF, JPEG, PNG e WebP; limite de 20 MB. O servidor confere assinatura/conteúdo e dimensões de imagem, calcula SHA-256 e regista fonte, autoria e instante do carregamento.
|
||||
- A política documental existente mantém os uploads no estado `quarantined`: o portal não tem motor antivírus configurado. O gestor pode aceder ao ficheiro pela rota privada para o processo de segurança existente; o endpoint de selecção pública recusa ficheiros em quarentena. A revisão administrativa não altera nem contorna esse estado.
|
||||
- Revisão administrativa com estado de privacidade, direitos de utilização e fundamento. A revisão pelo próprio autor é permitida para anexos e fica registada como `independent_review=false`; não equivale a certificação.
|
||||
- A publicação de um anexo exige acção explícita, zona já publicada, revisão concluída, direitos confirmados com fundamento e ausência de dados pessoais. O original permanece privado até cumprir as condições. A retirada da selecção pública é suportada.
|
||||
- A ficha pública não expõe o nome original do ficheiro, identidade do carregador ou fundamento interno dos direitos. O ficheiro é servido apenas pela rota pública do anexo seleccionado ou pela rota privada autenticada com MFA.
|
||||
- A existência de operador identificado deixou de ser requisito de publicação. Continuam necessários identidade, categoria determinada, localização pública revista e fonte legal validada. Estado operacional, existência legal e disponibilidade para receber investimentos são conceitos separados. Nenhuma actividade é inferida como autorizada sem fonte.
|
||||
|
||||
## Controlos de acesso existentes
|
||||
|
||||
O portal mantém `manage-portal`, email verificado, MFA e lista de gestores para a gestão. A configuração de revisão legal/GIS e publicação já existia; as regras existentes de revisão separada para validar fontes, validar relações territoriais e publicar uma zona foram preservadas. Não foi criada uma exigência de equipa Legal/GIS ou certificador externo para anexos, nem uma regra geral que obrigue o autor do anexo e o revisor a serem pessoas diferentes. A situação de revisão independente fica explícita no registo.
|
||||
|
||||
Para preparar a conta: o responsável identifica a pessoa correspondente ao endereço já configurado em `portal.managers`. Essa pessoa cria a conta pelo registo normal ou recupera-a pelo fluxo normal de recuperação de acesso; confirma o email recebido e configura MFA em `/settings/security`. Não se deve enviar palavra-passe ou códigos de autenticação. Depois, o gestor obtém o próprio ID local e executa:
|
||||
|
||||
```powershell
|
||||
php artisan investment-zones:import-initial --apply --actor=<ID_DO_GESTOR>
|
||||
```
|
||||
|
||||
O comando cria rascunhos, não valida fontes e não publica. A execução pode ser repetida para demonstrar idempotência. A criação de conta, verificação de email e MFA não foram simuladas.
|
||||
|
||||
## Evidência de testes
|
||||
|
||||
- `php vendor/bin/phpunit --do-not-cache-result --filter InvestmentZone`: 10 testes, 165 asserções, aprovados na base PostgreSQL isolada em `localhost:55441`.
|
||||
- Cobertura adicionada: ficheiro válido privado/em quarentena, rejeição de conteúdo inválido e excesso de tamanho, acesso privado/público, revisão pelo próprio autor marcada como não independente, bloqueio de publicação por quarentena ou por direitos/privacidade desconhecidos, selecção pública explícita depois de a fixture representar a verificação de segurança e retirada da publicação.
|
||||
- `npm.cmd run build`: concluído. `node node_modules/typescript/bin/tsc --noEmit`: concluído.
|
||||
- Pint passou nos ficheiros deste escopo. A verificação global `php vendor/bin/pint --test` ainda aponta ficheiros não relacionados previamente fora do escopo.
|
||||
- OpenAPI de zonas regenerada a partir de 24 rotas registadas; continua a documentar contratos de resposta de forma genérica.
|
||||
- A instância PostgreSQL isolada foi parada; os seus ficheiros temporários foram preservados. A base activa não recebeu migrations, importação nem anexos. O banco de testes preexistente em `localhost:5432` não foi alterado.
|
||||
|
||||
## Pendências e limites
|
||||
|
||||
1. Aplicar as duas migrations novas à base activa só após o procedimento de backup/ensaio operacional previsto e a conta elegível estar pronta.
|
||||
2. Importar os sete registos como rascunhos; repetir o comando; rever individualmente fonte e localização com evidência documental.
|
||||
3. Receber os documentos/imagens binários originais, concluir o processo de verificação de segurança dos ficheiros previsto pelo portal e conferir direitos de divulgação. Referências URL existentes não substituem os ficheiros. Até existir esse processo registado, os anexos ficam privados em quarentena e não podem ser publicados.
|
||||
4. Um gestor autorizado deve testar no browser criação/edição, anexação, revisão e publicação selectiva. Não houve esse ensaio porque não existe conta elegível na base activa.
|
||||
5. Demonstrar no browser público pesquisa territorial com ao menos uma zona publicada. O catálogo activo continua vazio; não se declara integração concluída no portal.
|
||||
6. Requisitos específicos de operadores, actividades, incentivos, estado operacional, áreas e relações continuam pendentes conforme cada fonte; não preencher por inferência nem bloquear campos independentes já comprovados.
|
||||
|
||||
## Rollback
|
||||
|
||||
As migrations são aditivas e não foram executadas na base activa. Na base isolada, os testes cobriram os fluxos sem tocar em dados reais. Depois de activadas num ambiente, o rollback das migrations recusa remover tabelas/colunas com dados; primeiro exportar e reconciliar anexos e registos. Não apagar manualmente ficheiros privados como substituto de um rollback documentado.
|
||||
|
After Width: | Height: | Size: 78 KiB |