Etapa 9 — Formulário React com 
dropdowns
Objectivo: Entregar o /Simulador acessível, responsivo e fiel aos catálogos.
Pré-condições: Endpoints de catálogo e API estáveis; contrato e desenho de campos aprovados.
Prompt para 
Codex
Antes de actuar, inspecciona o repositório real e identifica Laravel, React/Next.js, PostgreSQL/
PostGIS
, 
OpenAPI
, CI, testes, versões, estrutura, convenções e restrições. Não assumes nomes nem caminhos: adapta-os ao projecto. Reutiliza padrões existentes e apresenta primeiro um plano curto e a lista exacta de ficheiros a criar ou alterar. Não apagues, renomeies ou reescrevas artefactos sem necessidade demonstrada; não edites migrations já executadas em produção; não inventes taxas ou regras fiscais. Executa a Etapa 9 — Formulário React com 
dropdowns
. Implementa /Simulador em React/Next.js segundo os padrões existentes. Todo campo com duas ou mais opções usa dropdown pesquisável e acessível; campos 
multivalor
 permitem selecção e remoção por teclado. Não definas 
defaults
 fiscais. 
Dropdowns
 dependentes limpam filhos inválidos; “Outro” abre campo condicional. Implementa 
autosave
, validações cliente/servidor, estados de erro/
loading
, experiência móvel e 
WCAG
. Implementa apenas este escopo. Mantém alterações não destrutivas e reversíveis, validação cliente/servidor quando aplicável, transacções, 
idempotência
, 
optimistic
 
locking
, 
RLS
, 
snapshots
 e 
logs
 sem 
PII
 conforme as decisões já aprovadas. Executa os testes adequados e corrige os erros encontrados apenas dentro deste escopo. Se uma pré-condição ou 
gate falhar
, pára e regista o bloqueio. Não prossigas para a etapa seguinte. No fim, entrega: resumo; 
diff
 lógico por ficheiro; comandos executados; resultados e evidências dos testes; riscos e pendências; instruções de 
rollback
; estado proposto do gate para revisão humana. Não afirmes ter executado comandos que não executaste.
Critérios de conclusão: Testes UI, teclado e leitor de ecrã definidos/verificados; dependências, 
autosave
 e validação verdes; sem 
defaults
 fiscais.
17. Formulário integrado de simulação e manifestação de investimento ou negócio
O formulário deve servir simultaneamente para recolher os dados necessários à simulação fiscal e, mediante consentimento explícito do utilizador, reutilizar esses dados para criar uma 
Manifestação de Interesse de Investimento
 ou uma 
Manifestação de Oportunidade de Negócio
. A simulação mantém natureza informativa; a manifestação cria um processo formal, sujeito a autenticação, validação documental e acompanhamento no 
InvestMoz
.
17.1 Modalidades de utilização
Modalidade
Descrição
Resultado
Simulação anónima
O utilizador preenche apenas os dados económicos essenciais, sem identificação pessoal obrigatória.
Resultado fiscal indicativo; pode guardar temporariamente por 
token
 ou autenticar-se para continuar.
Simulação autenticada
O utilizador inicia sessão e pode associar a simulação a um perfil de investidor ou entidade já existente.
Simulação persistente, cenários, relatório e histórico.
Manifestação formal
O utilizador selecciona “Transformar em manifestação”, confirma os dados reutilizados, completa identificação, contactos, documentos e declaração.
Novo processo de investimento ou negócio, com referência, estado, responsável e trilho de acompanhamento.
17.2 Estrutura do formulário
Etapa
Campos principais
Regras e ligações
1. Finalidade
Objectivo: apenas simular, avaliar investimento próprio, procurar investidor/parceiro, apresentar oportunidade, solicitar facilitação; tipo de manifestação: investimento ou negócio.
A finalidade determina as etapas condicionais e o módulo de destino.
2. Perfil do promotor
Tipo de pessoa; investidor nacional/estrangeiro; residente fiscal; entidade existente/em constituição; país; NUIT opcional na simulação e obrigatório quando legalmente exigido na manifestação.
Quando autenticado, pré-preencher a partir do Perfil do Investidor; alterações não actualizam o cadastro mestre sem confirmação separada.
3. Identificação e contactos
Nome/denominação; representante; documento de identificação ou registo; telefone; correio electrónico; endereço; idioma preferido.
Só obrigatório na manifestação; dados pessoais separados dos dados económicos e protegidos por consentimento.
4. Projecto ou negócio
Título; resumo executivo; tipo: novo projecto, expansão, aquisição, parceria, concessão, fornecedor, comprador ou outro; sector e actividade; produtos/serviços; fase de maturidade.
Cria ou liga a um registo de projecto/oportunidade; título e resumo tornam-se a ficha inicial.
5. Localização
Província, distrito, posto administrativo/localidade; coordenadas opcionais; área necessária; ZEE/ZFI; propriedade, 
DUAT
 ou necessidade de terreno.
Usa o catálogo geográfico mestre/
PostGIS
; permite mapear a manifestação e activar regras territoriais.
6. Estrutura financeira
Investimento total; moeda; capital próprio; financiamento; montante já mobilizado; montante procurado; origem dos fundos; prazo; receitas, custos e lucro estimados.
Valores partilhados com a simulação; financiamento deve reconciliar com o montante total ou gerar aviso.
7. Emprego e impacto
Empregos directos e indirectos; nacionais e estrangeiros; qualificações; conteúdo local; exportações; substituição de importações; impacto comunitário e ambiental.
Alimenta avaliação de impacto, emprego e priorização, sem alterar cálculos fiscais não relacionados.
8. Operação fiscal
Vendas tributadas, isentas, taxa zero e exportações; custos dedutíveis; 
remunerações; pagamentos ao exterior; importações por item; benefícios alegados.
Enviado ao motor fiscal; benefícios ficam “a validar” 
enquanto a evidência não for aprovada.
9. Necessidade de negócio
Procura/oferta; tipo de parceiro; capital, comprador, fornecedor, terreno, tecnologia, licença ou assistência; valor e condições; prazo; confidencialidade.
Cria uma oportunidade de negócio ligada à manifestação; campos sensíveis não são publicados.
10. Documentos
Identificação; certidão/registo; NUIT; perfil da empresa; estudo de viabilidade; plano de negócio; prova de fundos; certificado ZEE/ZFI; licenças; mapa/localização.
Cada documento possui tipo, 
hash
, versão, validade, nível de confidencialidade e estado de verificação.
11. Consentimentos
Aceitação dos termos; declaração de veracidade; consentimento para reutilizar dados da simulação; autorização de contacto; opção de publicação da oportunidade.
Consentimentos separados, versionados e revogáveis quando aplicável; publicação nunca é presumida.
12. Revisão e submissão
Resumo dos dados; lacunas; resultado fiscal; riscos; dados públicos/privados; declaração final.
Guardar rascunho, validar, submeter ou regressar; submissão gera referência e bloqueia versão enviada.
17.3 Ligações com a aplicação 
InvestMoz
Entidade fonte
Entidade destino
Ligação e regra de dados
Conta/IAM
Manifestação
owner_user_id
 identifica o proprietário; autenticação obrigatória para submissão formal.
Perfil do investidor
Manifestação
investor_profile_id
 referencia o cadastro mestre; a manifestação guarda um 
snapshot
 dos dados apresentados.
Simulação
Manifestação
simulation_id
 liga o cenário escolhido; o resultado fiscal é preservado por 
rule_set
, data e 
hash
.
Manifestação
Projecto de investimento
investment_project_id
 é criado após triagem favorável ou ligado a projecto existente, evitando duplicação.
Manifestação
Oportunidade de negócio
business_opportunity_id
 é criado quando existe procura/oferta; a publicação depende de aprovação e consentimento.
Manifestação
CRM
crm_case_id
 acompanha contacto, responsável, notas, tarefas e follow-up; o CRM não duplica os dados fiscais detalhados.
Localização
Mapa/
PostGIS
jurisdiction_id
 e geometria opcional permitem pesquisa territorial e regras ZEE/ZFI.
Documentos
Gestão documental
document_id
 aponta para armazenamento seguro; permissões seguem a manifestação e o grau de confidencialidade.
Manifestação
Notificações
Eventos de submissão, pedido de informação, decisão e prazo geram mensagens no portal e por canais autorizados.
17.4 Fluxo entre simulação, manifestação e oportunidade
O utilizador inicia em 
/Simulador
, escolhe “Simular investimento” ou parte de uma oportunidade/projecto já existente.
O portal pré-preenche dados autorizados do perfil, projecto ou oportunidade; o utilizador confirma cada grupo.
O motor valida e calcula o cenário; o resultado recebe 
simulation_id
, versão das regras, data e 
hash
.
Após o resultado, a interface apresenta “Guardar”, “Criar cenários” e “Manifestar interesse”.
Ao escolher “Manifestar interesse”, o utilizador autentica-se, selecciona o cenário e autoriza a reutilização dos dados.
O sistema cria um rascunho de manifestação com 
simulation_id
 e 
snapshot
; pede apenas dados e documentos ainda ausentes.
A validação identifica campos obrigatórios, documentos, divergências e dados que serão públicos.
Na submissão, o processo recebe referência, 
timestamp
 e versão imutável; o CRM abre um caso de triagem.
O analista verifica identidade, completude, enquadramento, duplicação, viabilidade preliminar e necessidade de informação.
Se aprovada para prosseguimento, a manifestação é ligada/cria um projecto de investimento e, quando aplicável, uma oportunidade de negócio publicável.
Alterações posteriores 
criam nova
 versão; a simulação original permanece reproduzível e não é sobrescrita.
Estados
 da 
manifestação
:
 draft → 
validation_pending
 → submitted → 
under_screening
 → 
information_requested
 → 
under_assessment
 → 
approved_for_facilitation
 | 
converted_to_project
 | 
converted_to_opportunity
 | rejected | withdrawn | archived. 
Apenas transições autorizadas são permitidas; cada transição regista actor, data, motivo e anexos.
17.5 Extensão do modelo de dados
Tabela
Campos essenciais
Finalidade
investment_manifestations
id, 
reference_no
, 
owner_user_id
, 
investor_profile_id
, 
simulation_id
, 
manifestation_type
, title, summary, status, confidentiality, 
submitted_at
, 
current_version
, 
created_at
, 
updated_at
Registo central da manifestação; 
simulation_id
 é opcional na criação directa, mas obrigatório 
quando convertida de uma simulação.
manifestation_versions
id, 
manifestation_id
, 
version_no
, 
data_snapshot
, 
public_snapshot
, checksum, 
created_by
, 
created_at
Preserva exactamente os dados submetidos e separa informação publicável.
manifestation_locations
manifestation_id
, 
jurisdiction_id
, geometry, 
land_status
, 
area_required
Localização e necessidades territoriais.
manifestation_financials
manifestation_id
, currency, 
total_investment
, 
own_capital
, debt, 
secured_amount
, 
sought_amount
, 
annual_revenue
, 
annual_costs
Valores reconciliáveis e reutilizáveis pelo simulador.
manifestation_impacts
manifestation_id
, 
direct_jobs
, 
indirect_jobs
, 
national_jobs
, 
foreign_jobs
, 
exports_value
, 
local_content
, 
impact_json
Indicadores de emprego e desenvolvimento.
business_opportunities
id, 
manifestation_id
, 
opportunity_type
, 
offer_or_demand
, title, description, value, currency, deadline, 
publication_status
, confidentiality
Oferta/procura de investimento, parceria, compra, fornecimento, tecnologia ou outros negócios.
manifestation_documents
id, 
manifestation_id
, 
document_type
, 
object_key
, 
file_hash
, 
valid_from
, 
valid_to
, confidentiality, 
verification_status
Anexos seguros, versionados e verificáveis.
manifestation_consents
id, 
manifestation_id
, 
consent_type
, 
terms_version
, granted, 
granted_at
, 
revoked_at
, 
evidence_hash
Prova de consentimento para reutilização, contacto e publicação.
manifestation_status_history
id, 
manifestation_id
, 
from_status
, 
to_status
, 
actor_id
, reason, 
occurred_at
Trilho imutável das transições.
manifestation_links
manifestation_id
, 
investment_project_id
, 
business_opportunity_id
, 
crm_case_id
Ligações externas sem replicar dados mestre.
17.6 Endpoints adicionais
Método e rota
Uso
Regra principal
POST /api/v1/
simulations/{id}/
manifestations
Criar manifestação a partir de uma simulação.
Exige autenticação, 
Idempotency-Key
, consentimento e cenário concluído; copia apenas campos mapeados.
POST /api/v1/
manifestations
Criar manifestação directamente.
Permite preenchimento sem simulação; pode invocar o simulador posteriormente.
GET /api/v1/
manifestations/{
id}
Consultar formulário, 
estado, lacunas, ligações e histórico.
Apenas proprietário ou perfis autorizados.
PATCH
 /api/v1/
manifestations
/{id}
Guardar rascunho.
Usa 
If
-Match; não permite alterar versão já submetida.
POST /api/v1/
manifestations/{id}/
validate
Validar campos, documentos, reconciliação e permissões de publicação.
Devolve erros, avisos e informação em falta.
POST /api/v1/
manifestations/{id}/
submit
Submeter formalmente.
Gera referência, versão, checksum e evento CRM numa transacção/
outbox
.
POST /api/v1/
manifestations
/{id}/
documents
Registar metadados e obter URL segura de carregamento.
Valida tipo, tamanho, 
hash
, antivírus e confidencialidade.
POST /api/v1/
manifestations/{id}/
transition
Mudar estado.
Reservado a perfis autorizados; requer estado esperado, decisão e motivo.
POST /api/v1/
manifestations/{id}/
convert/project
Criar ou ligar projecto.
Verifica duplicados e mantém 
manifestation_id
 como origem.
POST /api/v1/
manifestations/{id}/
convert/opportunity
Criar oportunidade de negócio.
Publicação separada da conversão e sujeita a consentimento/aprovação.
GET /api/v1/me/manifestations
Listar processos do utilizador.
Filtros por estado, tipo, data, projecto e oportunidade.
17.7 Regras de experiência, segurança e aceitação
Apresentar barra de progresso, gravação automática, resumo por etapa e indicação clara de campos obrigatórios.
Usar listas oficiais para sectores, países e geografia; permitir pesquisa e selecção sem exigir conhecimento de códigos.
Aplicar validação no campo e no servidor; mensagens devem indicar como corrigir o erro.
Permitir preencher por teclado, leitor de ecrã, zoom e dispositivo móvel; não depender apenas de cor para comunicar estado.
Nunca tornar públicos nomes, contactos, documentos, valores confidenciais ou resultados fiscais sem consentimento explícito e aprovação.
Manter um único dono por dado: identidade no Perfil, geografia no catálogo territorial, simulação no módulo fiscal, processo na Manifestação e relacionamento no CRM.
Detectar possíveis duplicados por promotor, título, sector, localização e montante, sem bloquear automaticamente uma submissão legítima.
A conversão deve ser 
idempotente
: repetir o pedido não pode criar duas manifestações, projectos ou oportunidades.
O relatório da manifestação deve incluir referência, resumo, resultado fiscal associado, documentos, estado, próximos passos e contactos institucionais.
Critério 
Go
-Live:
 testes de pré-preenchimento, consentimento, reconciliação financeira, conversão, duplicação, permissões, confidencialidade, acessibilidade, 
rollback
 e integração CRM aprovados.
18. Especificação completa do formulário e acompanhamento
Esta secção transforma a estrutura funcional da Secção 17 num formulário directamente implementável. Cada campo possui uma chave estável para o 
front-end
, API, base de dados, testes e relatórios. “Obrigatório condicional” significa que a exigência é activada por respostas anteriores.
18.1 Formulário completo por etapa
Etapa 1 — Finalidade
Tipo
Obrigatoriedade e regra
purpose
 — O que pretende fazer?
Selecção
 
única
: 
simulate_only
, 
own_investment
, 
seek_investor
, 
seek_partner
, 
present_opportunity
, 
request_facilitation
Obrigatório; controla o percurso.
manifestation_type
 — Tipo de manifestação
Selecção única: 
investment
, business
Obrigatório se 
purpose
 não for 
simulate_only
.
entry_source
 — Origem
Selecção
: simulator, project, opportunity, direct
Preenchido pelo sistema e não editável.
source_id
UUID
Obrigatório quando a origem é projecto, oportunidade ou simulação.
preferred_language
Selecção: 
pt-MZ
, 
en
Obrigatório; predefinido pelo perfil/navegador.
Etapa 2 — Perfil do promotor
Tipo
Obrigatoriedade e regra
promoter.person
_type
singular, 
collective
, 
sole_trader
, 
consortium
Obrigatório.
promoter.investor
_origin
national
, 
foreign
, 
mixed
Obrigatório; activa perguntas cambiais.
promoter.tax_residency_country
País do catálogo ISO
Obrigatório.
promoter.entity
_stage
existing
, 
being_formed
Obrigatório para pessoa colectiva/consórcio.
promoter.legal
_form
Catálogo de formas jurídicas
Obrigatório para entidade existente.
promoter.investor
_profile_id
UUID
Opcional; pré-preenchido após autenticação.
promoter.nuit
Texto validado
Opcional na simulação; obrigatório na manifestação quando aplicável.
promoter.profile
_confirmation
Booleano
Obrigatório quando existirem dados pré-preenchidos.
Etapa 3 — Identificação e contactos
Tipo
Obrigatoriedade e regra
identity.legal
_name
Texto, 2–200 caracteres
Obrigatório para manifestação.
identity.commercial
_name
Texto
Opcional.
identity.registration
_number
Texto
Obrigatório para entidade existente.
identity.representative
_name
Texto
Obrigatório para pessoa colectiva/consórcio.
identity.representative
_capacity
Texto/
seleção
Obrigatório quando há representante.
contact.email
Correio electrónico
Obrigatório e verificado antes da submissão.
contact.phone
Telefone internacional
Obrigatório; código do país incluído.
contact.address
, country, province, district
Texto e catálogos
Obrigatório para manifestação.
contact.preferred
_channel
portal, email, 
phone
Obrigatório; SMS apenas se existir serviço autorizado.
Etapa 4 — Projecto ou negócio
Tipo
Obrigatoriedade e regra
project.title
Texto, 5–200 caracteres
Obrigatório; pesquisa de possíveis duplicados.
project.summary
Texto, 100–3000 caracteres
Obrigatório para manifestação.
project.type
new, expansion, acquisition, partnership, concession, supplier, buyer, other
Obrigatório.
project.sector
_id
 e 
activity_id
UUIDs
 de catálogo
Obrigatórios; actividade dependente do sector.
project.products
_services
Lista de textos
Pelo menos um item.
project.maturity
_stage
idea, concept, 
pre_feasibility
, feasibility, financing, implementation, operation
Obrigatório.
project.expected
_start_date
Data
Obrigatório; não anterior à data de referência sem justificação.
project.duration
_years
Inteiro positivo
Obrigatório para projectos com prazo.
project.existing
_project_id
UUID
Condicional quando se liga a projecto existente.
Etapa 5 — Localização
Tipo
Obrigatoriedade e regra
location.province
_id
, 
district_id
, 
locality_id
UUIDs
 dependentes
Província e distrito obrigatórios; localidade quando disponível.
location.site
_known
Booleano
Obrigatório.
location.latitude
, longitude
Decimal geográfico
Condicional se o local for conhecido.
location.area
_required
Decimal + unidade
Obrigatório quando há necessidade de terreno.
location.land
_status
owned, 
duat
, leased, requested, unknown
Obrigatório para investimento físico.
location.special
_zone_id
UUID
 ZEE/ZFI
Opcional; exige certificado para benefício.
location.infrastructure
_needs
Multi-selecção
: energia, água, estrada, porto, ferrovia, telecomunicações, armazenamento
Opcional; alimenta facilitação.
Etapa 6 — Estrutura financeira
Tipo
Obrigatoriedade e regra
financial.currency
ISO 4217
Obrigatório.
financial.total
_investment
Decimal não negativo
Obrigatório.
financial.own_capital
, 
domestic_debt
, 
foreign_debt
, grants
Decimais
Obrigatórios com zero permitido; soma deve reconciliar com o total.
financial.secured
_amount
Decimal
Obrigatório; não pode exceder o total.
financial.sought
_amount
Decimal
Calculado ou confirmado; total menos montante mobilizado.
financial.funds
_origin_countries
Lista de países
Obrigatório se existir capital/dívida estrangeira.
financial.annual
_revenue
, 
annual_operating_costs
, 
expected_profit
Decimais
Obrigatórios para simulação de rendimento; lucro é reconciliado.
financial.financing
_term_months
Inteiro
Condicional quando há dívida.
Etapa 7 — Emprego e impacto
Tipo
Obrigatoriedade e regra
impact.direct
_jobs
 e 
indirect_jobs
Inteiros não negativos
Obrigatórios para manifestação de investimento.
impact.national
_jobs
 e 
foreign_jobs
Inteiros
A soma dos empregos directos deve reconciliar ou gerar aviso.
impact.skills
_needed
Lista estruturada
Opcional; liga a competências/formação.
impact.local
_content_percentage
Percentagem 0–100
Opcional; exige pressuposto.
impact.exports
_value
 e 
import_substitution_value
Decimais
Condicionais se exporta/substitui importações.
impact.environmental
_category
Catálogo
Obrigatório quando conhecido; “por determinar” permitido.
impact.community
_benefits
Texto
Opcional.
Etapa 8 — Operação fiscal
Tipo
Obrigatoriedade e regra
tax.sales
_taxable
, 
sales_exempt
, 
sales_zero_rate
, exports
Decimais
Obrigatórios com zero permitido.
tax.deductible
_costs
, 
non_deductible_costs
, 
carried_losses
Decimais
Obrigatórios quando se calcula IRPC.
tax.payroll
[]
Lista por trabalhador ou faixa: quantidade, remuneração, adicionais, contributivo
Condicional quando existem trabalhadores.
tax.outbound
_
payments
[
]
Natureza, valor, beneficiário, país, residência, convenção e prova
Condicional quando existem pagamentos ao exterior.
tax.imports
[]
Descrição, código pautal, origem, quantidade, factura, frete, seguro, moeda e preferência
Condicional quando existem importações; código pautal obrigatório para cálculo definitivo.
tax.claimed
_
benefits
[
]
Regime, fundamento, certificado, validade
Opcional; nunca aplicado sem elegibilidade e prova.
tax.reference
_date
Data
Obrigatório; selecciona regras vigentes.
Etapa 9 — Necessidade de negócio
Tipo
Obrigatoriedade e regra
opportunity.offer
_or_demand
offer
, 
demand
, 
both
Obrigatório para manifestação de negócio.
opportunity.type
capital, partner, buyer, supplier, land, technology, 
licence
, services, other
Obrigatório.
opportunity.description
Texto, 100–3000 caracteres
Obrigatório.
opportunity.value
 e 
currency
Decimal + ISO 4217
Opcional, mas ambos em conjunto.
opportunity.conditions
Texto
Opcional.
opportunity.deadline
Data
Opcional; futura.
opportunity.confidentiality
public, 
registered_users
, restricted, confidential
Obrigatório; predefinido 
restricted
.
opportunity.publish
_requested
Booleano
Não implica publicação automática.
Etapa 10 — Documentos
Obrigatório quando
Validação
identity_document
Pessoa singular/representante
Tipo permitido, validade e verificação.
company_registration
 e NUIT
Entidade existente
Correspondência com identificação.
company_profile
Manifestação empresarial
PDF; classificação confidencial.
business_plan
 
ou
 
feasibility_study
Fase de viabilidade ou superior
Versão, data, 
hash
 e antivírus.
proof_of_funds
Montante mobilizado alegado
Confidencial; acesso restrito.
special_zone_certificate
Benefício ZEE/ZFI alegado
Entidade emissora e validade.
licences
Actividade licenciada/início operacional
Tipo, número, emissor e validade.
site_map
Local conhecido
Formato permitido e ligação geográfica.
Etapas 11 e 12 — Consentimentos, revisão e submissão
Tipo
Obrigatoriedade e regra
consents.terms
_accepted
Booleano + 
terms_version
Obrigatório para submissão.
consents.truth
_declaration
Booleano
Obrigatório.
consents.reuse
_simulation
Booleano
Obrigatório quando a origem é simulação.
consents.contact
_authorisation
Booleano
Obrigatório para acompanhamento.
consents.publication
_authorisation
Booleano
Obrigatório apenas se 
publish_requested
=
true
.
review.public
_fields_confirmation
Booleano
Obrigatório quando há pedido de publicação.
review.validation
_acknowledged
Booleano
Obrigatório; utilizador confirma avisos não bloqueadores.
review.final
_declaration_name
Texto
Obrigatório; deve corresponder ao representante.
review.submit
Acção
Disponível apenas com validação sem erros bloqueadores.
18.2 Modelo de dados detalhado
Entidade
Chave e relações
Campos e restrições principais
investment_manifestations
PK id; FK 
owner_user_id
 
externo
; FK 
investor_profile_id
 
externo
; FK 
simulation_id
 → simulations
reference_no
 
único
 
após
 
submissão
; 
manifestation_type
; purpose; status; confidentiality; 
lock_version
; 
current_version
; 
submitted_at
; 
assigned_team_id
; 
deleted_at
.
manifestation_versions
PK id; FK 
manifestation_id
; 
UNIQUE(
manifestation_id
, 
version_no
)
data_snapshot
 
JSONB
; 
public_snapshot
 
JSONB
; checksum 
único
 
por
 
manifestação
; 
created_by
; submitted 
boolean
; 
imutável
 
quando
 submitted=true.
manifestation_contacts
PK id; FK 
manifestation_id
contact_type
; name; email; phone; address; 
is_primary
; 
verified_at
; dados 
cifrados
 
quando
 
aplicável
.
manifestation_locations
PK id; FK 
manifestation_id
; FK 
jurisdiction_id
geometry; 
site_known
; 
land_status
; 
area_required
; 
area_unit
; 
special_zone_id
; 
infrastructure_needs
 
JSONB
.
manifestation_financials
PK id; FK 
manifestation_id
; 
UNIQUE(
manifestation_id
, 
version_no
)
currency; total; 
own_capital
; 
domestic_debt
; 
foreign_debt
; grants; secured; sought; revenue; costs; profit; CHECK 
valores
 ≥ 0 e 
reconciliação
 
configurável
.
manifestation_impacts
PK id; FK 
manifestation_id
jobs; national/foreign; exports; import substitution; local content; skills 
JSONB
; environment category.
business_opportunities
PK id; FK 
manifestation_id
; FK 
created_from_version_id
type; 
offer_or_demand
; title; description; value; deadline; 
publication_status
; 
public_snapshot
; 
published_at
.
manifestation_documents
PK id; FK 
manifestation_id
; FK 
manifestation_version_id
 
opcional
document_type
; 
object_key
; 
file_hash
; 
mime_type
; size; validity; confidentiality; 
verification_status
; 
verified_by
/at.
manifestation_consents
PK id; FK 
manifestation_id
consent_type
; 
terms_version
; granted; 
granted_at
; 
revoked_at
; 
evidence_hash
; 
ip_hash
; UNIQUE 
por
 
tipo
 e 
versão
.
manifestation_assignments
PK id; FK 
manifestation_id
; 
assignee_user_id
/
team_id
 
externos
role; 
assigned_at
; 
unassigned_at
; 
assigned_by
; 
apenas
 
uma
 
atribuição
 principal 
activa
.
manifestation_status_history
PK id; FK 
manifestation_id
; FK 
version_id
 
opcional
from_status
; 
to_status
; 
actor_id
; 
reason_code
; notes; 
occurred_at
; 
imutável
.
manifestation_requests
PK id; FK 
manifestation_id
request_type
; items 
JSONB
; 
due_at
; status; 
response_version_id
; 
opened_by
; 
closed_at
.
manifestation_tasks
PK id; FK 
manifestation_id
; FK 
assignment_id
task_type
; title; 
due_at
; priority; status; 
completed_at
; CRM 
external_id
 
opcional
.
manifestation_links
PK 
manifestation_id
investment_project_id
; 
business_opportunity_id
; 
crm_case_id
; 
origem
 externa e timestamps de 
sincronização
.
integration_outbox
PK id; 
aggregate_type
/id
event_type
; payload 
JSONB
; status; attempts; 
available_at
; 
published_at
; 
idempotency_key
 
única
.
Uma simulação pode originar várias manifestações apenas se o tipo/finalidade diferir; a 
idempotência
 impede duplicação do mesmo pedido.
Cada manifestação possui muitas versões, documentos, tarefas, pedidos, consentimentos e eventos de estado.
A versão submetida é imutável; respostas a pedidos de informação 
criam nova
 versão e mantêm a anterior.
Projecto, oportunidade e caso CRM são referências externas; os dados mestres não são copiados, excepto 
snapshots
 necessários à prova e auditoria.
RLS
 restringe proprietário, equipa atribuída e perfis de supervisão; campos confidenciais exigem permissão adicional.
18.3 Endpoints detalhados
Endpoint
Pedido/Resposta essencial
Segurança e efeitos
POST /
simulations
/{id}/
manifestations
Pedido
: 
manifestation_type
, purpose, 
selected_scenario_id
, 
consent_version
. 
Resposta
 201: 
manifestation_id
, status=draft, 
copied_fields
, 
missing_fields
, ETag.
JWT
 e 
Idempotency-Key
; verifica propriedade e simulação 
completed
; cria 
snapshot
.
POST /
manifestations
Pedido: 
purpose
, 
manifestation_type
, 
investor_profile_id
 opcional, 
initial_data
. Resposta 201 com id e 
ETag
.
JWT
; criação directa; não submete.
GET
 /
manifestations
/{id}/
schema
Resposta: etapas, campos, 
enums
, condições, obrigatoriedade, documentos e versão do 
schema
.
Proprietário/equipa; cache por versão.
GET
 /
manifestations
/{id}
Resposta
: dados, completeness, validation, 
current_version
, status, assignment, tasks, requests, links e timeline.
RLS
; campos confidenciais filtrados por permissão.
PATCH
 /
manifestations
/{id}
Content-Type
 
merge-patch
; pedido parcial. Resposta 200: manifestação, validação incremental e novo 
ETag
.
If
-Match obrigatório; apenas draft ou 
information_requested
.
POST /
manifestations
/{id}/
validate
Resposta
: valid, 
blocking_
errors
[
], 
warnings[
], 
missing_
documents
[
], 
reconciliation[
], 
public_preview
.
Não muda para 
submitted
; pode mudar draft para 
validation_pending
.
POST /
manifestations/{id}/
documents/uploads
Pedido
: 
document_type
, filename, 
mime_type
, size, confidentiality. 
Resposta: 
upload_id
 e URL temporária.
Lista branca; limites; URL curta.
POST /
manifestations/{id}/documents/{
upload_
id
}/
complete
Pedido: 
file_hash
. Resposta: 
document_id
, 
scan_status
.
Submissão bloqueada até antivírus aprovado.
POST /
manifestations
/{id}/
submit
Pedido
: 
expected_version
, declarations, 
consent_ids
. 
Resposta
 202/201: 
reference_no
, 
submitted_version
, status=submitted, 
tracking_url
.
Idempotente
; transacção grava versão, estado e 
outbox
 para CRM/notificação.
GET
 /me/
manifestations
Filtros
: status, type, from, to, cursor. 
Resposta paginada com resumo e 
next_action
.
Apenas proprietário.
GET
 /
manifestations
/{id}/
timeline
Resposta: eventos ordenados, 
actor_display
, estado, razão pública, documentos/requests relacionados.
Notas internas não são devolvidas ao investidor.
POST /
manifestations/{id}/requests/{
request_
id
}/
respond
Pedido: responses, 
document_ids
, 
comment
. Resposta: nova versão e estado 
under_screening
.
Proprietário; fecha pedido numa transacção.
POST /admin/
manifestations/{id}/
assign
Pedido
: 
expected_status
, 
team_id
, 
assignee_user_id
, role.
Gestor; cria 
assignment
, tarefa e notificação.
POST /admin/
manifestations/{id}/
transition
Pedido
: 
expected_status
, 
target_status
, 
reason_code
, 
public_message
, 
internal_notes
.
RBAC
 e 
If
-Match; valida máquina de estados; auditoria.
POST /admin/
manifestations/{id}/
information-requests
Pedido
: 
items[
], 
due_at
, 
public_message
.
Analista; muda para 
information_requested
 e notifica.
POST /admin/
manifestations/{id}/
convert/project
Pedido
: 
existing_project_id
 
opcional
, 
mapping_overrides
. 
Resposta: 
project_id
 e links.
Idempotente
; só após avaliação favorável.
POST /admin/
manifestations/{id}/
convert/opportunity
Pedido
: 
publication_scope
, 
public_snapshot
, deadline.
Consentimento e aprovação obrigatórios; não publica automaticamente.
18.4 Fluxo de submissão e acompanhamento
Passo/estado
Actor e acção
Sistema, saída e controlo
1. draft
Promotor cria ou converte uma simulação, preenche e guarda.
Autosave
, 
ETag
, percentagem de completude, validação incremental e detecção de duplicados.
2. 
validation_pending
Promotor solicita validação integral.
Verifica perfil, reconciliações, documentos, consentimentos, 
malware
 e campos públicos; devolve bloqueios e avisos.
3. 
submitted
Promotor confirma declarações e submete.
Transacção gera referência, versão imutável, checksum, histórico e evento 
outbox
; envia recibo.
4. 
under_screening
Coordenador recebe fila e atribui equipa/analista.
Cria caso CRM e tarefa; regista responsável e data-alvo. Prazo operacional configurável.
5. 
information_requested
Analista pede esclarecimentos/documentos com itens e prazo.
Notifica o promotor; mostra lista accionável; prazo e lembretes; resposta 
cria nova
 versão.
6. 
under_screening
 retomado
Promotor responde; analista confirma suficiência.
Fecha pedido ou abre complemento; todas as interacções entram na 
timeline
.
7. 
under_assessment
Equipa técnica avalia enquadramento, impacto, fiscalidade, localização, riscos e elegibilidade.
Checklists
 por domínio, pareceres e tarefas; resultados internos separados da comunicação pública.
8. 
approved_for_facilitation
Responsável aprova acompanhamento/facilitação.
Comunica decisão e próximos passos; cria plano de facilitação, marcos e gestor de conta.
9A. 
converted_to_project
Gestor cria ou associa projecto formal.
Mapeamento 
idempotente
, referência cruzada e preservação da origem.
9B. 
converted_to_opportunity
Gestor cria oportunidade de negócio.
Gera versão pública; publicação exige consentimento e aprovação editorial.
10. 
rejected
/
withdrawn
Entidade decide ou promotor retira.
Motivo público estruturado, recurso/reabertura conforme política e fecho de tarefas.
11. 
archived
Sistema/gestor encerra após retenção ou conclusão.
Aplica política de retenção; mantém auditoria, referências e provas legalmente necessárias.
18.4.1 Painel do investidor
Cabeçalho:
 referência, título, tipo, estado, data de submissão, responsável institucional e última actualização.
Próxima acção:
 mensagem única e accionável, prazo, botão correspondente e documentos necessários.
Progresso:
 linha temporal de estados com datas; não mostrar notas internas nem classificações reservadas.
Mensagens:
 canal seguro ligado ao processo, com anexos e histórico; correio electrónico apenas notifica e remete ao portal.
Documentos:
 estado recebido, em verificação, válido, rejeitado ou expirado, com motivo e opção de substituir.
Resultado fiscal:
 ligação à simulação exacta, data, versão das regras, resumo e aviso de natureza indicativa.
Ligações:
 projecto, oportunidade, reuniões, tarefas e decisões associadas.
Evento
Destinatário
Notificação e escalonamento
Rascunho incompleto
Promotor
Lembrete opcional; nunca enviar conteúdo sensível por correio.
Submissão recebida
Promotor e fila de triagem
Recibo imediato com referência e próximos passos.
Atribuição
Analista
Tarefa com prazo; alerta ao coordenador se não aceite no período configurado.
Pedido de informação
Promotor
Mensagem no portal e canais autorizados; lembretes antes do vencimento.
Prazo interno em risco
Analista e coordenador
Alerta progressivo; escalonamento ao gestor após ultrapassagem.
Mudança de estado
Promotor
Mensagem pública clara, data, fundamento e próxima acção.
Documento a expirar
Promotor e analista
Aviso antecipado configurável.
Conversão concluída
Promotor, gestor do projecto/oportunidade
Nova referência e ligação directa ao registo criado.