diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..11e44551 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +.git +.idea +.agents +.codex +node_modules +vendor +public/build +storage/logs +storage/framework/cache +storage/framework/sessions +storage/framework/views +tests +Doc +docs +*.zip +.phpunit.result.cache diff --git a/Doc/.$EDA.drawio.bkp b/Doc/.$EDA.drawio.bkp new file mode 100644 index 00000000..141fdf3f --- /dev/null +++ b/Doc/.$EDA.drawio.bkp @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Doc/DEA.drawio.pdf b/Doc/DEA.drawio.pdf new file mode 100644 index 00000000..c2d63811 Binary files /dev/null and b/Doc/DEA.drawio.pdf differ diff --git a/Doc/EDA.drawio b/Doc/EDA.drawio new file mode 100644 index 00000000..4880b5fa --- /dev/null +++ b/Doc/EDA.drawio @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Guia-Paginas-Publicas-InvestMoz.docx b/Doc/Guia-Paginas-Publicas-InvestMoz.docx new file mode 100644 index 00000000..964ccb3c Binary files /dev/null and b/Doc/Guia-Paginas-Publicas-InvestMoz.docx differ diff --git a/deploy/local/Dockerfile.node b/deploy/local/Dockerfile.node new file mode 100644 index 00000000..dc16873f --- /dev/null +++ b/deploy/local/Dockerfile.node @@ -0,0 +1,19 @@ +FROM node:22-bookworm AS node + +FROM php:8.4-cli-bookworm + +RUN apt-get update \ + && apt-get install -y --no-install-recommends libpq-dev libzip-dev unzip git curl \ + && docker-php-ext-install -j"$(nproc)" pdo_pgsql pgsql zip \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=node /usr/local/bin/node /usr/local/bin/node +COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules +RUN ln -s ../lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \ + && ln -s ../lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx \ + && ln -s ../lib/node_modules/corepack/dist/corepack.js /usr/local/bin/corepack + +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci --no-audit --no-fund +COPY . . diff --git a/deploy/local/Dockerfile.php b/deploy/local/Dockerfile.php new file mode 100644 index 00000000..5d2dda18 --- /dev/null +++ b/deploy/local/Dockerfile.php @@ -0,0 +1,13 @@ +FROM php:8.4-cli-bookworm + +RUN apt-get update \ + && apt-get install -y --no-install-recommends libpq-dev libzip-dev unzip git curl \ + && docker-php-ext-install -j"$(nproc)" pdo_pgsql pgsql zip \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer +WORKDIR /var/www/html +COPY composer.json composer.lock ./ +RUN composer install --no-interaction --prefer-dist --no-progress --no-scripts +COPY . . +RUN composer dump-autoload --optimize diff --git a/docs/investmoz/InvestMoz-levantamento-funcional-profissional.html b/docs/investmoz/InvestMoz-levantamento-funcional-profissional.html new file mode 100644 index 00000000..a5385a57 --- /dev/null +++ b/docs/investmoz/InvestMoz-levantamento-funcional-profissional.html @@ -0,0 +1,176 @@ + + + + +InvestMoz — Levantamento funcional e modelos + + + +
+

Documento de análise funcional

+

InvestMoz

+

Levantamento profissional do projecto, casos de uso reais, actores e diagramas

+
Data: 9 de Outubro de 2026
Âmbito: aplicação Laravel/React e documentação do repositório Investidor-V2
Versão: 1.0 · análise do código e dos documentos disponíveis
+

Portal de descoberta de oportunidades e serviços de investimento, ligado a fluxos autenticados de candidatura, tratamento institucional, evidência documental e acompanhamento.

+

Documento técnico-funcional. A presença de uma rota, tabela, job ou descrição não demonstra, por si só, activação em produção.

+
+ +

1. Sumário executivo

+

O InvestMoz é uma plataforma digital que aproxima investidores, promotores e instituições. A experiência começa no portal público, onde se consultam sectores, oportunidades, negócios existentes, território, zonas e serviços. A partir daí, a pessoa pode manifestar interesse, iniciar uma simulação ou pedir apoio. Os percursos que exigem continuidade passam para a área autenticada, onde se mantêm perfil, rascunhos, candidaturas, anexos e comunicação.

+

Do lado institucional, os pedidos podem ser revistos e acompanhados por CRM local, tarefas, revisões e eventos. A plataforma também contém domínios de catálogo territorial, zonas de investimento, documentação, governação fiscal, educação e competências, assistência de terra, parcerias, balcão virtual e IA baseada em fontes.

+
Leitura funcional: trata-se de uma plataforma de encaminhamento e gestão de jornadas de investimento, e não apenas de um catálogo de anúncios. A camada pública informa e capta pedidos; a camada autenticada conserva o trabalho; a camada de gestão analisa, valida e decide segundo permissões e evidência.
+

O README descreve a base inicial de sectores, oportunidades e manifestações de interesse. Rotas, controladores, migrations e documentação de domínio mostram uma solução mais abrangente. O levantamento de casos detalhados tem 24 casos de uso; este relatório acrescenta cenários concretos, diagramas UML/ER e a leitura da frequência dos eventos.

+ +

2. O que o projecto faz

+ + + + + + + + +
CapacidadeValor para o utilizadorExemplos de dados
Descoberta públicaEncontrar oportunidades, negócios, sectores, serviços e referências territoriais.sectors, opportunities, existing_businesses, investment_zones
Captação de interesseEnviar manifestação associada a uma oportunidade ou negócio, com consentimento.interest_requests, consents, receipts
Jornada do investidorGuardar itens, criar dossier/submissão, anexar documentos e acompanhar mensagens.investment_submissions, revisions, messages, attachments
Tratamento institucionalQualificar pedidos, atribuir responsável, criar tarefas e acompanhar a negociação.leads, contacts, crm_opportunities, tasks, activities
Planeamento territorialRelacionar projectos, clusters, corredores, localizações e zonas.projects, economic_clusters, development_corridors, geo_locations
Documentos e evidênciaPreservar origem, versões, hash, scan, classificação e autorização de divulgação.documents, document_versions, malware_scans, associations
Simulação e regras fiscaisGuardar rascunhos, executar simulações com parâmetros/fontes rastreáveis e governar versões.simulations, scenarios, results, tax_rule_versions, legal_sources
Serviços complementaresRegistar educação, assistência de terra, parcerias, balcão virtual e apoio com IA.training needs, land cases, partnerships, desk cases, ai runs
+ +

3. Actores e fronteiras de acesso

+ + + + + + + + +
ActorO que pretendeZona típica
VisitanteConsultar conteúdos públicos e iniciar interesse, apoio ou simulação.Portal público
Investidor / utilizador registadoManter perfil, favoritos, rascunhos, submissões, anexos e mensagens.Área autenticada
Promotor / proprietário de negócioRegistar ou actualizar negócio e responder a pedidos de informação.Área autenticada e workflow de revisão
Gestor de portal / CRMRever interesses, qualificar leads, atribuir tarefas e gerir conteúdos.Gestão interna
Gestor territorialManter projectos, relações, zonas, geometria e referências territoriais.Gestão interna
Revisor documental / gestor fiscalValidar metadados, evidência, versões e regras sob as respectivas funções.Gestão restrita
Agente de serviço / parceiro institucionalTratar casos ou colaborar em parcerias e salas.Serviços e colaboração
Administrador / workerGerir segurança/configuração ou executar trabalho assíncrono autorizado.Administração / sistema
+

Os nomes acima são papéis funcionais consolidados. A autorização efectiva depende das policies, middleware, MFA, configuração e permissões em vigor.

+ +

4. Diagrama de casos de uso com actores

+

O diagrama destaca actores (“bonecos”) e os principais serviços que usam. As associações mostram interacções típicas; não indicam que todos os serviços estejam activos na mesma instalação.

+
+ + +Sistema InvestMoz + +Visitante +Investidor +Gestor +Revisor +Parceiro + +Consultar catálogo e mapa +Pesquisar oportunidade/negócio +Manifestar interesse +Executar simulação +Criar candidatura / dossier +Anexar e acompanhar documentos +Tratar interesse no CRM +Validar e publicar conteúdo +Gerir território e zonas +Colaborar em parceria/serviço + + +
+

Exemplo do percurso mais comum: visitante pesquisa → manifesta interesse → investidor cria/acompanha candidatura → gestão trata o pedido → revisão e decisão.

+ +

5. Casos de uso reais — jornadas ilustrativas

+

UC-A — Investidor encontra oportunidade e manifesta interesse

+
  1. O visitante consulta sectores, filtra oportunidades por localização e abre o detalhe.
  2. Escolhe “manifestar interesse”, informa contacto, modalidade e mensagem, e aceita o consentimento aplicável.
  3. O sistema valida o alvo, regista o pedido e, quando configurado, um recibo/idempotência.
  4. O investidor pode autenticar-se para guardar a oportunidade ou avançar para uma submissão.
  5. Um gestor consulta o pedido, verifica consentimentos, atribui responsável, qualifica e cria tarefa de seguimento.
  6. As alterações relevantes ficam no histórico; notificações e integrações só são consideradas entregues quando o disparo e o serviço estiverem confirmados.
+

Resultado: pedido rastreável ligado à oportunidade e encaminhado para tratamento. Entidades: Opportunity, Investor/User, InterestRequest, Consent, Lead, Task, AuditEvent.

+

UC-B — Proprietário submete um negócio para divulgação

+
  1. O proprietário cria rascunho e informa modalidade, objectos, localização e documentos de suporte.
  2. Submete o registo; o estado passa para revisão conforme o workflow aplicável.
  3. O gestor analisa e pode aprovar, rejeitar ou pedir informação complementar.
  4. O revisor documental confere original, hash, versão, scan e autorização de divulgação.
  5. Só após as validações necessárias o conteúdo pode ser publicado ao público; publicação não altera a situação jurídica do documento.
+

Resultado: negócio com histórico e decisão rastreável. Estados documentados: draft → submitted → in_review → approved → published, com ramos needs_information, rejected, withdrawn, suspended e archived.

+

UC-C — Gestor territorial valida zona e relações

+
  1. O gestor regista a zona e a referência/fonte pertinente.
  2. Associa localização, operador, categoria, geometria e relações com projectos, clusters ou corredores.
  3. As relações sem evidência verificada permanecem pendentes e identificadas.
  4. Um revisor valida a evidência e as regras de publicação; alterações ficam versionadas.
  5. A zona só aparece no portal conforme estado e autorização de divulgação.
+

UC-D — Utilizador guarda um rascunho e executa simulação

+
  1. O utilizador preenche o formulário; os dados incompletos podem ser guardados como rascunho recuperável.
  2. Quando solicita o cálculo, o sistema selecciona questionário e parâmetros elegíveis.
  3. O job de simulação executa após a transacção e grava cenários, resultados, obrigações e fontes usadas.
  4. O relatório pode ser consultado; o rascunho continua distinto do cálculo executado.
+
Regra de integridade: importar ou publicar fonte documental não activa automaticamente uma regra fiscal. Parâmetros ausentes/ambíguos permanecem indeterminados.
+

UC-E — Parceiros colaboram numa parceria ou serviço

+

Um actor cria uma proposta; outro manifesta interesse; após aceitação, os participantes podem colaborar numa sala, trocar mensagens/documentos e acompanhar marcos. O balcão virtual segue padrão semelhante para pedidos de serviço: registo, análise, pedido de documentos, eventos, revisão e resolução.

+ +

6. Diagrama de classes (visão lógica)

+

O diagrama apresenta as classes de domínio principais, atributos representativos e operações. É uma vista funcional; não reproduz todos os campos nem métodos Laravel.

+
+ + +Userid, email, verified_at2FA / passkeys+ authenticate() +Investorid, user_id, profilecompany interests+ manageProfile() +Opportunitysector, slug, statuslocation, investment+ publish() +Sectorid, name, slugactive / published+ listOpportunities() +InterestRequesttarget, contact, consentstatus, submitted_at+ submit() / qualify() +Lead / Taskowner, next_actiondue_at, status+ assign() / complete() +Submissionowner, target, staterevisions, needs+ save() / submit() +Documenthash, sourceversion, status+ scan() +Project / Zoneterritory, geometryrelations, evidence+ validate() / publish() +Simulationquestionnaire, inputscenario, result, sources+ execute() / report() +TaxRuleVersionsource, dates, parametersreview / approval state+ resolveForPeriod() +AuditEventactor, entityaction, time+ record() + + +1 : 0..10..*11 : 0..*0..11..*0..*1 : 0..*1 : 0..* +
+

A relação exacta Investor/User, a associação Submission/target e os vínculos Document/entidade podem ser opcionais ou implementados por tabelas polimórficas/de junção; confirme no schema antes de gerar código ou migrações.

+ +

7. Diagrama de relacionamento (ER simplificado)

+
+ +SECTOROPPORTUNITYINTEREST_REQUESTINVESTOR +USERSUBMISSIONDOCUMENTAUDIT_EVENT +PROJECTCLUSTERINVESTMENT_ZONELEGAL_SOURCE +SIMULATIONTAX_RULE_VERSIONSIMULATION_RESULT + +1 : N1 : NN : 0..11 : NN : M* via links1 : NN : M*N : M*1 : N1 : N1 : N1 : N1 : Nassociationactorsource +
+

N:M = muitos-para-muitos, normalmente resolvido por tabela de associação. Ligações genéricas de documentos/auditoria podem não ser FKs directas. Este mapa é uma vista funcional, não um substituto do ERD integral em docs/investmoz/erd.mmd e do dicionário de dados.

+ +

8. Eventos e frequência

+ + + + + + + +
Evento/processoGatilhoFrequência confirmadaLeitura operacional
Escalar tarefas vencidasScheduler LaravelA cada 15 minutos; sem sobreposição configuradaCadência declarada em routes/console.php. O scheduler do servidor tem de estar activo.
Executar simulação (RunSimulation)Pedido de cálculo aceitePor pedido, via fila, afterCommitAssíncrono; volume depende da utilização e dos workers.
Scan de malware (ScanDocumentForMalware)Upload ou pedido de análise em fluxos suportadosPor documento, via fila; job únicoDepende de worker e scanner. Upload não prova análise concluída.
Comparação de compatibilidade MNEAlteração aplicável do negócioPor alteração aplicável, em fila de sombraJob identificado; frequência de alterações não medida.
Notificação de interesseRecepção de interesseDisparo não confirmadoJob NotifyInterestReceived existe, mas não foi localizada chamada dispatch().
Outbox/inbox e sincronização externaEvento/mensagem externaSem calendário operacional confirmadoEstrutura preparada; documentação indica sincronização real pendente.
Pesquisas, submissões, revisões e auditoriaAcção do visitante/utilizador/gestorSob procura ou acção; contagem indisponívelSem logs/analytics não se calculam ocorrências por período.
+

Frequência configurada não é frequência observada. Não foram disponibilizados logs, contagens de eventos da base activa, filas, analytics nem tráfego HTTP. Assim, eventos por hora/dia/mês, sazonalidade, falhas e utilizadores activos permanecem indeterminados. Não se extrapolam estes valores a partir de testes, seeders, screenshots ou schema.

+ +

9. Inventário dos 24 casos de uso

+ + + + + + + +
GrupoCasos
Portal e catálogoUC-01 Consultar página inicial e serviços; UC-02 Pesquisar sectores e oportunidades; UC-03 Consultar negócio existente.
Conta e jornadaUC-04 Criar conta/autenticar/recuperar acesso; UC-05 Manifestar interesse numa oportunidade; UC-06 Manifestar interesse num negócio; UC-07 Guardar oportunidade; UC-08 Manter submissão; UC-09 Submeter candidatura.
Negócios e CRMUC-10 Gerir negócio existente; UC-11 Tratar interesses no CRM.
Território e documentosUC-12 Gerir catálogo territorial; UC-13 Gerir zonas; UC-14 Carregar, verificar e publicar documento.
Simulação/fiscalidadeUC-15 Criar rascunho; UC-16 Executar simulação; UC-17 Gerir regra fiscal.
Serviços especializadosUC-18 Gerir educação e competências; UC-19 Assistência de terra; UC-20 Gerir parceria; UC-21 Usar balcão virtual.
TransversalUC-22 Usar IA com evidência; UC-23 Sincronizar sistemas externos; UC-24 Auditar alterações.
+

Os pré-requisitos, fluxos alternativos e tabelas associadas por UC encontram-se no ficheiro casos-de-uso-aplicacao-actual.md.

+ +

10. Integridade, segurança e limitações

+ + +

11. Fontes de análise

+ +

O inventário cobriu 981 caminhos listados por rg --files, excluindo vendor e node_modules. Isso descreve o repositório acessível, não anexos externos, conteúdo de armazenamento privado ou base de dados de produção.

+ diff --git a/docs/investmoz/casos-de-uso-aplicacao-actual.md b/docs/investmoz/casos-de-uso-aplicacao-actual.md new file mode 100644 index 00000000..9bceb9d7 --- /dev/null +++ b/docs/investmoz/casos-de-uso-aplicacao-actual.md @@ -0,0 +1,526 @@ +# Casos de uso da aplicação actual + +Este documento descreve os processos actualmente implementados ou previstos +pelas rotas, controladores, serviços e migrations existentes no projecto. +Não substitui regras legais nem autoriza publicação de dados. + +## 1. Actores + +| Actor | Responsabilidade | +|---|---| +| Visitante | Consulta o portal, oportunidades, negócios, zonas e documentos públicos. | +| Utilizador registado | Mantém perfil, rascunhos, submissões, favoritos e mensagens. | +| Investidor | Pesquisa oportunidades, manifesta interesse e acompanha candidaturas. | +| Gestor | Trata interesses, leads, tarefas, oportunidades e catálogo. | +| Revisor documental | Verifica documentos, malware, versões e autorização de divulgação. | +| Gestor territorial | Gere projectos, clusters, corredores, geografia e zonas. | +| Gestor fiscal | Gere fontes legais, versões de regras e parâmetros do simulador. | +| Gestor de educação | Gere competências, necessidades, cursos e propostas. | +| Parceiro institucional | Participa em parcerias, salas, mensagens, documentos e marcos. | +| Administrador | Gere utilizadores, permissões, configurações e instalação de módulos. | +| Sistema externo | Recebe/envi­a eventos através de outbox, inbox e sincronizações. | + +## 2. Visão geral do ciclo da aplicação + +```text +Portal público + -> consulta de catálogo + -> interesse, apoio ou simulação + -> autenticação/conta quando necessário + -> candidatura ou submissão + -> documentos e validação + -> CRM, tarefas e comunicação + -> decisão, parceria ou acompanhamento +``` + +Os principais agregados são `opportunities`, `existing_businesses`, +`interest_requests`, `investment_submissions`, `documents`, `investment_zones` +e `simulations`. + +## 3. UC-01 — Consultar a página inicial e serviços + +**Actor:** Visitante. + +**Pré-condições:** O portal está disponível. + +**Fluxo principal:** + +1. O visitante abre `/`. +2. O sistema apresenta a página inicial e os serviços publicados. +3. O visitante escolhe oportunidades, negócios, zonas, simulador, documentos, + apoio ou parcerias. +4. O sistema aplica apenas dados que estejam disponíveis para o público. + +**Dados:** `portal_resources`, `documents`, `opportunities`, `sectors`, +`existing_businesses`, `investment_zones`. + +**Resultado:** O visitante é encaminhado para o processo escolhido. + +## 4. UC-02 — Pesquisar sectores e oportunidades + +**Actor:** Visitante ou investidor. + +**Fluxo principal:** + +1. O actor consulta `/oportunidades` ou a API de oportunidades. +2. O sistema filtra por sector, localização, slug, estado e outros critérios. +3. O detalhe da oportunidade mostra perfil, território, relações, documentos + públicos e informação de investimento. +4. O actor pode iniciar uma manifestação de interesse ou guardar a oportunidade. + +**Dados:** `sectors`, `opportunities`, `opportunity_profiles`, +`opportunity_facets`, `opportunity_clusters`, `opportunity_corridors`, +`opportunity_projects`, `opportunity_locations`, `opportunity_favourites`. + +**Resultado:** Consulta pública ou início de UC-05/UC-06. + +## 5. UC-03 — Consultar um negócio existente + +**Actor:** Visitante ou investidor. + +**Fluxo principal:** + +1. O actor consulta `/negocios`. +2. O sistema lista negócios cujo estado e autorização permitem divulgação. +3. O actor abre o detalhe pelo `slug`. +4. O sistema apresenta apenas título, descrição, modalidade, localização, + objectos e documentos autorizados. +5. O actor pode iniciar uma manifestação de interesse. + +**Dados:** `existing_businesses`, `existing_business_objects`, +`existing_business_locations`, `existing_business_document_links`, +`documents`, `interest_requests`. + +**Regra:** Dados privados, mandatos e documentos não autorizados não são +expostos pelo portal público. + +## 6. UC-04 — Criar conta, autenticar e recuperar acesso + +**Actor:** Visitante/utilizador. + +**Fluxo principal:** + +1. O visitante cria uma conta com nome, email e palavra-passe. +2. O sistema cria `users`. +3. O utilizador confirma o email quando aplicável. +4. O utilizador inicia sessão. +5. O sistema aplica as políticas de autenticação, confirmação de palavra-passe + e, para operações protegidas, segundo factor. + +**Dados:** `users`, `passkeys`, `sessions`, `password_reset_tokens`. + +**Alternativas:** Registo rejeitado por email existente; palavra-passe +incorrecta; recuperação por token; desafio de dois factores. + +## 7. UC-05 — Manifestar interesse numa oportunidade + +**Actor:** Visitante ou investidor. + +**Fluxo principal:** + +1. O actor abre o formulário de interesse. +2. Informa contacto, oportunidade, modalidade, valor e mensagem. +3. O sistema valida os dados, consentimentos e alvo. +4. É criado `interest_requests`. +5. O sistema regista recibo/idempotência quando aplicável. +6. O sistema envia notificação ou evento de tratamento. + +**Dados:** `interest_requests`, `consents`, `interest_submission_receipts`, +`notifications`, `outbox_events`. + +**Estado inicial:** `received`, `submitted` ou equivalente configurado. + +**Resultado:** O interesse fica disponível para tratamento no CRM. + +## 8. UC-06 — Manifestar interesse num negócio existente + +**Actor:** Investidor. + +**Fluxo principal:** + +1. O investidor escolhe um `existing_business` publicado. +2. Selecciona a modalidade e, se aplicável, percentagem e intervalo de valor. +3. O sistema verifica que o negócio pode receber interesse. +4. Cria `interest_requests.existing_business_id`. +5. Regista consentimento para contacto e partilha da informação. +6. O caso passa para tratamento interno. + +**Dados:** `existing_businesses`, `interest_requests`, `investors`, `consents`. + +**Regra:** Um pedido não pode apontar simultaneamente para uma oportunidade e +para um negócio existente. + +## 9. UC-07 — Guardar uma oportunidade e manter espaço do investidor + +**Actor:** Utilizador autenticado. + +**Fluxo principal:** + +1. O utilizador abre uma oportunidade. +2. Escolhe guardar/iniciar no espaço do investidor. +3. O sistema regista a relação em `opportunity_favourites` ou inicia uma + submissão/dossier. +4. O utilizador consulta os seus itens em `/investidor` ou `/carteira`. + +**Dados:** `users`, `opportunity_favourites`, `investment_dossiers`, +`investor_accounts`, `investment_accounts`. + +## 10. UC-08 — Criar e manter uma submissão de investimento + +**Actor:** Investidor. + +**Pré-condições:** Utilizador autenticado e verificado. + +**Fluxo principal:** + +1. O investidor cria uma submissão. +2. O sistema cria `investment_submissions` com estado `draft`. +3. O investidor grava o payload e as necessidades específicas. +4. Pode adicionar anexos e mensagens. +5. O sistema cria eventos e revisões para manter histórico. +6. O investidor consulta ou actualiza a submissão. + +**Dados:** `investment_submissions`, `investment_specific_needs`, +`investment_submission_attachments`, `investment_submission_events`, +`investment_submission_revisions`, `investment_messages`, `documents`. + +## 11. UC-09 — Submeter candidatura + +**Actor:** Investidor. + +**Fluxo principal:** + +1. O investidor confirma os dados da submissão. +2. O sistema verifica campos obrigatórios, alvo e anexos. +3. A submissão muda de `draft` para `submitted`. +4. É associado ou criado o pedido de interesse, quando exigido. +5. O sistema cria evento de submissão e notifica a gestão. + +**Resultado:** A candidatura deixa de ser apenas rascunho e entra na fila de +tratamento interno. + +## 12. UC-10 — Gerir um negócio existente + +**Actor:** Investidor, proprietário ou gestor. + +**Fluxo principal:** + +1. O actor cria ou actualiza o negócio. +2. Regista modalidade, descrição, objectos, localização e documentos. +3. O sistema cria revisões e mantém o snapshot anterior. +4. Um gestor pode solicitar informação, rever ou rejeitar. +5. O negócio percorre o workflow configurado. +6. Apenas após validação e autorização poderá ser publicado. + +**Dados:** `existing_businesses`, `existing_business_objects`, +`existing_business_revisions`, `existing_business_reviews`, +`business_workflow_transitions`, `existing_business_mandates`, `documents`. + +**Estados possíveis:** `draft`, `submitted`, `in_review`, +`needs_information`, `approved`, `published`, `suspended`, `rejected`, +`withdrawn`, `archived`. + +## 13. UC-11 — Tratar interesses no CRM + +**Actor:** Gestor. + +**Fluxo principal:** + +1. O gestor abre a fila de interesses. +2. Consulta o pedido, consentimentos e alvo. +3. Atribui o caso a um responsável. +4. Converte o interesse em `leads`, quando aplicável. +5. Cria tarefas e actividades. +6. Actualiza o estado e regista o resultado. +7. Pode associar um `crm_opportunity` e continuar a negociação. + +**Dados:** `interest_requests`, `leads`, `investors`, `contacts`, +`crm_opportunities`, `tasks`, `activities`, `consents`. + +**Estados de interesse:** recebimento, qualificação, contacto, diligência, +negociação, conversão, recusa, cancelamento ou encerramento. + +## 14. UC-12 — Gerir catálogo territorial + +**Actor:** Gestor territorial. + +**Fluxo principal:** + +1. O gestor cria ou actualiza projectos, clusters e corredores. +2. Liga projectos a locais. +3. Liga projectos a clusters e corredores. +4. Cria cadeias de valor e lacunas de investimento. +5. Regista a fonte e o estado da relação. +6. Outro gestor pode validar ou revogar a relação. + +**Dados:** `projects`, `economic_clusters`, `value_chains`, +`value_chain_links`, `development_corridors`, `cluster_projects`, +`corridor_projects`, `corridor_clusters`, `investment_gaps`, `geo_locations`. + +## 15. UC-13 — Gerir zonas de investimento + +**Actor:** Gestor territorial com permissão e MFA quando exigido. + +**Fluxo principal:** + +1. Regista a fonte legal em `investment_legal_sources`. +2. Cria a zona em `investment_zones`. +3. Associa operador, categoria e localização. +4. Adiciona geometria, anexos e relações com projectos, clusters ou corredores. +5. Um revisor valida a informação. +6. A zona é publicada, suspensa ou revogada. +7. O sistema mantém revisões imutáveis. + +**Estados:** `draft`, `published`, `suspended`; validação `pending`, +`validated`, `historical`. + +**Dados:** `investment_zones`, `investment_legal_sources`, +`investment_zone_geometries`, `investment_zone_relations`, +`investment_zone_links`, `investment_zone_attachments`, `investment_zone_revisions`. + +## 16. UC-14 — Carregar, verificar e publicar documento + +**Actor:** Gestor documental. + +**Fluxo principal:** + +1. O gestor carrega o ficheiro. +2. O sistema preserva o original e calcula o hash. +3. Detecta duplicados e conflitos de versão. +4. Regista `documents` e, quando necessário, `document_versions`. +5. Executa análise antimalware. +6. O gestor revê classificação, datas, fonte e autorização. +7. O documento é associado ao negócio, candidatura, zona, projecto ou portal. +8. Só então pode ser disponibilizado publicamente. + +**Dados:** `documents`, `document_versions`, `document_malware_scans`, +`portal_resources`, `portal_resource_revisions` e tabelas `*_documents`. + +**Estados documentais:** pendente, limpo, infectado, rejeitado, privado, +publicável, publicado ou revogado. + +## 17. UC-15 — Criar rascunho de simulação + +**Actor:** Visitante ou utilizador. + +**Fluxo principal:** + +1. O actor abre o simulador. +2. O sistema cria ou recupera um cookie de recuperação. +3. Guarda os dados em `simulation_form_drafts`. +4. O actor pode continuar mais tarde. +5. Um utilizador autenticado pode reclamar o rascunho. +6. O rascunho pode ser ligado a um negócio existente, mediante autorização. + +**Resultado:** Dados incompletos permanecem como rascunho e não são tratados +como cálculo fiscal executado. + +## 18. UC-16 — Executar simulação + +**Actor:** Visitante ou utilizador. + +**Fluxo principal:** + +1. O actor submete os dados do simulador. +2. O sistema escolhe a versão do questionário. +3. Resolve os parâmetros fiscais elegíveis. +4. Cria `simulations` e `simulation_scenarios`. +5. Executa o cálculo através de job. +6. Guarda resultados, obrigações e fontes. +7. Gera relatório quando solicitado. +8. Regista auditoria e idempotência. + +**Dados:** `questionnaire_versions`, `simulations`, `simulation_scenarios`, +`simulation_results`, `simulation_obligations`, `simulation_reports`, +`simulation_jobs`, `simulation_result_sources`, `simulation_audit_events`. + +## 19. UC-17 — Gerir regra fiscal + +**Actor:** Autor, revisor, aprovador ou publicador fiscal. + +**Fluxo principal:** + +1. O autor cria uma versão da regra. +2. Associa a regra a uma fonte legal. +3. O revisor verifica expressão, datas e parâmetros. +4. O aprovador decide. +5. O publicador disponibiliza a versão. +6. O sistema regista cada transição. + +**Dados:** `simulation_tax_rule_versions`, `simulation_tax_rule_events`, +`investment_legal_sources`, `users`. + +**Regra:** Importar ou publicar um documento não activa automaticamente um +cálculo fiscal. + +## 20. UC-18 — Gerir educação e competências + +**Actor:** Gestor de educação. + +**Fluxo principal:** + +1. Mantém catálogo de competências, profissões, instituições e cursos. +2. Regista necessidades de formação de projectos. +3. Associa ocupações e competências. +4. Regista capacidades e oportunidades educativas. +5. Analisa lacunas. +6. Cria proposta de investimento educativo. + +**Dados:** `skills`, `occupations`, `training_needs`, `training_providers`, +`courses`, `education_opportunities`, `investment_gaps`, +`education_investment_proposals` e tabelas `skills_edu`. + +## 21. UC-19 — Abrir e tratar assistência de terra + +**Actor:** Investidor e gestor de assistência. + +**Fluxo principal:** + +1. O investidor cria um caso de assistência. +2. Regista localização, necessidade e documentos. +3. O gestor analisa o caso. +4. São registadas revisões, eventos e pedidos adicionais. +5. O caso é encaminhado ou encerrado. + +**Dados:** `land_assistance_cases`, `land_assistance_revisions`, +`land_assistance_events`, `land_assistance_documents`, `documents`, `users`. + +## 22. UC-20 — Criar e gerir parceria + +**Actor:** Investidor, organização ou parceiro institucional. + +**Fluxo principal:** + +1. O actor cria um rascunho de parceria. +2. Regista origem, sector, local e objectivo. +3. Outro actor manifesta interesse. +4. A candidatura é aceite ou recusada. +5. É aberta uma sala de parceria. +6. Os participantes trocam mensagens e documentos. +7. São definidos marcos, pagamentos ou acordo. +8. O sistema regista eventos e notificações. + +**Dados:** `portal_partnerships`, `partnership_origins`, +`partnership_locations`, `partnership_interests`, `partnership_rooms`, +`partnership_messages`, `partnership_documents`, `partnership_milestones`, +`partnership_events`, `partnership_notifications`. + +## 23. UC-21 — Usar o balcão virtual + +**Actor:** Utilizador autenticado e agente de atendimento. + +**Fluxo principal:** + +1. O utilizador abre um pedido no balcão. +2. O sistema cria um caso e associa o serviço. +3. O agente recebe o pedido. +4. São trocadas mensagens e solicitados documentos. +5. O caso passa por estados e revisões. +6. Eventos, notificações e pagamentos são registados. +7. O caso é resolvido ou encerrado. + +**Dados:** `desk_service_versions`, `desk_cases`, `desk_requests`, +`desk_documents`, `desk_events`, `desk_revisions`, `desk_messages`, +`desk_notifications`, `desk_institutional_links`, `desk_payments`. + +## 24. UC-22 — Usar inteligência artificial com evidência + +**Actor:** Gestor autorizado. + +**Fluxo principal:** + +1. O gestor activa a capacidade em `ai_controls`. +2. Regista uma fonte ou documento. +3. O sistema cria chunks da fonte. +4. O gestor inicia uma execução de IA. +5. O sistema grava `ai_runs`. +6. O resultado pode ser revisto ou receber feedback. +7. A aplicação mantém a fonte que suporta a resposta. + +**Dados:** `ai_controls`, `ai_sources`, `ai_chunks`, `ai_runs`, `ai_feedback`, +`documents`, `users`. + +## 25. UC-23 — Sincronizar com sistemas externos + +**Actor:** Sistema externo ou processo de integração. + +**Fluxo principal:** + +1. A aplicação gera um evento em `outbox_events`. +2. Um worker publica o evento. +3. O sistema externo responde ou envia evento para `inbox_events`. +4. A aplicação cria `sync_runs`. +5. Falhas ou divergências são registadas em `reconciliation_issues`. +6. O processo pode ser repetido de forma idempotente. + +## 26. UC-24 — Auditoria e controlo de alterações + +**Actor:** Sistema, gestor ou auditor. + +**Fluxo principal:** + +1. Uma operação protegida é executada. +2. O sistema identifica actor, entidade, acção e correlação. +3. Regista evento de auditoria. +4. Alterações de entidades versionadas geram revisão/snapshot. +5. O auditor consulta o histórico sem alterar o registo original. + +**Dados:** `audit_events`, `simulation_audit_events`, `investment_zone_revisions`, +`existing_business_revisions`, `investment_submission_revisions`, +`desk_revisions`, `outbox_events`. + +## 27. Regras transversais da aplicação + +- Dados privados exigem autenticação e autorização. +- Divulgação pública depende do estado de publicação e autorização registada. +- Documentos originais devem ser preservados. +- Hash, versão e proveniência devem permanecer associados ao documento. +- Relações jurídicas ou territoriais não validadas ficam pendentes. +- Rascunho não é submissão aprovada. +- Importação não é publicação. +- Publicação de documento não é activação de regra fiscal. +- Cálculos fiscais devem usar fonte e parâmetro identificados. +- Histórico e auditoria não devem ser apagados por rollback destrutivo. +- Operações de migração e testes devem usar base QA isolada. + +## 28. Mapa resumido dos processos + +```text +Visitante + -> consulta catálogo + -> interesse / apoio / simulação + +Investidor + -> conta + -> favoritos / dossier + -> submissão + -> documentos + -> mensagens + +Gestor + -> interesse + -> lead + -> tarefas + -> oportunidade CRM + -> decisão + +Gestor territorial + -> projecto / cluster / corredor + -> zona + -> geometria + -> fonte legal + -> validação / publicação + +Gestor fiscal + -> regra + -> revisão + -> aprovação + -> publicação + -> parâmetro usado pelo simulador + +Parceiros + -> parceria + -> candidatura + -> sala + -> mensagens / documentos / marcos +``` diff --git a/docs/investmoz/levantamento-funcional-e-eventos.md b/docs/investmoz/levantamento-funcional-e-eventos.md new file mode 100644 index 00000000..2c728dd9 --- /dev/null +++ b/docs/investmoz/levantamento-funcional-e-eventos.md @@ -0,0 +1,211 @@ +# Levantamento funcional, entidades e eventos — InvestMoz + +**Data do levantamento:** 9 de Outubro de 2026 +**Âmbito:** aplicação Laravel/React presente neste repositório. +**Base de evidência:** README, rotas, controladores, modelos, migrations e documentação em `docs/investmoz/`. A existência de uma tabela, rota ou documento não prova que a função esteja activa em produção. + +## 1. Resumo executivo + +O projecto é uma plataforma de investimento com área pública e área autenticada. Abrange descoberta de oportunidades e negócios, manifestações de interesse, gestão de candidaturas e carteira, CRM local, geografia e zonas de investimento, simulador e governação fiscal, catálogo documental, educação, assistência de terra, parcerias, balcão virtual, IA com fontes e integrações preparadas. + +O README apresenta a base inicial do portal (sectores, oportunidades e manifestações). O código actual e os documentos de domínio registam a extensão funcional posterior. Para o inventário detalhado dos fluxos, consultar [casos-de-uso-aplicacao-actual.md](casos-de-uso-aplicacao-actual.md), que identifica 24 casos de uso. Este documento complementa-o com uma visão de domínio, um diagrama resumido de relações e a frequência observável dos eventos. + +## 2. Âmbito e método + +Foi feito inventário dos caminhos acessíveis no repositório: **981 ficheiros** por `rg --files`, excluindo dependências geradas `vendor` e `node_modules`. Dentro da aplicação foram consultados, em particular, `routes/`, `app/Models/`, `app/Http/Controllers/`, `database/migrations/`, `database/seeders/` e `docs/investmoz/`. O número é uma contagem do inventário local nessa data, não um inventário de anexos externos ou de dados de produção. + +Classificação usada: + +- **Implementado no código:** rota, controlador, job, comando ou schema identificável. +- **Documentado/planeado:** descrito em documentação, sem prova suficiente de execução integrada. +- **Frequência de negócio desconhecida:** não há amostra de eventos de produção nem telemetria para calcular volume por hora/dia/mês. +- **Cadência técnica explícita:** periodicidade configurada no scheduler ou no mecanismo de fila. + +## 3. Actores e sistemas + +| Actor | Objectivo principal | Áreas usadas | +|---|---|---| +| Visitante | Consultar conteúdos públicos e iniciar pedidos | Portal, oportunidades, negócios, zonas, documentos, simulador | +| Investidor/utilizador | Manter perfil, favoritos, rascunhos, submissões, documentos e mensagens | Espaço do investidor, carteira, assistência, parcerias | +| Gestor de portal/CRM | Rever interesses, gerir leads, tarefas, catálogo e publicação | CRM local, gestão de portal | +| Gestor territorial | Manter projectos, clusters, corredores, relações, geografia e zonas | Catálogo territorial, GIS, zonas | +| Revisor documental | Conferir proveniência, versão, hash, autorização e análise antimalware | Biblioteca documental | +| Gestor fiscal | Rever fontes, parâmetros e versões das regras fiscais | Governação fiscal, simulador | +| Gestor de educação | Manter competências, necessidades, cursos, capacidades e propostas | Educação | +| Gestor/agente de assistência | Tratar pedidos de terra e pedidos do balcão virtual | Assistência de terra, balcão | +| Parceiro institucional | Participar em oportunidades/parcerias e colaborar em salas | Parcerias | +| Administrador | Gerir autenticação, segurança, configurações e permissões | Administração | +| Sistema externo/worker | Receber/enviar mensagens ou executar trabalho assíncrono | Outbox/inbox, filas, integrações | + +Papéis são uma leitura funcional dos fluxos. A autorização efectiva depende das policies, middleware e permissões implementadas, não apenas desta tabela. + +## 4. Catálogo de casos de uso + +O documento [Casos de uso da aplicação actual](casos-de-uso-aplicacao-actual.md) detalha pré-condições, fluxos e dados para cada caso. Índice consolidado: + +| ID | Caso de uso | Actor principal | Resultado | +|---|---|---|---| +| UC-01 | Consultar página inicial e serviços | Visitante | Entrada no serviço público autorizado | +| UC-02 | Pesquisar sectores e oportunidades | Visitante/investidor | Lista/detalhe e possível favorito/interesse | +| UC-03 | Consultar negócio existente | Visitante/investidor | Consulta da oferta divulgável | +| UC-04 | Criar conta, autenticar e recuperar acesso | Utilizador | Sessão autenticada/verificada | +| UC-05 | Manifestar interesse numa oportunidade | Visitante/investidor | Pedido recebido para tratamento | +| UC-06 | Manifestar interesse num negócio existente | Investidor | Pedido ligado ao negócio e consentimento | +| UC-07 | Guardar oportunidade e manter espaço do investidor | Utilizador | Favorito, dossier ou item na carteira | +| UC-08 | Criar e manter submissão de investimento | Investidor | Submissão em rascunho com histórico | +| UC-09 | Submeter candidatura | Investidor | Entrada em fila de tratamento | +| UC-10 | Gerir negócio existente | Proprietário/gestor | Registo revisto e eventualmente publicável | +| UC-11 | Tratar interesses no CRM | Gestor | Qualificação, lead, tarefa e seguimento | +| UC-12 | Gerir catálogo territorial | Gestor territorial | Projectos, clusters, corredores e relações | +| UC-13 | Gerir zonas de investimento | Gestor territorial/revisor | Zona validada, publicada ou suspensa | +| UC-14 | Carregar, verificar e publicar documento | Revisor documental | Documento preservado com estados independentes | +| UC-15 | Criar/retomar rascunho de simulação | Visitante/utilizador | Rascunho recuperável, sem cálculo implícito | +| UC-16 | Executar simulação | Visitante/utilizador | Resultado, obrigações, fontes e relatório | +| UC-17 | Gerir regra fiscal | Gestor fiscal | Versão de regra passa por revisão/aprovação | +| UC-18 | Gerir educação e competências | Gestor de educação | Catálogo, análise de lacunas e proposta | +| UC-19 | Abrir/tratar assistência de terra | Investidor/gestor | Caso acompanhado até encaminhamento/fecho | +| UC-20 | Criar e gerir parceria | Investidor/parceiro | Interesse, sala, mensagens, documentos e marcos | +| UC-21 | Usar balcão virtual | Utilizador/agente | Pedido de serviço acompanhado até resolução | +| UC-22 | Usar IA com evidência | Gestor autorizado | Execução rastreável ligada a fontes e feedback | +| UC-23 | Sincronizar sistemas externos | Worker/sistema externo | Eventos recebidos/enviados e divergências registadas | +| UC-24 | Auditar alterações | Sistema/gestor/auditor | Histórico e correlação para operações relevantes | + +## 5. Diagrama de entidades e relações + +Diagrama lógico resumido por domínios. As cardinalidades representam a estrutura documentada; algumas relações polimórficas, opcionais ou em tabelas de junção estão simplificadas. Para o ERD de schema detalhado, consultar [erd.mmd](erd.mmd), [data-dictionary.csv](data-dictionary.csv) e [table-catalog.csv](table-catalog.csv). + +```mermaid +erDiagram + USER ||--o{ INVESTOR : possui + USER ||--o{ SUBMISSION : cria + USER ||--o{ SIMULATION : executa + USER ||--o{ AUDIT_EVENT : origina + SECTOR ||--o{ OPPORTUNITY : classifica + OPPORTUNITY ||--o{ INTEREST_REQUEST : recebe + EXISTING_BUSINESS ||--o{ INTEREST_REQUEST : recebe + INVESTOR ||--o{ INTEREST_REQUEST : manifesta + INTEREST_REQUEST ||--o| LEAD : converte + LEAD ||--o{ CRM_TASK : acompanha + OPPORTUNITY ||--o{ SUBMISSION : referencia + SUBMISSION ||--o{ SUBMISSION_REVISION : versiona + SUBMISSION ||--o{ SUBMISSION_EVENT : regista + SUBMISSION ||--o{ DOCUMENT_LINK : anexa + PROJECT }o--o{ ECONOMIC_CLUSTER : associa + PROJECT }o--o{ DEVELOPMENT_CORRIDOR : associa + PROJECT ||--o{ INVESTMENT_GAP : identifica + INVESTMENT_ZONE ||--o{ ZONE_REVISION : versiona + INVESTMENT_ZONE ||--o{ ZONE_RELATION : liga + INVESTMENT_ZONE ||--o{ ZONE_ATTACHMENT : documenta + DOCUMENT ||--o{ DOCUMENT_VERSION : versiona + DOCUMENT ||--o{ MALWARE_SCAN : analisa + DOCUMENT }o--o{ PORTAL_RESOURCE : disponibiliza + SIMULATION ||--o{ SIMULATION_SCENARIO : contém + SIMULATION_SCENARIO ||--o{ SIMULATION_RESULT : produz + SIMULATION_RESULT ||--o{ SIMULATION_OBLIGATION : discrimina + SIMULATION_RESULT ||--o{ RESULT_SOURCE : fundamenta + TAX_RULE_VERSION }o--o{ LEGAL_SOURCE : fundamenta + PROJECT ||--o{ TRAINING_NEED : requer + SKILL }o--o{ OCCUPATION : relacionada + TRAINING_PROVIDER ||--o{ COURSE : oferece + USER ||--o{ LAND_ASSISTANCE_CASE : requer + PARTNERSHIP ||--o{ PARTNERSHIP_INTEREST : recebe + PARTNERSHIP ||--o| PARTNERSHIP_ROOM : abre + PARTNERSHIP_ROOM ||--o{ PARTNERSHIP_MESSAGE : contém + DESK_CASE ||--o{ DESK_EVENT : regista + AI_SOURCE ||--o{ AI_CHUNK : divide + AI_SOURCE ||--o{ AI_RUN : suporta + OUTBOX_EVENT }o..|| SYNC_RUN : processa + SYNC_RUN ||--o{ RECONCILIATION_ISSUE : detecta +``` + +### 5.1 Domínios e entidades nucleares + +| Domínio | Entidades nucleares | Relações principais | +|---|---|---| +| Identidade e acesso | `users`, `passkeys`, sessões, organizações, memberships | Utilizador possui perfil e inicia operações protegidas | +| Catálogo público | `sectors`, `opportunities`, catálogos de referência, recursos do portal | Sector classifica oportunidades; publicação controla exposição | +| Negócios existentes | `existing_businesses`, objectos, locais, revisões, mandatos | Negócio tem objectos/locais/documentos e workflow próprio | +| Investidor e CRM | `investors`, `interest_requests`, `leads`, `contacts`, oportunidades CRM, tarefas | Interesse pode converter-se em lead e gerar tarefas/actividades | +| Carteira e submissões | dossiers, `investment_submissions`, necessidades, revisões, eventos, mensagens, anexos | Submissão pertence a utilizador e liga-se a oportunidade/negócio | +| Território e GIS | `projects`, `economic_clusters`, `development_corridors`, `geo_locations`, `value_chains`, `investment_gaps` | Relações muitos-para-muitos documentam associação territorial/económica | +| Zonas de investimento | `investment_zones`, fontes legais, geometrias, relações, anexos, revisões | Zona tem localização, evidência, relações e estado de validação/publicação | +| Documentos | `documents`, versões, scans, associações por domínio, recursos do portal | Documento pode ser associado a várias entidades; disponibilidade, estado documental e uso em cálculo são independentes | +| Simulação e fiscalidade | rascunhos, `simulations`, cenários, resultados, obrigações, fontes, regras versionadas | Execução usa versões/parâmetros elegíveis e preserva as fontes do resultado | +| Educação | skills, occupations, providers, courses, training needs/capacity, propostas | Projectos expressam necessidades relacionadas com competências e formação | +| Serviços e colaboração | casos de terra, balcão virtual, parcerias, salas, mensagens, documentos, marcos | Casos e salas mantêm eventos e participantes próprios | +| IA e governação | controlos, fontes/chunks, execuções, feedback, auditoria | Execução de IA deve poder ser rastreada às fontes e ao actor | +| Integrações | `outbox_events`, `inbox_events`, `sync_runs`, reconciliações | Eventos são idempotentes/correlacionáveis; desenho de schema não prova integração activa | + +## 6. Eventos e frequência + +### 6.1 Frequência explicitamente configurada + +| Evento/processo | Gatilho | Frequência/cadência no código | Natureza e observação | +|---|---|---|---| +| Escalar tarefas vencidas (`investmoz:escalate-overdue-tasks`) | Scheduler Laravel | **A cada 15 minutos**, com `withoutOverlapping()` | Única periodicidade de scheduler encontrada em `routes/console.php`; execução real requer scheduler/cron activo | +| Executar simulação (`RunSimulation`) | Pedido de cálculo aceite | Por submissão, via fila, `afterCommit` | Assíncrono; frequência depende da procura e de workers activos | +| Analisar documento (`ScanDocumentForMalware`) | Upload/solicitação de scan em fluxos suportados | Por documento, via fila, `afterCommit`; job único por identidade configurada | Cadência sob procura; requer worker e scanner configurados. Upload/publicação não confirma scan limpo | +| Comparar compatibilidade MNE (`CompareMneBusiness`) | Alteração de negócio que agenda comparação | Por alteração aplicável, em fila específica e `afterCommit` | Trabalho assíncrono/sombra; volume real desconhecido | +| Notificar recepção de interesse (`NotifyInterestReceived`) | Disparo esperado após recepção de interesse | Job existe, mas não foi localizada chamada a `dispatch()` no código consultado; frequência de execução não confirmada | Tratar como capacidade prevista até localizar/activar o disparo; entrega efectiva também depende de configuração e worker | +| Auditoria, revisões e eventos de domínio | Acção de utilizador/sistema | No momento da operação que os gera | Orientado a evento; não há taxa histórica neste levantamento | +| Outbox/inbox e sincronização externa | Evento de domínio ou mensagem externa | Sem periodicidade operacional confirmada neste código/documentação consultada | Estrutura preparada; documentação aponta sincronização externa real como pendente/não activada | + +### 6.2 Frequência por categoria de actividade + +| Categoria | Frequência funcional esperada | O que é possível afirmar | +|---|---|---| +| Leituras públicas (home, catálogo, oportunidade, negócio, mapas/referências) | Sob procura do visitante | Há endpoints/páginas; sem logs ou analytics não se quantificam consultas | +| Escritas de investidor (interesses, favoritos, submissões, mensagens, perfil) | Sob acção do utilizador | São iniciadas por pedido explícito; não há volume observado disponível | +| Gestão (revisão, publicação, CRM, regras, zonas, catálogo) | Sob trabalho de gestores autorizados | Fluxos e protecções documentados; frequência por papel não medida | +| Simulação e rascunhos | Sob utilização do simulador; rascunhos podem ser actualizados/retomados | Rota e jobs encontrados; não assumir execução periódica nem cálculo fiscal por guardar rascunho | +| Uploads e análise documental | Sob envio/reanálise de documento | Job de scan é disparado por fluxos suportados; scan e publicação são estados distintos | +| Auditoria | Sob operações auditadas | A frequência acompanha as operações instrumentadas; cobertura total precisa de confirmação por fluxo | +| Regras fiscais e fontes | Sob processo de revisão/aprovação e alteração normativa | Não há calendário fixo; fonte publicada não activa automaticamente cálculo | +| Integrações externas | Não determinável/activação pendente | Tabelas de integração e documentação não são prova de entrega ou sincronização real | + +### 6.3 Frequência observada versus frequência de execução + +Não foram disponibilizados logs, contagens de `audit_events`, filas, analytics, pedidos HTTP ou exportação da base activa. Por isso, **não é possível apresentar eventos por hora/dia/mês, sazonalidade, taxa de falhas ou utilizadores activos**. A cadência de 15 minutos é apenas o intervalo configurado para o comando agendado. Para apurar frequência real, recolher métricas autorizadas por tipo de evento, intervalo temporal e resultado, sem expor dados pessoais; documentar período da amostra, filtros, retenção e origem. Não inferir métricas a partir de seeders, testes, screenshots ou schema. + +## 7. Sequência de alto nível + +```text +Visita pública + -> pesquisa catálogo/oportunidades/negócios/território + -> interesse, candidatura, assistência ou simulação + -> autenticação e consentimento quando exigidos + -> gravação do pedido/rascunho e histórico + -> trabalho assíncrono quando aplicável (scan, cálculo, notificação) + -> revisão por responsável autorizado + -> decisão, comunicação ou publicação com autorização + -> auditoria e eventual integração externa homologada +``` + +## 8. Regras transversais que afectam os fluxos + +- Disponibilidade para consulta, situação jurídica/documental e uso em regra/cálculo são estados independentes. +- Importar ou publicar documento não activa regra nem cálculo fiscal. +- Relações sem citação/evidência verificada devem ficar pendentes e identificadas. +- Guardar um rascunho não equivale a submeter ou aprovar. +- A divulgação obedece à autorização registada e ao seu âmbito. +- Documento original, proveniência, identificador, edição/data, hash e histórico devem ser preservados; não marcar autenticidade, vigência, direitos ou scan como confirmados sem evidência. +- Integração desenhada (outbox/inbox) não equivale a sincronização activa. +- Alterações a dados activos exigem confirmação de backup/restauro e acção autenticada necessária; testes/migrações devem usar exclusivamente base QA isolada, conforme `AGENTS.md`. + +## 9. Limitações e pontos para validação + +1. A cobertura implementada de cada UC varia; alguns documentos descrevem trabalho parcial, proposto ou bloqueado. Consultar `docs/investmoz/validation.md`, `completion-audit-2026-10-04.md`, `delivery-gaps.md` e os README de cada domínio antes de declarar operação concluída. +2. O ERD resumido não substitui constraints/FKs, cardinalidades exactas, escopos de acesso ou estados enumerados no schema e OpenAPI. +3. A frequência real de utilização e dos eventos de negócio permanece **indeterminada** sem telemetria operacional. +4. Execução do scheduler, workers, ClamAV, notificações, SuiteCRM e restantes conectores depende de configuração e operação externa verificável. +5. O inventário desta tarefa é do repositório, não dos ficheiros/anexos em armazenamento externo nem da base de dados de produção. + +## 10. Fontes locais principais + +- [README do projecto](../../README.md) +- [Casos de uso detalhados](casos-de-uso-aplicacao-actual.md) +- [ERD do schema reconciliado](erd.mmd) +- [Arquitectura e migrations](architecture-and-migrations.md) +- [Validação](validation.md) e [auditoria de conclusão](completion-audit-2026-10-04.md) +- Rotas: `routes/web.php`, `routes/api.php`, `routes/investment.php`, `routes/partnerships.php`, `routes/land-assistance.php`, `routes/investment-zones.php`, `routes/territorial-registry.php` +- Cadência: `routes/console.php`; trabalhos assíncronos em `app/Jobs/` diff --git a/resources/css/app.css b/resources/css/app.css index d5cbc229..26fc0aa8 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -9,6 +9,220 @@ @import './tempo-header.css'; +/* Institutional shell adapted from Tempo; page content keeps its own theme. */ +.tempo-header { + position: sticky; + top: 0; + z-index: 40; + background: #090909; + color: #fff; +} +.tempo-header-inner { + grid-template-rows: 84px; +} +.tempo-logo-link { + display: inline-flex; + align-items: center; + width: 140px; + border-radius: 0.25rem; +} +.tempo-nav-trigger { + display: flex; + min-height: 48px; + align-items: center; + gap: 0.5rem; + padding: 0.6rem 0.75rem; + border-radius: 0.5rem; + font-size: 0.9375rem; + font-weight: 600; + color: #eee; + transition: + color 0.2s, + background 0.2s; +} +.tempo-nav-trigger:hover, +.tempo-nav-trigger[data-state='open'] { + background: #ffffff0d; + color: #fff; +} +.tempo-nav-trigger[data-current-group] { + color: #fff; + box-shadow: inset 0 -2px #ed1c24; +} +.tempo-nav-trigger[data-state='open'] > svg { + transform: rotate(180deg); +} +@media (max-width: 640px) { + .tempo-nav-trigger { + gap: 0.25rem; + padding-inline: 0.25rem; + font-size: 0.8125rem; + } + .tempo-nav-trigger > svg { + width: 12px; + height: 12px; + } +} +.tempo-utility-button { + display: flex; + min-height: 40px; + align-items: center; + gap: 0.4rem; + padding: 0.4rem; + border-radius: 0.5rem; + font-size: 0.75rem; + color: #e2e8f0; +} +.tempo-utility-button:hover { + background: #ffffff10; +} +.tempo-header-social { + display: flex; + width: 30px; + height: 40px; + align-items: center; + justify-content: center; + color: var(--social-color); + transition: + transform 0.2s, + opacity 0.2s; + border-radius: 0.4rem; +} +.tempo-header-social:hover { + transform: translateY(-2px); + opacity: 0.8; +} +@media (max-width: 360px) { + .tempo-header-social { + width: 26px; + } +} +.tempo-login-button { + display: inline-flex; + min-height: 40px; + align-items: center; + gap: 0.5rem; + border: 1px solid #ffffff50; + border-radius: 0.4rem; + padding: 0.5rem 0.85rem; + font-size: 0.8rem; + font-weight: 600; + color: #fff; + transition: + background 0.2s, + border-color 0.2s; +} +.tempo-login-button:hover { + background: #ed1c24; + border-color: #ed1c24; +} +.tempo-header-actions { + order: 2; + display: flex; + align-items: center; + gap: 0.5rem; + margin-left: auto; +} +.tempo-interest-button { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 40px; + padding: 0.5rem 0.75rem; + border: 1px solid #ed1c24; + border-radius: 0.4rem; + background: #ed1c24; + color: white; + font-size: 0.75rem; + font-weight: 600; + white-space: nowrap; + transition: background 0.2s; +} +.tempo-interest-button:hover { + background: #c9151c; +} +.tempo-panel-summary { + order: 4; + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; + width: 100%; + min-height: 44px; + padding-block: 0.5rem; + border-top: 1px solid #ffffff1a; + font-size: 0.75rem; +} +.tempo-panel-summary a { + color: #fff; + text-underline-offset: 3px; +} +.tempo-panel-summary a:hover { + text-decoration: underline; +} +.tempo-panel-summary span { + color: #cbd5e1; + font-size: 0.6875rem; + white-space: nowrap; +} +@media (max-width: 480px) { + .tempo-header-actions { + flex-direction: column; + align-items: flex-end; + padding-block: 0.65rem; + } +} +@media (min-width: 640px) { + .tempo-header-inner { + grid-template-rows: 90px; + } + .tempo-logo-link { + width: 160px; + } +} +@media (min-width: 1280px) { + .tempo-header-inner { + grid-template-rows: 96px; + } + .tempo-logo-link { + width: 152px; + } + .tempo-header-actions { + order: 6; + margin-left: 0; + } + .tempo-header-inner .tempo-nav-trigger { + padding-inline: 0.5rem; + font-size: 0.9375rem; + } + .tempo-panel-summary { + order: 0; + flex-direction: column; + align-items: flex-start; + justify-content: center; + gap: 0.1rem; + width: auto; + min-width: 102px; + border-top: 0; + border-left: 1px solid #ffffff1a; + padding-left: 0.75rem; + } +} +@media (min-width: 1440px) { + .tempo-header-inner { + grid-template-rows: 102px; + } + .tempo-logo-link { + width: 168px; + } + .tempo-header-inner .tempo-nav-trigger { + font-size: 1rem; + } +} +.tempo-header :is(a, button):focus-visible { + outline: 2px solid #fff; + outline-offset: 4px; +} .tempo-dropdown { z-index: 60; border: 1px solid #e2e8f0;