{
  "id": "enum-affiliationtype",
  "title": "Enum — AffiliationType",
  "description": "Tipos funcionais permitidos para um vínculo institucional do SGE.",
  "type": "enum-reference",
  "status": "implemented",
  "visibility": "public",
  "tags": [
    "sge/enums",
    "sge/autorizacao"
  ],
  "related": [
    "migration-04-affiliations",
    "migrations",
    "modelo-de-dados-acesso",
    "perfis-e-responsabilidades-por-vinculo"
  ],
  "sourceRefs": [
    "https://github.com/sge-suite/sge/blob/master/app/Enums/AffiliationType.php",
    "https://github.com/sge-suite/sge/blob/master/tests/Unit/Enums/AffiliationTypeTest.php"
  ],
  "authors": [],
  "updated": null,
  "diagram": null,
  "body": "> [!success] Estado\n> Implementado em `app/Enums/AffiliationType.php` e usado como cast e validação PHP de `Affiliation`. Policies já cobrem campi e administração de contas/vínculos administrativos; as regras dos demais perfis e jornadas continuam sendo implementadas por fase.\n\n## Contrato\n\nClassifica o papel funcional de uma pessoa dentro de um vínculo. Não representa e-mail, campus, permissão isolada ou representante legal.\n\n| Case                  | Valor persistido       | Rótulo                   |\n| --------------------- | ---------------------- | ------------------------ |\n| `SystemAdministrator` | `system_administrator` | Administrador do Sistema |\n| `CampusAdministrator` | `campus_administrator` | Administrador do Campus  |\n| `InternshipOffice`    | `internship_office`    | Setor de Estágios        |\n| `Coordinator`         | `coordinator`          | Coordenador de Curso     |\n| `Advisor`             | `advisor`              | Orientador               |\n| `Student`             | `student`              | Discente                  |\n| `Supervisor`          | `supervisor`           | Supervisor               |\n| `TeachingDirection`   | `teaching_direction`   | Direção de Ensino        |\n\nO representante legal e seu cargo são campos textuais de `Campus`, não são um vínculo nem um case de `AffiliationType`. Não criar `LegalRepresentative`.\n\n## Checklist de implementação\n\n- [x] Criar enum string em `App\\Enums\\AffiliationType`.\n- [x] Implementar `label()`, `options()` e `values()`.\n- [x] Adicionar cast do enum no Model `Affiliation`.\n- [x] Usar o enum no cast e na validação de [`affiliations`](doc:migration-04-affiliations).\n- [x] Cobrir todos os cases, rótulos e opções com testes unitários.\n- [x] Aplicar as Policies ao Administrador do Sistema para gestão global e gestão de contas/vínculos administrativos.\n- [ ] Completar e testar as regras de escopo dos demais tipos nas Policies.\n- [x] Confirmar que este enum, vínculo ativo, escopo e estado são a única fonte de autorização; as tabelas de permissões foram removidas.\n\n## Relacionamentos\n\n- [Migrations](doc:migrations)\n- [Migration de affiliations](doc:migration-04-affiliations)\n- [Modelo de acesso](doc:modelo-de-dados-acesso)\n- [Responsabilidades por vínculo](doc:perfis-e-responsabilidades-por-vinculo)\n- [Painel de desenvolvimento](doc:painel-de-desenvolvimento)",
  "sections": [
    {
      "id": "contrato",
      "level": 2,
      "title": "Contrato",
      "text": "Classifica o papel funcional de uma pessoa dentro de um vínculo. Não representa e-mail, campus, permissão isolada ou representante legal.  | Case                  | Valor persistido       | Rótulo                   | | --------------------- | ---------------------- | ------------------------ | | `SystemAdministrator` | `system_administrator` | Administrador do Sistema | | `CampusAdministrator` | `campus_administrator` | Administrador do Campus  | | `InternshipOffice`    | `internship_office`    | Setor de Estágios        | | `Coordinator`         | `coordinator`          | Coordenador de Curso     | | `Advisor`             | `advisor`              | Orientador               | | `Student`             | `student`              | Discente                  | | `Supervisor`          | `supervisor`           | Supervisor               | | `TeachingDirection`   | `teaching_direction`   | Direção de Ensino        |  O representante legal e seu cargo são campos textuais de `Campus`, não são um vínculo nem um case de `AffiliationType`. Não criar `LegalRepresentative`.",
      "line": 4
    },
    {
      "id": "checklist-de-implementacao",
      "level": 2,
      "title": "Checklist de implementação",
      "text": "- [x] Criar enum string em `App\\Enums\\AffiliationType`. - [x] Implementar `label()`, `options()` e `values()`. - [x] Adicionar cast do enum no Model `Affiliation`. - [x] Usar o enum no cast e na validação de [`affiliations`](doc:migration-04-affiliations). - [x] Cobrir todos os cases, rótulos e opções com testes unitários. - [x] Aplicar as Policies ao Administrador do Sistema para gestão global e gestão de contas/vínculos administrativos. - [ ] Completar e testar as regras de escopo dos demais tipos nas Policies. - [x] Confirmar que este enum, vínculo ativo, escopo e estado são a única fonte de autorização; as tabelas de permissões foram removidas.",
      "line": 21
    },
    {
      "id": "relacionamentos",
      "level": 2,
      "title": "Relacionamentos",
      "text": "- [Migrations](doc:migrations) - [Migration de affiliations](doc:migration-04-affiliations) - [Modelo de acesso](doc:modelo-de-dados-acesso) - [Responsabilidades por vínculo](doc:perfis-e-responsabilidades-por-vinculo) - [Painel de desenvolvimento](doc:painel-de-desenvolvimento)",
      "line": 32
    }
  ],
  "sourcePath": "content/enum-affiliationtype.md",
  "visuals": [],
  "apiVersion": 1
}
