PROGRAMA INTEGRADO DE INVESTIMENTOS (
PII
)
 
2026-2030
Resumo executivo:
 
Este documento propõe a evolução do Portal do Investidor da Tempo 
Lda
 
para uma plataforma digital de apoio 
à implementação do Programa Integrado de Investimentos (
PII
 2026-2030
).
 As recomendações concentram-se em 
cinco
 prioridades: 
alinhar conteúdos e serviços com os eixos estratégicos do 
PII
 2026-2030
; organizar oportunidades por sectores, províncias e cadeias
 de 
valor;
 reforçar a credibilidade jurídica e institucional
;
 melhorar a experiência do utilizador
; e preparar
 funcionalidades 
transacionais
 que permitam ao investidor consultar oportunidades, simular incentivos, aceder a legislação essencial e acompanhar processos de investimento de forma integrada.
Este documento tem como 
objectivo
 apoiar a melhoria do Portal do Investidor da Tempo 
Lda
, disponível em https://infopublica.tempo.co.mz/portal-do-investidor, identificando 
correcções
 de conteúdo, ajustes de experiência do utilizador e funcionalidades prioritárias para tornar a plataforma mais útil, credível e orientada às necessidades de investidores nacionais e estrangeiros.
Alinhamento com o 
PII
 2026-2030:
 O portal deve funcionar como vitrine digital, mecanismo de facilitação e instrumento de acompanhamento das prioridades do 
PII
 2026-2030
, apoiando a mobilização de investimento público, privado e em parceria público-privada nos sectores estratégicos definidos para o período 2026-2030.
Carteira de 
projectos
 prioritários:
 organizar oportunidades por sector, província, estágio de maturidade, entidade promotora, modalidade de financiamento e impacto esperado.
Promoção territorial do investimento:
 destacar oportunidades provinciais e distritais, incluindo corredores logísticos, zonas económicas especiais, zonas francas industriais e polos produtivos.
Facilitação e acompanhamento:
 permitir que investidores identifiquem requisitos, entidades competentes, documentos necessários, incentivos aplicáveis e canais de contacto para cada oportunidade.
Monitoria do 
PII
 2026-2030
:
 incluir indicadores de execução, tais como número de oportunidades publicadas, manifestações de interesse recebidas, 
projectos
 em análise, montante estimado de investimento mobilizado e estado de implementação por sector.
Para estruturar um portal robusto e 100% alinhado com o plano governamental, os eixos estruturantes e os requisitos funcionais que devem estar presentes incluem:
1. Pilares de Conteúdo e Serviços Chave
Guia Regulatório e de Licenciamento:
Integração das normas de Licenciamento Simplificado e Mera Comunicação Prévia.
Fluxogramas clarificando o passo a passo para a abertura de empresas e registo de investimentos através da APIEX (Agência para a Promoção de Investimento e Exportações).
Sectores Estratégicos e Oportunidades Prioritárias:
Apresentação clara de 
projetos
 nas áreas-chave impulsionadas pelas políticas públicas: 
Agronegócio
, 
Energia & Mineração
 (com foco em energias renováveis e na transição energética), 
Turismo
, 
Infraestruturas
 e 
Mercado Financeiro / Economia Azul
.
Quadro Fiscal, Incentivos e Repatriamento de Capitais:
Detalhe das taxas reduzidas de IRPC (
ex
: 10% para agricultura e transportes) e isenções de IVA para insumos produtivos introduzidas no âmbito do PAE.
Explicação clara do regime legal de 
repatriamento de capitais
 e normas cambiais do Banco de Moçambique.
Zonas Económicas Especiais (ZEE) e Zonas Francas Industriais (
ZFI
):
Mapeamento 
interativo
 e explicativo sobre os benefícios fiscais e aduaneiros específicos das 
ZEEs
 e 
ZFIs
 em Moçambique.
2. Integração Institucional (Links e Interoperabilidade)
O portal deve servir como um balcão ou agregador facilitador, fazendo a ponte 
direta
 com os ecossistemas governamentais oficiais:
APIEX:
 Registo e aprovação de 
projetos
 de investimento privado.
Autoridade Tributária (AT):
 Obtenção de NUIT, informação sobre benefícios fiscais e procedimentos aduaneiros.
Banco de Moçambique:
 Registo de capital estrangeiro e regulamentação cambial.
Bolsa de Valores de Moçambique (
BVM
) / Bolsa de Mercadorias:
 Oportunidades no mercado financeiro e comercialização agrícola.
e-
SNIP
 / MEF:
 Transparência sobre 
projetos
 públicos e infraestruturas estratégicas.
3. Funcionalidades de experiência do utilizador e acessibilidade
Princípios de experiência do utilizador:
 O portal deve ser desenhado a partir das principais tarefas do investidor: compreender oportunidades, comparar sectores, confirmar requisitos legais, simular incentivos, iniciar contacto e acompanhar processos. Cada página deve reduzir dúvidas, evitar jargão excessivo, apresentar chamadas de 
acção
 claras e oferecer um caminho visível para apoio especializado.
Calculadora ou simulador de incentivos:
 permitir ao investidor estimar, de forma orientadora, possíveis impostos, benefícios fiscais e requisitos aplicáveis em função da 
província, do sector, da localização em ZEE ou 
ZFI
 e do volume de investimento, deixando claro que o resultado depende de validação legal e institucional.
Suporte multilingue:
 disponibilizar, no mínimo, versões completas em português e inglês, com alternância visível em todas as páginas principais e tradução consistente dos formulários, guias, mensagens de erro, botões de 
ação
 e documentos de apoio essenciais. A inclusão futura de francês ou mandarim deve depender dos públicos-alvo prioritários e da capacidade de manutenção dos conteúdos.
Área Reservada 
ou 
Dashboard do Investidor
:
 permitir ao investidor acompanhar o
 estado das submissões, 
visualizar documentos pendentes, receber notificações, agendar 
reuniões virtuais
, consultar histórico de 
interações
 e solicitar
 assistência 
direta
 junto dos serviços de facilitação do investimento.
Requisitos mínimos de acessibilidade:
 O portal deve garantir contraste adequado, leitura simples em dispositivos móveis, navegação por teclado, textos alternativos para imagens e ícones, rótulos claros em formulários e mensagens de erro compreensíveis. Estes requisitos são essenciais para que investidores com diferentes níveis de literacia digital consigam utilizar a plataforma sem apoio constante.
Excelente. Focar em todas estas três frentes permite estruturar uma plataforma coesa e perfeitamente operacional.
Abaixo está o plano 
diretor
 detalhado para cada uma das vertentes:
1. 
Arquitectura
 de Informação e Conteúdos (
Sitemap
 & UX)
A navegação deve 
refletir
 o ciclo de vida do investidor: descoberta de oportunidades, análise de requisitos, preparação e submissão do 
projeto
, acompanhamento do processo e apoio pós-investimento.
A. Áreas Principais do Portal
Porquê Moçambique?
Dados macroeconómicos 
actualizados
 e relatórios de risco de país.
Localização estratégica (acesso ao mercado da SADC e corredores de logística).
Guia do Investidor (Passo a Passo):
Mapeamento do percurso legal: Constituição de empresa 
 Obtenção de NUIT 
 Registo na APIEX 
 Licenciamento e Abertura de Conta Bancária.
Sectores e 
Projetos
 Estratégicos:
Catálogo 
interativo
 por sector (
Energia 
e
 Mineração
, 
Agronegócio
, 
Turismo
, 
Infraestruturas
 e
 
Mercado Financeiro
).
Carteira 
PII
 2026-2030:
 cada sector deve apresentar oportunidades associadas ao 
PII
 2026-2030
, com indicação de localização, entidade promotora, fase de preparação, necessidades de financiamento, impacto económico esperado e documentos de referência disponíveis.
Oportunidades em Zonas Económicas Especiais (ZEE) e Zonas Francas Industriais (
ZFI
).
Quadro Legal & Incentivos:
Repositório documental 
descarregável
 (Leis, Decretos, Regulamentos Cambiais).
Guia de tributação e facilidades fiscais.
Balcão Virtual / Área Reservada:
Submissão e acompanhamento de propostas de investimento em tempo real.
2. Integração Técnica com APIs Governamentais
Para transformar o portal num balcão único interoperável, as integrações de sistema devem ser tratadas como uma ambição funcional dependente de acordos institucionais, disponibilidade técnica das entidades públicas e validação jurídica dos fluxos de dados.
[ Investidor / Portal ] 
       │
       
├
──
►
 APIEX (API de Registo) 
──
►
 Valida
çã
o de 
Projetos
 & Licenciamento
       
├
──
►
 Autoridade Tribut
á
ria 
──
►
 Emiss
ã
o de NUIT & Benef
í
cios Fiscais
       
├
──
►
 Banco de Mo
ç
ambique  
──
►
 Verifica
çã
o Cambial & Repatriamento
       └──
►
 
BRC
 (Registo Comercial)
─
►
 Verifica
çã
o de Entidades Singulares/
Coletivas
Especificações dos 
Endpoints
 Chave
APIEX (Agência de Promoção de Investimentos e Exportações):
Submissão 
electrónica
 do Formulário de Pedido de Autorização de Investimento.
Consulta de estado do processo via 
Webhook
 de notificação.
Autoridade Tributária (AT):
Verificação e atribuição automática do NUIT de investidor singular ou 
coletivo
.
Emissão e validação de Certidões de Quitação e elegibilidade a benefícios fiscais.
Banco de Moçambique (BM):
Integração com a plataforma de registo de Operações Cambiais de Capital (para registo do investimento estrangeiro e garantia de repatriamento de lucros/dividendos).
Segurança e Autenticação:
Autenticação via 
OAuth
 2.0 / 
OpenID
 
Connect
.
Criptografia de dados ponta a ponta (
TLS
 1.3 / AES-256) em conformidade com as normas estatais de 
protecção
 de dados.
3. Alinhamento Jurídico com a Lei de Investimentos Privados
O conteúdo e os fluxos de trabalho do portal devem 
refletir
 rigorosamente o quadro legal vigente em Moçambique:
Lei de Investimentos e Regulamentação:
Alinhamento 
direto
 com as garantias legais de 
proteção
 da propriedade privada e não-discriminação entre investidores nacionais e estrangeiros.
Clareza nos limites mínimos de capital para elegibilidade a incentivos específicos do regime de investimento privado.
Facilitação Cambial e Repatriamento:
Instruções claras sobre a obrigatoriedade de registo do capital de entrada junto do Banco de Moçambique para assegurar o direito de transferência de lucros, dividendos e capital investido de volta ao país de origem.
Incentivos Fiscais e Aduaneiros:
Incorporação das reduções e isenções previstas (
ex
: redução de taxas de IRPC para agricultura e transportes, isenções de direitos aduaneiros para bens de equipamento da Classe K).
Simplificação de Processos:
Mecanismo de Mera Comunicação Prévia para 
atividades
 de baixo risco económico, eliminando burocracias e reduzindo prazos de resposta das entidades licenciadoras.
P
ortal 
actual
 em 
Portal do Investidor - Informação Pública
, a estrutura existente serve como uma boa 
base conceptual e demonstrativa
, mas 
precisa de melhorias significativas
 para se tornar uma ferramenta plenamente funcional, fiável e 
atrativa
 para investidores nacionais e estrangeiros.
Aqui está uma avaliação detalhada do que o portal já cumpre bem e dos pontos críticos que precisam de ser aprimorados:
O que o portal já faz bem (Pontos Fortes)
Estrutura Visual Limpa:
 Apresentação moderna, com bom contraste e organização clara por blocos de conteúdo.
Sectores Bem Mapeados:
 A divisão em áreas chave (Energia & Mineração, Agronegócio, Turismo, Infraestruturas e Mercado Financeiro) alinha-se com as prioridades económicas reais do país.
Mapeamento Institucional:
 A indicação visível dos principais reguladores (APIEX, Banco de Moçambique, Autoridade Tributária, 
BVM
 e Bolsa de Mercadorias) transmite o ecossistema institucional 
correto
.
O que precisa de ser Melhorado para Uso Real
1. Incoerências de Conteúdo e Exemplo (UX & Informação)
Barra de Pesquisa Descontextualizada:
 O campo de busca deve sugerir temas 
directamente
 ligados ao investimento, como “registo de 
projecto
 na APIEX”, “benefícios fiscais”, “repatriamento de dividendos”, “Zonas Económicas Especiais” e “licenciamento simplificado”, em vez de exemplos associados a serviços gerais de cidadania.
Falta de Profundidade nos Cards:
 As descrições dos sectores estratégicos devem abandonar frases genéricas e apresentar informação específica de cada área, incluindo oportunidades, localização, tipo de investidor-alvo, principais incentivos, entidades competentes e documentos necessários para iniciar o processo.
2. Transição de "Site Informativo" para "Portal 
Transacional
"
Falta de Integração Operacional:
 Os logos dos reguladores e os botões da página funcionam apenas como links estáticos. Para um investidor, é crucial ter 
balcão único
, onde possa:
Submeter propostas ou pré-candidaturas de 
projetos
 
diretamente
 à APIEX.
Consultar tabelas de incentivos fiscais 
interativas
 por 
província e 
sector.
Iniciar/consultar pedidos de NUIT ou registos operacionais.
3. Alinhamento Jurídico e Regulatório Visível
Quadro Legal Acessível:
 Falta um repositório claro de documentos jurídicos essenciais para descarregar, como a 
Nova Lei de Investimentos Privados
, o regulamento das Zonas Económicas Especiais (ZEE), e o guia de 
Regulamentação Cambial do Banco de Moçambique
 para repatriamento de capitais.
Guias de processos passo a passo:
 deve existir uma secção dedicada que explique, de forma visual e textual, a rota do investidor: constituição de empresa, obtenção de NUIT, registo na APIEX, licenciamento simplificado quando aplicável, abertura de conta bancária e registo cambial.
4. Recursos Multilingues e de Suporte
Idioma:
 Sendo Moçambique um polo de 
atração
 de investimento internacional, o portal necessita obrigatoriamente de alternância fluida entre 
Português e Inglês
 (e idealmente Francês ou Mandarim).
Canais de Suporte 
Direto
:
 Além do contacto genérico por e-mail/telefone, seria muito vantajoso ter um sistema de agendamento de reuniões virtuais com assistentes da APIEX ou um 
helpdesk
 focado no investidor.
Nota de validação:
 Todas as referências a benefícios fiscais, taxas reduzidas, incentivos aduaneiros, 
repatriamento de capitais e licenciamento simplificado deve
 ser confirmadas com a legislação vigente e com as entidades competentes antes da publicação final no portal. O portal deve apresentar informação orientadora, mas evitar substituir parecer jurídico, decisão administrativa ou confirmação oficial das autoridades.
Correções
 imediatas recomendadas na página 
atual
:
 substituir exemplos de pesquisa ligados a cidadania por termos de investimento; rever todos os cards 
setoriais
 para eliminar textos repetidos; criar chamadas claras para documentos legais, incentivos e procedimentos; incluir uma opção visível de idioma; e acrescentar uma secção “Como começar” com passos simples para novos investidores.
Como começar:
 A página principal deve incluir uma secção curta com cinco passos para novos investidores: identificar o sector de interesse, consultar requisitos legais e incentivos aplicáveis, preparar documentos básicos, solicitar orientação ou reunião de facilitação e iniciar o processo de registo ou submissão junto da entidade competente.
Recomendação
O portal 
atual
 funciona como uma boa base visual e informativa, mas deve evoluir por etapas
 para se tornar uma plataforma de apoio ao 
PII
 2026-2030
: primeiro, corrigindo textos, pesquisa, navegação, 
bilinguidade
 e conteúdos 
setoriais
; depois, adicionando 
carteira de 
projectos
, 
recursos legais, guias práticos
, filtros territoriais
 e ferramentas de apoio à decisão; e, numa fase mais avançada, integrando funcionalidades 
transaccionais
, monitoria de investimentos e ligação operacional
 com sistemas públicos, sempre mediante validação institucional.
Matriz de prioridades
 alinhada ao 
PII
 2026-2030
:
 
As 
correcções
 devem ser organizadas em três níveis. 
Prioridade alta:
 
alinhar a página inicial com os 
objectivos
 do 
PII
 2026-2030
, 
corrigir a barra de pesquisa, substituir textos genéricos dos cards, criar páginas 
sectoriais
 
e territoriais com oportunidades verificáveis
 e inserir uma secção visível de legislação
,
 incentivos
 e carteira de 
projectos
 prioritários.
 
Prioridade média:
 implementar 
selector
 de idiomas, melhorar filtros de pesquisa
 por sector, província, entidade competente e fase do investimento
, criar formulário de contacto especializado e estruturar o repositório documental. 
Prioridade futura:
 desenvolver Área Reservada do Investidor, simulador fiscal
 orientador
, acompanhamento de processos
, indicadores de monitoria do 
PII
 
2026-2030 
e integrações 
transaccionais
 com entidades públicas
, sempre mediante validação institucional
.
Para transformar o portal 
actual
 numa 
Plataforma Integrada de Serviços de Investimento (Single 
Window
 for 
Investment
)
, a implementação deve ser feita em 
fases estruturadas
, cobrindo a 
arquitectura
 do sistema, os fluxos de integração por API e os novos componentes de interface (UI/UX).
Aqui está o plano de implementação técnico e funcional para o portal:
Fase
 1: 
Arquitectura
 do Sistema e Segurança (
Backend
)
Antes de conectar as APIs governamentais, é necessário estabelecer uma camada intermédia de orquestração (
API Gateway
) no portal para garantir segurança, registo de auditoria e alta disponibilidade.
[ 
Frontend
: 
React
 / Next.js ]
            │
            
▼
 (HTTPS / 
OAuth
 2.0)
[ 
Backend
 / API Gateway 
Integrador]
 
◄
──
►
 [ Base de Dados 
Transaccional
 (
PostgreSQL
) ]
            │
            
├
──
►
 API APIEX (Propostas & Licenciamento)
            
├
──
►
 API Autoridade Tribut
á
ria (NUIT & Isen
çõ
es)
            
├
──
►
 API Banco de Mo
ç
ambique (Registo Cambial)
            └──
►
 API Conservat
ó
ria / 
BRC
 (Valida
çã
o Empresarial)
Gestão de Identidade e Autenticação (e-ID / 
OAuth
 2.0):
Criar o 
Dashboard do Investidor
 com login seguro (Single 
Sign-On
).
Suporte para submissão de documentos assinados digitalmente ou validados com verificação de identidade (
KYC
).
Base de Dados 
Transacional
:
Implementar uma base de dados relacional para gerir o estado dos pedidos (
Draft
, 
Submetido
, 
Em Análise na APIEX
, 
Aprovado
, 
Pendente de Pagamento
).
Fase
 2: Implementação das Integrações por API
A tabela seguinte apresenta exemplos conceptuais de pontos de integração que devem ser validados com cada entidade pública antes de qualquer desenvolvimento em ambiente de produção.
Nota técnica:
 Os 
endpoints
 indicados na tabela são exemplos conceptuais para especificação funcional e devem ser confirmados com cada entidade competente antes de qualquer implementação técnica ou publicação como integração oficial.
Entidade Governamental
Ponto de Integração (
Endpoint
)
Função no Portal
APIEX
/
api
/v1/
investments
/
submit
Submissão 
directa
 do Formulário de Pedido de Autorização de Investimento Privado.
Autoridade Tributária (AT)
/
api
/v1/
tax
/
nuit-validation
Validação automática do NUIT e emissão do comprovativo de enquadramento nos incentivos do Código dos Benefícios Fiscais.
Banco de Moçambique (BM)
/
api
/v1/
forex
/
register
-capital
Registo preliminar de intenção de entrada de capital estrangeiro para garantia de repatriamento de lucros.
Registo Comercial (
BRC
)
/
api
/v1/
company
/
verify
Verificação do estado de constituição e reserva de nome da entidade jurídica.
Fase
 3: Novos Componentes e Funcionalidades 
de
 UI/UX
Para resolver as limitações da versão 
actual
, o 
frontend
 deve incorporar os seguintes módulos:
1. Repositório Digital de Guias Jurídicos
Secção "Centro de Recursos Legal":
 Um hub organizado por categorias com 
PDFs
 e documentos oficiais descarregáveis e pesquisáveis:
Nova Lei de Investimentos Privados e Regulamento.
Código dos Benefícios Fiscais e Quadro do PAE (Licenciamento Simplificado).
Avisos e Normativos Cambiais do Banco de Moçambique.
Filtros 
inteligentes:
 permitir
 filtrar documentos por 
sector, tipo
 de 
incentivo fiscal ou aduaneiro
,
 
província
, entidade competente, fase do investimento e data de 
actualização
.
2. Simulador 
Interactivo
 de Incentivos Fiscais
Uma ferramenta onde o investidor insere:
Volume de investimento proposto (
ex
: USD).
Sector de 
atividade
 (
ex
: Agronegócio, Energias Renováveis).
Localização (Província / ZEE / 
ZFI
).
Resultado instantâneo:
 O portal calcula a estimativa de taxa de IRPC aplicável, anos de isenção de IVA e redução de direitos aduaneiros sobre bens de capital (Classe K).
3. Balcão Virtual / Acompanhamento de Processos em Tempo Real
Substituir os botões estáticos por um 
Acompanhador de Estado (
Tracking
 
System
)
:
investidor recebe um Número de Acompanhamento Único.
Visualiza em tempo real as etapas: 
Análise de Viabilidade Parecer das Entidades Sectoriais Aprovação do Projeto Emissão do Certificado de Investimento
.
Fase
 4: Reorganização da Página Principal
Com base na versão 
actual
 em 
Portal do Investidor
:
Ajustar a Barra de Pesquisa:
Alterar os exemplos de busca para termos do ecossistema de negócios: 
"Isenção de IVA agricultura", "Como registar 
projecto
 na APIEX", "Repatriamento de dividendos"
.
Substituir os textos genéricos dos cards por dados operacionais verificáveis em cada sector, incluindo oportunidades concretas, localização, incentivos aplicáveis, entidades competentes, documentos necessários e chamada de 
acção
 específica para iniciar o processo.
Em vez de 
“Explore o potencial...”
, apresentar dados operacionais de cada sector quando validados, como área disponível, incentivos aplicáveis, entidades competentes e chamada de 
acção
 específica. Qualquer número ou taxa deve ser identificado como exemplo ilustrativo ou confirmado por fonte oficial antes da publicação.
Adicionar 
Selector
 de Idiomas Visível:
Adicionar alternador de idioma no cabeçalho (
PT | EN
).
Próximo Passo Recomendado
Próximo passo recomendado: priorizar primeiro as melhorias de conteúdo e navegação da página pública, porque são as que têm impacto imediato na credibilidade do portal. Em seguida, deve ser preparada a especificação funcional da Área Reservada do Investidor e, numa fase posterior, o desenho técnico das integrações por API com entidades públicas relevantes.
Anexo técnico:
 A especificação 
OpenAPI
 3.0 e os exemplos de wireframe apresentados a seguir devem ser tratados como material de apoio para a equipa de desenvolvimento, complementando as recomendações funcionais descritas nas secções anteriores.
1. Especificação 
OpenAPI
 3.0 / 
Swagger
 (
Backend
 Integrador)
Esta especificação define os 
endpoints
 principais para integração 
transaccional
 com a 
APIEX
, 
Autoridade Tributária (AT)
 e 
Banco de Moçambique (BM)
.
YAML
openapi
: 3.0.3
info
:
  
title
: API do Portal do Investidor de Moçambique (
Backend
 Integrador)
  
description
: 
Endpoints
 para 
transações
 e integrações com APIEX, Autoridade Tributária e Banco de Moçambique.
  
version
: 1.0.0
servers:
  - url: https://api.invest.gov.mz/v1
    
description
: Servidor Principal de Produção / 
Sandbox
paths
:
  /
apiex
/
projects
/
submit
:
    
post
:
      
summary
: Submeter Proposta de Investimento Privado à APIEX
      
operationId
: 
submitInvestmentProject
      
security
:
        - 
BearerAuth
: []
      
requestBody
:
        
required
: 
true
        
content
:
          
application
/
json
:
            
schema
:
              $
ref
: '#/
components
/
schemas
/
InvestmentProjectRequest
'
      responses:
        '201':
          
description
: Projeto submetido com sucesso.
          
content
:
            
application
/
json
:
              
schema
:
                $
ref
: '#/
components
/
schemas
/
ProjectSubmissionResponse
'
        '400':
          
description
: Dados de formulário inválidos ou incompletos.
  /
apiex
/
projects
/{
projectId
}/status:
    
get
:
      
summary
: Consultar Estado do Projeto na APIEX
      
operationId
: 
getProjectStatus
      
security
:
        - 
BearerAuth
: []
      
parameters
:
        - 
name
: 
projectId
          in: 
path
          
required
: 
true
          
schema
:
            
type
: 
string
      responses:
        '200':
          
description
: Detalhes e estado 
atual
 do processo.
          
content
:
            
application
/
json
:
              
schema
:
                $
ref
: '#/
components
/
schemas
/
ProjectStatusResponse
'
  /
tax
/
nuit
/
validate
:
    
post
:
      
summary
: Validar NUIT e Verificar Isenção de Benefícios Fiscais (AT)
      
operationId
: 
validateTaxNuit
      
security
:
        - 
BearerAuth
: []
      
requestBody
:
        
required
: 
true
        
content
:
          
application
/
json
:
            
schema
:
              
type
: 
object
              
properties
:
                
nuit
:
                  
type
: 
string
                  
example
: "400123456"
                
sectorCode
:
                  
type
: 
string
                  
example
: "AGRI_01"
      responses:
        '200':
          
description
: Validação do NUIT e estado de quitação/incentivo.
          
content
:
            
application
/
json
:
              
schema
:
                
type
: 
object
                
properties
:
                  
isValid
:
                    
type
: 
boolean
                  
companyName
:
                    
type
: 
string
                  
eligibleTaxIncentive
:
                    
type
: 
boolean
                  
irpcReducedRate
:
                    
type
: 
number
                    
example
: 10
  /
forex
/capital-
registration
:
    
post
:
      
summary
: Registo Cambial de Entrada de Capital Estrangeiro (Banco de Moçambique)
      
operationId
: 
registerForeignCapital
      
security
:
        - 
BearerAuth
: []
      
requestBody
:
        
required
: 
true
        
content
:
          
application
/
json
:
            
schema
:
              $
ref
: '#/
components
/
schemas
/
ForexCapitalRegistration
'
      responses:
        '200':
          
description
: Registo 
efetuado
 com garantia legal de repatriamento de dividendos.
components
:
  
securitySchemes
:
    
BearerAuth
:
      
type
: 
http
      
scheme
: 
bearer
      
bearerFormat
: 
JWT
  
schemas
:
    
InvestmentProjectRequest
:
      
type
: 
object
      
required
:
        - 
companyName
        - 
nuit
        - sector
        - 
investmentAmountUSD
        - 
province
      
properties
:
        
companyName
:
          
type
: 
string
          
example
: "
AgroMoz
 S.A."
        
nuit
:
          
type
: 
string
          
example
: "400123456"
        sector:
          
type
: 
string
          
enum
: [
AGRONEGOCIO
, 
ENERGIA_MINERACAO
, TURISMO, INFRAESTRUTURA, 
MERCADO_FINANCEIRO
]
        
investmentAmountUSD
:
          
type
: 
number
          
example
: 2500000.00
        
province
:
          
type
: 
string
          
example
: "Zambézia"
        
hasLocalPartner
:
          
type
: 
boolean
          
example
: 
true
    
ProjectSubmissionResponse
:
      
type
: 
object
      
properties
:
        
trackingNumber
:
          
type
: 
string
          
example
: "INV-MZ-2026-8891"
        status:
          
type
: 
string
          
example
: "
UNDER_REVIEW
"
        
submittedAt
:
          
type
: 
string
          
format
: date-time
    
ProjectStatusResponse
:
      
type
: 
object
      
properties
:
        
trackingNumber
:
          
type
: 
string
        status:
          
type
: 
string
          
enum
: [
SUBMITTED
, 
UNDER_REVIEW
, 
PENDING_DOCUMENTS
, 
APPROVED
, 
REJECTED
]
        
currentStage
:
          
type
: 
string
          
example
: "Parecer da Autoridade Tributária"
        
estimatedDaysRemaining
:
          
type
: 
integer
          
example
: 5
    
ForexCapitalRegistration
:
      
type
: 
object
      
properties
:
        
trackingNumber
:
          
type
: 
string
        
amountForeignCurrency
:
          
type
: 
number
          
example
: 1000000.00
        
currency
:
          
type
: 
string
          
example
: "USD"
        
originBankCountry
:
          
type
: 
string
          
example
: "
ZAF
"
2. Wireframe / Layout da Nova Área Reservada do Investidor
Abaixo está o modelo visual em ASCII / Estrutura UI para o dashboard privado do investidor:
+---------------------------------------------------------------------------------------------------+
|  [LOGO 
GOV
/APIEX]  Portal do Investidor                [Notificações (3)]  [
PT|EN
]  User: 
Agromoz
 |
+---------------------------------------------------------------------------------------------------+
| NAV: [Dashboard]  [Os Meus 
Projetos
]  [Simulador 
Fiscal
]  [Repositório Legal]  [Suporte 
Direto
] |
+---------------------------------------------------------------------------------------------------+
|                                                                                                   |
|  BEM-VINDO, 
AGROMOZ
 S.A.                                                                          |
|  Estado Geral do Investimento: ENCAMINHADO PARA APROVAÇÃO                                         |
|                                                                                                   |
|  +---------------------------------------------------------------------------------------------+  |
|  | PROGRESSO DA CANDIDATURA (
Tracking
 ID: INV-MZ-2026-8891)                                   |  |
|  |                                                                                             |  |
|  |  ( [✓] Submissão )  ───  ( [✓] NUIT & AT )  ───  ( [●] Análise APIEX )  ───  ( [ ] Emitido )  |  |
|  |  Concluído 20/
Jul
       Validado em Sistema      Em Avaliação (Restam 4 dias)                   |  |
|  +---------------------------------------------------------------------------------------------+  |
|                                                                                                   |
|  +--------------------------------------------------+  +---------------------------------------+  |
|  | RESUMO DO PROJETO SUBMETIDO                      |  | INCENTIVOS E ENQUADRAMENTO FISCAL     |  |
|  +--------------------------------------------------+  +---------------------------------------+  |
|  | Sector: Agronegócio & Processamento             |  | IRPC Aplicável: 10% (Redução de 68%)  |  |
|  | Província: Zambézia (Distrito de 
Gurúè
)         |  | Isenção de IVA (Classe K): 
ATIVA
      |  |
|  | Valor: USD $2,500,000.00                          |  | Registo Cambial BM: REGISTADO         |  |
|  | Empregos Previstos: 120 Locais                    |  | Certidão de Quitação: VÁLIDA          |  |
|  | [Descarregar Dossier PDF]                        |  | [Ver Declaração de Incentivos]        |  |
|  +--------------------------------------------------+  +---------------------------------------+  |
|                                                                                                   |
|  +---------------------------------------------------------------------------------------------+  |
|  | AÇÕES RÁPIDAS & SERVIÇOS INTEGRADOS                                                         |  |
|  +---------------------------------------------------------------------------------------------+  |
|  |  [ + Novo Projeto ]   [ Agendar Reunião APIEX ]   [ Pedir Certificado ]   [ Anexar Licença ]|  |
|  +---------------------------------------------------------------------------------------------+  |
|                                                                                                   |
+---------------------------------------------------------------------------------------------------+
As opções seguintes apresentam alternativas técnicas para desenvolvimento posterior: modelos de dados de 
backend
 em 
TypeScript
/
Python
 e componentes de 
frontend
 em 
React
/
Tailwind
 para a Área Reservada do Investidor.
Os elementos seguintes devem ser tratados como material técnico de apoio para a equipa de desenvolvimento, incluindo
 
modelos de dados em 
TypeScript
, 
Python
/
Pydantic
 e componentes
 de 
frontend
 em 
React
 com 
Tailwind
 CSS
 para a Área Reservada do Investidor.
1. Modelos de Dados no 
Backend
A. 
TypeScript
 (Interfaces & 
Zod
 
Validation
)
TypeScript
// 
types
/
investor.ts
import
 { z } 
from
 '
zod
';
export
 
enum
 
ProjectSector
 {
  
AGRONEGOCIO
 = '
AGRONEGOCIO
',
  
ENERGIA_MINERACAO
 = '
ENERGIA_MINERACAO
',
  TURISMO = 'TURISMO',
  INFRAESTRUTURA = 'INFRAESTRUTURA',
  
MERCADO_FINANCEIRO
 = '
MERCADO_FINANCEIRO
',
}
export
 
enum
 
ProjectStatus
 {
  
SUBMITTED
 = '
SUBMITTED
',
  
UNDER_REVIEW
 = '
UNDER_REVIEW
',
  
PENDING_DOCUMENTS
 = '
PENDING_DOCUMENTS
',
  
APPROVED
 = '
APPROVED
',
  
REJECTED
 = '
REJECTED
',
}
// 
Schema
 
Zod
 para validação do 
payload
 de submissão
export
 
const
 
InvestmentProjectSchema
 = 
z.object
({
  
companyName
: 
z.string
().min(2, "Nome da empresa é obrigatório"),
  
nuit
: 
z.string
().
length
(9, "O NUIT deve ter 
exatamente
 9 dígitos"),
  sector: 
z.nativeEnum
(
ProjectSector
),
  
investmentAmountUSD
: 
z.number
().positive("O valor deve ser superior a 0"),
  
province
: 
z.string
().min(2, "
Selecione
 a província do 
projeto
"),
  
hasLocalPartner
: 
z.boolean
().
default
(false),
  
contactEmail
: 
z.string
().email("E-mail inválido"),
});
export
 
type
 
InvestmentProjectRequest
 = 
z.infer
<
typeof
 
InvestmentProjectSchema
>;
export
 interface 
ProjectStatusResponse
 {
  
trackingNumber
: 
string
;
  status: 
ProjectStatus
;
  
currentStage
: 
string
;
  
estimatedDaysRemaining
: 
number
;
  
submittedAt
: 
string
;
  
taxIncentiveApplied
: {
    
irpcReducedRate
: 
number
; // 
ex
: 10%
    
vatExemption
: 
boolean
;
  };
}
B. 
Python
 (
Pydantic
 / 
FastAPI
 
Models
)
Python
# models/investor.py
from
 
enum
 
import
 
Enum
from
 
pydantic
 
import
 
BaseModel
, 
EmailStr
, Field
from
 
datetime
 
import
 
datetime
from
 
typing
 
import
 
Optional
class
 
ProjectSector
(
str
, 
Enum
):
    
AGRONEGOCIO
 = "
AGRONEGOCIO
"
    
ENERGIA_MINERACAO
 = "
ENERGIA_MINERACAO
"
    TURISMO = "TURISMO"
    INFRAESTRUTURA = "INFRAESTRUTURA"
    
MERCADO_FINANCEIRO
 = "
MERCADO_FINANCEIRO
"
class
 
ProjectStatus
(
str
, 
Enum
):
    
SUBMITTED
 = "
SUBMITTED
"
    
UNDER_REVIEW
 = "
UNDER_REVIEW
"
    
PENDING_DOCUMENTS
 = "
PENDING_DOCUMENTS
"
    
APPROVED
 = "
APPROVED
"
    
REJECTED
 = "
REJECTED
"
class
 
InvestmentProjectRequest
(
BaseModel
):
    
company_name
: 
str
 = Field(..., 
min_length
=2, 
example
="
AgroMoz
 S.A.")
    
nuit
: 
str
 = Field(..., 
min_length
=9, 
max_length
=9, 
example
="400123456")
    sector: 
ProjectSector
    
investment_amount_usd
: 
float
 = Field(..., 
gt
=0, 
example
=2500000.00)
    
province
: 
str
 = Field(..., 
example
="Zambézia")
    
has_local_partner
: 
bool
 = False
    
contact_email
: 
EmailStr
class
 
TaxIncentiveSummary
(
BaseModel
):
    
irpc_reduced_rate
: 
float
 = Field(
default
=10.0, 
description
="Taxa reduzida de IRPC em %")
    
vat_exemption
: 
bool
 = 
True
    
customs_exemption_class_k
: 
bool
 = 
True
class
 
ProjectStatusResponse
(
BaseModel
):
    
tracking_number
: 
str
 = Field(..., 
example
="INV-MZ-2026-8891")
    status: 
ProjectStatus
    
current_stage
: 
str
 = Field(..., 
example
="Parecer da Autoridade Tributária")
    
estimated_days_remaining
: 
int
 = 5
    
submitted_at
: 
datetime
    
tax_incentive
: 
TaxIncentiveSummary
2. Componente 
React
 (Next.js / 
Tailwind
 CSS)
Este componente 
renderiza
 a 
Área Reservada do Investidor (Dashboard)
 com monitorização de estado em tempo real, indicadores fiscais e atalhos rápidos de 
ação
.
TypeScript
// 
components
/
InvestorDashboard.tsx
import
 
React
, { 
useState
 } 
from
 '
react
';
export
 
default
 
function
 
InvestorDashboard
() {
  
const
 [
project
] = 
useState
({
    
trackingNumber
: 'INV-MZ-2026-8891',
    
companyName
: '
Agromoz
 S.A.',
    sector: 'Agronegócio & Processamento',
    
province
: 'Zambézia (
Gurúè
)',
    
amountUSD
: 2500000,
    status: '
UNDER_REVIEW
',
    
stage
: 'Análise na APIEX',
    
daysRemaining
: 4,
    steps: [
      { 
label
: 'Submissão', 
done
: 
true
, date: '20 
Jul
' },
      { 
label
: 'NUIT & AT', 
done
: 
true
, date: '22 
Jul
' },
      { 
label
: 'Análise APIEX', 
done
: false, active: 
true
 },
      { 
label
: 'Certificado Emitido', 
done
: false },
    ],
  });
  
return
 (
    <div 
className
="min-h-
screen
 bg-slate-50 p-6 text-slate-800">
      {/* Top 
Header
 Bar */}
      <
header
 
className
="mb-8 
flex
 
flex-wrap
 
items-center
 
justify-between
 
rounded
-xl 
bg-white
 p-4 
shadow-sm
 
border
 border-slate-200">
        <div 
className
="
flex
 
items-center
 space-x-3">
          <div 
className
="h-10 w-10 
rounded-lg
 bg-red-600 
flex
 
items-center
 
justify-center
 
text-white
 
font
-bold 
text
-xl">
            
MZ
          </div>
          <div>
            <h1 
className
="
text-lg
 
font
-bold">Portal do Investidor</h1>
            <p 
className
="
text-xs
 text-slate-500">República de Moçambique</p>
          </div>
        </div>
        <div 
className
="
flex
 
items-center
 space-x-4">
          <
span
 
className
="
text-xs
 bg-emerald-100 text-emerald-800 
font-semibold
 px-2.5 py-1 
rounded-full
">
            ● Autenticado (e-ID)
          </
span
>
          <
span
 
className
="
text-sm
 
font-medium
 text-slate-700">{
project.companyName
}</
span
>
          <
button
 
className
="
text-xs
 
border
 border-slate-300 px-3 py-1.5 
rounded-lg
 hover:bg-slate-100">
            PT | EN
          </
button
>
        </div>
      </
header
>
      {/* 
Main
 Container */}
      <
main
 
className
="max-w-7xl mx-auto space-y-6">
        {/* Status Banner */}
        <div 
className
="
bg-white
 
rounded
-xl p-6 
shadow-sm
 
border
 border-slate-200">
          <div 
className
="
flex
 
flex
-col 
md:flex-row
 
md:items-center
 
justify-between
 mb-6">
            <div>
              <
span
 
className
="
text-xs
 
font-semibold
 text-slate-400 
uppercase
 
tracking-wider
">
                ID de Acompanhamento: {
project.trackingNumber
}
              </
span
>
              <h2 
className
="
text
-xl 
font
-bold text-slate-900 mt-1">
                Estado 
Atual
: <
span
 
className
="text-amber-600">Em Avaliação Técnica</
span
>
              </h2>
            </div>
            <div 
className
="mt-4 md:mt-0 
text-sm
 text-slate-500 bg-slate-100 px-4 py-2 
rounded-lg
">
              Tempo estimado restante: <
strong
 
className
="text-slate-800">{
project.daysRemaining
} dias úteis</
strong
>
            </div>
          </div>
          {/* 
Stepper
 
Progress
 */}
          <div 
className
="
relative
 
flex
 
flex
-col 
md:flex-row
 
justify-between
 
items-center
 w-
full
 my-4">
            {
project.steps.map
((step, 
idx
) => (
              <div 
key
={
idx
} 
className
="flex-1 
flex
 
flex
-col 
items-center
 
relative
 mb-4 md:mb-0">
                <div
                  
className
={`w-10 h-10 
rounded-full
 
flex
 
items-center
 
justify-center
 
font
-bold 
text-sm
 z-10 ${
                    
step.done
                      ? 'bg-emerald-600 
text-white
'
                      : 
step.active
                      ? 'bg-amber-500 
text-white
 ring-4 ring-amber-100'
                      : 'bg-slate-200 text-slate-500'
                  }`}
                >
                  {
step.done
 ? '✓' : 
idx
 + 1}
                </div>
                <
span
 
className
="
text-xs
 
font-semibold
 mt-2 text-slate-700">{
step.label
}</
span
>
                {
step.date
 && <
span
 
className
="
text
-[10px] text-slate-400">{
step.date
}</
span
>}
              </div>
            ))}
          </div>
        </div>
        {/* 
Info
 
Grid
 */}
        <div 
className
="
grid
 grid-cols-1 md:grid-cols-2 gap-6">
          {/* Card: Resumo do Projeto */}
          <div 
className
="
bg-white
 p-6 
rounded
-xl 
shadow-sm
 
border
 border-slate-200 space-y-4">
            <h3 
className
="
text
-base 
font
-bold text-slate-900 
border
-b pb-2">Resumo da Proposta</h3>
            <div 
className
="
grid
 grid-cols-2 gap-4 
text-sm
">
              <div>
                <p 
className
="text-slate-500 
text-xs
">Sector de 
Atividade
</p>
                <p 
className
="
font-semibold
 text-slate-800">{
project.sector
}</p>
              </div>
              <div>
                <p 
className
="text-slate-500 
text-xs
">Localização</p>
                <p 
className
="
font-semibold
 text-slate-800">{
project.province
}</p>
              </div>
              <div>
                <p 
className
="text-slate-500 
text-xs
">Investimento Declarado</p>
                <p 
className
="
font-semibold
 text-emerald-700">
                  ${
project.amountUSD.toLocaleString
()} USD
                </p>
              </div>
              <div>
                <p 
className
="text-slate-500 
text-xs
">Entidade Gestora</p>
                <p 
className
="
font-semibold
 text-slate-800">APIEX Moçambique</p>
              </div>
            </div>
            <
button
 
className
="w-
full
 mt-2 
text-xs
 
font-semibold
 text-red-600 bg-red-50 hover:bg-red-100 py-2.5 
rounded-lg
 
transition
">
              Descarregar Dossier de Submissão (PDF)
            </
button
>
          </div>
          {/* Card: Enquadramento Fiscal e Regulatório */}
          <div 
className
="
bg-white
 p-6 
rounded
-xl 
shadow-sm
 
border
 border-slate-200 space-y-4">
            <h3 
className
="
text
-base 
font
-bold text-slate-900 
border
-b pb-2">Benefícios Fiscais Aplicáveis</h3>
            <
ul
 
className
="space-y-3 
text-sm
">
              <li 
className
="
flex
 
justify-between
 
items-center
 
text-xs
">
                <
span
 
className
="text-slate-600">Taxa de IRPC (Agronegócio):</
span
>
                <
span
 
className
="
font
-bold text-emerald-600 bg-emerald-50 px-2 py-1 
rounded
">10% (Redução de 68%)</
span
>
              </li>
              <li 
className
="
flex
 
justify-between
 
items-center
 
text-xs
">
                <
span
 
className
="text-slate-600">Isenção de Direitos Aduaneiros (Classe K):</
span
>
                <
span
 
className
="
font
-bold text-slate-800">Elegível / 
Ativo
</
span
>
              </li>
              <li 
className
="
flex
 
justify-between
 
items-center
 
text-xs
">
                <
span
 
className
="text-slate-600">Registo Cambial (Banco de Moçambique):</
span
>
                <
span
 
className
="
font
-bold text-emerald-600">Garantia de Repatriamento</
span
>
              </li>
            </
ul
>
            <
button
 
className
="w-
full
 mt-2 
text-xs
 
font-semibold
 text-slate-700 bg-slate-100 hover:bg-slate-200 py-2.5 
rounded-lg
 
transition
">
              Emitir Declaração de Benefícios Fiscais
            </
button
>
          </div>
        </div>
        {/* 
Quick
 
Actions
 Bar */}
        <div 
className
="
bg-white
 p-4 
rounded
-xl 
shadow-sm
 
border
 border-slate-200">
          <h4 
className
="
text-xs
 
font
-bold text-slate-400 
uppercase
 
tracking-wider
 mb-3">Ações Rápidas</h4>
          <div 
className
="
flex
 
flex-wrap
 gap-3">
            <
button
 
className
="bg-red-600 hover:bg-red-700 
text-white
 
text-xs
 
font-semibold
 px-4 py-2.5 
rounded-lg
 
shadow-sm
 
transition
">
              + Submeter Novo Projeto
            </
button
>
            <
button
 
className
="bg-slate-800 hover:bg-slate-900 
text-white
 
text-xs
 
font-semibold
 px-4 py-2.5 
rounded-lg
 
shadow-sm
 
transition
">
              Agendar Reunião com Assistente APIEX
            </
button
>
            <
button
 
className
="
border
 border-slate-300 text-slate-700 hover:bg-slate-50 
text-xs
 
font-semibold
 px-4 py-2.5 
rounded-lg
 
transition
">
              Simulador de Incentivos
            </
button
>
          </div>
        </div>
      </
main
>
    </div>
  );
}
M
odelos de dados de 
backend
 (
TypeScript
 e 
Python
/
Pydantic
)
 e o 
componente 
frontend
 em 
React
 com 
Tailwind
 CSS para o Dashboard
.
Para dar continuidade ao desenvolvimento da plataforma, o próximo passo lógico é concretizar a integração e a lógica funcional de uma das duas vertentes:
Opção A: Lógica de 
Backend
 (APIs & Persistência)
Endpoints
 e Controladores (
FastAPI
 ou Next.js API 
Routes
):
 Implementar a lógica dos 
endpoints
 /
apiex
/
projects
/
submit
, /
apiex
/
projects
/{
projectId
}/status e /
tax
/
nuit
/
validate
, integrando a validação 
Zod
/
Pydantic
 e o simulador de regras de negócio.
Modelo de Base de Dados (Prisma 
ORM
 / 
SQLAlchemy
):
 Estruturar o esquema da base de dados relacional (
PostgreSQL
) para gerir utilizadores, 
projectos
 de investimento, estados de aprovação e registos de auditoria (
audit
 
logs
).
Opção B: Módulos de 
Frontend
 (UI/UX 
Transacional
)
Formulário 
Multi-step
 de Submissão de Projeto:
 Componente 
React
 com validação em tempo real para recolha progressiva de dados (Entidade 
 Dados do Projeto 
 Documentação 
 Confirmação).
Simulador 
Interativo
 de Incentivos Fiscais:
 Calculadora visual onde o investidor 
selecciona
 o sector, a localização (Província / ZEE) e o montante de investimento para obter a estimativa instantânea de benefícios fiscais (IRPC, IVA, Direitos Aduaneiros).
implementação dos dois componentes de 
frontend
 em 
React
 com 
Tailwind
 CSS.
1. Formulário 
Multi-step
 de Submissão de Projeto
Este componente gere o estado de um formulário que progride através de quatro etapas, com validação básica em tempo real.
TypeScript
// 
components
/
ProjectSubmissionForm.tsx
import
 
React
, { 
useState
 } 
from
 '
react
';
import
 { 
useForm
, 
UseFormRegister
, 
FieldErrors
 } 
from
 '
react-hook-form
';
import
 { 
zodResolver
 } 
from
 '@
hookform
/
resolvers
/
zod
';
import
 * as z 
from
 '
zod
';
// Define 
the
 steps
const
 steps = [
  { id: '
entity
', 
name
: 'Entidade', 
description
: 'Dados da Empresa' },
  { id: '
project
', 
name
: 'Dados do Projeto', 
description
: '
Setor
, Local e Valor' },
  { id: '
documentation
', 
name
: 'Documentação', 
description
: 'Upload de Ficheiros' },
  { id: '
confirmation
', 
name
: 'Confirmação', 
description
: 'Revisão e Submissão' },
];
// Define 
validation
 
schemas
 for 
each
 step
const
 
entitySchema
 = 
z.object
({
  
companyName
: 
z.string
().min(2, "Nome da empresa é obrigatório"),
  
nuit
: 
z.string
().
length
(9, "O NUIT deve ter 
exatamente
 9 dígitos"),
  
contactEmail
: 
z.string
().email("E-mail inválido"),
});
const
 
projectSchema
 = 
z.object
({
  sector: 
z.enum
(['
AGRONEGOCIO
', '
ENERGIA_MINERACAO
', 'TURISMO', 'INFRAESTRUTURA', '
MERCADO_FINANCEIRO
']),
  
province
: 
z.string
().min(2, "
Selecione
 a província do 
projeto
"),
  
investmentAmountUSD
: 
z.number
().positive("O valor deve ser superior a 0"),
  
hasLocalPartner
: 
z.boolean
(),
});
// A 
simplify
 
schema
 
just
 for 
the
 file 
name
, for 
demonstration
const
 
documentationSchema
 = 
z.object
({
  
businessPlan
: 
z.string
().min(1, "Plano de Negócios é obrigatório"),
  
identityDocument
: 
z.string
().min(1, "Documento de Identificação é obrigatório"),
});
// 
Full
 
schema
 for 
types
, 
not
 for individual step 
validation
const
 
fullSchema
 = 
entitySchema.merge
(
projectSchema
).
merge
(
documentationSchema
);
type
 
FormData
 = 
z.infer
<
typeof
 
fullSchema
>;
// Step 1 
Component
const
 
StepEntity
 = ({ 
register
, 
errors
 }: { 
register
: 
UseFormRegister
<
FormData
>, 
errors
: 
FieldErrors
<
FormData
> }) => (
  <div 
className
="space-y-4">
    <h3 
className
="
text-lg
 
font-semibold
 text-slate-900 mb-4">Passo 1: Dados da Entidade</h3>
    <div>
      <
label
 
htmlFor
="
companyName
" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">Nome da Empresa</
label
>
      <input 
type
="
text
" {...
register
('
companyName
')} 
className
="mt-1 
block
 w-
full
 
border
 border-slate-300 
rounded-lg
 p-2.5 
text-sm
 
shadow-sm
" />
      {
errors.companyName
 && <p 
className
="text-red-500 
text-xs
 mt-1">{
errors.companyName.message
}</p>}
    </div>
    <div>
      <
label
 
htmlFor
="
nuit
" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">NUIT</
label
>
      <input 
type
="
text
" {...
register
('
nuit
')} 
className
="mt-1 
block
 w-
full
 
border
 border-slate-300 
rounded-lg
 p-2.5 
text-sm
 
shadow-sm
" />
      {
errors.nuit
 && <p 
className
="text-red-500 
text-xs
 mt-1">{
errors.nuit.message
}</p>}
    </div>
    <div>
      <
label
 
htmlFor
="
contactEmail
" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">E-mail de Contacto</
label
>
      <input 
type
="email" {...
register
('
contactEmail
')} 
className
="mt-1 
block
 w-
full
 
border
 border-slate-300 
rounded-lg
 p-2.5 
text-sm
 
shadow-sm
" />
      {
errors.contactEmail
 && <p 
className
="text-red-500 
text-xs
 mt-1">{
errors.contactEmail.message
}</p>}
    </div>
  </div>
);
// Step 2 
Component
const
 
StepProject
 = ({ 
register
, 
errors
 }: { 
register
: 
UseFormRegister
<
FormData
>, 
errors
: 
FieldErrors
<
FormData
> }) => (
  <div 
className
="space-y-4">
    <h3 
className
="
text-lg
 
font-semibold
 text-slate-900 mb-4">Passo 2: Dados do Projeto</h3>
    <div>
      <
label
 
htmlFor
="sector" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">Sector de 
Atividade
</
label
>
      <
select
 {...
register
('sector')} 
className
="mt-1 
block
 w-
full
 
border
 border-slate-300 
rounded-lg
 p-2.5 
text-sm
 
shadow-sm
">
        <
option
 
value
="">
Selecione
...</
option
>
        <
option
 
value
="
AGRONEGOCIO
">Agronegócio</
option
>
        <
option
 
value
="
ENERGIA_MINERACAO
">Energia & Mineração</
option
>
        <
option
 
value
="TURISMO">Turismo</
option
>
        <
option
 
value
="INFRAESTRUTURA">Infraestrutura</
option
>
        <
option
 
value
="
MERCADO_FINANCEIRO
">Mercado Financeiro</
option
>
      </
select
>
      {
errors.sector
 && <p 
className
="text-red-500 
text-xs
 mt-1">{
errors.sector.message
}</p>}
    </div>
    <div>
      <
label
 
htmlFor
="
province
" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">Província</
label
>
      <input 
type
="
text
" {...
register
('
province
')} 
className
="mt-1 
block
 w-
full
 
border
 border-slate-300 
rounded-lg
 p-2.5 
text-sm
 
shadow-sm
" />
      {
errors.province
 && <p 
className
="text-red-500 
text-xs
 mt-1">{
errors.province.message
}</p>}
    </div>
    <div>
      <
label
 
htmlFor
="
investmentAmountUSD
" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">Montante de Investimento (USD)</
label
>
      <input 
type
="
number
" {...
register
('
investmentAmountUSD
', { 
valueAsNumber
: 
true
 })} 
className
="mt-1 
block
 w-
full
 
border
 border-slate-300 
rounded-lg
 p-2.5 
text-sm
 
shadow-sm
" />
      {
errors.investmentAmountUSD
 && <p 
className
="text-red-500 
text-xs
 mt-1">{
errors.investmentAmountUSD.message
}</p>}
    </div>
    <div 
className
="
flex
 
items-center
">
      <input 
type
="
checkbox
" {...
register
('
hasLocalPartner
')} 
className
="h-4 w-4 text-emerald-600 border-slate-300 
rounded
" />
      <
label
 
htmlFor
="
hasLocalPartner
" 
className
="ml-2 
block
 
text-sm
 text-slate-700">Tem parceiro local?</
label
>
    </div>
  </div>
);
// Step 3 
Component
 - 
Demonstration
 (file 
names
 as 
strings
)
const
 
StepDocumentation
 = ({ 
register
, 
errors
 }: { 
register
: 
UseFormRegister
<
FormData
>, 
errors
: 
FieldErrors
<
FormData
> }) => (
  <div 
className
="space-y-4">
    <h3 
className
="
text-lg
 
font-semibold
 text-slate-900 mb-4">Passo 3: Documentação</h3>
    <div>
      <
label
 
htmlFor
="
businessPlan
" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">Plano de Negócios (PDF/Word)</
label
>
      <input 
type
="file" {...
register
('
businessPlan
')} 
className
="mt-1 
block
 w-
full
 
border
 border-slate-300 
rounded-lg
 p-2.5 
text-sm
 
shadow-sm
 text-slate-500 file:mr-4 file:py-1 file:px-2 file:rounded-md file:border-0 file:text-xs file:font-semibold file:bg-emerald-50 file:text-emerald-700 hover:file:bg-emerald-100" />
      {
errors.businessPlan
 && <p 
className
="text-red-500 
text-xs
 mt-1">{
errors.businessPlan.message
}</p>}
    </div>
    <div>
      <
label
 
htmlFor
="
identityDocument
" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">Documento de Identificação do Promotor</
label
>
      <input 
type
="file" {...
register
('
identityDocument
')} 
className
="mt-1 
block
 w-
full
 
border
 border-slate-300 
rounded-lg
 p-2.5 
text-sm
 
shadow-sm
 text-slate-500 file:mr-4 file:py-1 file:px-2 file:rounded-md file:border-0 file:text-xs file:font-semibold file:bg-emerald-50 file:text-emerald-700 hover:file:bg-emerald-100" />
      {
errors.identityDocument
 && <p 
className
="text-red-500 
text-xs
 mt-1">{
errors.identityDocument.message
}</p>}
    </div>
  </div>
);
// Step 4 
Component
const
 
StepConfirmation
 = ({ 
formData
 }: { 
formData
: 
FormData
 }) => (
  <div 
className
="space-y-4">
    <h3 
className
="
text-lg
 
font-semibold
 text-slate-900 mb-4">Passo 4: Confirmação e Submissão</h3>
    <div 
className
="
grid
 grid-cols-2 gap-x-6 gap-y-4 
text-sm
 bg-slate-50 p-4 
rounded-lg
 
border
 border-slate-200">
      <div><
span
 
className
="
font-semibold
 text-slate-700">Empresa:</
span
> {
formData.companyName
}</div>
      <div><
span
 
className
="
font-semibold
 text-slate-700">NUIT:</
span
> {
formData.nuit
}</div>
      <div><
span
 
className
="
font-semibold
 text-slate-700">E-mail:</
span
> {
formData.contactEmail
}</div>
      <div><
span
 
className
="
font-semibold
 text-slate-700">Sector:</
span
> {
formData.sector
}</div>
      <div><
span
 
className
="
font-semibold
 text-slate-700">Província:</
span
> {
formData.province
}</div>
      <div><
span
 
className
="
font-semibold
 text-slate-700">Investimento (USD):</
span
> ${
formData.investmentAmountUSD.toLocaleString
()}</div>
      <div><
span
 
className
="
font-semibold
 text-slate-700">Parceiro Local:</
span
> {
formData.hasLocalPartner
 ? 'Sim' : 'Não'}</div>
    </div>
    <p 
className
="
text-sm
 text-slate-600 mt-4">Ao clicar em "Submeter", confirma que os dados acima estão 
correctos
 e de acordo com os documentos anexados. O seu 
projeto
 será encaminhado para a APIEX para avaliação.</p>
  </div>
);
export
 
default
 
function
 
ProjectSubmissionForm
() {
  
const
 [
currentStep
, 
setCurrentStep
] = 
useState
(0);
  // 
Schema
 for 
current
 step 
validation
  
const
 
currentSchema
 = [
entitySchema
, 
projectSchema
, 
documentationSchema
][
currentStep
];
  
const
 {
    
register
,
    
handleSubmit
,
    
trigger
,
    
getValues
,
    
formState
: { 
errors
 },
  } = 
useForm
<
FormData
>({
    resolver: 
currentStep
 < 3 ? 
zodResolver
(
currentSchema
) : 
undefined
, // No 
validation
 for 
confirmation
 step
    
mode
: '
onChange
', // 
Validate
 in real-time
    
defaultValues
: {
      
hasLocalPartner
: false, // Set 
default
 
value
    }
  });
  
const
 
onSubmit
 = 
async
 (data: 
FormData
) => {
    // 
Implement
 API 
submission
 
logic
 
here
, e.g., to `/
api
/v1/
apiex
/
projects
/
submit
`
    console.log('Final 
Form
 Data:', data);
    
alert
('Projeto submetido com sucesso!');
    // 
Redirect
 
or
 show a final 
success
 
message
  };
  
const
 
nextStep
 = 
async
 () => {
    
const
 
isStepValid
 = 
await
 
trigger
();
    
if
 (
isStepValid
) {
      
setCurrentStep
((
prev
) => 
Math.min
(
prev
 + 1, 
steps.length
 - 1));
    }
  };
  
const
 
prevStep
 = () => {
    
setCurrentStep
((
prev
) => 
Math.max
(
prev
 - 1, 0));
  };
  
return
 (
    <div 
className
="min-h-
screen
 bg-slate-50 p-6 text-slate-800">
      <
header
 
className
="mb-8 
flex
 
items-center
 
justify-between
 
rounded
-xl 
bg-white
 p-4 
shadow-sm
 
border
 border-slate-200">
        <div 
className
="
flex
 
items-center
 space-x-3">
          <div 
className
="h-10 w-10 
rounded-lg
 bg-red-600 
flex
 
items-center
 
justify-center
 
text-white
 
font
-bold 
text
-xl">
MZ
</div>
          <div>
            <h1 
className
="
text-lg
 
font
-bold">Submissão de Projeto</h1>
            <p 
className
="
text-xs
 text-slate-500">Portal do Investidor</p>
          </div>
        </div>
      </
header
>
      <
main
 
className
="max-w-3xl mx-auto 
bg-white
 p-8 
rounded
-xl 
shadow
 
border
 border-slate-200">
        {/* 
Stepper
 
Header
 */}
        <
nav
 
className
="mb-10 pb-4 
border
-b border-slate-200">
          <
ol
 
className
="
flex
 
flex
-col 
md:flex-row
 
justify-between
 
items-start
 
md:items-center
 w-
full
 my-4 gap-y-4 md:gap-y-0">
            {
steps.map
((step, 
idx
) => (
              <li 
key
={step.id} 
className
="
flex
 
flex
-col 
md:flex-row
 
items-center
 flex-1 
relative
 mb-4 md:mb-0">
                <div
                  
className
={`w-10 h-10 
rounded-full
 
flex
 
items-center
 
justify-center
 
font
-bold 
text-sm
 z-10 
transition
 border-2 ${
                    
idx
 < 
currentStep
                      ? 'bg-emerald-600 
text-white
 border-emerald-600'
                      : 
idx
 === 
currentStep
                      ? 'bg-red-600 
text-white
 border-red-600'
                      : 'bg-slate-100 text-slate-500 border-slate-200'
                  }`}
                >
                  {
idx
 + 1}
                </div>
                <div 
className
="mt-2 md:mt-0 md:ml-3 
text-center
 
md:text-left
">
                  <
span
 
className
={`
text-xs
 
font-semibold
 ${
idx
 <= 
currentStep
 ? 'text-slate-900' : 'text-slate-500'}`}>{step.name}</
span
>
                  <p 
className
="
text
-[10px] text-slate-400 
hidden
 
md:block
">{
step.description
}</p>
                </div>
              </li>
            ))}
          </
ol
>
        </
nav
>
        {/* Step 
Content
 */}
        <
form
 
onSubmit
={
currentStep
 === 3 ? 
handleSubmit
(
onSubmit
) : 
undefined
} 
className
="mb-10">
          {
currentStep
 === 0 && <
StepEntity
 
register
={
register
} 
errors
={
errors
} />}
          {
currentStep
 === 1 && <
StepProject
 
register
={
register
} 
errors
={
errors
} />}
          {
currentStep
 === 2 && <
StepDocumentation
 
register
={
register
} 
errors
={
errors
} />}
          {
currentStep
 === 3 && <
StepConfirmation
 
formData
={
getValues
()} />}
          {/* 
Hidden
 
submit
 
button
 to 
trigger
 
form
 
submission
 
on
 
enter
 in 
any
 input */}
          <
button
 
type
="
submit
" 
className
="
hidden
" />
        </
form
>
        {/* 
Navigation
 
Buttons
 */}
        <
footer
 
className
="
flex
 
items-center
 
justify-between
 pt-6 
border
-t border-slate-200">
          <
button
            
type
="
button
"
            
onClick
={
prevStep
}
            
disabled
={
currentStep
 === 0}
            
className
={`px-6 py-2.5 
text-xs
 
font-semibold
 
rounded-lg
 
transition
 ${
              
currentStep
 === 0
                ? 'bg-slate-100 text-slate-400 
border
 border-slate-200 cursor-
not
-
allowed
'
                : 'bg-slate-100 text-slate-700 hover:bg-slate-200 
border
 border-slate-200'
            }`}
          >
            Anterior
          </
button
>
          <div 
className
="
flex
 gap-2">
            {
currentStep
 < 3 ? (
              <
button
                
type
="
button
"
                
onClick
={
nextStep
}
                
className
="bg-slate-900 hover:bg-slate-800 
text-white
 
text-xs
 
font-semibold
 px-6 py-2.5 
rounded-lg
 
shadow-sm
 
transition
"
              >
                Próximo
              </
button
>
            ) : (
              <
button
                
type
="
submit
"
                
onClick
={
handleSubmit
(
onSubmit
)}
                
className
="bg-red-600 hover:bg-red-700 
text-white
 
text-xs
 
font-semibold
 px-6 py-2.5 
rounded-lg
 
shadow-sm
 
transition
"
              >
                Submeter Projeto
              </
button
>
            )}
          </div>
        </
footer
>
      </
main
>
    </div>
  );
}
2. Simulador 
Interativo
 de Incentivos Fiscais
Este componente é uma calculadora visual onde os investidores podem simular cenários e obter estimativas de benefícios fiscais.
TypeScript
// 
components
/
IncentiveSimulator.tsx
import
 
React
, { 
useState
, 
useMemo
 } 
from
 '
react
';
// 
Simplified
 rules for 
demonstration
const
 
incentivesRules
 = {
  IRPC: {
    base: 32, // %
    
agricultureReduced
: 10, // %
  },
  VAT: {
    base: 16, // %
    
capitalExemption
: 
true
, // 
Example
: for capital 
goods
 (Classe K)
  },
  
Customs
: {
    
capitalExemption
: 
true
, // 
Example
: for capital 
goods
 (Classe K)
  },
};
const
 
sectors
 = [
  { id: '
AGRONEGOCIO
', 
name
: 'Agronegócio', 
description
: 'Agricultura, pecuária, processamento', 
irpc
: 10 },
  { id: '
ENERGIA_MINERACAO
', 
name
: 'Energia & Mineração', 
irpc
: 32 },
  { id: 'TURISMO', 
name
: 'Turismo', 
irpc
: 32 },
  { id: 'INFRAESTRUTURA', 
name
: 'Infraestrutura', 
irpc
: 10 }, // 
Example
: some 
infrastructure
 
projects
  { id: '
MERCADO_FINANCEIRO
', 
name
: 'Mercado Financeiro', 
irpc
: 32 },
];
const
 
provinces
 = [
  'Maputo Cidade', 'Maputo Província', 'Gaza', 'Inhambane', 'Sofala', 'Manica', 'Tete', 'Zambézia', 'Nampula', 'Cabo Delgado', 'Niassa'
];
export
 
default
 
function
 
IncentiveSimulator
() {
  
const
 [
selectedSectorId
, 
setSelectedSectorId
] = 
useState
(
sectors
[0].id);
  
const
 [
investmentAmountUSD
, 
setInvestmentAmountUSD
] = 
useState
(1000000); // 1 
Million
 
default
  
const
 [
localPartner
, 
setLocalPartner
] = 
useState
(false);
  // 
Find
 
the
 
selected
 sector to 
get
 
its
 rules
  
const
 
selectedSector
 = 
useMemo
(() => {
    
return
 
sectors.find
(sector => sector.id === 
selectedSectorId
);
  }, [
selectedSectorId
]);
  // 
Simplified
 
calculation
 
logic
  
const
 
calculatedIncentives
 = 
useMemo
(() => {
    
if
 (!
selectedSector
) 
return
 
null
;
    // Use 
reduced
 IRPC for 
agriculture
/
infrastructure
, base for 
others
    
const
 
finalIrpc
 = 
selectedSector.irpc
;
    
const
 
irpcSavings
 = ((32 - 
finalIrpc
) / 
100
) * 
investmentAmountUSD
; // 
Estimativa simplificada do impacto da redução da taxa
    // Assume some standard VAT/
Customs
 
exemptions
 for capital 
investment
    
const
 
vatStatus
 = 'Isenção sob Bens de Capital (Classe K)';
    
const
 
customsStatus
 = 'Isenção sob Bens de Capital (Classe K)';
    
return
 {
      
irpc
: 
finalIrpc
,
      
irpcSavingsUSD
: 
irpcSavings
,
      
vatStatus
,
      
customsStatus
,
      
repatriationGuarantee
: 
true
, // 
Example
: 
automatically
 
granted
 for 
compliant
 
investment
    };
  }, [
selectedSector
, 
investmentAmountUSD
]);
  
return
 (
    <div 
className
="min-h-
screen
 bg-slate-50 p-6 text-slate-800">
      <
header
 
className
="mb-8 
flex
 
items-center
 
justify-between
 
rounded
-xl 
bg-white
 p-4 
shadow-sm
 
border
 border-slate-200">
        <div 
className
="
flex
 
items-center
 space-x-3">
          <div 
className
="h-10 w-10 
rounded-lg
 bg-red-600 
flex
 
items-center
 
justify-center
 
text-white
 
font
-bold 
text
-xl">
MZ
</div>
          <div>
            <h1 
className
="
text-lg
 
font
-bold">Simulador de Incentivos Fiscais</h1>
            <p 
className
="
text-xs
 text-slate-500">República de Moçambique</p>
          </div>
        </div>
      </
header
>
      <
main
 
className
="max-w-7xl mx-auto space-y-8">
        <div 
className
="
grid
 grid-cols-1 lg:grid-cols-3 gap-8">
          
          {/* Inputs 
Section
 */}
          <div 
className
="lg:col-span-1 
bg-white
 p-6 
rounded
-xl 
shadow-sm
 
border
 border-slate-200 space-y-6">
            <h2 
className
="
text
-base 
font
-bold text-slate-900 
border
-b pb-2">Parâmetros do Investimento</h2>
            
            {/* Sector Selector */}
            <div>
              <
label
 
htmlFor
="sector" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">Sector de 
Atividade
</
label
>
              <
select
 
                id="sector" 
                
value
={
selectedSectorId
}
                
onChange
={(e) => 
setSelectedSectorId
(
e.target.value
)}
                
className
="mt-1 
block
 w-
full
 
border
 border-slate-300 
rounded-lg
 p-2.5 
text-sm
 
shadow-sm
"
              >
                {
sectors.map
(sector => (
                  <
option
 
key
={sector.id} 
value
={sector.id}>{sector.name}</
option
>
                ))}
              </
select
>
            </div>
            {/* 
Investment
 
Amount
 */}
            <div>
              <
label
 
htmlFor
="
amount
" 
className
="
block
 
text-sm
 
font-medium
 text-slate-700">Montante de Investimento (USD)</
label
>
              <input 
                id="
amount
"
                
type
="range"
                min="100000" // 100k
                
max
="100000000" // 100M
                step="100000"
                
value
={
investmentAmountUSD
}
                
onChange
={(e) => 
setInvestmentAmountUSD
(
Number
(
e.target.value
))}
                
className
="mt-1 w-
full
 h-2 bg-slate-200 
rounded-lg
 
appearance-none
 cursor-
pointer
 accent-red-600"
              />
              <p 
className
="
text-center
 
font
-bold text-emerald-700 
text-lg
 mt-1">
                ${
investmentAmountUSD.toLocaleString
()} USD
              </p>
            </div>
             {/* Local 
Partner
 
Toggle
 */}
            <div 
className
="
flex
 
items-center
 
justify-between
 bg-slate-50 px-4 py-3 
rounded-lg
 
border
 border-slate-200">
              <
span
 
className
="
text-sm
 
font-medium
 text-slate-700">Tem parceiro local?</
span
>
              <
label
 
className
="
relative
 
inline-flex
 
items-center
 cursor-
pointer
">
                <input 
                  
type
="
checkbox
" 
                  
checked
={
localPartner
}
                  
onChange
={(e) => 
setLocalPartner
(
e.target.checked
)}
                  
className
="
sr-only
 
peer
"
                />
                <div 
className
="w-11 h-6 bg-slate-200 
peer-focus:outline-none
 peer-focus:ring-4 peer-focus:ring-emerald-100 
rounded-full
 
peer
 
peer-checked:after:translate-x-full
 
peer-checked:after:border-white
 
after:content
-[''] 
after:absolute
 
after:top
-[2px] 
after:left
-[2px] 
after:bg-white
 after:border-slate-300 
after:border
 
after:rounded-full
 after:h-5 after:w-5 
after:transition-all
 peer-checked:bg-emerald-600"></div>
              </
label
>
            </div>
            
            <p 
className
="
text-xs
 text-slate-500 mt-2">Esta simulação é uma estimativa baseada nas regras gerais 
atuais
 e não substitui a confirmação final da APIEX e da Autoridade Tributária.</p>
          </div>
          {/* 
Results
 
Section
 */}
          <div 
className
="lg:col-span-2 space-y-8">
            {
calculatedIncentives
 && (
              <>
                {/* 
Result
 Cards 
Grid
 */}
                <div 
className
="
grid
 grid-cols-1 md:grid-cols-2 gap-6">
                  {/* Card: IRPC */}
                  <div 
className
="
bg-white
 p-6 
rounded
-xl 
shadow-sm
 
border
 border-slate-200 
flex
 
flex
-col 
items-center
 
text-center
">
                    <
span
 
className
="
text-xs
 
font-semibold
 text-slate-400 
uppercase
 
tracking-wider
 mb-2">Imposto sobre Rendimento das Pessoas Colectivas (IRPC)</
span
>
                    <p 
className
="text-slate-500 
text-xs
 mb-3">Redução para sector de {selectedSector?.name}</p>
                    <p 
className
="text-5xl 
font-extrabold
 text-emerald-600 bg-emerald-50 px-3 py-1 
rounded-lg
">
                      {
calculatedIncentives.irpc
}%
                    </p>
                    <p 
className
="
text-xs
 text-slate-500 mt-2 
line-through
">Taxa Base: 32%</p>
                  </div>
                  {/* Card: 
Savings
 
Estimate
 */}
                  <div 
className
="
bg-white
 p-6 
rounded
-xl 
shadow-sm
 
border
 border-slate-200 
flex
 
flex
-col 
items-center
 
text-center
 
justify-between
">
                    <
span
 
className
="
text-xs
 
font-semibold
 text-slate-400 
uppercase
 
tracking-wider
 mb-2">Impacto Fiscal Estimado (Primeiro Ano)</
span
>
                    <p 
className
="text-4xl 
font-extrabold
 text-slate-900 mt-2">
                      ${
calculatedIncentives.irpcSavingsUSD.toLocaleString
(
undefined
, { 
maximumFractionDigits
: 0 })} USD
                    </p>
                    <p 
className
="text-slate-500 
text-xs
 mt-3">Poupança potencial de IRPC com a taxa reduzida de {
calculatedIncentives.irpc
}%.</p>
                  </div>
                </div>
                {/* 
Additional
 
Benefits
 
List
 */}
                <div 
className
="
bg-white
 p-6 
rounded
-xl 
shadow-sm
 
border
 border-slate-200">
                  <h3 
className
="
text
-base 
font
-bold text-slate-900 
border
-b pb-2 mb-4">Outros Benefícios e Garantias</h3>
                  <
ul
 
className
="space-y-4 
text-sm
">
                    <li 
className
="
flex
 
items-center
 space-x-3 
text-xs
 bg-slate-50 px-3 py-2.5 
rounded-lg
 
border
 border-slate-200">
                      <
span
 
className
="
text-lg
">✓</
span
>
                      <div>
                        <
span
 
className
="
font-semibold
 text-slate-800">Isenção de IVA:</
span
>
                        <
span
 
className
="ml-2 
font-medium
 text-slate-600">{
calculatedIncentives.vatStatus
}</
span
>
                      </div>
                    </li>
                    <li 
className
="
flex
 
items-center
 space-x-3 
text-xs
 bg-slate-50 px-3 py-2.5 
rounded-lg
 
border
 border-slate-200">
                      <
span
 
className
="
text-lg
">✓</
span
>
                      <div>
                        <
span
 
className
="
font-semibold
 text-slate-800">Isenção de Direitos Aduaneiros:</
span
>
                        <
span
 
className
="ml-2 
font-medium
 text-slate-600">{
calculatedIncentives.customsStatus
}</
span
>
                      </div>
                    </li>
                    <li 
className
="
flex
 
items-center
 space-x-3 
text-xs
 bg-slate-50 px-3 py-2.5 
rounded-lg
 
border
 border-slate-200">
                      <
span
 
className
="
text-lg
">✓</
span
>
                      <div>
                        <
span
 
className
="
font-semibold
 text-slate-800">Registo Cambial (Banco de Moçambique):</
span
>
                        <
span
 
className
="ml-2 
font-medium
 text-slate-600">Garantia legal de repatriamento de dividendos.</
span
>
                      </div>
                    </li>
                    {
localPartner
 && (
                      <li 
className
="
flex
 
items-center
 space-x-3 
text-xs
 bg-emerald-50 text-emerald-800 px-3 py-2.5 
rounded-lg
 
border
 border-emerald-200">
                        <
span
 
className
="
text-lg
">
★
</
span
>
                        <p><
strong
>Parceria Local:</
strong
> A elegibilidade para incentivos específicos pode ser reforçada pela presença de parceiros locais em determinados sectores estratégicos do PAE.</p>
                      </li>
                    )}
                  </
ul
>
                </div>
              </>
            )}
            {/* 
Quick
 
Actions
 Bar */}
            <div 
className
="
bg-white
 p-4 
rounded
-xl 
shadow-sm
 
border
 border-slate-200 
flex
 gap-3">
              <
button
 
className
="bg-red-600 hover:bg-red-700 
text-white
 
text-xs
 
font-semibold
 px-4 py-2.5 
rounded-lg
 
shadow-sm
 
transition
 
flex
 
items-center
 space-x-2">
                <
span
>+ Submeter Novo Projeto com estes dados</
span
>
              </
button
>
              <
button
 
className
="bg-slate-800 hover:bg-slate-900 
text-white
 
text-xs
 
font-semibold
 px-4 py-2.5 
rounded-lg
 
shadow-sm
 
transition
">
                Consultar Código dos Benefícios Fiscais (PDF)
              </
button
>
            </div>
          </div>
        </div>
      </
main
>
    </div>
  );
}