{
  "id": "modelo-de-dados-nucleo",
  "title": "Modelo de dados — Núcleo",
  "description": "Relações centrais entre cadastros, solicitações, estágios, documentos e avaliações.",
  "type": "data-model",
  "status": "in-progress",
  "visibility": "public",
  "tags": [
    "sge/modelagem",
    "sge/mermaid"
  ],
  "related": [
    "modelo-de-dados-acesso",
    "modelo-de-dados-historico",
    "ciclos-de-status"
  ],
  "sourceRefs": [],
  "authors": [],
  "updated": null,
  "diagram": "modelo-nucleo-identidade",
  "body": "> [!info] Nível deste diagrama\n> Este é um recorte do modelo lógico relacional publicado. Ele mostra tabelas, colunas-chave e relações; o contrato completo de campos, índices e nulabilidade fica em uma única fonte técnica, evitando duplicação no diagrama.\n\n## Identidade, cidades, endereços e cadastros\n\n{{diagram:modelo-nucleo-identidade}}\n\n| Entidade | Responsabilidade |\n| --- | --- |\n| `users` | identidade autenticada e credenciais |\n| `user_personal_data` | Dados pessoais atuais e dados profissionais opcionais do supervisor, compartilhados por usuário; CPF permanece em `users` |\n| `cities` | catálogo local de municípios por código IBGE e UF |\n| `addresses` | endereços atuais e cópias históricas usadas por estágios |\n| `affiliations` | função institucional, campus e e-mail contextual; a Migration 10 adiciona `course_id` obrigatório para vínculos de discente |\n| `campuses` e `courses` | escopo acadêmico e administrativo |\n| `internship_types` | regras de carga, notas e exceções aplicáveis ao curso |\n| `granting_parties` | cadastro atual da concedente, vinculado a um campus; CPF/CNPJ podem se repetir e os dados locais não são compartilhados |\n\nUma pessoa possui uma conta e quantos vínculos forem necessários. O vínculo ativo, e não a conta isolada, define o contexto usado por Gates e Policies.\n\n## Da solicitação ao estágio\n\n{{diagram:modelo-nucleo-solicitacao}}\n\n- Existe uma solicitação por processo iniciado pelo discente; devoluções editam o mesmo registro.\n- Evidências de emancipação são registros privados, analisados manualmente pelo Setor.\n- O estágio nasce apenas após o aceite da solicitação e preserva FKs e snapshots dos dados aprovados.\n- Correções posteriores atualizam somente os campos autorizados e não apagam documentos ou estados anteriores.\n\n## Execução, formalização e conclusão\n\n{{diagram:modelo-nucleo-execucao}}\n\n| Conjunto | Regra central |\n| --- | --- |\n| jornadas, pausas, calendário e exceções | determinam a previsão reproduzível de término |\n| templates e versões | preservam o modelo usado em cada geração |\n| documentos | mantêm origem, versão, estado e snapshot; o arquivo final é temporário |\n| avaliação do supervisor | reutiliza o mesmo formulário em `Draft` ou `Returned` |\n| notas | supervisor é calculada; relatório e apresentação são lançadas pelo orientador |\n| cancelamento | exige pedido e decisão do Setor, preservando o histórico |\n\n## Regras de integridade\n\n- Dados atuais relacionam-se por FK; valores usados em um processo histórico são congelados em snapshots.\n- A jornada é pactuada na abertura; outra vigência só pode nascer de aditivo com assinaturas conferidas e não reescreve dias já cumpridos.\n- Templates usados não são alterados; uma mudança cria nova versão.\n- `Submitted` e `Approved` bloqueiam a avaliação; `Returned` reabre o mesmo registro.\n- O Activity Log registra alterações relevantes, mas não substitui tabelas de domínio.\n\n## Leituras relacionadas\n\n- [Conta, vínculos e autorização](doc:modelo-de-dados-acesso).\n- [Snapshots, logs e mensagens](doc:modelo-de-dados-historico).\n- [Estados e transições](doc:ciclos-de-status).\n- [Modelagem de dados](doc:modelagem-de-dados).",
  "sections": [
    {
      "id": "identidade-cidades-enderecos-e-cadastros",
      "level": 2,
      "title": "Identidade, cidades, endereços e cadastros",
      "text": "| Entidade | Responsabilidade | | --- | --- | | `users` | identidade autenticada e credenciais | | `user_personal_data` | Dados pessoais atuais e dados profissionais opcionais do supervisor, compartilhados por usuário; CPF permanece em `users` | | `cities` | catálogo local de municípios por código IBGE e UF | | `addresses` | endereços atuais e cópias históricas usadas por estágios | | `affiliations` | função institucional, campus e e-mail contextual; a Migration 10 adiciona `course_id` obrigatório para vínculos de discente | | `campuses` e `courses` | escopo acadêmico e administrativo | | `internship_types` | regras de carga, notas e exceções aplicáveis ao curso | | `granting_parties` | cadastro atual da concedente, vinculado a um campus; CPF/CNPJ podem se repetir e os dados locais não são compartilhados |  Uma pessoa possui uma conta e quantos vínculos forem necessários. O vínculo ativo, e não a conta isolada, define o contexto usado por Gates e Policies.",
      "line": 4
    },
    {
      "id": "da-solicitacao-ao-estagio",
      "level": 2,
      "title": "Da solicitação ao estágio",
      "text": "- Existe uma solicitação por processo iniciado pelo discente; devoluções editam o mesmo registro. - Evidências de emancipação são registros privados, analisados manualmente pelo Setor. - O estágio nasce apenas após o aceite da solicitação e preserva FKs e snapshots dos dados aprovados. - Correções posteriores atualizam somente os campos autorizados e não apagam documentos ou estados anteriores.",
      "line": 21
    },
    {
      "id": "execucao-formalizacao-e-conclusao",
      "level": 2,
      "title": "Execução, formalização e conclusão",
      "text": "| Conjunto | Regra central | | --- | --- | | jornadas, pausas, calendário e exceções | determinam a previsão reproduzível de término | | templates e versões | preservam o modelo usado em cada geração | | documentos | mantêm origem, versão, estado e snapshot; o arquivo final é temporário | | avaliação do supervisor | reutiliza o mesmo formulário em `Draft` ou `Returned` | | notas | supervisor é calculada; relatório e apresentação são lançadas pelo orientador | | cancelamento | exige pedido e decisão do Setor, preservando o histórico |",
      "line": 30
    },
    {
      "id": "regras-de-integridade",
      "level": 2,
      "title": "Regras de integridade",
      "text": "- Dados atuais relacionam-se por FK; valores usados em um processo histórico são congelados em snapshots. - A jornada é pactuada na abertura; outra vigência só pode nascer de aditivo com assinaturas conferidas e não reescreve dias já cumpridos. - Templates usados não são alterados; uma mudança cria nova versão. - `Submitted` e `Approved` bloqueiam a avaliação; `Returned` reabre o mesmo registro. - O Activity Log registra alterações relevantes, mas não substitui tabelas de domínio.",
      "line": 43
    },
    {
      "id": "leituras-relacionadas",
      "level": 2,
      "title": "Leituras relacionadas",
      "text": "- [Conta, vínculos e autorização](doc:modelo-de-dados-acesso). - [Snapshots, logs e mensagens](doc:modelo-de-dados-historico). - [Estados e transições](doc:ciclos-de-status). - [Modelagem de dados](doc:modelagem-de-dados).",
      "line": 51
    }
  ],
  "sourcePath": "content/modelo-de-dados-nucleo.md",
  "visuals": [
    {
      "id": "modelo-nucleo-execucao",
      "kind": "db-schema",
      "title": "Esquema lógico — execução do estágio",
      "description": "Tabelas e colunas que controlam endereço de trabalho, feriados, vigência, jornadas, pausas e cancelamento.",
      "summary": "O estágio usa os feriados nacionais, estaduais e municipais aplicáveis ao endereço do local de trabalho, possui jornadas, pausas e exceções e pode receber um pedido de cancelamento; a avaliação é detalhada no contrato próprio.",
      "renderMode": "mermaid",
      "api": "api/diagrams/modelo-nucleo-execucao.json",
      "human": "diagrams/modelo-nucleo-execucao.html"
    },
    {
      "id": "modelo-nucleo-identidade",
      "kind": "db-schema",
      "title": "Esquema lógico — identidade e cadastros",
      "description": "Tabelas e colunas de identidade, dados pessoais, cidades, endereços, campus e vínculos institucionais.",
      "summary": "A conta possui dados pessoais e vínculos; cidades são catalogadas pelo código IBGE, endereços apontam para elas e cadastros mantêm endereços atuais.",
      "renderMode": "mermaid",
      "api": "api/diagrams/modelo-nucleo-identidade.json",
      "human": "diagrams/modelo-nucleo-identidade.html"
    },
    {
      "id": "modelo-nucleo-solicitacao",
      "kind": "db-schema",
      "title": "Esquema lógico — solicitação e formalização",
      "description": "Tabelas e colunas que registram a solicitação e os cadastros usados para formalizar o estágio.",
      "summary": "A solicitação é enviada por um vínculo discente, referencia curso, tipo e concedente, e mantém o estado que conduz à formalização.",
      "renderMode": "mermaid",
      "api": "api/diagrams/modelo-nucleo-solicitacao.json",
      "human": "diagrams/modelo-nucleo-solicitacao.html"
    }
  ],
  "apiVersion": 1
}
