From eca67191358a1a6842de8867817509b6a8236871 Mon Sep 17 00:00:00 2001 From: nala Date: Wed, 11 Nov 2026 12:11:52 +0200 Subject: [PATCH] Unify institution profiles and reduce primary menu to six groups --- AGENTS.md | 5 + .../unification/traceability-and-manual.md | 10 + docs/investmoz/v2/auditoria-portal/backlog.md | 10 + .../v2/auditoria-portal/matriz-requisitos.csv | 8 +- .../visao-consolidada-modulos.md | 10 + .../js/components/funding-institution.tsx | 282 ++++++++++-------- .../js/components/portal-grouped-menu.tsx | 17 +- .../js/lib/funding-public-presentation.ts | 104 ++++++- resources/js/lib/portal-navigation.ts | 53 ++-- resources/js/pages/funding/index.tsx | 61 ++-- resources/js/pages/funding/show.tsx | 209 +++++++------ tests/frontend/funding-directory.test.mjs | 11 +- .../funding-public-presentation.test.mjs | 167 ++++++++++- tests/frontend/portal-navigation.test.mjs | 8 +- tests/frontend/portal-six-group-menu.test.mjs | 194 ++++++++++++ 15 files changed, 853 insertions(+), 296 deletions(-) create mode 100644 tests/frontend/portal-six-group-menu.test.mjs diff --git a/AGENTS.md b/AGENTS.md index d693d3f9..6a1b3886 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,3 +1,8 @@ +## Uniformização pública e menu — decisão expressa do proprietário,11/11/2026 + +Lista e detalhe das instituições financeiras devem usar a mesma apresentação:descrição única,categoria/tipo sem repetição,produtos/serviços,contactos e moradas úteis apenas quando disponíveis. Não apresentar secções vazias,avisos genéricos repetidos,notas de publicação/importação,preços antigos por reconfirmar ou a mesma informação várias vezes. Deduplicar apenas a apresentação,conservando dados e fontes no editor. Usar Quorus e Moza Banco como exemplos de conferência. +Menu principal:Início,Descoberta,Realização,Suporte,Sobre nós,Mais. Descoberta:Concursos e anúncios,Localizações,Instituições financeiras,Catálogos relacionados. Realização:Iniciar investimento,Licenciamento,Acesso à terra. Suporte:Biblioteca,Legislação,Serviços ao investidor,Acompanhamento do projecto,Apoio ao investidor. Preservar conteúdo deSobre nós/Mais,contexto dos dossiers e permissões. Escolha de apresentação:acessos de trabalho antes no nível principal passam paraMais,sem novas concessões. + ## Comunicação pública — orientação expressa do proprietário,11/11/2026 Apresentar conteúdos públicos com linguagem profissional,clara e apelativa,centrada na entidade,oportunidade,produtos e serviços úteis ao investidor. Não usar descrições de importação,cadastro,fichas,ficheiros ou documentos geradores como apresentação comercial. Preservar as fontes,versões e rastreabilidade no cadastro/editor;ligações institucionais e datas úteis podem ser consultadas separadamente. Não inventar ofertas,condições,disponibilidade,cobertura ou garantias para preencher lacunas. Esta orientação aplica-se transversalmente aos conteúdos do portal. diff --git a/docs/investmoz/unification/traceability-and-manual.md b/docs/investmoz/unification/traceability-and-manual.md index 2d69ce4b..f288bbdf 100644 --- a/docs/investmoz/unification/traceability-and-manual.md +++ b/docs/investmoz/unification/traceability-and-manual.md @@ -1,3 +1,13 @@ +## 11/11/2026 — uniformização Quorus/Moza e menu de seis grupos em QA + +Correcção orientada pelos exemplos expressos do proprietário:lista e detalhe reutilizam agora **o mesmo componente público**. Descrição única,categoria/tipo numa linha,produtos/serviços uma vez,contactos e moradas apenas quando disponíveis. Quorus:descrição de corretagem eSeguros uma vez;sem secções vazias ou avisos genéricos. Moza:descrição paraPME,CréditoPME/instrumentos uma vez,umtelefone e umamorada;sem notas de publicação,preços antigos,comissões/garantias por reconfirmar,entidade responsável repetida,sectores/cobertura desconhecidos ou referências institucionais duplicadas. Não inventa dados nem altera condições guardadas. Ligações dos produtos/contactos permanecem acessíveis uma vez;moradas diferentes são preservadas. + +Menu principal exactamente **Início–Descoberta–Realização–Suporte–Sobre nós–Mais**. Concursos movido paraDescoberta;Biblioteca eInstituições financeiras com os nomes pedidos;conteúdos deSobre nós/Mais preservados. Acesso de trabalho deslocado paraMais,sem perder permissões;conta/contexto/licenciamentoS08 e filtros preservados. Instruções permanentes actualizadas com o padrão pedido. + +**QA:**33verificações dirigidas aprovadas,com três casos novos:exemplos públicos exactos nas duas páginas,deduplicação conservadora e cabeçalho real com seis entradas em quatro combinações(público/autenticado,móvel/computador). Reutilizadas provas dos fluxos de interesse/dossier/editorial e das permissões,não reexecutadas na base. Fontes de270instituições intactas,sem migração/importação/republicação. Artefactos `outputs/funding-uniform-menu-20261111/verification.json` eHTMLs reais emSSR. Não é conferência visual de navegador;tipos/lint/compilação aprovados;pacote Git com aplicação/reversão conferidas no fecho. + +**Estado:** implementado em QA,não instalado;homologação mantém `a59142ca` e270instituições publicadas. Restam instalação e conferência visual;não requer seleccionar/publicar novamente instituições. Restante saldo de módulos e fiscal preservado. Próximo trabalho:entregar este conjunto compatível e continuar os resíduos de implementação acordados. + ## 11/11/2026 — apresentação financeira profissional instalada ema59142ca Instalação expressamente autorizada,executada pelo processo Git existente e conferida às11:38:54Africa/Johannesburg(09:38:54UTC): `a59142caa2fc277975be82fb550223ff7d949594`. O directório `/fundos` e o detalhe apresentam descrição e produtos/serviços conhecidos,sem usar texto de importação,fichas ou documento gerador como apresentação. Descrições específicas são preservadas;resumo genérico exacto passa a uma descrição pela natureza publicada. Não são inventadas ofertas para instituições sem produtos específicos identificados. Metadados/fontes/histórico mantidos no editor;ligações institucionais e datas úteis acessíveis separadamente. Orientação transversal registada emAGENTS. diff --git a/docs/investmoz/v2/auditoria-portal/backlog.md b/docs/investmoz/v2/auditoria-portal/backlog.md index 50c69d3b..f730ba48 100644 --- a/docs/investmoz/v2/auditoria-portal/backlog.md +++ b/docs/investmoz/v2/auditoria-portal/backlog.md @@ -1,3 +1,13 @@ +## 11/11/2026 — uniformização Quorus/Moza e menu de seis grupos em QA + +Correcção orientada pelos exemplos expressos do proprietário:lista e detalhe reutilizam agora **o mesmo componente público**. Descrição única,categoria/tipo numa linha,produtos/serviços uma vez,contactos e moradas apenas quando disponíveis. Quorus:descrição de corretagem eSeguros uma vez;sem secções vazias ou avisos genéricos. Moza:descrição paraPME,CréditoPME/instrumentos uma vez,umtelefone e umamorada;sem notas de publicação,preços antigos,comissões/garantias por reconfirmar,entidade responsável repetida,sectores/cobertura desconhecidos ou referências institucionais duplicadas. Não inventa dados nem altera condições guardadas. Ligações dos produtos/contactos permanecem acessíveis uma vez;moradas diferentes são preservadas. + +Menu principal exactamente **Início–Descoberta–Realização–Suporte–Sobre nós–Mais**. Concursos movido paraDescoberta;Biblioteca eInstituições financeiras com os nomes pedidos;conteúdos deSobre nós/Mais preservados. Acesso de trabalho deslocado paraMais,sem perder permissões;conta/contexto/licenciamentoS08 e filtros preservados. Instruções permanentes actualizadas com o padrão pedido. + +**QA:**33verificações dirigidas aprovadas,com três casos novos:exemplos públicos exactos nas duas páginas,deduplicação conservadora e cabeçalho real com seis entradas em quatro combinações(público/autenticado,móvel/computador). Reutilizadas provas dos fluxos de interesse/dossier/editorial e das permissões,não reexecutadas na base. Fontes de270instituições intactas,sem migração/importação/republicação. Artefactos `outputs/funding-uniform-menu-20261111/verification.json` eHTMLs reais emSSR. Não é conferência visual de navegador;tipos/lint/compilação aprovados;pacote Git com aplicação/reversão conferidas no fecho. + +**Estado:** implementado em QA,não instalado;homologação mantém `a59142ca` e270instituições publicadas. Restam instalação e conferência visual;não requer seleccionar/publicar novamente instituições. Restante saldo de módulos e fiscal preservado. Próximo trabalho:entregar este conjunto compatível e continuar os resíduos de implementação acordados. + ## 11/11/2026 — apresentação financeira profissional instalada ema59142ca Instalação expressamente autorizada,executada pelo processo Git existente e conferida às11:38:54Africa/Johannesburg(09:38:54UTC): `a59142caa2fc277975be82fb550223ff7d949594`. O directório `/fundos` e o detalhe apresentam descrição e produtos/serviços conhecidos,sem usar texto de importação,fichas ou documento gerador como apresentação. Descrições específicas são preservadas;resumo genérico exacto passa a uma descrição pela natureza publicada. Não são inventadas ofertas para instituições sem produtos específicos identificados. Metadados/fontes/histórico mantidos no editor;ligações institucionais e datas úteis acessíveis separadamente. Orientação transversal registada emAGENTS. diff --git a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv index 5035d09f..b6634468 100644 --- a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv +++ b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv @@ -2026,7 +2026,7 @@ MASTER-f167d915-0004,"5. Ligações institucionais de apoio: disponibilizar, no MASTER-f167d915-0005,"Princípio de incorporação: o Balcão Virtual não será uma aplicação isolada. Será incluído no mesmo domínio funcional do Portal do Investidor, partilhando cabeçalho, menus, sessão, perfis, design system, gestão de utilizadores, observabilidade e processos de publicação. A implementação deverá evitar autenticação duplicada, cadastros paralelos e componentes que já existam no portal.",..\..\..\..\..\..\Users\macbook\.codex\attachments\0ad28475-97cc-4263-b611-022f3de5bebc\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 30,Balcão/orientação,/balcao-virtual/contextos; /balcao-virtual/dossiers; /balcao-virtual/dossiers/{id}; /balcao-virtual/dossiers/{id}/documentos; /balcao-virtual/dossiers/{id}/documentos/{document}; /balcao-virtual/dossiers/{id}/documentos/{document}/conferencia; /balcao-virtual/dossiers/{id}/etapas; /balcao-virtual/dossiers/{id}/fontes; /balcao-virtual/dossiers/{id}/orientacao; /balcao-virtual/dossiers/{id}/pedidos; /balcao-virtual/dossiers/{id}/pressupostos; /balcao-virtual/dossiers/{id}/recomendacoes,"VirtualDesk, pedidos/casos, anexos, contexto dossier e acompanhamento. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Pedido contextual→gravar→submeter→nova sessão→gestor→mensagem/documentos/resultado, reaproveitando A/B. Critério individual original preservado; cobertura atual ainda não individualizada.","Perfis próprios do Balcão; serviços/campos e decisões externas aplicáveis, sem inventar destinatário/prazo. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-f167d915-0005: Princípio de incorporação: o Balcão Virtual não será uma aplicação isolada. Será incluído no mesmo domínio funcional do Portal do Investidor, partilhando cabeçalho, menus, sessão, perfis, design system, gestão de utilizadores, observabilidade e processos de publicação. A implementação deverá evitar autenticação duplicada, cadastros paralelos e componentes que já existam no portal.",P2,MASTER-f167d915-0005: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-f167d915-0005,1,"[{""id"":""MASTER-f167d915-0005"",""pedido"":""Princípio de incorporação: o Balcão Virtual não será uma aplicação isolada. Será incluído no mesmo domínio funcional do Portal do Investidor, partilhando cabeçalho, menus, sessão, perfis, design system, gestão de utilizadores, observabilidade e processos de publicação. A implementação deverá evitar autenticação duplicada, cadastros paralelos e componentes que já existam no portal."",""fontes"":[""..\\..\\..\\..\\..\\..\\Users\\macbook\\.codex\\attachments\\0ad28475-97cc-4263-b611-022f3de5bebc\\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 30""],""aceitacao"":""Princípio de incorporação: o Balcão Virtual não será uma aplicação isolada. Será incluído no mesmo domínio funcional do Portal do Investidor, partilhando cabeçalho, menus, sessão, perfis, design system, gestão de utilizadores, observabilidade e processos de publicação. A implementação deverá evitar autenticação duplicada, cadastros paralelos e componentes que já existam no portal."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""Balcão/orientação""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.desk_cases: 1 registos; public.desk_requests: 0 registos; public.desk_institutional_links: 0 registos; public.desk_messages: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Pedido contextual→gravar→submeter→nova sessão→gestor→mensagem/documentos/resultado, reaproveitando A/B. Critério individual original preservado; cobertura atual ainda não individualizada.","VirtualDesk, pedidos/casos, anexos, contexto dossier e acompanhamento","Perfis próprios do Balcão; serviços/campos e decisões externas aplicáveis, sem inventar destinatário/prazo.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: balcão. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,balcão,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Services/VirtualDesk.php; app/Services/Ai/InvestorGuidance.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,InvestorGuidanceTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-f167d915-0006,"URL e navegação recomendadas: disponibilizar o módulo através de uma rota própria no Portal do Investidor, por exemplo “/balcao-virtual”, acessível pelo menu principal e pela área autenticada. As rotas internas dos formulários, pedidos e painéis devem permanecer sob o mesmo domínio e respeitar os mecanismos de autorização já existentes.",..\..\..\..\..\..\Users\macbook\.codex\attachments\0ad28475-97cc-4263-b611-022f3de5bebc\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 31,Balcão/orientação,/balcao-virtual/contextos; /balcao-virtual/dossiers; /balcao-virtual/dossiers/{id}; /balcao-virtual/dossiers/{id}/documentos; /balcao-virtual/dossiers/{id}/documentos/{document}; /balcao-virtual/dossiers/{id}/documentos/{document}/conferencia; /balcao-virtual/dossiers/{id}/etapas; /balcao-virtual/dossiers/{id}/fontes; /balcao-virtual/dossiers/{id}/orientacao; /balcao-virtual/dossiers/{id}/pedidos; /balcao-virtual/dossiers/{id}/pressupostos; /balcao-virtual/dossiers/{id}/recomendacoes,"VirtualDesk, pedidos/casos, anexos, contexto dossier e acompanhamento. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Pedido contextual→gravar→submeter→nova sessão→gestor→mensagem/documentos/resultado, reaproveitando A/B. Critério individual original preservado; cobertura atual ainda não individualizada.","Perfis próprios do Balcão; serviços/campos e decisões externas aplicáveis, sem inventar destinatário/prazo. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-f167d915-0006: URL e navegação recomendadas: disponibilizar o módulo através de uma rota própria no Portal do Investidor, por exemplo “/balcao-virtual”, acessível pelo menu principal e pela área autenticada. As rotas internas dos formulários, pedidos e painéis devem permanecer sob o mesmo domínio e respeitar os mecanismos de autorização já existentes.",P2,MASTER-f167d915-0006: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-f167d915-0006,1,"[{""id"":""MASTER-f167d915-0006"",""pedido"":""URL e navegação recomendadas: disponibilizar o módulo através de uma rota própria no Portal do Investidor, por exemplo “/balcao-virtual”, acessível pelo menu principal e pela área autenticada. As rotas internas dos formulários, pedidos e painéis devem permanecer sob o mesmo domínio e respeitar os mecanismos de autorização já existentes."",""fontes"":[""..\\..\\..\\..\\..\\..\\Users\\macbook\\.codex\\attachments\\0ad28475-97cc-4263-b611-022f3de5bebc\\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 31""],""aceitacao"":""URL e navegação recomendadas: disponibilizar o módulo através de uma rota própria no Portal do Investidor, por exemplo “/balcao-virtual”, acessível pelo menu principal e pela área autenticada. As rotas internas dos formulários, pedidos e painéis devem permanecer sob o mesmo domínio e respeitar os mecanismos de autorização já existentes."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""Balcão/orientação""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.desk_cases: 1 registos; public.desk_requests: 0 registos; public.desk_institutional_links: 0 registos; public.desk_messages: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Pedido contextual→gravar→submeter→nova sessão→gestor→mensagem/documentos/resultado, reaproveitando A/B. Critério individual original preservado; cobertura atual ainda não individualizada.","VirtualDesk, pedidos/casos, anexos, contexto dossier e acompanhamento","Perfis próprios do Balcão; serviços/campos e decisões externas aplicáveis, sem inventar destinatário/prazo.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: balcão. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,balcão,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Services/VirtualDesk.php; app/Services/Ai/InvestorGuidance.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,InvestorGuidanceTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-f167d915-0007,"A validação pública do portal confirma uma plataforma activa com navegação, conteúdos, área de entrada, dados de mercado, notícias, explorador de activos, carteira, perfil do investidor e simuladores. A reutilização técnica definitiva depende de acesso ao repositório, configuração, base de dados e ambientes; por isso, os itens abaixo distinguem o que pode ser assumido como disponível do que deve ser comprovado na Fase 0.",..\..\..\..\..\..\Users\macbook\.codex\attachments\0ad28475-97cc-4263-b611-022f3de5bebc\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 42,simuladores,/api/v1/questionnaires/{code}; /api/v1/simulation-drafts; /api/v1/simulation-drafts/claim; /api/v1/simulation-drafts/claim-preview; /api/v1/simulation-drafts/current; /api/v1/simulation-drafts/linkable-businesses; /api/v1/simulation-drafts/{id}; /api/v1/simulation-drafts/{id}/business-link; /api/v1/simulation-drafts/{id}/conversions; /api/v1/simulation-drafts/{id}/touch; /api/v1/simulations; /api/v1/simulations/history,"SimulationExecution, resultados/cenários/fontes, rascunhos e dossier existentes. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Cenário→cálculo→gravação→resultado/dossier correto→nova sessão→PDF/derivadas autorizadas. Sem aprovação/score inventado. Critério individual original preservado; cobertura atual ainda não individualizada.,"Regras financeiras/fiscais separadas; fonte oficial aceite, parâmetros/âmbito/período podem faltar; não substituir por0/taxa atual. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-f167d915-0007: A validação pública do portal confirma uma plataforma activa com navegação, conteúdos, área de entrada, dados de mercado, notícias, explorador de activos, carteira, perfil do investidor e simuladores. A reutilização técnica definitiva depende de acesso ao repositório, configuração, base de dados e ambientes; por isso, os itens abaixo distinguem o que pode ser assumido como disponível do que deve ser comprovado na Fase 0.",P2,MASTER-f167d915-0007: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-f167d915-0007,1,"[{""id"":""MASTER-f167d915-0007"",""pedido"":""A validação pública do portal confirma uma plataforma activa com navegação, conteúdos, área de entrada, dados de mercado, notícias, explorador de activos, carteira, perfil do investidor e simuladores. A reutilização técnica definitiva depende de acesso ao repositório, configuração, base de dados e ambientes; por isso, os itens abaixo distinguem o que pode ser assumido como disponível do que deve ser comprovado na Fase 0."",""fontes"":[""..\\..\\..\\..\\..\\..\\Users\\macbook\\.codex\\attachments\\0ad28475-97cc-4263-b611-022f3de5bebc\\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 42""],""aceitacao"":""A validação pública do portal confirma uma plataforma activa com navegação, conteúdos, área de entrada, dados de mercado, notícias, explorador de activos, carteira, perfil do investidor e simuladores. A reutilização técnica definitiva depende de acesso ao repositório, configuração, base de dados e ambientes; por isso, os itens abaixo distinguem o que pode ser assumido como disponível do que deve ser comprovado na Fase 0."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""simuladores""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.simulation_form_drafts: 22 registos; public.simulation_scenarios: 16 registos; public.simulations: 16 registos; public.simulation_tax_rules: tabela ausente,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.",Cenário→cálculo→gravação→resultado/dossier correto→nova sessão→PDF/derivadas autorizadas. Sem aprovação/score inventado. Critério individual original preservado; cobertura atual ainda não individualizada.,"SimulationExecution, resultados/cenários/fontes, rascunhos e dossier existentes","Regras financeiras/fiscais separadas; fonte oficial aceite, parâmetros/âmbito/período podem faltar; não substituir por0/taxa atual.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: simuladores. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,simuladores,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Services/SimulationTaxParameterResolver.php; resources/js/components/simulation-form.tsx — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"SimulationExecutionTest, SimulationFormDraftTest, SimulationDraftContinuityTest, SimulationTaxRuleGovernanceTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, -MASTER-f167d915-0008,"Navegação e identidade visual Observável no portal público. Reutilizar cabeçalho, menus, grelha, tipografia, cores, componentes e padrões responsivos. Inventário de componentes, design tokens e regras de navegação.",..\..\..\..\..\..\Users\macbook\.codex\attachments\0ad28475-97cc-4263-b611-022f3de5bebc\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 44,dashboard/perfis,/api/v1/investment/companies/{id?}; /api/v1/investment/notifications; /api/v1/investment/notifications/{id}/read; /api/v1/investment/profile; /api/v1/investment/submissions/{id}/messages; /api/v1/investment/submissions/{id}/revisions/{version}; /dashboard; /investidor/companies/{id?}; /investidor/manifestacoes/{id}/messages; /investidor/manifestacoes/{id}/revisions/{version}; /investidor/notifications; /investidor/notifications/{id}/read,"Fortify, PortalProfileAdministration/Access, grants, policies, portal_security_approvals e menus atuais. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.","outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | [Identidade Tempo 19/10/2026] Pedido expresso: importar header/footer de tempo-dashboard, remover marca InvesteMoz da navega??o e organizar Descoberta/Realiza??o/Suporte. AGENTS.md 12/10/2026: propriet?rio e regras Tempo preservados. Radix, CSS responsivo e tradu??es institucionais s?o escolhas t?cnicas. S? ambiente local investmoz_local_test:55441; sem migra??es ou implanta??o activa nesta altera??o visual. Prova: outputs/tempo-shell-20261019/analysis-and-plan.json; verification.json; header.png; footer.png; mobile-320.png. Quatro p?ginas 200; cinco larguras 320?1440 sem overflow; teclado/Escape/foco, idioma, login/logout sem erros JS. N?o encerra aceita??o global da cl?usula.",Sem evidência suficiente,"Reutilizar provas existentes; suplementar autorização/revogação/elevação por ação/consumidor, sem sistema paralelo. Critério individual original preservado; cobertura atual ainda não individualizada.","030000→040000 instalados, seis categorias ON; contas/grants reais concluídos. Autorizações por tipo/org e independência mantidas. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-f167d915-0008: Navegação e identidade visual Observável no portal público. Reutilizar cabeçalho, menus, grelha, tipografia, cores, componentes e padrões responsivos. Inventário de componentes, design tokens e regras de navegação.",P2,MASTER-f167d915-0008: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-f167d915-0008,1,"[{""id"":""MASTER-f167d915-0008"",""pedido"":""Navegação e identidade visual Observável no portal público. Reutilizar cabeçalho, menus, grelha, tipografia, cores, componentes e padrões responsivos. Inventário de componentes, design tokens e regras de navegação."",""fontes"":[""..\\..\\..\\..\\..\\..\\Users\\macbook\\.codex\\attachments\\0ad28475-97cc-4263-b611-022f3de5bebc\\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 44""],""aceitacao"":""Navegação e identidade visual Observável no portal público. Reutilizar cabeçalho, menus, grelha, tipografia, cores, componentes e padrões responsivos. Inventário de componentes, design tokens e regras de navegação."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""dashboard/perfis""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.investment_accounts: 0 registos; public.investment_company_declarations: 0 registos; public.investment_submissions: 3 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Reutilizar provas existentes; suplementar autorização/revogação/elevação por ação/consumidor, sem sistema paralelo. Critério individual original preservado; cobertura atual ainda não individualizada.","Fortify, PortalProfileAdministration/Access, grants, policies, portal_security_approvals e menus atuais","030000→040000 instalados, seis categorias ON; contas/grants reais concluídos. Autorizações por tipo/org e independência mantidas.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: perfis. Esforço de código adicional só após lacuna reproduzida.,"outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | [Identidade Tempo 19/10/2026] Pedido expresso: importar header/footer de tempo-dashboard, remover marca InvesteMoz da navega??o e organizar Descoberta/Realiza??o/Suporte. AGENTS.md 12/10/2026: propriet?rio e regras Tempo preservados. Radix, CSS responsivo e tradu??es institucionais s?o escolhas t?cnicas. S? ambiente local investmoz_local_test:55441; sem migra??es ou implanta??o activa nesta altera??o visual. Prova: outputs/tempo-shell-20261019/analysis-and-plan.json; verification.json; header.png; footer.png; mobile-320.png. Quatro p?ginas 200; cinco larguras 320?1440 sem overflow; teclado/Escape/foco, idioma, login/logout sem erros JS. N?o encerra aceita??o global da cl?usula.",perfis,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Http/Controllers/DashboardController.php; app/Services/CountryCatalogue.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentWorkspaceTest, InvestorGuidanceTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, +MASTER-f167d915-0008,"Navegação e identidade visual Observável no portal público. Reutilizar cabeçalho, menus, grelha, tipografia, cores, componentes e padrões responsivos. Inventário de componentes, design tokens e regras de navegação.",..\..\..\..\..\..\Users\macbook\.codex\attachments\0ad28475-97cc-4263-b611-022f3de5bebc\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 44,dashboard/perfis,/api/v1/investment/companies/{id?}; /api/v1/investment/notifications; /api/v1/investment/notifications/{id}/read; /api/v1/investment/profile; /api/v1/investment/submissions/{id}/messages; /api/v1/investment/submissions/{id}/revisions/{version}; /dashboard; /investidor/companies/{id?}; /investidor/manifestacoes/{id}/messages; /investidor/manifestacoes/{id}/revisions/{version}; /investidor/notifications; /investidor/notifications/{id}/read,"Fortify, PortalProfileAdministration/Access, grants, policies, portal_security_approvals e menus atuais. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","[FUNDING-UNIFORM-MENU-20261111] Uniformização pública Quorus/Moza e menu de seis grupos em QA,não instalados;homologaçãoa59142ca preservada. | Histórico: Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.","outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | [Identidade Tempo 19/10/2026] Pedido expresso: importar header/footer de tempo-dashboard, remover marca InvesteMoz da navega??o e organizar Descoberta/Realiza??o/Suporte. AGENTS.md 12/10/2026: propriet?rio e regras Tempo preservados. Radix, CSS responsivo e tradu??es institucionais s?o escolhas t?cnicas. S? ambiente local investmoz_local_test:55441; sem migra??es ou implanta??o activa nesta altera??o visual. Prova: outputs/tempo-shell-20261019/analysis-and-plan.json; verification.json; header.png; footer.png; mobile-320.png. Quatro p?ginas 200; cinco larguras 320?1440 sem overflow; teclado/Escape/foco, idioma, login/logout sem erros JS. N?o encerra aceita??o global da cl?usula.",Sem evidência suficiente,"Reutilizar provas existentes; suplementar autorização/revogação/elevação por ação/consumidor, sem sistema paralelo. Critério individual original preservado; cobertura atual ainda não individualizada.","030000→040000 instalados, seis categorias ON; contas/grants reais concluídos. Autorizações por tipo/org e independência mantidas. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-f167d915-0008: Navegação e identidade visual Observável no portal público. Reutilizar cabeçalho, menus, grelha, tipografia, cores, componentes e padrões responsivos. Inventário de componentes, design tokens e regras de navegação.",P2,MASTER-f167d915-0008: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-f167d915-0008,1,"[{""id"":""MASTER-f167d915-0008"",""pedido"":""Navegação e identidade visual Observável no portal público. Reutilizar cabeçalho, menus, grelha, tipografia, cores, componentes e padrões responsivos. Inventário de componentes, design tokens e regras de navegação."",""fontes"":[""..\\..\\..\\..\\..\\..\\Users\\macbook\\.codex\\attachments\\0ad28475-97cc-4263-b611-022f3de5bebc\\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 44""],""aceitacao"":""Navegação e identidade visual Observável no portal público. Reutilizar cabeçalho, menus, grelha, tipografia, cores, componentes e padrões responsivos. Inventário de componentes, design tokens e regras de navegação."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""dashboard/perfis""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.investment_accounts: 0 registos; public.investment_company_declarations: 0 registos; public.investment_submissions: 3 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","[FUNDING-UNIFORM-MENU-20261111] Lista/detalhe comuns,sem repetições/secções vazias/dados antigos;seis grupos conforme proprietário. Restam instalação/visual;sem republicação das270instituições ou concessões novas. | Histórico: Reutilizar provas existentes; suplementar autorização/revogação/elevação por ação/consumidor, sem sistema paralelo. Critério individual original preservado; cobertura atual ainda não individualizada.","Fortify, PortalProfileAdministration/Access, grants, policies, portal_security_approvals e menus atuais","030000→040000 instalados, seis categorias ON; contas/grants reais concluídos. Autorizações por tipo/org e independência mantidas.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: perfis. Esforço de código adicional só após lacuna reproduzida.,"[FUNDING-UNIFORM-MENU-20261111]33verificações dirigidas:exemplos Quorus/Moza,deduplicação conservadora,cabeçalho real desktop/mobile,público/autenticado,rotas/permissões preservadas. outputs/funding-uniform-menu-20261111/verification.json;270fontes intactas,sem migração/escrita activa. | Histórico: outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | [Identidade Tempo 19/10/2026] Pedido expresso: importar header/footer de tempo-dashboard, remover marca InvesteMoz da navega??o e organizar Descoberta/Realiza??o/Suporte. AGENTS.md 12/10/2026: propriet?rio e regras Tempo preservados. Radix, CSS responsivo e tradu??es institucionais s?o escolhas t?cnicas. S? ambiente local investmoz_local_test:55441; sem migra??es ou implanta??o activa nesta altera??o visual. Prova: outputs/tempo-shell-20261019/analysis-and-plan.json; verification.json; header.png; footer.png; mobile-320.png. Quatro p?ginas 200; cinco larguras 320?1440 sem overflow; teclado/Escape/foco, idioma, login/logout sem erros JS. N?o encerra aceita??o global da cl?usula.",perfis,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Http/Controllers/DashboardController.php; app/Services/CountryCatalogue.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentWorkspaceTest, InvestorGuidanceTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-f167d915-0009,"Área de entrada e sessão Existe ponto de entrada público; implementação interna não verificada. Reutilizar autenticação e sessão existentes, sem criar credenciais paralelas. Fluxo de login/logout, recuperação, MFA, duração de sessão e mecanismo de autorização.",..\..\..\..\..\..\Users\macbook\.codex\attachments\0ad28475-97cc-4263-b611-022f3de5bebc\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 45,governação/outros,/api/v1/investment/admin/interests/{interest}/status; /management/history; /management/interests; /management/interests/{interest}; /management/interests/{interest}/consent/contact; /management/interests/{interest}/consent/proponent; /management/opportunities; /management/opportunities/create; /management/opportunities/drafts; /management/opportunities/{id}/draft; /management/opportunities/{id}/edit; /management/opportunities/{id}/lifecycle,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-f167d915-0009: Área de entrada e sessão Existe ponto de entrada público; implementação interna não verificada. Reutilizar autenticação e sessão existentes, sem criar credenciais paralelas. Fluxo de login/logout, recuperação, MFA, duração de sessão e mecanismo de autorização.",P1,MASTER-f167d915-0009: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-f167d915-0009,1,"[{""id"":""MASTER-f167d915-0009"",""pedido"":""Área de entrada e sessão Existe ponto de entrada público; implementação interna não verificada. Reutilizar autenticação e sessão existentes, sem criar credenciais paralelas. Fluxo de login/logout, recuperação, MFA, duração de sessão e mecanismo de autorização."",""fontes"":[""..\\..\\..\\..\\..\\..\\Users\\macbook\\.codex\\attachments\\0ad28475-97cc-4263-b611-022f3de5bebc\\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 45""],""aceitacao"":""Área de entrada e sessão Existe ponto de entrada público; implementação interna não verificada. Reutilizar autenticação e sessão existentes, sem criar credenciais paralelas. Fluxo de login/logout, recuperação, MFA, duração de sessão e mecanismo de autorização."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""governação/outros""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,Requisito transversal; consultar estado-ativo-after.json,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.",Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer","Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: governação e demais cláusulas. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,governação e demais cláusulas,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",AGENTS.md — componentes do domínio encontrados; correspondência integral deste requisito não presumida,; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-f167d915-0010,"Frontend e design system Interface funcional confirmada; stack e biblioteca não verificados. Reutilizar componentes existentes; criar apenas componentes específicos de formulários, timeline, filas e validação. Stack frontend, biblioteca, convenções, acessibilidade e cobertura de testes.",..\..\..\..\..\..\Users\macbook\.codex\attachments\0ad28475-97cc-4263-b611-022f3de5bebc\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 47,biblioteca,//; /Simulador; /api/v1/ai/documents; /api/v1/documents/recommendations; /api/v2/investment/admin/legal-sources; /api/v2/investment/admin/legal-sources/{id}/{action}; /apoio; /balcao-virtual; /balcao-virtual/dossiers/{id}/documentos/{document}/conferencia; /como-investir; /documentos; /documentos/{id},"documents, biblioteca, importação autenticada, VerifiedDocumentBinary, jobs/derivadas. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Cobrir consulta/importação/doc/derivada/hash/perfil e revogação; preservar original; divulgação separada. Não inferir relação territorial. Critério individual original preservado; cobertura atual ainda não individualizada.,Scanner/worker/GD/WebP e originais privados; ACL por oportunidade/sala diferente de partilha individual não implementada. LegadoOFF. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,"MASTER-f167d915-0010: Frontend e design system Interface funcional confirmada; stack e biblioteca não verificados. Reutilizar componentes existentes; criar apenas componentes específicos de formulários, timeline, filas e validação. Stack frontend, biblioteca, convenções, acessibilidade e cobertura de testes.",P2,MASTER-f167d915-0010: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-f167d915-0010,1,"[{""id"":""MASTER-f167d915-0010"",""pedido"":""Frontend e design system Interface funcional confirmada; stack e biblioteca não verificados. Reutilizar componentes existentes; criar apenas componentes específicos de formulários, timeline, filas e validação. Stack frontend, biblioteca, convenções, acessibilidade e cobertura de testes."",""fontes"":[""..\\..\\..\\..\\..\\..\\Users\\macbook\\.codex\\attachments\\0ad28475-97cc-4263-b611-022f3de5bebc\\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 47""],""aceitacao"":""Frontend e design system Interface funcional confirmada; stack e biblioteca não verificados. Reutilizar componentes existentes; criar apenas componentes específicos de formulários, timeline, filas e validação. Stack frontend, biblioteca, convenções, acessibilidade e cobertura de testes."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""biblioteca""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.documents: 4 registos; public.portal_resources: 4 registos; public.portal_resource_links: 19 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.",Cobrir consulta/importação/doc/derivada/hash/perfil e revogação; preservar original; divulgação separada. Não inferir relação territorial. Critério individual original preservado; cobertura atual ainda não individualizada.,"documents, biblioteca, importação autenticada, VerifiedDocumentBinary, jobs/derivadas",Scanner/worker/GD/WebP e originais privados; ACL por oportunidade/sala diferente de partilha individual não implementada. LegadoOFF.,Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: documentos e legado. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,documentos e legado,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Http/Controllers/PortalServicesController.php; app/Jobs/ScanDocumentForMalware.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"PortalServicesTest, DocumentLibrarySchemaCompatibilityTest, ImportDocumentBatchTest, ClamDScannerIntegrationTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-f167d915-0011,"Base de dados Não verificável externamente. Reutilizar a instância e padrões existentes, criando schema/tabelas próprias e relações controladas com utilizadores e organizações. SGBD, migrations, convenções, volumes, backups, índices, auditoria e política de dados.",..\..\..\..\..\..\Users\macbook\.codex\attachments\0ad28475-97cc-4263-b611-022f3de5bebc\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 49,governação/outros,/api/v1/investment/admin/interests/{interest}/status; /management/history; /management/interests; /management/interests/{interest}; /management/interests/{interest}/consent/contact; /management/interests/{interest}/consent/proponent; /management/opportunities; /management/opportunities/create; /management/opportunities/drafts; /management/opportunities/{id}/draft; /management/opportunities/{id}/edit; /management/opportunities/{id}/lifecycle,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-f167d915-0011: Base de dados Não verificável externamente. Reutilizar a instância e padrões existentes, criando schema/tabelas próprias e relações controladas com utilizadores e organizações. SGBD, migrations, convenções, volumes, backups, índices, auditoria e política de dados.",P2,MASTER-f167d915-0011: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-f167d915-0011,1,"[{""id"":""MASTER-f167d915-0011"",""pedido"":""Base de dados Não verificável externamente. Reutilizar a instância e padrões existentes, criando schema/tabelas próprias e relações controladas com utilizadores e organizações. SGBD, migrations, convenções, volumes, backups, índices, auditoria e política de dados."",""fontes"":[""..\\..\\..\\..\\..\\..\\Users\\macbook\\.codex\\attachments\\0ad28475-97cc-4263-b611-022f3de5bebc\\Pasted text.txt; SHA f167d9156c2572c0253949a6f0ed88aafc28450cce902e8f445e3d979119aa37; linha 49""],""aceitacao"":""Base de dados Não verificável externamente. Reutilizar a instância e padrões existentes, criando schema/tabelas próprias e relações controladas com utilizadores e organizações. SGBD, migrations, convenções, volumes, backups, índices, auditoria e política de dados."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""governação/outros""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,Requisito transversal; consultar estado-ativo-after.json,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.",Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer","Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: governação e demais cláusulas. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,governação e demais cláusulas,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",AGENTS.md — componentes do domínio encontrados; correspondência integral deste requisito não presumida,; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, @@ -10894,11 +10894,11 @@ AUD-ESTABLISHMENT-01,"Importar empresas licenciadas e empreendimentos turístico [RECONCILIACAO-43-20261019] Código e critérios confrontados com leitura READ ONLY fresca; PROVA-RECONCILIACAO-43-LEITURA.json, RECONCILIACAO-43-QA-FONTES.json, RECONCILIACAO-43-SCHEMA-QA.json. Não encerra critério funcional por inventário. [PLANO-P1-P6-20261019] Plano Tempo: 27–46 h disponibilização; P7 e desenvolvimento separados. Inclusão 36–39 expressa para decisão; sem publicação automática. Revisão de proposta d87970e701f0. Roteiro no manual existente; não encerra critério por instalação. [PROACTIVE-SUPPLY-REVIEW-20261102] Reconciliação com prova aceite de28/10/2026: importação privada específica já entregue, com361464 observações administrativas,147165 repetições conservadas e214299 projecções distintas; nenhum destes números é contagem de empresas únicas. Recibo proactive-supply-git-delivery-20261028.json e motores prepare/export/load-proactive-supply.py preservados. Os estados anteriores a essa entrega são históricos, não prova de ausência actual. Acrescentada consulta privada só de leitura das origens/linhas, pendências territoriais, repetições e conflitos, com cobertura explícita, referências recuperáveis e filtros sem acentos. Corrigidas respostas antigas após mudança de contexto; hashes de identidade/recibos privados excluídos da projecção. 9 Feature/138 asserções e seis frontend; PHPStan, tipos, lint/Pint/build aprovados. Onze tabelas QA com contagens/checksums iguais antes/depois. Recibo proactive_supply_review_increment_20261102; sem importação ou alteração no activo.",incrementos futuros,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Importador específico destes cadastros e reconciliação de entidades/versões ainda por preparar. Importação de artigos do legado e geometrias não substitui esta carga.,Identificar fontes/dados/âmbito/período concretos; não reabrir aceitação oficial.,"Inventariar os ficheiros fornecidos, inspecionar colunas e IDs reais; reutilizar organizações/estabelecimentos existentes por correspondência, serviços de importação privada/hash e hierarquia territorial. Não criar organizações automaticamente com base em nome ou licença.",Leitura integral do exemplar local e inventário código/documental; importação/retrieval deste DOCX não comprova a funcionalidade descrita.,Contrato específico não demonstrado.,,,,24–48 h por formato aprovado; acesso ao ficheiro e identificadores são pré-condições.,,, -AUD-FUND-01,Catálogo de fundos nacionais e territoriais com elegibilidade explicada e atualização,[Segmentação bf26caeee043 — identidade confirmada; nome local v1.docx] Alias documental INV-005; SEG-bf26caee-p157; SEG-bf26caee-p158; SEG-bf26caee-p483; SEG-bf26caee-p636; SEG-bf26caee-p723,INV-005 / incremento posterior ao workflow das seis categorias,"Consumidor específico ainda por delimitar; reutilizar rotas de biblioteca/Balcão/negócios/simulador pertinentes, sem atribuir existência fictícia.","Biblioteca, taxonomias, fontes e filtros comuns. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","[INSTALADO-a59142ca-20261111] Apresentação profissional do directório/detalhe instalada;HTTP200 e270instituições publicadas preservadas. | Histórico: [FUNDING-PUBLIC-EDITORIAL-20261111] Apresentação profissional em QA,não instalada;270publicadas e homologação8f295f05 preservadas. | Histórico: [INSTITUICOES-20261110]270instituições/operadores,393referências de localização e168contactos do documento fornecido, em QA. Nenhuma nova instalação/publicação activa. | Histórico anterior preservado: [ACT12-20261110] Directório financeiro/conteúdo fornecido em QA; não instalado/publicado. Homologação1c75a30a mantém zero fichas financeiras. | Histórico anterior preservado: [CONCLUSAO-INTEGRAL-20261110] Fontes até ff726e57 na homologação teste-investidor. Não confundir instalação do código com nova concessão, habilitação nominal ou prova visual integral. | Histórico anterior preservado: Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. Preparação editorial assistida em QA: selecção/conferência e publicação explícita separadas, MFA nativo, edições preservadas e repetição exacta. Disponibilização efectiva ainda pendente. Instalação ef24cbdc confirmada10/11/2026; backup/restauro190tabelas/369ficheiros; fontes33hashes. Conteúdo ainda0fichas/0publicações; entrada no editor confirmada, sem POST de preparação/publicação observado. ACT12 aberto até consulta efectiva, sem nova instalação exigida. Confirmação posterior10/11:32rascunhos persistidos/0publicações; continuação e publicação403 após expiraçãoMFA900s (21:31:43+02). Retoma autenticada idempotente conserva rascunhos. Instalaçãoef24cbdc preservada; ACT12 aberto. Confirmação seguinte:90rascunhos/0publicações, recusas403 apósMFA. CorrecçãoQA de retoma na mesma aba poractor/fontes, confirmação separada e recuperação exacta; selecção todas270/contadores/controlos visíveis. Revisãoactivaef24cbdc até recibo posterior. Retoma instalada4f3dbcf8/22:01+02,7hashes/HTTP200/backup-restauro190tabelas369ficheiros, guardasMFA mantidas.90rascunhos/0publicações; preparação/publicação autenticada e consulta efectiva ainda pendentes. ACT12 aberto. Diagnóstico posterior:loginMFAEdge22:03:53/dashboard200; editor403Safari/WebKit22:04 em sessão anterior. Não era expiração da nova sessãoEdge. Colar URL noEdge autenticado; nenhuma permissão/sessão/configuração alterada. Abertura/publicação efectiva por confirmar. Acesso reposto:editorEdgeHTTP200às22:11:21+02 na sessão correcta; sem nova instalação/permissão. Publicação/conteúdo consultável ainda por confirmar. ENTREGACONFIRMADA10/11/2026às22:54:31+02:270/270instituições do documento publicadas/270identidades/393locais168contactos; nenhuma em falta. CatálogoHTTP200total270incluindo histórico, filtroseguradora/Nampula6resultados eBCI/Absa/ArkoHTTP200. Cadastro/disponibilização do original concluídos emhomologação4f3dbcf8; continuidade dossierQA aceite reutilizada; visual separado. Cinco programas anteriores permanecem privados. Provaoutputs/funding-directory-20261110/institutions/publication-complete.json.","segmentacao-processos-reconciliacao-20261011.md; contratos/rotas inventariados atuais; não há prova de percurso completo deste incremento. [FUNDING-EDITOR-20261102] Catálogo e editor locais: rascunhos, prévia vinculada, publicação/retirada com autoridade editorial existente, versões imutáveis, janelas/critério explicado, documentos por versão e interesse privado. Quatro testes/91 asserções e tipos aprovados. Filtros territoriais/sectoriais, ensaios de documentos, fontes reais, visual e disponibilização pendentes; requisito parcial, sem alteração no activo. Manual de 02/11 e funding_editor_increment_20261102. [FUNDING-FILTERS-20261102] Filtros locais por sector, cobertura territorial e estado de janela, com desconhecidos explícitos e cobertura parcial. Nomes/caminhos territoriais e sectores conservados por versão. Descarga verifica versão, checksum, direitos, análise e bytes; prévia obsoleta recusada. Seis testes/204 asserções, PHPStan, tipos, lint sem avisos e compilação aprovados. Recibo funding_filters_increment_20261102 e manual. Faltam fontes reais incorporadas, validação visual, ensaios de concorrência e disponibilização; requisito parcial. [FUNDING-REFERENCES-20261102] Referência oficial FDEL empacotada com fontes/edições/hashes e prévia editorial; prepara rascunho sem publicar. Uma ficha e chamada municipal histórica, repetição sem duplicar ou substituir. Sete testes/235 asserções; PHPStan, tipos e lint aprovados. Recibo funding_references_increment_20261102; manual de 02/11. Ligações sectorial/cartográfica, concorrência, visual, alertas e disponibilização pendentes. Parcial local, sem escrita no activo. [FUNDING-CONCURRENCY-20261102] Ensaio com cinco pares de processos e bloqueios observados no PostgreSQL identificou deadlock 40P01 entre retirada e interesse da mesma pessoa. Bloqueio da conta ajustado a FOR NO KEY UPDATE, conservando serialização e referências de auditoria. Cinco cenários passaram após correcção; sete Feature/235 asserções e PHPStan/Pint aprovados. Dados/versão/interesse e auditoria sem duplicação conservados; recibo funding_concurrency_increment_20261102. Não comprova carga ou todas as intercalações. Visual, vínculos da referência, alertas e disponibilização pendentes. [FUNDING-ALERTS-20261102] ACT-11: versões publicadas de fundos/programas/incentivos do catálogo integradas no motor de alertas existente, com adesão explícita e preferências antigas preservadas. Filtros e desconhecidos explicados, origem/versão/estado conservados, retirada/acesso próprio, cancelamento, lote e reversão transaccional. 36 testes/612 asserções e seis frontend; PHPStan, tipos, lint e compilação aprovados. Recibo funding_alerts_increment_20261102 e manual. Sem canais externos, recolha externa ou instalação no activo; requisito agregado parcial. [FUNDING-ASSESSMENT-CONCURRENCY-20261102] Nove pares concorrentes observados aprovaram referências/versões/interesses, geradores duplicados, preferências idempotentes e ambas as precedências de cancelamento. Conferência de critérios mostra/envia apenas perguntas aplicáveis, preserva respostas locais e reinicia por ficha/versão. Oito frontend, tipos/lint/compilação aprovados; PHP da aplicação sem delta, provas 36 Feature/612 reutilizadas após conferir hashes. Recibo funding_assessment_concurrency_increment_20261102. Visual, vínculos de referência, canais externos e disponibilização continuam pendentes.",Parcial — implementação local em QA,"02/11/2026: concorrência do gerador verificada nos cenários delimitados e perguntas aplicáveis corrigidas. Restam visual, vínculos da referência, canais externos e disponibilização/agendador. Histórico: 02/11/2026: oportunidades, concursos e fundos/apoios do catálogo integrados em alertas locais com prova. Restam canais/outras fontes externas, concorrência específica do gerador, visual, vínculos de referência e disponibilização/agendador. Histórico: 02/11/2026: concorrência demonstrada nos cinco cenários delimitados e impasse corrigido. Restam visual, vínculos ao cadastro da referência, alertas de incentivos e disponibilização. Histórico: 02/11/2026: referência oficial preparada pela interface com prova local; restam vínculos sectorial/cartográfico da referência, concorrência/visual, alertas de incentivos e disponibilização. Histórico: 02/11/2026: filtros e ensaios específicos de documentos implementados/verificados localmente. Restam fontes reais incorporadas, visual, concorrência e disponibilização; integração de incentivos nos alertas não demonstrada. Histórico preservado: 02/11/2026: implementação local parcial com editor e percurso público; restam filtros territoriais/sectoriais, provas específicas de documentos/conflitos, fontes reais e visual/disponibilização. Histórico: Catálogo de fundos com janelas e elegibilidade não implementado; ofertas experimentais não o substituem.","Documentos/entidades/fontes/parâmetros próprios antes de implementação; sem novos módulos nesta auditoria. Fundos com fonte/data, elegibilidade explicada e janela; indeterminado quando parâmetros faltam. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","Fonte, gestor, sectores, cobertura nacional ou territorial, datas/estado e documentos; filtro e explicação por critério; fundos expirados sinalizados; guardar interesse autorizado sem duplicação.",P2,"Código INV-005 é alias deste documento, não renumeração do roteiro/backlog. Conteúdo/regras pendentes não se tornam aprovados pela importação.",SEG-bf26caee-p157; SEG-bf26caee-p158; SEG-bf26caee-p483; SEG-bf26caee-p636; SEG-bf26caee-p723,5,"[{""id"": ""SEG-bf26caee-p157"", ""section"": ""1.5"", ""first_paragraph"": 157, ""last_paragraph"": 157, ""text"": ""Permitir a consulta de negócios similares na zona antes da abertura de um empreendimento, apoiando a análise de viabilidade. As fontes iniciais incluem os ficheiros de cadastro de empreendimentos turísticos de três, quatro e cinco estrelas e de empresas licenciadas já disponibilizados ao projecto. Antes da utilização, estes dados devem ser inventariados, normalizados, deduplicados, georreferenciados e sujeitos a validação de actualidade, cobertura e autorização de uso."", ""requirements"": [""AUD-ESTABLISHMENT-01"", ""AUD-FUND-01"", ""AUD-MARKET-01""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p157"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}, {""id"": ""SEG-bf26caee-p158"", ""section"": ""1.5"", ""first_paragraph"": 158, ""last_paragraph"": 158, ""text"": ""Publicar fundos de financiamento por localização ou com cobertura nacional, conforme a respectiva distribuição geográfica."", ""requirements"": [""AUD-ESTABLISHMENT-01"", ""AUD-FUND-01"", ""AUD-MARKET-01""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p158"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}, {""id"": ""SEG-bf26caee-p483"", ""section"": ""3.2.3"", ""first_paragraph"": 483, ""last_paragraph"": 483, ""text"": ""A pesquisa deve permitir combinar texto, sector, localização, raio, dimensão, classificação, estado, período e fonte, com ordenação e paginação consistentes. Os resultados de negócios similares, fundos e oportunidades devem apresentar data de actualização, cobertura, critérios usados e limitações conhecidas. Sempre que existir correspondência ou recomendação automatizada, o portal deve explicar os factores considerados, permitir correcção dos dados de entrada e evitar classificações baseadas em informação incompleta ou não validada."", ""requirements"": [""AUD-FUND-01"", ""AUD-MARKET-01"", ""AUD-OP-04""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p483"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}, {""id"": ""SEG-bf26caee-p636"", ""section"": ""6"", ""first_paragraph"": 636, ""last_paragraph"": 641, ""text"": ""INV-005 | Fundos compatíveis com explicação da correspondência | Sim | Sem demonstração suficiente | — | Demonstrar catálogo, cobertura, critérios, prazos, actualização e justificação."", ""requirements"": [""AUD-FUND-01""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p636"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}, {""id"": ""SEG-bf26caee-p723"", ""section"": ""6.1"", ""first_paragraph"": 723, ""last_paragraph"": 729, ""text"": ""§1.5 | Fundos nacionais e territoriais | INV-005 | Sim | Sem demonstração suficiente | — | Demonstrar cadastro, fonte, actualização, cobertura, critérios, prazos e correspondência fundamentada."", ""requirements"": [""AUD-FUND-01""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p723"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}]",Consumidor específico não demonstrado.,Contrato específico não demonstrado.,Nenhuma entidade/regra criada para este módulo.,"A recuperação do original da especificação é prova do acervo, não deste percurso.",Pendente de implementação/prova própria.,"Novo ID apenas após pesquisa de correspondência: os requisitos relacionados são componentes a reutilizar, não equivalências. [Segmentação bf26caeee043 — identidade confirmada; nome local v1.docx] ",não implementado,Não demonstrada para este requisito específico; nenhum pacote ativado por esta incorporação. COUNTRY02ON preservado.,"Diagnóstico específico anterior de ausência/cobertura conservado; inventário atual não demonstra entrega posterior deste incremento. Nenhuma nova implementação iniciada nesta auditoria. +AUD-FUND-01,Catálogo de fundos nacionais e territoriais com elegibilidade explicada e atualização,[Segmentação bf26caeee043 — identidade confirmada; nome local v1.docx] Alias documental INV-005; SEG-bf26caee-p157; SEG-bf26caee-p158; SEG-bf26caee-p483; SEG-bf26caee-p636; SEG-bf26caee-p723,INV-005 / incremento posterior ao workflow das seis categorias,"Consumidor específico ainda por delimitar; reutilizar rotas de biblioteca/Balcão/negócios/simulador pertinentes, sem atribuir existência fictícia.","Biblioteca, taxonomias, fontes e filtros comuns. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","[FUNDING-UNIFORM-MENU-20261111] Uniformização pública Quorus/Moza e menu de seis grupos em QA,não instalados;homologaçãoa59142ca preservada. | Histórico: [INSTALADO-a59142ca-20261111] Apresentação profissional do directório/detalhe instalada;HTTP200 e270instituições publicadas preservadas. | Histórico: [FUNDING-PUBLIC-EDITORIAL-20261111] Apresentação profissional em QA,não instalada;270publicadas e homologação8f295f05 preservadas. | Histórico: [INSTITUICOES-20261110]270instituições/operadores,393referências de localização e168contactos do documento fornecido, em QA. Nenhuma nova instalação/publicação activa. | Histórico anterior preservado: [ACT12-20261110] Directório financeiro/conteúdo fornecido em QA; não instalado/publicado. Homologação1c75a30a mantém zero fichas financeiras. | Histórico anterior preservado: [CONCLUSAO-INTEGRAL-20261110] Fontes até ff726e57 na homologação teste-investidor. Não confundir instalação do código com nova concessão, habilitação nominal ou prova visual integral. | Histórico anterior preservado: Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. Preparação editorial assistida em QA: selecção/conferência e publicação explícita separadas, MFA nativo, edições preservadas e repetição exacta. Disponibilização efectiva ainda pendente. Instalação ef24cbdc confirmada10/11/2026; backup/restauro190tabelas/369ficheiros; fontes33hashes. Conteúdo ainda0fichas/0publicações; entrada no editor confirmada, sem POST de preparação/publicação observado. ACT12 aberto até consulta efectiva, sem nova instalação exigida. Confirmação posterior10/11:32rascunhos persistidos/0publicações; continuação e publicação403 após expiraçãoMFA900s (21:31:43+02). Retoma autenticada idempotente conserva rascunhos. Instalaçãoef24cbdc preservada; ACT12 aberto. Confirmação seguinte:90rascunhos/0publicações, recusas403 apósMFA. CorrecçãoQA de retoma na mesma aba poractor/fontes, confirmação separada e recuperação exacta; selecção todas270/contadores/controlos visíveis. Revisãoactivaef24cbdc até recibo posterior. Retoma instalada4f3dbcf8/22:01+02,7hashes/HTTP200/backup-restauro190tabelas369ficheiros, guardasMFA mantidas.90rascunhos/0publicações; preparação/publicação autenticada e consulta efectiva ainda pendentes. ACT12 aberto. Diagnóstico posterior:loginMFAEdge22:03:53/dashboard200; editor403Safari/WebKit22:04 em sessão anterior. Não era expiração da nova sessãoEdge. Colar URL noEdge autenticado; nenhuma permissão/sessão/configuração alterada. Abertura/publicação efectiva por confirmar. Acesso reposto:editorEdgeHTTP200às22:11:21+02 na sessão correcta; sem nova instalação/permissão. Publicação/conteúdo consultável ainda por confirmar. ENTREGACONFIRMADA10/11/2026às22:54:31+02:270/270instituições do documento publicadas/270identidades/393locais168contactos; nenhuma em falta. CatálogoHTTP200total270incluindo histórico, filtroseguradora/Nampula6resultados eBCI/Absa/ArkoHTTP200. Cadastro/disponibilização do original concluídos emhomologação4f3dbcf8; continuidade dossierQA aceite reutilizada; visual separado. Cinco programas anteriores permanecem privados. Provaoutputs/funding-directory-20261110/institutions/publication-complete.json.","segmentacao-processos-reconciliacao-20261011.md; contratos/rotas inventariados atuais; não há prova de percurso completo deste incremento. [FUNDING-EDITOR-20261102] Catálogo e editor locais: rascunhos, prévia vinculada, publicação/retirada com autoridade editorial existente, versões imutáveis, janelas/critério explicado, documentos por versão e interesse privado. Quatro testes/91 asserções e tipos aprovados. Filtros territoriais/sectoriais, ensaios de documentos, fontes reais, visual e disponibilização pendentes; requisito parcial, sem alteração no activo. Manual de 02/11 e funding_editor_increment_20261102. [FUNDING-FILTERS-20261102] Filtros locais por sector, cobertura territorial e estado de janela, com desconhecidos explícitos e cobertura parcial. Nomes/caminhos territoriais e sectores conservados por versão. Descarga verifica versão, checksum, direitos, análise e bytes; prévia obsoleta recusada. Seis testes/204 asserções, PHPStan, tipos, lint sem avisos e compilação aprovados. Recibo funding_filters_increment_20261102 e manual. Faltam fontes reais incorporadas, validação visual, ensaios de concorrência e disponibilização; requisito parcial. [FUNDING-REFERENCES-20261102] Referência oficial FDEL empacotada com fontes/edições/hashes e prévia editorial; prepara rascunho sem publicar. Uma ficha e chamada municipal histórica, repetição sem duplicar ou substituir. Sete testes/235 asserções; PHPStan, tipos e lint aprovados. Recibo funding_references_increment_20261102; manual de 02/11. Ligações sectorial/cartográfica, concorrência, visual, alertas e disponibilização pendentes. Parcial local, sem escrita no activo. [FUNDING-CONCURRENCY-20261102] Ensaio com cinco pares de processos e bloqueios observados no PostgreSQL identificou deadlock 40P01 entre retirada e interesse da mesma pessoa. Bloqueio da conta ajustado a FOR NO KEY UPDATE, conservando serialização e referências de auditoria. Cinco cenários passaram após correcção; sete Feature/235 asserções e PHPStan/Pint aprovados. Dados/versão/interesse e auditoria sem duplicação conservados; recibo funding_concurrency_increment_20261102. Não comprova carga ou todas as intercalações. Visual, vínculos da referência, alertas e disponibilização pendentes. [FUNDING-ALERTS-20261102] ACT-11: versões publicadas de fundos/programas/incentivos do catálogo integradas no motor de alertas existente, com adesão explícita e preferências antigas preservadas. Filtros e desconhecidos explicados, origem/versão/estado conservados, retirada/acesso próprio, cancelamento, lote e reversão transaccional. 36 testes/612 asserções e seis frontend; PHPStan, tipos, lint e compilação aprovados. Recibo funding_alerts_increment_20261102 e manual. Sem canais externos, recolha externa ou instalação no activo; requisito agregado parcial. [FUNDING-ASSESSMENT-CONCURRENCY-20261102] Nove pares concorrentes observados aprovaram referências/versões/interesses, geradores duplicados, preferências idempotentes e ambas as precedências de cancelamento. Conferência de critérios mostra/envia apenas perguntas aplicáveis, preserva respostas locais e reinicia por ficha/versão. Oito frontend, tipos/lint/compilação aprovados; PHP da aplicação sem delta, provas 36 Feature/612 reutilizadas após conferir hashes. Recibo funding_assessment_concurrency_increment_20261102. Visual, vínculos de referência, canais externos e disponibilização continuam pendentes.",Parcial — implementação local em QA,"02/11/2026: concorrência do gerador verificada nos cenários delimitados e perguntas aplicáveis corrigidas. Restam visual, vínculos da referência, canais externos e disponibilização/agendador. Histórico: 02/11/2026: oportunidades, concursos e fundos/apoios do catálogo integrados em alertas locais com prova. Restam canais/outras fontes externas, concorrência específica do gerador, visual, vínculos de referência e disponibilização/agendador. Histórico: 02/11/2026: concorrência demonstrada nos cinco cenários delimitados e impasse corrigido. Restam visual, vínculos ao cadastro da referência, alertas de incentivos e disponibilização. Histórico: 02/11/2026: referência oficial preparada pela interface com prova local; restam vínculos sectorial/cartográfico da referência, concorrência/visual, alertas de incentivos e disponibilização. Histórico: 02/11/2026: filtros e ensaios específicos de documentos implementados/verificados localmente. Restam fontes reais incorporadas, visual, concorrência e disponibilização; integração de incentivos nos alertas não demonstrada. Histórico preservado: 02/11/2026: implementação local parcial com editor e percurso público; restam filtros territoriais/sectoriais, provas específicas de documentos/conflitos, fontes reais e visual/disponibilização. Histórico: Catálogo de fundos com janelas e elegibilidade não implementado; ofertas experimentais não o substituem.","Documentos/entidades/fontes/parâmetros próprios antes de implementação; sem novos módulos nesta auditoria. Fundos com fonte/data, elegibilidade explicada e janela; indeterminado quando parâmetros faltam. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","Fonte, gestor, sectores, cobertura nacional ou territorial, datas/estado e documentos; filtro e explicação por critério; fundos expirados sinalizados; guardar interesse autorizado sem duplicação.",P2,"Código INV-005 é alias deste documento, não renumeração do roteiro/backlog. Conteúdo/regras pendentes não se tornam aprovados pela importação.",SEG-bf26caee-p157; SEG-bf26caee-p158; SEG-bf26caee-p483; SEG-bf26caee-p636; SEG-bf26caee-p723,5,"[{""id"": ""SEG-bf26caee-p157"", ""section"": ""1.5"", ""first_paragraph"": 157, ""last_paragraph"": 157, ""text"": ""Permitir a consulta de negócios similares na zona antes da abertura de um empreendimento, apoiando a análise de viabilidade. As fontes iniciais incluem os ficheiros de cadastro de empreendimentos turísticos de três, quatro e cinco estrelas e de empresas licenciadas já disponibilizados ao projecto. Antes da utilização, estes dados devem ser inventariados, normalizados, deduplicados, georreferenciados e sujeitos a validação de actualidade, cobertura e autorização de uso."", ""requirements"": [""AUD-ESTABLISHMENT-01"", ""AUD-FUND-01"", ""AUD-MARKET-01""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p157"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}, {""id"": ""SEG-bf26caee-p158"", ""section"": ""1.5"", ""first_paragraph"": 158, ""last_paragraph"": 158, ""text"": ""Publicar fundos de financiamento por localização ou com cobertura nacional, conforme a respectiva distribuição geográfica."", ""requirements"": [""AUD-ESTABLISHMENT-01"", ""AUD-FUND-01"", ""AUD-MARKET-01""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p158"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}, {""id"": ""SEG-bf26caee-p483"", ""section"": ""3.2.3"", ""first_paragraph"": 483, ""last_paragraph"": 483, ""text"": ""A pesquisa deve permitir combinar texto, sector, localização, raio, dimensão, classificação, estado, período e fonte, com ordenação e paginação consistentes. Os resultados de negócios similares, fundos e oportunidades devem apresentar data de actualização, cobertura, critérios usados e limitações conhecidas. Sempre que existir correspondência ou recomendação automatizada, o portal deve explicar os factores considerados, permitir correcção dos dados de entrada e evitar classificações baseadas em informação incompleta ou não validada."", ""requirements"": [""AUD-FUND-01"", ""AUD-MARKET-01"", ""AUD-OP-04""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p483"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}, {""id"": ""SEG-bf26caee-p636"", ""section"": ""6"", ""first_paragraph"": 636, ""last_paragraph"": 641, ""text"": ""INV-005 | Fundos compatíveis com explicação da correspondência | Sim | Sem demonstração suficiente | — | Demonstrar catálogo, cobertura, critérios, prazos, actualização e justificação."", ""requirements"": [""AUD-FUND-01""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p636"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}, {""id"": ""SEG-bf26caee-p723"", ""section"": ""6.1"", ""first_paragraph"": 723, ""last_paragraph"": 729, ""text"": ""§1.5 | Fundos nacionais e territoriais | INV-005 | Sim | Sem demonstração suficiente | — | Demonstrar cadastro, fonte, actualização, cobertura, critérios, prazos e correspondência fundamentada."", ""requirements"": [""AUD-FUND-01""], ""source_sha256"": ""bf26caeee0437a8d292bf29be59247e2862c14e79b5ae465c00322747af72af5"", ""locator"": ""word/document.xml#p723"", ""declared_document_state_is_not_functional_evidence"": true, ""exact_requested_exemplar_confirmed"": true}]",Consumidor específico não demonstrado.,Contrato específico não demonstrado.,Nenhuma entidade/regra criada para este módulo.,"A recuperação do original da especificação é prova do acervo, não deste percurso.",Pendente de implementação/prova própria.,"Novo ID apenas após pesquisa de correspondência: os requisitos relacionados são componentes a reutilizar, não equivalências. [Segmentação bf26caeee043 — identidade confirmada; nome local v1.docx] ",não implementado,Não demonstrada para este requisito específico; nenhum pacote ativado por esta incorporação. COUNTRY02ON preservado.,"Diagnóstico específico anterior de ausência/cobertura conservado; inventário atual não demonstra entrega posterior deste incremento. Nenhuma nova implementação iniciada nesta auditoria. -[RECONCILIACAO-43-20261019] 15: Implementar fonte/gestor, janela, elegibilidade explicável, estados desconhecido/expirado e interesse idempotente.","[INSTALADO-a59142ca-20261111] Delta editorial encerrado em implementação/instalação;restam visual e enriquecimento de produtos específicos quando informado. Sem nova selecção/publicação do lote. | Histórico: [FUNDING-PUBLIC-EDITORIAL-20261111] Descrição/produtos/serviços sem texto de importação/fichas/documento gerador. Restam instalação/visual e enriquecimento de ofertas específicas quando informado;sem republicação do lote. | Histórico: [INSTITUICOES-20261110] Local/categoria/tipo → banco e seguradora → fonte/contacto → mesmo dossier → actualização do processo/recuperação demonstrados; presença física e cobertura separadas, incertezas/histórico explícitos. Restam instalação, revisão/publicação editorial autenticada, consulta efectiva no destino e visual. Outros critérios desta linha não encerrados. | Histórico anterior preservado: [ACT12-20261110] Onze fichas fundamentadas (7instituições+4programas/fundos; BNI Capital como produto BNI), pesquisa local/necessidade no mesmo produto, condições/fontes/contactos e gravação/recuperação no mesmo dossier demonstradas. Restam instalação, preparação/revisão/publicação autenticada e consulta real no destino; visual pendente. Outros critérios desta linha não encerrados. | Histórico anterior preservado: [CONCLUSAO-INTEGRAL-20261110] Catálogo/editor/versionamento/critérios e alertas locais já implementados; fontes instaladas até ff726e57. Restam vínculos da referência, canais/fontes externos e observação visual. Confirmar operação do agendador no âmbito configurado sem presumir ausência ou criar destinatários. | Histórico anterior preservado: 02/11/2026: concorrência do gerador verificada nos cenários delimitados e perguntas aplicáveis corrigidas. Restam visual, vínculos da referência, canais externos e disponibilização/agendador. Histórico: 02/11/2026: oportunidades, concursos e fundos/apoios do catálogo integrados em alertas locais com prova. Restam canais/outras fontes externas, concorrência específica do gerador, visual, vínculos de referência e disponibilização/agendador. Histórico: 02/11/2026: concorrência demonstrada nos cinco cenários delimitados e impasse corrigido. Restam visual, vínculos ao cadastro da referência, alertas de incentivos e disponibilização. Histórico: 02/11/2026: referência oficial preparada pela interface com prova local; restam vínculos sectorial/cartográfico da referência, concorrência/visual, alertas de incentivos e disponibilização. Histórico: 02/11/2026: filtros e ensaios específicos de documentos implementados/verificados localmente. Restam fontes reais incorporadas, visual, concorrência e disponibilização; integração de incentivos nos alertas não demonstrada. Histórico preservado: 02/11/2026: implementação local parcial com editor e percurso público; restam filtros territoriais/sectoriais, provas específicas de documentos/conflitos, fontes reais e visual/disponibilização. Histórico: Catálogo de fundos com janelas e elegibilidade não implementado; ofertas experimentais não o substituem. +[RECONCILIACAO-43-20261019] 15: Implementar fonte/gestor, janela, elegibilidade explicável, estados desconhecido/expirado e interesse idempotente.","[FUNDING-UNIFORM-MENU-20261111] Lista/detalhe comuns,sem repetições/secções vazias/dados antigos;seis grupos conforme proprietário. Restam instalação/visual;sem republicação das270instituições ou concessões novas. | Histórico: [INSTALADO-a59142ca-20261111] Delta editorial encerrado em implementação/instalação;restam visual e enriquecimento de produtos específicos quando informado. Sem nova selecção/publicação do lote. | Histórico: [FUNDING-PUBLIC-EDITORIAL-20261111] Descrição/produtos/serviços sem texto de importação/fichas/documento gerador. Restam instalação/visual e enriquecimento de ofertas específicas quando informado;sem republicação do lote. | Histórico: [INSTITUICOES-20261110] Local/categoria/tipo → banco e seguradora → fonte/contacto → mesmo dossier → actualização do processo/recuperação demonstrados; presença física e cobertura separadas, incertezas/histórico explícitos. Restam instalação, revisão/publicação editorial autenticada, consulta efectiva no destino e visual. Outros critérios desta linha não encerrados. | Histórico anterior preservado: [ACT12-20261110] Onze fichas fundamentadas (7instituições+4programas/fundos; BNI Capital como produto BNI), pesquisa local/necessidade no mesmo produto, condições/fontes/contactos e gravação/recuperação no mesmo dossier demonstradas. Restam instalação, preparação/revisão/publicação autenticada e consulta real no destino; visual pendente. Outros critérios desta linha não encerrados. | Histórico anterior preservado: [CONCLUSAO-INTEGRAL-20261110] Catálogo/editor/versionamento/critérios e alertas locais já implementados; fontes instaladas até ff726e57. Restam vínculos da referência, canais/fontes externos e observação visual. Confirmar operação do agendador no âmbito configurado sem presumir ausência ou criar destinatários. | Histórico anterior preservado: 02/11/2026: concorrência do gerador verificada nos cenários delimitados e perguntas aplicáveis corrigidas. Restam visual, vínculos da referência, canais externos e disponibilização/agendador. Histórico: 02/11/2026: oportunidades, concursos e fundos/apoios do catálogo integrados em alertas locais com prova. Restam canais/outras fontes externas, concorrência específica do gerador, visual, vínculos de referência e disponibilização/agendador. Histórico: 02/11/2026: concorrência demonstrada nos cinco cenários delimitados e impasse corrigido. Restam visual, vínculos ao cadastro da referência, alertas de incentivos e disponibilização. Histórico: 02/11/2026: referência oficial preparada pela interface com prova local; restam vínculos sectorial/cartográfico da referência, concorrência/visual, alertas de incentivos e disponibilização. Histórico: 02/11/2026: filtros e ensaios específicos de documentos implementados/verificados localmente. Restam fontes reais incorporadas, visual, concorrência e disponibilização; integração de incentivos nos alertas não demonstrada. Histórico preservado: 02/11/2026: implementação local parcial com editor e percurso público; restam filtros territoriais/sectoriais, provas específicas de documentos/conflitos, fontes reais e visual/disponibilização. Histórico: Catálogo de fundos com janelas e elegibilidade não implementado; ofertas experimentais não o substituem. -[UTILIZACAO-HOMOLOGACAO-20261019] 15: Desenvolvimento restante + dados — Primeiro fundo documentado e tratamento de elegibilidade/prazo ainda em falta. Preparação editorial assistida em QA: selecção/conferência e publicação explícita separadas, MFA nativo, edições preservadas e repetição exacta. Disponibilização efectiva ainda pendente. Instalação ef24cbdc confirmada10/11/2026; backup/restauro190tabelas/369ficheiros; fontes33hashes. Conteúdo ainda0fichas/0publicações; entrada no editor confirmada, sem POST de preparação/publicação observado. ACT12 aberto até consulta efectiva, sem nova instalação exigida. Confirmação posterior10/11:32rascunhos persistidos/0publicações; continuação e publicação403 após expiraçãoMFA900s (21:31:43+02). Retoma autenticada idempotente conserva rascunhos. Instalaçãoef24cbdc preservada; ACT12 aberto. Confirmação seguinte:90rascunhos/0publicações, recusas403 apósMFA. CorrecçãoQA de retoma na mesma aba poractor/fontes, confirmação separada e recuperação exacta; selecção todas270/contadores/controlos visíveis. Revisãoactivaef24cbdc até recibo posterior. Retoma instalada4f3dbcf8/22:01+02,7hashes/HTTP200/backup-restauro190tabelas369ficheiros, guardasMFA mantidas.90rascunhos/0publicações; preparação/publicação autenticada e consulta efectiva ainda pendentes. ACT12 aberto. Diagnóstico posterior:loginMFAEdge22:03:53/dashboard200; editor403Safari/WebKit22:04 em sessão anterior. Não era expiração da nova sessãoEdge. Colar URL noEdge autenticado; nenhuma permissão/sessão/configuração alterada. Abertura/publicação efectiva por confirmar. Acesso reposto:editorEdgeHTTP200às22:11:21+02 na sessão correcta; sem nova instalação/permissão. Publicação/conteúdo consultável ainda por confirmar. ENTREGACONFIRMADA10/11/2026às22:54:31+02:270/270instituições do documento publicadas/270identidades/393locais168contactos; nenhuma em falta. CatálogoHTTP200total270incluindo histórico, filtroseguradora/Nampula6resultados eBCI/Absa/ArkoHTTP200. Cadastro/disponibilização do original concluídos emhomologação4f3dbcf8; continuidade dossierQA aceite reutilizada; visual separado. Cinco programas anteriores permanecem privados. Provaoutputs/funding-directory-20261110/institutions/publication-complete.json.","Biblioteca, taxonomias, fontes e filtros comuns","Documentos/entidades/fontes/parâmetros próprios antes de implementação; sem novos módulos nesta auditoria. Fundos com fonte/data, elegibilidade explicada e janela; indeterminado quando parâmetros faltam.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,"Nova funcionalidade/expansão; preparar execução, não implementar nesta auditoria",Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: incrementos futuros. Esforço de código adicional só após lacuna reproduzida.,"[INSTALADO-a59142ca-20261111] outputs/funding-public-editorial-20261111/installation.json:16fontes,HTTP200,backup/restauro190tabelas/369ficheiros,sete tabelas protegidas idênticas,zero migrações/importações/republicações. | Histórico: [FUNDING-PUBLIC-EDITORIAL-20261111] Nove testes afectados,três novos:270referências,edições preservadas,produtos não inventados,lista/detalhe reais sem metadados internos. outputs/funding-public-editorial-20261111/verification.json;sem alteração de cadastros/interesses/editorial/fontes. | Histórico: [INSTITUICOES-20261110]outputs/funding-directory-20261110/institutions/{content,verification}.json e catalogo-qa.html/270fichas;5API/735asserções e28frontend dirigidos. Fonte Instituições financeiras em Moçambique.docx SHA119bb5514d2777849b70aebfec21d28a41885cbdc7d9827fbebd764fe994c108. | Histórico anterior preservado: [ACT12-20261110] outputs/funding-directory-20261110/{verification,content-qa,dossier-qa}.json e catalogo-qa.html/11fichas;3API/127asserções,13frontend; fonte benchmark de melhorias investeMoz.docx SHA065203aacfae766c62cf9c2c272ebacc61ff23bd4ff9e91535939fede87f7617. | Histórico anterior preservado: [CONCLUSAO-INTEGRAL-20261110] Instalação ff726e57: outputs/reviewed-install-20261110/verification.json; fontes aceites e recibos anteriores reutilizados. Saldo por percurso no início de visao-consolidada-modulos.md. segmentacao-processos-reconciliacao-20261011.md; contratos/rotas inventariados atuais; não há prova de percurso completo deste incremento. | Homologação teste-investidor 19/10/2026: Fundos=Não demonstrado. Saldo derivado e limites em outputs/investmoz-disponibilizacao-integral-20261019/SALDO-E-ACTUALIZACAO-CONSOLIDADA.md. Não substitui estado/provas do activo; trecho documental encerrado, vínculo dossier aberto. | Proposta integral fdcb31f1b5b9: aplicação activa local completa + R2/DOC01/destino reconciliados; schema/build/recuperação de contexto e reversão de apresentação ensaiados no clone isolado. Não instalado remotamente. Inc. QA territoriais/Inhambane/programas separados. Limites e decisões em outputs/investmoz-disponibilizacao-integral-20261019/PROPOSTA-INTEGRAL-PARA-DECISAO.md. | Execução autorizada fdcb31f1b5b9 concluída em teste-investidor: Fundos=Não demonstrado. 1080 hashes iguais, schema171/88, custódia/scan/recuperação reais. Sem publicação ou papéis novos. Vínculo dossier legítimo pendente; incrementos QA separados. Limites em outputs/investmoz-disponibilizacao-integral-20261019/RESULTADO-DISPONIBILIZACAO-INTEGRAL.md; não encerra critérios globais não demonstrados. +[UTILIZACAO-HOMOLOGACAO-20261019] 15: Desenvolvimento restante + dados — Primeiro fundo documentado e tratamento de elegibilidade/prazo ainda em falta. Preparação editorial assistida em QA: selecção/conferência e publicação explícita separadas, MFA nativo, edições preservadas e repetição exacta. Disponibilização efectiva ainda pendente. Instalação ef24cbdc confirmada10/11/2026; backup/restauro190tabelas/369ficheiros; fontes33hashes. Conteúdo ainda0fichas/0publicações; entrada no editor confirmada, sem POST de preparação/publicação observado. ACT12 aberto até consulta efectiva, sem nova instalação exigida. Confirmação posterior10/11:32rascunhos persistidos/0publicações; continuação e publicação403 após expiraçãoMFA900s (21:31:43+02). Retoma autenticada idempotente conserva rascunhos. Instalaçãoef24cbdc preservada; ACT12 aberto. Confirmação seguinte:90rascunhos/0publicações, recusas403 apósMFA. CorrecçãoQA de retoma na mesma aba poractor/fontes, confirmação separada e recuperação exacta; selecção todas270/contadores/controlos visíveis. Revisãoactivaef24cbdc até recibo posterior. Retoma instalada4f3dbcf8/22:01+02,7hashes/HTTP200/backup-restauro190tabelas369ficheiros, guardasMFA mantidas.90rascunhos/0publicações; preparação/publicação autenticada e consulta efectiva ainda pendentes. ACT12 aberto. Diagnóstico posterior:loginMFAEdge22:03:53/dashboard200; editor403Safari/WebKit22:04 em sessão anterior. Não era expiração da nova sessãoEdge. Colar URL noEdge autenticado; nenhuma permissão/sessão/configuração alterada. Abertura/publicação efectiva por confirmar. Acesso reposto:editorEdgeHTTP200às22:11:21+02 na sessão correcta; sem nova instalação/permissão. Publicação/conteúdo consultável ainda por confirmar. ENTREGACONFIRMADA10/11/2026às22:54:31+02:270/270instituições do documento publicadas/270identidades/393locais168contactos; nenhuma em falta. CatálogoHTTP200total270incluindo histórico, filtroseguradora/Nampula6resultados eBCI/Absa/ArkoHTTP200. Cadastro/disponibilização do original concluídos emhomologação4f3dbcf8; continuidade dossierQA aceite reutilizada; visual separado. Cinco programas anteriores permanecem privados. Provaoutputs/funding-directory-20261110/institutions/publication-complete.json.","Biblioteca, taxonomias, fontes e filtros comuns","Documentos/entidades/fontes/parâmetros próprios antes de implementação; sem novos módulos nesta auditoria. Fundos com fonte/data, elegibilidade explicada e janela; indeterminado quando parâmetros faltam.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,"Nova funcionalidade/expansão; preparar execução, não implementar nesta auditoria",Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: incrementos futuros. Esforço de código adicional só após lacuna reproduzida.,"[FUNDING-UNIFORM-MENU-20261111]33verificações dirigidas:exemplos Quorus/Moza,deduplicação conservadora,cabeçalho real desktop/mobile,público/autenticado,rotas/permissões preservadas. outputs/funding-uniform-menu-20261111/verification.json;270fontes intactas,sem migração/escrita activa. | Histórico: [INSTALADO-a59142ca-20261111] outputs/funding-public-editorial-20261111/installation.json:16fontes,HTTP200,backup/restauro190tabelas/369ficheiros,sete tabelas protegidas idênticas,zero migrações/importações/republicações. | Histórico: [FUNDING-PUBLIC-EDITORIAL-20261111] Nove testes afectados,três novos:270referências,edições preservadas,produtos não inventados,lista/detalhe reais sem metadados internos. outputs/funding-public-editorial-20261111/verification.json;sem alteração de cadastros/interesses/editorial/fontes. | Histórico: [INSTITUICOES-20261110]outputs/funding-directory-20261110/institutions/{content,verification}.json e catalogo-qa.html/270fichas;5API/735asserções e28frontend dirigidos. Fonte Instituições financeiras em Moçambique.docx SHA119bb5514d2777849b70aebfec21d28a41885cbdc7d9827fbebd764fe994c108. | Histórico anterior preservado: [ACT12-20261110] outputs/funding-directory-20261110/{verification,content-qa,dossier-qa}.json e catalogo-qa.html/11fichas;3API/127asserções,13frontend; fonte benchmark de melhorias investeMoz.docx SHA065203aacfae766c62cf9c2c272ebacc61ff23bd4ff9e91535939fede87f7617. | Histórico anterior preservado: [CONCLUSAO-INTEGRAL-20261110] Instalação ff726e57: outputs/reviewed-install-20261110/verification.json; fontes aceites e recibos anteriores reutilizados. Saldo por percurso no início de visao-consolidada-modulos.md. segmentacao-processos-reconciliacao-20261011.md; contratos/rotas inventariados atuais; não há prova de percurso completo deste incremento. | Homologação teste-investidor 19/10/2026: Fundos=Não demonstrado. Saldo derivado e limites em outputs/investmoz-disponibilizacao-integral-20261019/SALDO-E-ACTUALIZACAO-CONSOLIDADA.md. Não substitui estado/provas do activo; trecho documental encerrado, vínculo dossier aberto. | Proposta integral fdcb31f1b5b9: aplicação activa local completa + R2/DOC01/destino reconciliados; schema/build/recuperação de contexto e reversão de apresentação ensaiados no clone isolado. Não instalado remotamente. Inc. QA territoriais/Inhambane/programas separados. Limites e decisões em outputs/investmoz-disponibilizacao-integral-20261019/PROPOSTA-INTEGRAL-PARA-DECISAO.md. | Execução autorizada fdcb31f1b5b9 concluída em teste-investidor: Fundos=Não demonstrado. 1080 hashes iguais, schema171/88, custódia/scan/recuperação reais. Sem publicação ou papéis novos. Vínculo dossier legítimo pendente; incrementos QA separados. Limites em outputs/investmoz-disponibilizacao-integral-20261019/RESULTADO-DISPONIBILIZACAO-INTEGRAL.md; não encerra critérios globais não demonstrados. [UTILIZACAO-HOMOLOGACAO-20261019] Leitura nominal de contas/recursos no destino; saldo18/10; prévia29 sem escrita; comparação de hashes QA separados. outputs/investmoz-disponibilizacao-integral-20261019/UTILIZACAO-EFECTIVA-HOMOLOGACAO.md diff --git a/docs/investmoz/v2/auditoria-portal/visao-consolidada-modulos.md b/docs/investmoz/v2/auditoria-portal/visao-consolidada-modulos.md index e7f4ea1a..b46ce098 100644 --- a/docs/investmoz/v2/auditoria-portal/visao-consolidada-modulos.md +++ b/docs/investmoz/v2/auditoria-portal/visao-consolidada-modulos.md @@ -1,3 +1,13 @@ +## 11/11/2026 — uniformização Quorus/Moza e menu de seis grupos em QA + +Correcção orientada pelos exemplos expressos do proprietário:lista e detalhe reutilizam agora **o mesmo componente público**. Descrição única,categoria/tipo numa linha,produtos/serviços uma vez,contactos e moradas apenas quando disponíveis. Quorus:descrição de corretagem eSeguros uma vez;sem secções vazias ou avisos genéricos. Moza:descrição paraPME,CréditoPME/instrumentos uma vez,umtelefone e umamorada;sem notas de publicação,preços antigos,comissões/garantias por reconfirmar,entidade responsável repetida,sectores/cobertura desconhecidos ou referências institucionais duplicadas. Não inventa dados nem altera condições guardadas. Ligações dos produtos/contactos permanecem acessíveis uma vez;moradas diferentes são preservadas. + +Menu principal exactamente **Início–Descoberta–Realização–Suporte–Sobre nós–Mais**. Concursos movido paraDescoberta;Biblioteca eInstituições financeiras com os nomes pedidos;conteúdos deSobre nós/Mais preservados. Acesso de trabalho deslocado paraMais,sem perder permissões;conta/contexto/licenciamentoS08 e filtros preservados. Instruções permanentes actualizadas com o padrão pedido. + +**QA:**33verificações dirigidas aprovadas,com três casos novos:exemplos públicos exactos nas duas páginas,deduplicação conservadora e cabeçalho real com seis entradas em quatro combinações(público/autenticado,móvel/computador). Reutilizadas provas dos fluxos de interesse/dossier/editorial e das permissões,não reexecutadas na base. Fontes de270instituições intactas,sem migração/importação/republicação. Artefactos `outputs/funding-uniform-menu-20261111/verification.json` eHTMLs reais emSSR. Não é conferência visual de navegador;tipos/lint/compilação aprovados;pacote Git com aplicação/reversão conferidas no fecho. + +**Estado:** implementado em QA,não instalado;homologação mantém `a59142ca` e270instituições publicadas. Restam instalação e conferência visual;não requer seleccionar/publicar novamente instituições. Restante saldo de módulos e fiscal preservado. Próximo trabalho:entregar este conjunto compatível e continuar os resíduos de implementação acordados. + ## 11/11/2026 — apresentação financeira profissional instalada ema59142ca Instalação expressamente autorizada,executada pelo processo Git existente e conferida às11:38:54Africa/Johannesburg(09:38:54UTC): `a59142caa2fc277975be82fb550223ff7d949594`. O directório `/fundos` e o detalhe apresentam descrição e produtos/serviços conhecidos,sem usar texto de importação,fichas ou documento gerador como apresentação. Descrições específicas são preservadas;resumo genérico exacto passa a uma descrição pela natureza publicada. Não são inventadas ofertas para instituições sem produtos específicos identificados. Metadados/fontes/histórico mantidos no editor;ligações institucionais e datas úteis acessíveis separadamente. Orientação transversal registada emAGENTS. diff --git a/resources/js/components/funding-institution.tsx b/resources/js/components/funding-institution.tsx index 74bb467c..1c7ba74e 100644 --- a/resources/js/components/funding-institution.tsx +++ b/resources/js/components/funding-institution.tsx @@ -1,10 +1,17 @@ import { ClassificationFields, - ClassificationSummary, evidenceLabels, type Classification, } from '@/components/funding-classification'; -import {fundingPublicPresentation} from '@/lib/funding-public-presentation'; +import { + fundingPublicPresentation, + publicInstitutionContacts, + publicInstitutionLocations, +} from '@/lib/funding-public-presentation'; +import { + financialCategories, + financialTypes, +} from '@/components/funding-classification'; import { card, input, button } from '@/pages/investment/shared'; export type FundingSource = { @@ -552,135 +559,158 @@ export function InstitutionFields({ ); } -function Source({value}:{value:FundingSource}){return <>{value.source_url&&
Informação institucionalConsultar informação da entidade

Consulta em {value.checked_on}.

}{value.evidence_status==='historical'&&

Informação histórica.

}{value.evidence_status==='conflict'&&

Informação por esclarecer junto da instituição.

};} -export function InstitutionView({ value }: { value: InstitutionDetails }) { +export function InstitutionView({ + value, + compact = false, +}: { + value: InstitutionDetails & { title?: string; summary?: string }; + compact?: boolean; +}) { + const presentation = fundingPublicPresentation({ + ...value, + title: value.title ?? '', + summary: value.summary ?? '', + kind: 'institution', + }), + contacts = publicInstitutionContacts(value.contacts), + locations = publicInstitutionLocations(value.locations); + const category = (value.institution_categories ?? []) + .map((k) => financialCategories[k]) + .filter(Boolean) + .join(' · '), + types = (value.institution_types ?? []) + .map((k) => financialTypes[k]) + .filter(Boolean) + .join(' · '); + const urls = new Set( + compact + ? [] + : presentation.products + .map((p) => p.url) + .filter((url): url is string => !!url), + ); + const sites = contacts + .filter((c) => c.kind === 'website') + .filter((c) => { + if (urls.has(c.value)) return false; + urls.add(c.value); + return true; + }); return ( -
-

Instituição financeira

- - {!value.institution_types?.length && ( +
+ {!compact && ( +

+ Instituição financeira +

+ )} +
+

Descrição

+

{presentation.description}

+
+ {(category || types) && (

- Natureza:{' '} - { - ( - { - bank: 'Banco', - credit: 'Instituição de crédito', - microfinance: 'Microfinanças', - investment_fund: 'Fundo de investimento', - development: - 'Agência de desenvolvimento/financiamento', - other: 'Outra natureza documentada', - unknown: 'Por confirmar', - } as Record - )[value.institution_nature] - } + {category} + {category && types ? ': ' : ''} + {types}

)} - -

Contactos

- {value.contacts.length === 0 &&

Contactos por confirmar.

} - {value.contacts.map((c, i) => ( -
-

- {c.kind === 'website' ? ( - - {c.value} - - ) : ( - c.value - )} -

- -
- ))} -

Sede e balcões — presença física

- {value.locations.length === 0 && ( -

Localização física por confirmar.

+ {['historical', 'merged'].includes( + value.institution_status ?? '', + ) &&

Instituição histórica ou integrada noutra entidade.

} +
+

Produtos e serviços

+ {presentation.products.length ? ( +
    + {presentation.products.map((p) => ( +
  • + {!compact && p.url ? ( + + {p.title} + + ) : ( + {p.title} + )} + {p.detail ? ': ' + p.detail : ''} +
  • + ))} +
+ ) : presentation.services.length ? ( +

{presentation.services.join(' · ')}

+ ) : null} +
+ {!compact && + (sites.length > 0 || + contacts.some((c) => c.kind !== 'website')) && ( +
+

Contactos

+
    + {sites.map((c) => ( +
  • + + Website + +
  • + ))} + {contacts + .filter((c) => c.kind !== 'website') + .map((c) => ( +
  • + {c.kind === 'email' ? ( + + {c.value} + + ) : c.kind === 'phone' ? ( + + {c.value} + + ) : ( + c.value + )} +
  • + ))} +
+
+ )} + {!compact && locations.length > 0 && ( +
+

Localização

+
    + {locations.map((l, i) => ( +
  • + {l.role === 'headquarters' + ? 'Sede: ' + : l.role === 'branch' + ? 'Balcão: ' + : ''} + {l.address} + {l.hours ? ' · ' + l.hours : ''} +
  • + ))} +
+
)} - {value.locations.map((l, i) => ( -
-

- {l.role === 'headquarters' - ? 'Sede' - : l.role === 'branch' - ? 'Balcão' - : 'Ponto de contacto institucional'} - : {l.label && !/^(Morada|Localização).*(documento|fonte)/i.test(l.label) ? l.label+' · ' : ''}{l.address} -

-

- {l.territory_path?.map((n) => n.name).join(' / ') || - 'Localização detalhada a confirmar'} -

- {l.location_text && ( -

Local indicado: {l.location_text}

- )} - {l.hours && ( -

- Horário de atendimento:{' '} - {l.hours} -

- )} - -
- ))} -

Produtos e serviços

- {value.products.length === 0 && ( -

- {fundingPublicPresentation({...value,title:"",kind:"institution",summary:""}).services.join(" · ") || "Consulte as soluções disponíveis junto da instituição."} -

- )} - {value.products.map((p) => ( -
-

{p.title}

-

{p.instrument}

-

- Cobertura do financiamento:{' '} - {p.coverage === 'national' - ? 'Nacional, segundo a fonte' - : p.coverage === 'territorial' - ? 'Locais documentados' - : 'Por confirmar'}{' '} - · {p.coverage_text} -

- {p.territory_paths?.map((path, i) => ( -

{path.map((n) => n.name).join(' / ')}

- ))} -

Condições: {p.conditions || 'Por confirmar'}

-

- Montantes/moeda/prazos: {p.amounts || 'Por confirmar'} -

-

- Disponibilidade:{' '} - {p.availability === 'unknown' - ? 'Por confirmar' - : p.availability === 'closed' - ? 'Encerrada segundo a fonte' - : 'Oferta identificada na fonte; confirmar condições actuais com a instituição'} -

- {p.contact_url && ( - - Contactar/consultar o produto - - )} - -
- ))} -

- Uma referência não é elegibilidade confirmada, aprovação nem - garantia de financiamento. O portal não envia pedidos ou dados à - instituição. -

); } diff --git a/resources/js/components/portal-grouped-menu.tsx b/resources/js/components/portal-grouped-menu.tsx index 498b8347..098a7d4d 100644 --- a/resources/js/components/portal-grouped-menu.tsx +++ b/resources/js/components/portal-grouped-menu.tsx @@ -200,11 +200,9 @@ export function PortalGroupedMenu() { {groups .filter((group) => [ - 'procurement-area', 'discovery', 'realization', 'support', - 'work', ].includes(group.id), ) .map((group) => ( @@ -260,7 +258,9 @@ export function PortalGroupedMenu() { Mais @@ -310,6 +310,17 @@ export function PortalGroupedMenu() { ), )} + {groups + .filter((group) => group.id === 'work') + .map((group) => ( + + + + {t(group.label)} + + {items(group.children ?? [])} + + ))} diff --git a/resources/js/lib/funding-public-presentation.ts b/resources/js/lib/funding-public-presentation.ts index db8c6d75..d54919db 100644 --- a/resources/js/lib/funding-public-presentation.ts +++ b/resources/js/lib/funding-public-presentation.ts @@ -1,4 +1,4 @@ -type PublicFunding = { +export type PublicFunding = { title: string; kind: string; summary: string; @@ -8,6 +8,8 @@ type PublicFunding = { title: string; instrument?: string | null; availability?: string; + contact_url?: string | null; + source_url?: string | null; }[]; }; const descriptions: Record = { @@ -45,9 +47,10 @@ const services: Record = { }; export function fundingPublicPresentation(p: PublicFunding) { const generic = + !p.summary.trim() || p.summary.trim() === - 'Instituição identificada no documento fornecido. Categoria, localização e contactos são informativos; produtos, disponibilidade e condições não documentados permanecem por confirmar.'; - const description = generic + 'Instituição identificada no documento fornecido. Categoria, localização e contactos são informativos; produtos, disponibilidade e condições não documentados permanecem por confirmar.'; + let description = generic ? (descriptions[p.institution_types?.[0] ?? ''] ?? 'Entidade do sector financeiro.') : p.summary @@ -58,9 +61,31 @@ export function fundingPublicPresentation(p: PublicFunding) { .replace(/Público\/finalidade:/g, 'Soluções para') .replace(/\.\./g, '.') .trim(); + const repeatedInstrument = (p.products ?? []).some( + (product) => + product.instrument?.trim() && + description.startsWith(product.instrument.trim()), + ); + if (repeatedInstrument) { + const audience = description.match( + /Soluções para\s+(.+?)(?:\.|$)/i, + )?.[1]; + description = audience + ? 'Soluções financeiras para ' + + audience.charAt(0).toLowerCase() + + audience.slice(1) + + '.' + : (descriptions[p.institution_types?.[0] ?? ''] ?? description); + } const products = (p.products ?? []) .filter((x) => x.availability !== 'closed') - .map((x) => ({ title: x.title, detail: x.instrument?.trim() ?? '' })); + .map((x) => ({ + title: x.title.startsWith(p.title + ' — ') + ? x.title.slice(p.title.length + 3) + : x.title, + detail: x.instrument?.trim() ?? '', + url: x.contact_url || x.source_url || null, + })); return { description, products, @@ -73,3 +98,74 @@ export function fundingPublicPresentation(p: PublicFunding) { ], }; } + +const normal = (s: string) => + s + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .toLowerCase() + .replace(/[^a-z0-9]+/g, ' ') + .trim(); +export function publicInstitutionContacts< + T extends { kind: string; value: string }, +>(rows: T[]) { + const seen = new Set(); + return rows.flatMap((row) => { + const value = + row.kind === 'phone' + ? row.value.replace(/\s*Não encontrado\.?$/i, '').trim() + : row.value.trim(); + if (!value) return []; + const key = + row.kind + + ':' + + (row.kind === 'phone' + ? value.replace(/\D/g, '') + : value.toLowerCase().replace(/\/$/, '')); + if (seen.has(key)) return []; + seen.add(key); + return [{ ...row, value }]; + }); +} +export function publicInstitutionLocations< + T extends { + role: string; + address?: string | null; + location_text?: string; + territory_path?: { name: string }[]; + }, +>(rows: T[]) { + const result: T[] = []; + for (const row of [...rows].sort( + (a, b) => + (a.role === 'headquarters' ? 0 : 1) - + (b.role === 'headquarters' ? 0 : 1), + )) { + if (!row.address?.trim()) continue; + const address = normal(row.address); + const duplicate = result.some((previous) => { + const other = normal(previous.address ?? ''); + if (address === other) return true; + const short = address.length < other.length ? address : other, + long = address.length < other.length ? other : address; + if (!long.startsWith(short + ' ')) return false; + const rest = long.slice(short.length).trim(); + const localities = [ + row.location_text ?? '', + previous.location_text ?? '', + ...(row.territory_path ?? []).map((x) => x.name), + ...(previous.territory_path ?? []).map((x) => x.name), + ].map(normal); + return ( + localities.includes(rest) || + localities.some( + (x) => + x.replace(/^cidade de /, '') === + rest.replace(/^cidade de /, ''), + ) + ); + }); + if (!duplicate) result.push(row); + } + return result; +} diff --git a/resources/js/lib/portal-navigation.ts b/resources/js/lib/portal-navigation.ts index 6a4f705d..26296836 100644 --- a/resources/js/lib/portal-navigation.ts +++ b/resources/js/lib/portal-navigation.ts @@ -478,40 +478,41 @@ export function portalNavigation(access: PortalNavAccess): PortalNavItem[] { : null) : null; return uniqueNavigationDestinations([ - ...(access.procurement - ? [ - { - id: 'procurement-area', - label: 'Concursos e anúncios', - children: [ - link( - 'procurement', - 'Consultar concursos e anúncios', - '/concursos', - ), - ...(access.authenticated - ? [ - link( - 'procurement-watched', - 'Os concursos que acompanho', - '/concursos/acompanhar', - ), - ] - : []), - ], - }, - ] - : []), { id: 'discovery', label: 'Descoberta', children: [ + ...(access.procurement + ? [ + { + id: 'procurement-area', + label: 'Concursos e anúncios', + children: [ + link( + 'procurement', + 'Consultar concursos e anúncios', + '/concursos', + ), + ...(access.authenticated + ? [ + link( + 'procurement-watched', + 'Os concursos que acompanho', + '/concursos/acompanhar', + ), + ] + : []), + ], + }, + ] + : []), + link('locations', 'Localizações', '/oportunidades?view=map'), ...(access.funding ? [ link( 'funding', - 'Instituições financeiras e seguros', + 'Instituições financeiras', '/fundos', ), ...(access.authenticated @@ -580,7 +581,7 @@ export function portalNavigation(access: PortalNavAccess): PortalNavItem[] { id: 'support', label: 'Suporte', children: [ - link('documents', 'Biblioteca de documentos', '/documentos'), + link('documents', 'Biblioteca', '/documentos'), link('legislation', 'Legislação', '/legislacao'), link( 'services', diff --git a/resources/js/pages/funding/index.tsx b/resources/js/pages/funding/index.tsx index 1d5975ed..c8666a96 100644 --- a/resources/js/pages/funding/index.tsx +++ b/resources/js/pages/funding/index.tsx @@ -1,4 +1,7 @@ -import {fundingPublicPresentation} from '@/lib/funding-public-presentation'; +import { + InstitutionView, + type InstitutionDetails, +} from '@/components/funding-institution'; import { financialCategories, financialTypes, @@ -68,8 +71,9 @@ export default function Index({ A minha selecção

- Encontre bancos, seguradoras, fundos e outros parceiros financeiros. - Explore as soluções e os contactos adequados ao seu investimento. + Encontre bancos, seguradoras, fundos e outros parceiros + financeiros. Explore as soluções e os contactos adequados ao seu + investimento.

- Sector e local filtram o âmbito geral do programa. Cada chamada - pode ter uma cobertura mais restrita. O estado indica que existe - pelo menos uma janela nesse estado; não confirma elegibilidade - nem candidatura aberta no local escolhido. + Explore as instituições e soluções adequadas ao seu + investimento. Use os filtros para encontrar a informação de que + precisa.

{items.data.length === 0 && (

@@ -274,27 +277,33 @@ export default function Index({ {item.payload.title} -

{fundingPublicPresentation(item.payload).description}

- {item.payload.kind==='institution' &&

Produtos e serviços

{fundingPublicPresentation(item.payload).products.length ?
    {fundingPublicPresentation(item.payload).products.map(p=>
  • {p.title}{p.detail ? ': '+p.detail : ''}
  • )}
:

{fundingPublicPresentation(item.payload).services.join(' · ') || 'Consulte as soluções disponíveis junto da instituição.'}

}
} -

- {(item.payload.institution_categories ?? []) - .map((k) => financialCategories[k] ?? k) - .join(' · ')}{' '} - ·{' '} - {(item.payload.institution_types ?? []) - .map((k) => financialTypes[k] ?? k) - .join(' · ')} -

- {item.payload.kind!=='institution' &&

Entidade gestora: {item.payload.manager_name}

} - {Object.entries(item.filter_explanation ?? {}).map( - ([key, message]) => ( -

{message}

- ), + {item.payload.kind === 'institution' ? ( + + ) : ( + <> +

{item.payload.summary}

+

Entidade gestora: {item.payload.manager_name}

+ {Object.entries(item.filter_explanation ?? {}).map( + ([key, message]) => ( +

{message}

+ ), + )} + )} - {item.payload.kind==='institution' && item.payload.windows.length===0 ? null : item.payload.windows.length === 0 ? ( + {item.payload.kind === 'institution' && + item.payload.windows.length === 0 ? null : item.payload + .windows.length === 0 ? (

- Não existe uma janela de candidatura confirmada - para este programa. + Não existe uma janela de candidatura confirmada para + este programa.

) : (
    diff --git a/resources/js/pages/funding/show.tsx b/resources/js/pages/funding/show.tsx index a163e7bf..6901d354 100644 --- a/resources/js/pages/funding/show.tsx +++ b/resources/js/pages/funding/show.tsx @@ -1,4 +1,4 @@ -import {fundingPublicPresentation} from '@/lib/funding-public-presentation'; +import { fundingPublicPresentation } from '@/lib/funding-public-presentation'; import { InstitutionView, type InstitutionDetails, @@ -41,9 +41,20 @@ export default function Show({ > Voltar aos fundos e programas -

    Descrição

    {fundingPublicPresentation(payload).description}

    - {payload.kind === 'institution' && ( - + {payload.kind === 'institution' ? ( + + ) : ( +
    +

    Descrição

    +

    {fundingPublicPresentation(payload).description}

    +
    )} {authenticated && ( )} -

    - Entidade responsável: {payload.manager_name}. -

    - {(payload.territory_paths ?? []).map((path, index) => ( -

    - Local abrangido: {path.map((node) => node.name).join(' / ')} -

    - ))} -

    - Sectores:{' '} - {payload.sectors_text || - (payload.sectors_scope === 'all' - ? 'Todos, segundo a fonte' - : payload.sectors_scope === 'unknown' - ? 'Por confirmar' - : (payload.sector_snapshots ?? []) - .map((sector) => sector.name) - .join(', '))} -

    -

    - {payload.coverage === 'national' - ? 'Cobertura nacional' - : payload.coverage === 'territorial' - ? 'Cobertura territorial' - : 'Cobertura por confirmar'} - {payload.coverage_text ? ` — ${payload.coverage_text}` : ''} -

    - {payload.source_url &&
    Informação institucionalConsultar informação da entidade

    Actualização consultada em {payload.source_checked_on}.

    } - {(payload.kind!=='institution'||payload.windows.length>0) && (
    -

    - Janelas de candidatura -

    - {payload.windows.length === 0 && ( -

    - Não há uma janela de candidatura confirmada para este programa. -

    - )} - {payload.windows.map((item) => ( -
    -

    {item.title}

    -

    {windowLabels[item.state]}

    - {item.start_on &&

    Abertura: {item.start_on}

    } - {item.end_on &&

    Data-limite: {item.end_on}

    } - {item.coverage_text &&

    {item.coverage_text}

    } -

    - {item.coverage === 'programme' - ? 'Mesma cobertura do programa' - : item.coverage === 'national' - ? 'Chamada nacional' - : item.coverage === 'unknown' - ? 'Cobertura da chamada por confirmar' - : 'Chamada territorial'} + {payload.kind !== 'institution' && ( + <> + {' '} +

    Entidade responsável: {payload.manager_name}.

    + {(payload.territory_paths ?? []).map((path, index) => ( +

    + Local abrangido:{' '} + {path.map((node) => node.name).join(' / ')}

    - {(item.territory_paths ?? []).map((path, index) => ( -

    - {path.map((node) => node.name).join(' / ')} -

    - ))} - - {item.source_reference} - -

    Fonte consultada em {item.checked_on}.

    - {item.application_url && ( + ))} +

    + Sectores:{' '} + {payload.sectors_text || + (payload.sectors_scope === 'all' + ? 'Todos, segundo a fonte' + : payload.sectors_scope === 'unknown' + ? 'Por confirmar' + : (payload.sector_snapshots ?? []) + .map((sector) => sector.name) + .join(', '))} +

    +

    + {payload.coverage === 'national' + ? 'Cobertura nacional' + : payload.coverage === 'territorial' + ? 'Cobertura territorial' + : 'Cobertura por confirmar'} + {payload.coverage_text + ? ` — ${payload.coverage_text}` + : ''} +

    + {payload.source_url && ( +
    + Informação institucional - Consultar o canal indicado pela entidade + Consultar informação da entidade - )} -
    - ))} -
    )} - {(payload.kind!=='institution'||payload.criteria.length>0||payload.windows.some(window=>window.criteria.length>0)) && ( )} +

    + Actualização consultada em{' '} + {payload.source_checked_on}. +

    + + )} + + )} + {(payload.kind !== 'institution' || payload.windows.length > 0) && ( +
    +

    + Janelas de candidatura +

    + {payload.windows.length === 0 && ( +

    + Não há uma janela de candidatura confirmada para + este programa. +

    + )} + {payload.windows.map((item) => ( +
    +

    {item.title}

    +

    {windowLabels[item.state]}

    + {item.start_on &&

    Abertura: {item.start_on}

    } + {item.end_on &&

    Data-limite: {item.end_on}

    } + {item.coverage_text &&

    {item.coverage_text}

    } +

    + {item.coverage === 'programme' + ? 'Mesma cobertura do programa' + : item.coverage === 'national' + ? 'Chamada nacional' + : item.coverage === 'unknown' + ? 'Cobertura da chamada por confirmar' + : 'Chamada territorial'} +

    + {(item.territory_paths ?? []).map((path, index) => ( +

    + {path.map((node) => node.name).join(' / ')} +

    + ))} + + {item.source_reference} + +

    Fonte consultada em {item.checked_on}.

    + {item.application_url && ( + + Consultar o canal indicado pela entidade + + )} +
    + ))} +
    + )} + {(payload.kind !== 'institution' || + payload.criteria.length > 0 || + payload.windows.some( + (window) => window.criteria.length > 0, + )) && ( + + )} {payload.documents.length > 0 && (

    Documentos associados

    @@ -162,10 +204,7 @@ export default function Show({ )}

    Guardar interesse

    -

    - Guarde esta opção para retomar a preparação do investimento. Não envia uma - candidatura nem contacta a entidade. -

    + {saved ? ( <>

    diff --git a/tests/frontend/funding-directory.test.mjs b/tests/frontend/funding-directory.test.mjs index 1408b484..e05f65d7 100644 --- a/tests/frontend/funding-directory.test.mjs +++ b/tests/frontend/funding-directory.test.mjs @@ -84,14 +84,11 @@ test("actual institution view keeps physical address separate from product cover const html = renderToStaticMarkup( React.createElement(InstitutionView, { value: details }), ); - assert.match(html, /Sede: SYNTHETIC Maputo office/); - assert.match(html, /Nacional, segundo a fonte/); - assert.match(html, /Condições: Por confirmar/); - assert.match(html, /Disponibilidade: Por confirmar/); + assert.match(html, /Sede: SYNTHETIC address/); + assert.match(html, /SYNTHETIC QA investment/); assert.match(html, /https:\/\/example.invalid\/contact/); - assert.match(html, /https:\/\/example\.invalid\/source/); - assert.match(html, /Consultar informação da entidade/); - assert.match(html, /não é elegibilidade confirmada/); + assert.doesNotMatch(html,/Por confirmar|não é elegibilidade|SHA-256/); + }); test("adding a physical location does not fill product financing coverage", () => { const { InstitutionFields } = load("components/funding-institution.tsx"); diff --git a/tests/frontend/funding-public-presentation.test.mjs b/tests/frontend/funding-public-presentation.test.mjs index c4a54350..fa439a65 100644 --- a/tests/frontend/funding-public-presentation.test.mjs +++ b/tests/frontend/funding-public-presentation.test.mjs @@ -60,16 +60,26 @@ function load(file) { } : name === './shared' ? { windowLabels: {} } - : name === '@/lib/portal-api' ? {portalRequest:()=>{throw Error('Read-only rendering must not send requests');}} : name === '@/components/funding-classification' - ? load('components/funding-classification.tsx') - : name === '@/components/funding-institution' - ? load('components/funding-institution.tsx') - : name === '@/components/funding-dossier-choice' - ? { FundingDossierChoice: () => null } - : name === - '@/components/funding-criteria-assessment' - ? load('components/funding-criteria-assessment.tsx') - : require(name), + : name === '@/lib/portal-api' + ? { + portalRequest: () => { + throw Error( + 'Read-only rendering must not send requests', + ); + }, + } + : name === '@/components/funding-classification' + ? load('components/funding-classification.tsx') + : name === '@/components/funding-institution' + ? load('components/funding-institution.tsx') + : name === '@/components/funding-dossier-choice' + ? { FundingDossierChoice: () => null } + : name === + '@/components/funding-criteria-assessment' + ? load( + 'components/funding-criteria-assessment.tsx', + ) + : require(name), module, module.exports, ); @@ -146,8 +156,143 @@ test('actual public cards and detail lead with description/products and keep imp new RegExp(raw.title.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')), ); } - const out=new URL('../../outputs/funding-public-editorial-20261111/',import.meta.url);fs.mkdirSync(out,{recursive:true});const name=p.products.length?'bank-with-products':'investment-manager';fs.writeFileSync(new URL(name+'-index.html',out),index);fs.writeFileSync(new URL(name+'-detail.html',out),detail);fs.writeFileSync(new URL('verification.json',out),JSON.stringify({publishedSourceRecords:270,descriptionsPreserved:true,productsNotFabricated:true,actualPublicComponents:true,metadataRemovedFromPresentation:true,privateEditorialFieldsUnchanged:true,activeDataWrites:0,visualBrowserReview:false},null,2)); + const out = new URL( + '../../outputs/funding-public-editorial-20261111/', + import.meta.url, + ); + fs.mkdirSync(out, { recursive: true }); + const name = p.products.length + ? 'bank-with-products' + : 'investment-manager'; + fs.writeFileSync(new URL(name + '-index.html', out), index); + fs.writeFileSync(new URL(name + '-detail.html', out), detail); + fs.writeFileSync( + new URL('verification.json', out), + JSON.stringify( + { + publishedSourceRecords: 270, + descriptionsPreserved: true, + productsNotFabricated: true, + actualPublicComponents: true, + metadataRemovedFromPresentation: true, + privateEditorialFieldsUnchanged: true, + activeDataWrites: 0, + visualBrowserReview: false, + }, + null, + 2, + ), + ); assert.match(detail, /Descrição/); if (p.products.length) assert.match(detail, /Soluções PME/); } }); + +test('Quorus and Moza use one shared clean profile in both list and detail', () => { + const Index = load('pages/funding/index.tsx').default, + Show = load('pages/funding/show.tsx').default; + const out = new URL( + '../../outputs/funding-uniform-menu-20261111/', + import.meta.url, + ); + fs.mkdirSync(out, { recursive: true }); + for (const title of ['Quorus', 'Moza Banco']) { + const raw = records.find((p) => p.title === title); + assert.ok(raw, title); + const p = { ...raw, windows: [], documents: [] }, + item = { + id: 'synthetic', + version_id: 'synthetic-version', + version: 1, + payload: p, + }; + const index = renderToStaticMarkup( + React.createElement(Index, { + items: { data: [item], links: [] }, + filters: {}, + kinds: {}, + options: { territories: [], sectors: [] }, + management: false, + }), + ); + const detail = renderToStaticMarkup( + React.createElement(Show, { + record: item, + authenticated: false, + saved: null, + }), + ); + for (const html of [ + index.match(/

    ([\s\S]*?)<\/article>/)?.[0] ?? + index, + detail, + ]) { + assert.doesNotMatch( + html, + /Por confirmar|por confirmar|correspondência confirmada|Instituição identificada|Entidade responsável|Sectores:|Cobertura|garantia de financiamento|Não encontrado|ficha|Sede ou contacto indicado|Informação institucional/, + ); + assert.equal((html.match(/Produtos e serviços/g) || []).length, 1); + assert.equal((html.match(/Descrição/g) || []).length, 1); + } + if (title === 'Quorus') { + assert.equal( + (detail.match(/Entidade de corretagem de seguros/g) || []) + .length, + 1, + ); + assert.doesNotMatch( + detail, + /]*>Contactos|]*>Localização/, + ); + } else { + assert.equal((detail.match(/21 342 000/g) || []).length, 1); + assert.equal( + (detail.match(/Rua dos Desportistas/g) || []).length, + 1, + ); + assert.equal( + ( + detail.match( + /Tesouraria, investimento, construção e equipamento/g, + ) || [] + ).length, + 1, + ); + assert.doesNotMatch(detail, /500\.000|30\.000\.000|Prime|spread/); + } + fs.writeFileSync( + new URL(title.replaceAll(' ', '-') + '-index.html', out), + index, + ); + fs.writeFileSync( + new URL(title.replaceAll(' ', '-') + '-detail.html', out), + detail, + ); + } +}); +test('contact and location deduplication preserves different branches and original records', () => { + const moza = records.find((p) => p.title === 'Moza Banco'), + original = JSON.stringify(moza); + assert.equal( + presentation + .publicInstitutionContacts(moza.contacts) + .filter((c) => c.kind === 'phone').length, + 1, + ); + assert.equal( + presentation.publicInstitutionLocations(moza.locations).length, + 1, + ); + assert.equal( + presentation.publicInstitutionLocations([ + ...moza.locations, + { + ...moza.locations[0], + role: 'branch', + address: 'Rua dos Desportistas, número 714', + }, + ]).length, + 2, + ); + assert.equal(JSON.stringify(moza), original); +}); diff --git a/tests/frontend/portal-navigation.test.mjs b/tests/frontend/portal-navigation.test.mjs index 911aedd9..6775dd8a 100644 --- a/tests/frontend/portal-navigation.test.mjs +++ b/tests/frontend/portal-navigation.test.mjs @@ -417,7 +417,7 @@ void test('installed concours has its own primary group and preserves public and authenticated, procurement: true, }); - const group = groups.find((g) => g.id === 'procurement-area'); + const group = groups.find((g) => g.id === 'discovery').children.find(g=>g.id==='procurement-area'); assert.equal(group.label, 'Concursos e anúncios'); assert.equal( destinations(groups).filter((h) => h === '/concursos').length, @@ -427,15 +427,15 @@ void test('installed concours has its own primary group and preserves public and JSON.stringify(groups.find((g) => g.id === 'discovery')).includes( '/concursos', ), - false, + true, ); assert.equal( currentNavigationGroup(groups, '/concursos?q=obras'), - 'procurement-area', + 'discovery', ); assert.equal( currentNavigationGroup(groups, '/concursos/fixture'), - 'procurement-area', + 'discovery', ); assert.equal( destinations(group.children).includes('/concursos/acompanhar'), diff --git a/tests/frontend/portal-six-group-menu.test.mjs b/tests/frontend/portal-six-group-menu.test.mjs new file mode 100644 index 00000000..172c9c98 --- /dev/null +++ b/tests/frontend/portal-six-group-menu.test.mjs @@ -0,0 +1,194 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import { createRequire } from 'node:module'; +import { compileFunction } from 'node:vm'; +import ts from 'typescript'; +import React from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import * as navigation from '../../resources/js/lib/portal-navigation.ts'; +import { searchTerritoryHref } from '../../resources/js/lib/search-territory.ts'; +const require = createRequire(import.meta.url); +let state, mobile; +const primitive = + (tag) => + ({ children, asChild, className, ...props }) => + asChild + ? React.cloneElement(children, { className }) + : React.createElement( + tag, + { + className, + ...Object.fromEntries( + Object.entries(props).filter( + ([k]) => + k.startsWith('aria-') || + k.startsWith('data-'), + ), + ), + }, + children, + ); +const source = fs.readFileSync( + new URL( + '../../resources/js/components/portal-grouped-menu.tsx', + import.meta.url, + ), + 'utf8', + ), + module = { exports: {} }; +const output = ts.transpileModule(source, { + compilerOptions: { + module: ts.ModuleKind.CommonJS, + target: ts.ScriptTarget.ES2022, + jsx: ts.JsxEmit.ReactJSX, + }, +}).outputText; +compileFunction(output, ['require', 'module', 'exports'])( + (name) => + name === '@/components/portal-product-identity' + ? {} + : name === '@inertiajs/react' + ? { + usePage: () => state, + Link: ({ children, href, className, ...props }) => + React.createElement( + 'a', + { + href, + className, + ...Object.fromEntries( + Object.entries(props).filter( + ([k]) => + k.startsWith('aria-') || + k.startsWith('data-'), + ), + ), + }, + children, + ), + router: {}, + } + : name === 'lucide-react' + ? new Proxy({}, { get: () => () => null }) + : name === '@/hooks/use-mobile' + ? { useIsMobile: () => mobile } + : name === '@/components/navigation-context' + ? { useNavigationContext: () => ({ view: null }) } + : name === '@/components/tempo-brand' + ? { useTempoUi: () => ({ t: (x) => x, language: 'pt' }) } + : name === '@/components/tempo-header-tools' + ? { TempoLanguageSelector: () => null } + : name === '@/components/ui/dropdown-menu' + ? new Proxy( + {}, + { + get: (_, key) => + primitive( + String(key).includes('Trigger') + ? 'button' + : 'div', + ), + }, + ) + : name === '@/lib/portal-navigation' + ? navigation + : name === '@/lib/search-territory' + ? { searchTerritoryHref } + : name === '@/routes' + ? { logout: () => '/logout' } + : require(name), + module, + module.exports, +); +test('actual header has exactly the requested six primary entries on desktop and mobile for public and signed-in users', () => { + const out = new URL( + '../../outputs/funding-uniform-menu-20261111/', + import.meta.url, + ); + fs.mkdirSync(out, { recursive: true }); + for (const authenticated of [false, true]) + for (mobile of [false, true]) { + state = { + url: '/', + props: { + auth: { + user: authenticated + ? { + name: 'SYNTHETIC QA', + email: 'qa@example.invalid', + } + : null, + canManagePortal: false, + }, + procurementEnabled: true, + fundingEnabled: true, + }, + }; + const html = renderToStaticMarkup( + React.createElement(module.exports.PortalGroupedMenu), + ); + const nav = html.match( + /]*aria-label="Áreas do portal"[\s\S]*?<\/nav>/, + )?.[0]; + assert.ok(nav); + const labels = [ + ...nav.matchAll( + /<(?:a|button)[^>]*class="tempo-nav-trigger"[^>]*>([\s\S]*?)<\/(?:a|button)>/g, + ), + ].map((m) => m[1].replace(/<[^>]*>/g, '').trim()); + assert.deepEqual(labels, [ + 'Início', + 'Descoberta', + 'Realização', + 'Suporte', + 'Sobre nós', + 'Mais', + ]); + for (const href of [ + '/concursos', + '/fundos', + '/documentos', + '/legislacao', + '/sobre', + '/contacto', + '/acesso-gestao', + ]) + assert.ok(html.includes('href="' + href + '"'), href); + assert.ok(html.includes('step=S08')); + assert.equal(html.includes('/management/'), false); + fs.writeFileSync( + new URL( + 'header-' + authenticated + '-' + mobile + '.html', + out, + ), + html, + ); + } + fs.writeFileSync( + new URL('verification.json', out), + JSON.stringify( + { + synthetic: true, + sharedInstitutionProfile: true, + suppliedExamples: ['Quorus', 'Moza Banco'], + sourceRowsPreserved: true, + primaryEntries: [ + 'Início', + 'Descoberta', + 'Realização', + 'Suporte', + 'Sobre nós', + 'Mais', + ], + actualHeaderRendered: true, + publicAndSignedIn: true, + mobileAndDesktopBranches: true, + visualBrowserReview: false, + activeDataWrites: 0, + }, + null, + 2, + ), + ); +});