# PLATAFORMA — Plano de Migração, Estimativas e Riscos

> **Continuação de** `06-MIGRACAO-MODERNA.md`, que traz a tabela de
> equivalência Laravel 5.5 → 11/12 e as decisões de arquitetura propostas
> (DTOs, Actions, Policies, Enums, Casts, API Resources, Sanctum, filas,
> widgets/slots).

---

## 3. Ordem de migração por módulo

Do mais estável ao mais arriscado. A ordem segue a maturidade do legado: quanto
mais maduro e testado o módulo, mais cedo ele entra.

### Onda 1 — Fundação (sem módulo de negócio)

| Passo | Entrega | Depende de |
|---|---|---|
| 1.1 | Esqueleto `/src` (core · services · layout · modules), PSR-4 **sem classmap** | ADR-003, ADR-013 |
| 1.2 | Runtime em containers (web · FPM · Valkey · PG 18) | ADR-005, ADR-007 |
| 1.3 | Quality gate (PHPStan max + Pint + PHPUnit + PCOV) | ADR-023, ADR-040, ADR-038 |
| 1.4 | Observabilidade (JSON log, `X-Request-ID`, RFC 7807) | ADR-024 |
| 1.5 | Core: contratos, autodescoberta de módulos, mensageria | ADR-014, ADR-007 |

### Onda 2 — Piloto e módulos estáveis

| # | Módulo | Slug | Risco | Justificativa do risco |
|---|---|---|---|---|
| 1 | **Notícias** | `noticias` | Baixo | Escolhido como piloto no plano 13 — valida domínio, mídia, listagem/detalhe, SEO, RSS, cache. Contém `contents` (a tabela central), mas a lógica editorial é simples. |
| 2 | **Glossário** | `glossario` | Baixo | CRUD + listagem por letra; 1 controller, 1 view SQL, 1 model. |
| 3 | **Telefones Úteis** | `telefones-uteis` | Baixo | CRUD simples com view SQL. |
| 4 | **Perguntas Frequentes** | `perguntas-frequentes` | Baixo | CRUD + view SQL. |
| 5 | **Páginas Estáticas** | `paginas-estaticas` | Baixo | CRUD + slug. |
| 6 | **Avisos** | `avisos` | Baixo | CRUD sobre `contents`. |
| 7 | **Banners** | `banners` | Baixo | CRUD + upload de imagem. |
| 8 | **Destaques** | `detaques` | Baixo | CRUD + ordenação. |
| 9 | **Redes Sociais** | `redes-sociais` | Baixo | CRUD. |
| 10 | **Atas e Pontos de Frequência** | `atas-e-pontos-de-frequencia` | Baixo | Leitura de view + 2 níveis de detalhe. |
| 11 | **Pauta do Dia** | `pauta-do-dia` | Baixo | Leitura de view. |
| 12 | **Sessões** | `sessoes` | Baixo | Leitura de view. |
| 13 | **Agenda de Eventos** | `agenda-de-eventos` | Baixo | CRUD + categorias. |
| 14 | **Enquetes** | `enquetes` | Médio | CRUD + enquete respondida (exibe resultado). |
| 15 | **Vereadores** | `vereadores` | Médio | 5 recursos de permissão; volume de dados pequeno. |
| 16 | **Legislação** | `legislacao` | Médio | Hierarquia de 3 níveis + filtros + exportação. |
| 17 | **Publicações** | `publicacoes` | Médio | Hierarquia + filtro por período + exportação. |
| 18 | **Licitações Antigas** | `licitacoes-antigas` | Médio | Somente leitura; útil para validar o padrão de view legada → Resource. |
| 19 | **Transparência Fiscal** | `transparencia-fiscal` | Médio | View com `CASE` + filtro por categoria. |
| 20 | **Licitações** | `licitacoes` | **Alto** | `biddings` + 3 catálogos + pivot de anexos + `DB::raw` com `concat`/`to_char` + `orderByRaw` com regex em `number`. |
| 21 | **Contratos / Propostas / Proponentes** | (ligados a licitações) | **Alto** | SQL crudo mais pesado do legado (`v6/app/Http/Controllers/Prefecture/ContractController.php:67-74`, `ProposalController.php:68`). |
| 22 | **Diário Oficial** | `diario-oficial` | **Alto** | PDF (Imagick + FPDI + TCPDF), certificados, áreas/ subáreas, geração de PDF **síncrona** → fila. Tem documentação própria em `v6/wiki/modules/DiarioOficial/` (18 arquivos) e suíte E2E dedicada. |
| 23 | **Requerimentos / Requerimento de Diárias** | `requerimentos`, `requerimento-de-diarias` | Médio | Fluxo com status e anexos. |
| 24 | **Carta de Serviços** | `carta-de-servicos` | **Alto** | 12 tabelas `service_letter_*`, 8 controllers, geração de PDF, temas, canais, etapas. |
| 25 | **Ouvidoria** | `ouvidoria` | **Alto** | PII (CPF/CNPJ), 8 tabelas, máscaras, anexos, relatórios estatísticos, `DB::raw` com `interval`. |
| 26 | **Solicitações LAI (e-SIC)** | `solicitacoes-lai` | **Alto** | PII + prazos legais + status + anexos. |
| 27 | **Formulários Dinâmicos** | `formularios-dinamicos` | **Alto** | Motor de questionário dinâmico (11 tabelas, enums, tipos de pergunta). |
| 28 | **A Instituição / A Cidade / Órgãos / Secretarias** | `a-instituicao`, `a-cidade`, `orgaos`, `secretarias` | Médio | Árvore de conteúdo + páginas por secretaria. |
| 29 | **Unidades de Atendimento / Unidade Gestora** | `unidades-de-atendimento`, `unidade-gestora` | Médio | CRUD + vínculos. |
| 30 | **Feriados Municipais** | `feriados-municipais` | Baixo | CRUD + calendário. |
| 31 | **Comitê de Investimentos** | `comite-de-investimentos` | Médio | Leitura de view. |
| 32 | **TV Câmara / Transmissões** | `tv-camara`, `transmissoes` | Médio | Vídeo + iframe. |
| 33 | **Acesso Rápido** | `acesso-rapido` | Baixo | CRUD + ordenação. |
| 34 | **Mais Conteúdos** | `mais-conteudos` | Baixo | apenas umbrella de `category_contents`. |
| 35 | **Servidor** | `servidor` | Médio | Dados de servidores públicos (PII parcial). |
| 36 | **Fornecedores** | `fornecedores` | Médio | CRUD + view. |
| 37 | **E-Vacina** | `e-vacina` | Baixo | CRUD. |
| 38 | **Newsletters** | `newsletters` | Baixo | Cadastro de e-mail + envio. |
| 39 | **LGPD** | `lgpd` | Médio | Política de privacidade + barra; tem ADR-019 dedicada na v7. |
| 40 | **Menus do Site** | `menus-do-site` | Médio | CRUD de menu + itens; legado com `link` e `menu` (2 recursos). |
| 41 | **Configurações da Instituição / Temas e Cores / Outras Configurações** | `configuracoes-da-instituicao`, `temas-e-cores`, `outras-configuracoes` | **Alto (arquitetural)** | São a **fonte da verdade de runtime** (`configurations`). Precisam sair **antes** dos módulos que os consomem. |
| 42 | **Usuários / Logs / Suporte / Manual / Novidades** | `usuarios`, `logs-do-sistema`, `suporte`, `manual-do-sistema`, `novidades` | Médio | Dependem de `cms_users` (ADR-037) e da trilha de auditoria (ADR-035). |
| 43 | **Drive** | `drive` | Baixo | Integração externa (Google Drive) — sem equivalente no repositório atual. |
| 44 | **VIAP** | `viap` | Médio | Módulo novo da v6, ainda instável (seed `ViapSeeder.php` cria o módulo). |

### 3.1 Módulos exclusivos da v5 — **não migrar**

Verificado por diff de `information_schema.tables` e de
`v6/app/Http/Controllers/**`:

| Módulo v5 | Evidência da remoção |
|---|---|
| Obras (`works`) | Tabelas `works`, `work_categories`, `work_statuses`, `work_archives`; controllers `Portal/WorksController.php`, `Prefecture/Works/WorkController.php` — **só na v5** |
| Obras Paralisadas | `obras_paralisadas`; `Portal/ObrasParalisadasController.php` — só na v5 |
| Concursos PSS | `concursos_pss`; `Portal/ConcursosPssController.php` — só na v5 |
| Estagiários | `estagiarios`; `Portal/EstagiariosController.php` — só na v5 |
| Fila de espera SUS | `fila_espera_sus`; `Portal/FilaEsperaSusController.php` — só na v5 |
| Licitantes Sancionados | `licitantes_sancionados`; `Portal/LicitantesSancionadosController.php` — só na v5 |
| Terceirizados | `outsourceds`; `Portal/OutsourcedController.php` — só na v5 |
| Gemini (IA) | `Prefecture/GeminiController.php`, `Http/Requests/GeminiPromptRequest.php` — só na v5 |
| Relatório Estatístico Ouvidoria | `relatorios_estatisticos_ouvidoria`; `Prefecture/RelatorioEstatisticoOuvidoriaController.php` — só na v5 |
| Arquivo (categorias) | `archive_categories`; `Prefecture/ArchiveCategoryController.php` — só na v5 |

**Regra:** por ADR-042 (sem retrocompatibilidade), esses módulos **não entram**
na v7. A decisão de produto (reintroduzir ou não) precisa ser confirmada pelo
negócio — ver `08-GAPS-E-DIVIDAS.md`.

### 3.2 Nomenclatura de pasta por módulo

Padrão da v7 (ADR-014): `src/modules/{Grupo}/{Modulo}/`, com `Grupo`determinando
o agrupamento no menu do CMS. Mapeamento sugerido para os 56 slugs:

| Grupo | Módulos |
|---|---|
| `Publicacoes` | `noticias`, `publicacoes`, `legislacao`, `diario-oficial`, `destaques`, `mais-conteudos`, `banners`, `avisos` |
| `Institucional` | `a-instituicao`, `a-cidade`, `orgaos`, `secretarias`, `unidades-de-atendimento`, `unidade-gestora`, `feriados-municipais`, `comite-de-investimentos`, `tv-camara`, `transmissoes` |
| `Transparencia` | `transparencia-fiscal`, `licitacoes`, `licitacoes-antigas`, `contratos`, `requerimentos`, `requerimento-de-diarias`, `carta-de-servicos`, `viap` |
| `Atendimento` | `ouvidoria`, `solicitacoes-lai`, `formularios-dinamicos`, `suporte` |
| `Conteudo` | `glossario`, `perguntas-frequentes`, `telefones-uteis`, `paginas-estaticas`, `redes-sociais`, `enquetes`, `agenda-de-eventos`, `sessoes`, `pauta-do-dia`, `atas-e-pontos-de-frequencia`, `vereadores`, `newsletters` |
| `Infraestrutura` | `configuracoes-da-instituicao`, `temas-e-cores`, `outras-configuracoes`, `lgpd`, `e-vacina`, `fornecedores`, `drive`, `menus-do-site`, `logs-do-sistema`, `manual-do-sistema`, `novidades`, `usuarios`, `servidor` |

---

## 4. Estimativa de esforço por área

Base: complexidade observada no legado (nº de controllers, models, views SQL,
SQL cru, tabelas, rotas) e peso da reescrita (não há compatibilidade, ADR-042).

**Escala:** S (≤ 2 dias) · M (3–6 dias) · L (1–2 semanas) · XL (> 2 semanas).

| Área | Escala | Justificativa (métrica observada) |
|---|---|---|
| Fundação (`/src`, Core, contracts, discovery) | **XL** | 43 ADRs, 6 services, 4 camadas; decisão de arquitetura já tomada, execução ainda não. |
| Design system + layout engine (slots) | **XL** | 6 temas Blade (889 Blades só nos modelos) → 1 design system + engine de slots. |
| CMS shell próprio | **L** | Substituir AdminLTE 1.22 + AngularJS 1.x (452 Blades `prefecture/**` + 62 `admin/**`). |
| Autenticação + autorização | **L** | Trocar Sentinel (roles + permissões + `resources`/`modulos`) por sessão nativa + Gate + 4 ações. |
| Migrations + schema novo | **L** | 358 migrations, 138 tabelas, 75 views → novo schema com `uuid`, `timestamptz`, JSONB. |
| Diário Oficial (módulo) | **XL** | PDF (Imagick+FPDI+TCPDF), 8 tabelas, certificados, 2 controllers de portal + 6 de CMS, E2E dedicado. |
| Carta de Serviços | **XL** | 12 tabelas, 8 controllers, PDF, 8 sub-rotas, temas. |
| Ouvidoria + LAI | **L** | 2 módulos, 9 tabelas, PII, máscaras, anexos, relatórios. |
| Formulários Dinâmicos | **L** | 11 tabelas, motor de questionário, 2 enums, tipos configuráveis. |
| Licitações + Contratos + Propostas | **L** | 8 tabelas, 3 catálogos, 2 pivots, SQL cru pesado. |
| Transparência Fiscal | **M** | 1 view SQL com `CASE` + filtro por categoria + grid. |
| Notícias (piloto) | **M** | 1 tabela nuclear (`contents`) + galeria + destaque + carrossel + SEO + RSS. |
| API dados abertos | **M** | 5 endpoints, 6 Resources, OpenAPI. |
| Blobs / storage / mídia | **L** | 2.026 `.js`, uploads, WebP, galeria; migração para S3. |
| Observabilidade + auditoria | **M** | JSON log, RFC 7807, `X-Request-ID`, trilha imutável. |
| Testes (≥ 90% + mutation) | **L** | 30 arquivos de teste hoje; gate PCOV + `infection` exige cobertura real. |
| E2E | **M** | Playwright já existe (`v6/tests-e2e/`), reaproveitar padrões. |
| Deploy / operação | **M** | CI GitLab já existe; alinhar com `up_prod.sh` e runbooks da v7. |

**Total estimado: 60–90 dias-equipe** para a reconstrução funcional completa
das 3 camadas, excluindo curadoria editorial de conteúdo.

---

## 5. Riscos e decisões de equivalência funcional (o que NÃO pode mudar)

| Item | Contrato público | Onde está hoje | Regra para a v7 |
|---|---|---|---|
| **URLs do portal** | `/noticias`, `/noticia/{slug}`, `/transparencia-fiscal`, `/licitacoes`, `/diario-oficial`, `/ouvidoria`, `/carta-de-servicos`… | `v6/routes/web.php` | Preservar os 228 URIs; o que mudar, redirect **301** (`seo.redirect`, já existente na v7) |
| **Payload da API** | chaves `titulo`, `autor`, `fonte`, `data_publicacao`, `descricao`, `interacoes`, `slug`, `arquivos` | `v6/app/Http/Resources/Swagger/V1/Portal/NewResource.php` | Preservar o formato ou versionar (`/api/v2`) |
| **Semântica de `status`** | `contents.status` booleano = publicado | `v6/app/Http/Model/Prefecture/Content.php` | Manter o efeito observável (publicado/rascunho) |
| **Regra do carrossel** | `layouts.section = 'tags'` → mostra destaques em vez de recentes | `v6/app/Http/Traits/NewsTrait.php:178` | Ter equivalente funcional via configuração de slot |
| **Contagem de cliques** | `contents.clicks` incrementa e alimenta "Mais Lidas" | `v6/app/Http/Traits/GetInformationsPrefectureTrait.php` | Preservar; avaliar cache/async na v7 |
| **Publicação agendada** | `publication_date` futura esconde do portal | trait `byPublication()` | Preservar com `timestamptz` |
| **HTML de layout no banco** | `layouts.value` (HTML) **não é mais válido** | `v6/app/Http/Controllers/Prefecture/LayoutController.php` | **Muda** — ADR-016/017 (tema é dado, sem HTML no banco). Mudança **declarada**, não silenciosa. |
| **Filtro de preservação delayout** | `layout` = `modelo1`..`modelo6` | `configurations.layout` | Substituir por `LayoutPreset`; manter os **6 presets** como opção inicial, para não perder a identidade visual do município |
| **Permissões** | nomes no formato `{recurso}.{ação}` | `resources.slug` | **Mudam** de forma explícita: `{modulo}.{acao}` com 4 ações (ADR-033). Recriar os perfis existentes no `cms_users`. |
| **Login** | `POST /login` do CMS | `v6/routes/basepro.php` | `POST /cms.login` na v7 (domínio próprio) — ADR-037 |
| **Ordem de widgets** | ordem manual do layout | `layouts.order` | Preservar a **capacidade**; implementação via JSONB de slots |

---

## 6. Referências

| Item | Caminho |
|---|---|
| ADRs da v7 (portal) | `public-v7/wiki/adr/` |
| ADRs da v7 (CMS) | `cms/wiki/` |
| Plano de implementação | `public-v7/wiki/plan/00-index.md` |
| Fases de execução | `public-v7/wiki/implementation/README.md` |
| Design system canônico | `public-v7/wiki/DESIGN.md` |
| Backlog de módulos | `public-v7/wiki/backlog/` |
| Composição do portal v7 | `public-v7/composer.json` |
| Composição do CMS v7 | `cms/composer.json` |
| Regras de código do CMS | `cms/CODING_GUIDELINES.md` |
| Correção da dependência de breadcrumb (v5) | `dossie_modules/_01_v5_fix/README.md` |
