# Status de Implementação — SGG

> Este arquivo é a **fonte da verdade** sobre o que está pronto. Cada bloco o
> atualiza. Se a implementação parar, o próximo bloco continua a partir daqui,
> sem reiniciar o projeto.

**Versão do schema/arquitetura:** v4 (congelada) + migrations Blocos 2,3,6,7 (47 tabelas)
**Fase atual concluída:** Fase 10 + Hotfix 10.1/10.2 (correções operacionais)
**Última atualização:** 2026-06-19

---

## Hotfix 10.1 + 10.2 — CONCLUÍDO ✅
**Qualidade de dados, usabilidade e renderização do mapa**

### 10.2 — Mapa e inteligência
- [x] Mapa Territorial renderiza (init defensivo: aguarda Leaflet, invalidateSize, min-height)
- [x] Correção aplicada também ao mapa executivo e ao mapa público
- [x] Centraliza em Uberlândia, funciona sem dados, desktop e mobile
- [x] Dashboard Territorial, Inteligência e Sala de Situação validados com dados reais

### 10.1 — Dados e usabilidade
- [x] Bairros: saneamento de duplicados/UTF8 (migration 009), fusão com remapeamento
      de 10 tabelas, unicidade por (tenant,name)
- [x] Demandas: filtro por Responsável/Assessor (combina com demais filtros)
- [x] Aniversariantes: botão Parabenizar abre WhatsApp (wa.me) com mensagem pronta,
      respeitando consentimento e opt-out (LGPD)
- [x] Dashboard: texto desatualizado substituído pela lista de módulos ativos

### Banco
- [x] Nenhuma tabela nova. Migration 009 idempotente. 47 tabelas.

### Verificação
20 verificações de aplicação + saneamento de bairros com duplicados reais
(4 grupos -> 0, demanda remapeada, idempotente).

---

## Fase 10 — CONCLUÍDA ✅
**Inteligência, Produtividade e Hardening**

### Sala de Situação (/situation)
- [x] 10 números-chave do mandato + alertas executivos automáticos
- [x] Exclusiva para vereador, chefe de gabinete e admin

### Relatórios estratégicos (/reports)
- [x] Bairros, regiões e categorias críticas
- [x] Secretarias mais demandadas (tempo médio de resolução)
- [x] Produtividade da equipe; demandas recorrentes (bairro/categoria)

### Auditoria gerencial (/audit)
- [x] Eventos humanizados, últimas atividades, ações comuns, usuários ativos

### Hardening
- [x] Troca de senha obrigatória no 1º acesso (fim do admin123)
- [x] Política de senha forte (8+, maiúscula, minúscula, número)
- [x] Headers de segurança (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, CSP)
- [x] Rate limit de login e regeneração de sessão (confirmados; já existentes)

### Performance / Banco
- [x] 1 índice novo (demands.created_at); demais tabelas já indexadas
- [x] Migration 008 (ALTER users + índice). Sem tabelas novas. 47 tabelas.

### Verificação
22 verificações aprovadas (headers, troca de senha, sala de situação, alertas,
relatórios estratégicos, auditoria gerencial, bloqueio por papel, migração).

---

## Hotfix 9.1 — CONCLUÍDO ✅
**Relatórios + Auditoria**

- [x] /reports: 13 indicadores agregados + distribuições de demandas
      (status/bairro/categoria/responsável), filtros (período/região/bairro/
      responsável/status). Permissão reports.view.
- [x] /audit: leitura de audit_logs (data, usuário, ação, módulo, registro, IP,
      detalhes), filtros (usuário/ação/módulo/período), paginação. Permissão
      audit.view; auditoria não pública.
- [x] Menu: Relatórios e Auditoria ativados (saíram de "Em breve").
- [x] Sem tabelas novas e sem permissões novas.
- Verificação: 13 itens (telas abrem, filtros, logs, menu, permissões protegem).

---

## Bloco 9 — CONCLUÍDO ✅
**Visitas Técnicas + Tarefas e comentários**

### Funcionalidades entregues
- [x] Visitas técnicas: CRUD, status (agendada/realizada/cancelada/remarcada)
- [x] Visitas: vínculo a demanda/cidadão/bairro/responsável, coordenadas
- [x] Visitas: "Ver no mapa" e camada de visitas no mapa territorial
- [x] Tarefas: CRUD, prioridade, prazo, responsável, status com conclusão
- [x] Tarefas: comentários (task_comments), tarefas atrasadas destacadas
- [x] Integração com Demandas (registrar visita / criar tarefa)
- [x] Auditoria de visitas e tarefas
- [x] Menu: Visitas técnicas e Tarefas ativados

### Banco
- Nenhuma tabela nova, nenhuma migration. Reutiliza technical_visits, tasks,
  task_comments. 47 tabelas.

### Verificação (resumo)
Validação essencial: 16 verificações (criação, status com data automática,
comentários, listas, mapa, integração com demanda, auditoria). php -l ok.

---

## Bloco 8 — CONCLUÍDO ✅
**Portal de Transparência**

### Funcionalidades entregues
- [x] Portal público sem login, responsivo (celular/tablet/desktop)
- [x] Página inicial (identidade do vereador, indicadores, destaques)
- [x] Timeline pública (mandate_timeline, is_public=1)
- [x] Ações do mandato (public_reports publicados)
- [x] Indicadores públicos agregados
- [x] Mapa público (apenas bairros atendidos, sem dados pessoais)
- [x] Galeria pública (media_files is_public=1)
- [x] Documentos públicos (documents is_public=1)
- [x] Pesquisa pública (ações, bairros, documentos)
- [x] Transparência territorial e Prestação de contas (agregados)
- [x] SEO (title, description, Open Graph, favicon)
- [x] Gestão admin de publicações (public.manage) com publicar/despublicar
- [x] Auditoria de publicação/despublicação
- [x] Menu: Transparência (admin) ativado

### Privacidade
- PUBLIC = só o que for explicitamente publicado, filtrado no backend via
  Model PublicPortal. Nunca expõe nome/telefone/endereço/coordenadas de
  cidadãos; território e indicadores sempre agregados.

### Banco
- Nenhuma tabela nova. documents +is_public/+published_at (migration 007).
  Reutiliza mandate_timeline, public_reports, media_files. 47 tabelas.

### Verificação (resumo)
Validação essencial: 21 verificações (sem login; nada privado vaza; só público
aparece; 404 em item privado; publicar/despublicar auditado). php -l ok.

---

## Bloco 7 — CONCLUÍDO ✅
**Mapa Territorial e Regiões**

### Funcionalidades entregues
- [x] Mapa interativo Leaflet + OpenStreetMap (sem APIs pagas)
- [x] Camadas com filtros: demandas (abertas/resolvidas/atrasadas/recorrentes),
      visitas, compromissos, cidadãos
- [x] Heatmap por demandas, cidadãos e visitas
- [x] Dashboard territorial (cards + tabela por bairro/região)
- [x] Inteligência territorial (rankings: mais/menos atendidos, reincidência, regiões)
- [x] Dashboard executivo (mapa-resumo, indicadores, alertas de concentração)
- [x] Busca territorial (bairro, cidadão, demanda, protocolo)
- [x] Integração demanda → mapa e compromisso → mapa
- [x] Fallback de coordenadas (feição herda coordenada do bairro)
- [x] Menu: Mapa, Dashboard, Inteligência e Painel Executivo ativados

### Ajustes rápidos (nesta entrega)
- [x] DATABASE_INVENTORY.md (inventário das 47 tabelas)
- [x] agenda_events + resultado + encaminhamentos (migration 005)

### Banco
- Nenhuma tabela nova. Coordenadas já existiam (neighborhoods, demands.occur_*,
  technical_visits, citizens). Seed de coordenadas dos bairros (database.sql +
  migration 006). database.sql segue em 47 tabelas.

### Verificação (resumo)
Validação essencial única: 16 verificações aprovadas (resultado/encaminhamentos,
camadas JSON, heatmap, busca, 4 telas, integração mapa). `php -l` ok.

---

## Débitos técnicos
- **Coordenadas dos bairros são aproximadas** (centro do bairro). Servem para
  inteligência territorial; não representam localização exata de imóveis ou
  cidadãos. Refináveis com coordenadas próprias por demanda/visita.
- **Privacidade no mapa (Hotfix 7.1)**: dados territoriais ≠ dados pessoais.
  Nome de cidadão no mapa/busca só com `citizens.view`; com apenas
  `reports.view`, cidadãos aparecem anônimos e não pesquisáveis.
- **Participantes estruturados** (`agenda_events.participants`): hoje texto
  livre. Futuro: modelar vínculo a `users`/`citizens` para histórico e
  relatórios de presença. Registrado também no CHANGELOG. Não implementado por
  decisão de escopo.
- Tabelas modeladas e ainda sem interface dedicada: `mandate_timeline`, `public_reports`,
  `demand_public_tokens`, `consent_logs` (ver DATABASE_INVENTORY.md).

---

## Bloco 6 — CONCLUÍDO ✅
**Agenda e Compromissos**

### Funcionalidades entregues
- [x] CRUD de compromissos (reunião, visita, audiência, evento, interno/externo, etc.)
- [x] Campos completos: título, datas, local, bairro, região, responsável,
      participantes, observações, status
- [x] Status: agendado, confirmado, realizado, cancelado, reagendado
- [x] Calendário em mês, semana, dia e lista (HTML/CSS puro, sem bibliotecas)
- [x] Agenda territorial (bairro/região, região derivada do bairro)
- [x] Dashboard da agenda (cards + próximos + por bairro/região)
- [x] Integração com Demandas (agendar vinculado à demanda)
- [x] Integração com Cidadãos (vínculo + filtro por cidadão)
- [x] Atribuição de responsável (equipe)
- [x] Estrutura para lembretes internos (próximos compromissos)
- [x] Auditoria (criação/edição/cancelamento/reagendamento/conclusão)
- [x] Menu: Agenda e Painel da Agenda ativados

### Hotfix do Bloco 5 (incluído nesta entrega)
- [x] config.php fora do pacote (somente config.example.php)
- [x] README com seção "Instalação em cPanel" (host 127.0.0.1, base_path)
- [x] Teste de conexão Z-API em Configurações > WhatsApp

### Banco
- Nenhuma tabela nova. agenda_events ampliada (status, region_id, ENUM type)
  via migration 004 (idempotente). database.sql segue em 47 tabelas.

### Verificação (resumo)
Validação essencial única: 16 verificações aprovadas (fluxo de criação/status/
reagendamento, região derivada, auditoria, calendário mês/semana/dia/lista,
dashboard, integração com demanda, hotfix Z-API). `php -l` ok.

---

## Bloco 5 — CONCLUÍDO ✅
**WhatsApp (Z-API)**

### Funcionalidades entregues
- [x] Caixa de saída de mensagens com cards, busca e filtros
- [x] Criar mensagem manual (cidadão ou avulso), com modelo e telefone auto
- [x] Fluxo rascunho → fila → enviada, com cancelamento
- [x] Trava de consentimento (LGPD) ao enfileirar e ao enviar
- [x] Envio real via Z-API (cliente cURL nativo, sem dependências)
- [x] Logs de envio (message_logs) com payload do provedor e trilha de ações
- [x] CRUD de modelos de mensagem (messages.manage_templates) com slug único
- [x] Configuração Z-API com tokens mascarados (não reexibidos em claro)
- [x] Menu: Mensagens / WhatsApp e Modelos de mensagem ativados
- [x] Aniversários e rascunhos do sistema integrados à caixa de saída

### Banco
- Nenhuma tabela nova. Reutiliza message_outbox, message_templates,
  message_logs e settings (credenciais Z-API). database.sql segue em 47
  tabelas. Sem migration.

### Verificação (resumo)
Teste essencial único: 13 verificações aprovadas (rascunho+consentimento,
trava LGPD na fila e no envio, recusa sem Z-API, falha de conexão tratada com
log, CRUD de modelo, token mascarado). `php -l` ok.

---

## Bloco 4 — CONCLUÍDO ✅
**Documentos + Protocolos + Modelos**

### Funcionalidades entregues
- [x] CRUD de documentos (ofício, indicação, requerimento, memorando,
      resposta ao cidadão, outro) com filtros, edição e exclusão
- [x] Numeração automática por tipo/ano (OF-2026-0001, IND-..., REQ-...),
      transacional, sem interferir no protocolo de demandas
- [x] Status com data de emissão automática
- [x] Vínculo a demanda e a secretaria de destino
- [x] CRUD de modelos com variáveis {{...}} (permissão templates.manage)
- [x] Geração de documento a partir de modelo + demanda (variáveis preenchidas)
- [x] Impressão/PDF via navegador com papel timbrado (sem dependência servidor)
- [x] Integração com Demandas (atalho "Gerar documento desta demanda")
- [x] Auditoria de criar/editar/excluir/imprimir
- [x] Menu: Documentos e Modelos ativados

### Banco
- Nenhuma tabela nova (modelagem congelada). Reutiliza documents,
  document_templates e protocol_counters. database.sql segue em 47 tabelas.
  Sem migration neste bloco.

### Verificação (resumo)
Teste essencial único: 15 verificações aprovadas (numeração, prefixos,
emissão, modelos, variáveis da demanda, impressão, integração, auditoria).
1 bug corrigido (colunas occur_address/occur_reference). `php -l` ok.

---

## Bloco 3 — CONCLUÍDO ✅
**Mídia do Gabinete** (biblioteca, upload, galeria, coleções, download seguro)

### Funcionalidades entregues
- [x] Biblioteca de fotos, vídeos, áudios e documentos
- [x] Upload individual e múltiplo, com drag-and-drop e barra de progresso
- [x] Validação por MIME real e limites de tamanho por tipo
- [x] Organização: categoria, bairro, região (derivada), evento/campanha/
      institucional, demanda e visita relacionadas
- [x] Metadados: título, descrição, autor, data de captura, origem, tags (N:N)
- [x] Galeria em grade e lista, com busca e filtros (tipo/categoria/bairro/
      região/tag)
- [x] Coleções (galerias) por bairro, evento, campanha ou institucional
- [x] Download seguro por controller + registro em media_download_logs
- [x] Preview (inline) também servido por controller, sem URL pública direta
- [x] Auditoria: upload, alteração, exclusão, download, vínculo, marcação de uso
- [x] Equipe de Rua: upload, consulta do próprio conteúdo, vínculo; sem excluir
      conteúdo de terceiros (403)
- [x] Marketing: ver biblioteca, baixar, marcar como utilizado, criar coleções
- [x] Dashboard de mídia (fotos, vídeos, áudios, documentos, downloads,
      coleções, uploads do mês)
- [x] Dashboard territorial (mídias por bairro e por região)
- [x] Integração com Demandas (ver e adicionar mídias vinculadas)
- [x] Estrutura de compartilhamento WhatsApp (fila media_share_queue) — SEM envio
- [x] Migration 003 idempotente + database.sql consolidado (47 tabelas)

### Verificação realizada (resumo)
Teste essencial único: 20 verificações aprovadas (upload, MIME, região derivada,
tags, galeria, download+log, coleção, fila WhatsApp, dashboard, integração com
demanda, permissão equipe_rua 403). Import limpo e migration 003 sem erro.
`php -l` ok em todos os arquivos.

### Pendências herdadas para blocos futuros
- Thumbnail automático de vídeo (FFmpeg ausente em cPanel) — usar capa manual.
- Navegação mídia↔visita completa depende do módulo de Visitas (Bloco 5).
- Envio real por WhatsApp/Z-API (Bloco 6).

---

## Bloco 2 — CONCLUÍDO ✅
**Demandas + Protocolos + SLA + Histórico + Anexos**
(+ ajustes estruturais em Cidadãos e Equipe, Dashboard e Menu)

### Funcionalidades entregues
- [x] CRUD de demandas (listar, criar, ver, editar, excluir/soft delete)
- [x] Busca e filtros (status, prioridade, categoria, bairro, atrasadas)
- [x] Protocolo automático `SGG-AAAA-NNNNNN` (sequencial, transacional)
- [x] SLA herdado da categoria ou manual; cálculo de prazo e status de SLA
- [x] Recalculo automático de SLA (dentro/vencendo/vencido/cumprido)
- [x] Detecção de recorrência (categoria + bairro + referência)
- [x] Fluxo de status com primeira resposta e data de resolução
- [x] Histórico/timeline (criação, status, comentários, atribuições, anexos)
- [x] Comentários internos
- [x] Anexos (JPG/PNG/WEBP/PDF, MIME real, fora do webroot, download seguro)
- [x] Mensagem de status pronta para copiar (WhatsApp)
- [x] Cidadãos: nickname, liderança comunitária, origem (request_sources),
      bairro por seleção (neighborhoods), cidade fixa Uberlândia
- [x] Equipe: telefone, cargo, região responsável, bairros atendidos (N:N)
- [x] Dashboard: cards de demandas (abertas, resolvidas, atrasadas, total)
- [x] Menu reorganizado por áreas, com módulos futuros como "Em breve"
- [x] Migrations incrementais + `MIGRATIONS.md` e `BACKUP.md`
- [x] Seeds de Uberlândia (5 regiões, 23 bairros, 6 secretarias)

### Verificação realizada
Testado end-to-end (instalação limpa e via migrations): protocolo sequencial,
SLA herdado/manual, recorrência, mudança de status com SLA cumprido,
histórico, comentários, anexos (upload/download), cidadão e usuário com os
novos campos, dashboard, menu e RBAC. Todos os PHP passam em `php -l`.

---

## Bloco 1 — CONCLUÍDO ✅
**Core + Login + Configuração base + Cidadãos + Aniversariantes**

### Funcionalidades entregues
- [x] Estrutura MVC leve em PHP 8 (sem framework, sem Composer obrigatório)
- [x] Front controller único + roteamento
- [x] Configuração de banco (`config/config.php`)
- [x] Sessão segura (HttpOnly, SameSite, regeneração, expiração)
- [x] Proteção CSRF em todos os formulários
- [x] Login e logout
- [x] Anti brute-force (bloqueio temporário)
- [x] Usuários (listar, criar, editar)
- [x] Perfis e permissões (RBAC) com middleware
- [x] Dashboard inicial com indicadores
- [x] Identidade visual do gabinete (logo, logo reduzida, favicon, slogan,
      nome público, cores)
- [x] Dados institucionais do mandato (vereador, partido, número, legislatura,
      cidade, estado, contatos, redes)
- [x] Upload seguro de logo e favicon (MIME real, allowlist, hash, fora do webroot)
- [x] Cadastro de cidadãos (nome, telefone, e-mail, endereço completo,
      observações, consentimento, opt-out, aniversário dia/mês sem ano)
- [x] Listagem, busca/filtro, edição e exclusão (soft delete) de cidadãos
- [x] Tela de aniversariantes (dia e mês, filtro por consentimento)
- [x] Geração de mensagem de parabéns em rascunho (controle manual)
- [x] Modelo de mensagem de aniversário (seed)
- [x] Trava LGPD: não gera mensagem sem consentimento / com opt-out
- [x] Registro de interação no histórico do cidadão ao gerar mensagem
- [x] Auditoria básica das ações principais
- [x] Layout responsivo (sidebar desktop / nav inferior mobile)

### Verificação realizada
Testado end-to-end (PHP 8.3 + MariaDB): login→dashboard, CRUD de cidadãos,
validação de campos, busca, aniversariantes do dia/mês, filtro de
consentimento, geração de mensagem com trava LGPD, RBAC (assessor bloqueado em
/users e /settings), salvar identidade, criar usuário, logout e proteção de
rotas. Todos os PHP passam em `php -l`.

---

## Próximos blocos (ordem revisada pelo cliente)

> Concluídos: Blocos 1, 2, 3, 4, 5, 6 e 7.

### Bloco 8 — Portal de Transparência
Área pública (transparência) e timeline do mandato.

### Itens transversais (a agendar)
- (Concluído na Fase 10) Troca de senha obrigatória + hardening.

---

## Observações técnicas e melhorias anotadas
- **Troca de senha obrigatória no primeiro login**: anotado para o Bloco 9
  (admin entra com admin123; recomenda-se trocar imediatamente).
- **Deploy**: o sistema suporta duas opções de pasta (app fora do public_html
  ou tudo dentro com `.htaccess` de proteção). Ver README_INSTALACAO.txt.
- **Uploads**: ficam em `uploads/` (fora do webroot na Opção A). Servidos por
  controller, nunca por link direto.
- **Schema v4 inteiro já está no database.sql**; blocos futuros só adicionam
  código de aplicação, sem alterar o banco (salvo necessidade revelada em uso).

## Próximo passo sugerido
Blocos 1–9, hotfixes e Fase 10 concluídos. O sistema cobre operação completa do
mandato e agora também inteligência executiva (sala de situação, relatórios
estratégicos, auditoria gerencial) e hardening de segurança.

Débito técnico remanescente: participantes estruturados na agenda
(agenda_events.participants é texto livre). Ver DATABASE_INVENTORY.md.