# P16 — Pessoas e certames

| Campo | Valor |
|---|---|
| Programa | F7+ — operação, estrutura e conteúdo |
| Status | `planejado` |
| Depende de | P15, P11, P5.5 (LGPD/dados abertos) |
| Habilita | P17 (diárias), P21 |
| Tamanho | **G** (4–6 sessões) |
| ADRs | ADR-019 (LGPD), ADR-020, ADR-024, ADR-033, ADR-035, ADR-012, ADR-017, ADR-049 |

## 1. Objetivo

Publicar as informações de **pessoal e certames** que a lei exige — servidores, terceirizados,
estagiários e concursos/PSS — com o mínimo de dado pessoal, acesso restrito e retenção. O objetivo
não é reproduzir o cadastro de RH do legado: é publicar o que é público com base legal explícita.

**Resultado observável:** o cidadão consulta o quadro público e os concursos; o CMS mantém os
registros; CPF, matrícula e dados sensíveis nunca aparecem em página, API, log ou auditoria; o
registro inativo sai do portal e é expurgado conforme a retenção.

## 2. Regra de dados pessoais (vale para toda a fase)

> **D13:** allowlist público mínimo; remuneração nominal só com base legal/parecer e como relação,
> nunca consulta individual. CPF/matrícula/endereço/telefone pessoal não são públicos.

- **Classificação obrigatória** por campo: `publico`, `restrito`, `sensivel`.
- **Nunca públicos:** CPF, RG, matrícula, endereço residencial, telefone pessoal, e-mail pessoal,
  data de nascimento, dados de saúde, dados bancários.
- **Público mínimo:** nome, cargo/função, lotação, vínculo, período, situação; remuneração só se
  houver base legal e decisão registrada.
- Campos restritos, se armazenados, usam cast `encrypted` (ADR-020) e acesso auditado; se não há
  necessidade legal, **não armazenar**.
- Retenção por tipo; expurgo via `RetentionRegistry`; auditoria de leitura sensível; nenhum dado
  pessoal em log/telemetria (apenas id/tipo).
- Base legal documentada em `wiki/specs/05-seguranca-lgpd.md`/ADR-019 e no runbook de DSAR.

## 3. Escopo fechado

### S1 — Servidores

- Módulo `Transparencia/Servidores` (token `servidores`, grupo `Transparencia`).
- Tabela `servidores`: `id`, `nome`, `cargo`, `funcao`, `lotacao`, `vinculo` enum
  (`efetivo|comissionado|temporario|cedido`), `data_admissao`, `data_desligamento` null,
  `carga_horaria` text null, `situacao` enum (`ativo|inativo|afastado`), `metadata` jsonb, timestamps.
  **Remuneração não entra na tabela principal**: ver S1b. Campos privados, se a operação exigir,
  ficam em tabela/colunas separadas com `encrypted`.
- CMS restrito (`servidores.ver/editar`), busca por nome/cargo/lotação; portal público com
  **DTO de campos públicos** (não serializar o model inteiro). Não criar API pública sem decisão.
- Regras: desligamento não apaga; inativo sai da listagem pública; nenhuma importação automática de
  folha; carga manual/CSV do importador (P9) se necessário.
- Teste: resposta pública não contém CPF/matrícula/endereço; serialização allowlist.

### S1b — Remuneração nominal + tabela remuneratória (PNTP 6.2/6.3)

- `servidor_remuneracoes`: `servidor_id`, `competencia` (`YYYY-MM`), `cargo`, `lotacao`,
  `bruto`, `descontos`, `liquido`, `updated_at`; `UNIQUE (servidor_id, competencia)`.
  Publicar como **relação** (tabela), nunca consulta individual/autenticada.
- Filtros por nome/mês/ano; CSV via `Services\OpenData` (P5.5); 3 anos; atualização 30 dias;
  `Atualizado em`.
- Sem CPF/matrícula; DTO allowlist; base legal e retenção documentadas.
- Fonte `servidores.remuneracao`: `containsPersonalData=true`, `publicationBasis=legal_obligation`,
  `personalDataFields` = apenas nome/cargo/lotação/valores; sem base local, não publica.
- `tabela_remuneratoria`: `cargo`, `nivel`, `faixa`, `valor`, `vigencia_inicio`, `vigencia_fim`,
  `media_id` null; página `/transparencia/recursos-humanos/tabela-remuneratoria`; 1 ano/3 anos.
- Se a lei local não permitir remuneração nominal, **não publicar** e registrar a decisão; o
  critério fica sem pontuação, não se inventa dado.

### S2 — Terceirizados + Estagiários

- `Transparencia/Terceirizados` (token `terceirizados`): `nome`, `empresa`, `funcao`, `lotacao`,
  `contrato`, `inicio`, `fim` null, `situacao`; CMS/portal; mesma política de campos.
- `Transparencia/Estagiarios` (token `estagiarios`): `nome`, `curso`, `instituicao`, `inicio`, `fim`,
  `lotacao`, `situacao`; CMS/portal; sem dados de saúde/idade.
- Listagens com filtro por situação/lotação, paginação; detalhe opcional (se não houver valor, só
  lista); busca/sitemap se público.
- Nenhuma duplicação de pessoa entre Servidores/Terceirizados/Estagiários: são vínculos distintos;
  se a mesma pessoa aparecer em dois, não há chave única compartilhada (evitar CPF).

### S3 — Concursos e PSS

- Módulo `Publicacoes/Concursos` (token `concursos`, grupo `Publicacoes`).
- Tabelas `concursos` (`titulo` jsonb, `slug`, `tipo` enum `concurso|pss|seletivo`, `orgao`,
  `inscricoes_inicio/fim`, `status` enum, `resumo`, `conteudo` AST, `metadata`) e
  `concurso_anexos` (`media_id`, `titulo` jsonb, `tipo` enum `edital|retificacao|resultado|outro`,
  `position`, `publicado_em`).
- Portal `/concursos` (filtros por tipo/status/ano, inscrições abertas) e detalhe; anexos via Media;
  CMS CRUD/publicar/arquivar; sitemap/busca.
- Regras: retificação não apaga edital anterior; resultado é anexo versionado; status derivado das
  datas + ação explícita; 4 locales.
- Sem inscrição online no MVP (apenas informação + link externo quando houver).

### S4 — Integração, busca, sitemap e fechamento

- Cada módulo com URL pública registra `SitemapSource` e `SearchSource` (P9); quando publica dado
  estruturado, registra `DatasetSource` (P5.5) e exporta via `Services\OpenData`.
- Nenhum endpoint público de servidor/terceirizado/estagiário além do DTO allowlist; se um dia
  houver API, decisão explícita + rate limit + LGPD.
- E2E: listar/consultar; inativo some; concurso com edital/retificação; busca; 4 locales; axe.
- `make check` 2× + `E2E=1`; cobertura ≥90%; PHPStan max 0.

## 4. Fora de escopo

- Folha de pagamento/RH, integração com sistema de pessoal, eSocial.
- CPF/matrícula como chave pública; dados bancários; saúde.
- Fila SUS e e-Vacina (P21).
- API pública de pessoas; export além do allowlist (o CSV da relação é permitido).
- ETL do legado (ADR-042).

## 5. Fatias de sessão

| Sessão | Entrega | Prova | Depende |
|---|---|---|---|
| **P16.S1** | política de campos + Servidores | DTO público sem PII; CMS; inativo fora; auditoria | P15/P11 |
| **P16.S1b** | Remuneração nominal + tabela | relação (não consulta); CSV; 3 anos; base legal | S1 |
| **P16.S2** | Terceirizados + Estagiários | listas/filtros; campos allowlist; sem duplicação | S1 |
| **P16.S3** | Concursos/PSS + anexos | edital/retificação/resultado; datas; sitemap/busca | S1 |
| **P16.S4** | integração + E2E + docs | 4 locales; axe; 2× check; nenhum PII em log | S1–S3 |

## 6. DoD

- [ ] Nenhum campo proibido em página, API, log, auditoria ou export.
- [ ] DTO/Resource allowlist por módulo; teste de serialização.
- [ ] Base legal, retenção e expurgo documentados; inativo sai do portal.
- [ ] Concursos com edital/retificação/resultado versionados; sem inscrição online.
- [ ] Busca/sitemap integrados; 4 locales; axe zero A/AA.
- [ ] `make check` 2× + `E2E=1`; cobertura ≥90%; PHPStan max 0.
- [ ] PNTP 6.1: carga horária, filtros e 3 anos; 6.2 remuneração como relação; 6.3 tabela.
- [ ] PNTP 6.4/6.5: 180 dias; 6.6/6.7: 1 ano/30 dias; CSV e `Atualizado em`.

## Fechamento — ficha de revisão

> **Obrigatório antes de fechar:** criar `_to_revision/P16-pessoas-certames.md` e seguir
> `_to_revision/README.md` + `_to_revision/PROTOCOLO.md` (v2.0). A ficha não é gate de build; é a
> entrada da fila de revisão profunda.

- Cabeçalho: fase, `kd` épico/tasks/slices, âncoras (este arquivo, ADRs e código) e status
  `⬜ pendente` → `🟡 em revisão` → `✅ revisado` / `🔧 com correções`.
- Conteúdo: o que foi implementado, arquivos/superfícies a revisar, checklist D1–D14 aplicável,
  riscos e observações.
- Fechamento: preencher “Notas da revisão” com data/revisor/resultado e achados (`kd write
  --anchor`), atualizar a fila em `_to_revision/README.md` e `_to_revision/_inventario.md`.
- Achado com correção exige teste vermelho→verde; a fase só é `closed` no `kd` com a ficha
  registrada.

## 7. Riscos

| Risco | Mitigação |
|---|---|
| Vazamento de CPF/matrícula | não armazenar ou cifrar; DTO allowlist; teste de serialização |
| Publicar dado sem base legal | decisão por campo; LGPD review; runbook |
| Duplicar pessoa em três módulos | vínculos distintos; sem chave CPF; documentar |
| Retenção esquecida | `RetentionRegistry` + expurgo agendado + teste |
| Importação de folha virar ETL | carga manual/CSV pontual; ADR-042 |
| Concurso com anexo antigo apagado | versionar anexos; nada de delete físico |

## 8. Retomada

```bash
kd prime
kd ask "servidores terceirizados estagiários concursos LGPD"
kd task list --ready
```

Ler: `dossie_modules/{servidor,terceirizados,estagiarios,concursos-pss}/**` → `MODULOS.md` §1/P16 →
`src/modules/Portal/Lgpd/**` → `src/core/Internal/Retention/**` → `wiki/specs/05-seguranca-lgpd.md`.
