{
  "id": "migration-22-internship-calendar-overrides",
  "title": "Migration 22A — internship_calendar_overrides",
  "description": "Exceções de uma data de calendário para um estágio específico.",
  "type": "migration-reference",
  "status": "implemented",
  "visibility": "public",
  "tags": [
    "sge/migrations",
    "sge/calendario",
    "sge/estagio"
  ],
  "related": [
    "migration-15-internships",
    "migration-22-holidays",
    "migration-base-04-activity-log"
  ],
  "sourceRefs": [],
  "authors": [],
  "updated": null,
  "diagram": null,
  "body": "> [!success] Estado\n> Migration, Model, factory, relação e unicidade por estágio/data implementados. Autorização e recálculo da previsão permanecem no fluxo funcional.\n\n## Contrato\n\n| Coluna | Tipo PostgreSQL | Nulo | Chaves/índices | Regra |\n| --- | --- | --- | --- | --- |\n| `id` | `bigint` | não | `PK` | Identificador da exceção. |\n| `internship_id` | `bigint` | não | `FK`, `UQ` com `date` | Estágio afetado; `RESTRICT`. |\n| `date` | `date` | não | `UQ` com `internship_id` | Uma data por registro; feriadão usa registros separados. |\n| `is_working_day` | `boolean` | não | — | `true` libera expediente; `false` bloqueia expediente. |\n| `reason` | `text` | não | — | Justificativa obrigatória. |\n\n| `created_at` | `timestamp(0)` | não | — | Auditoria. |\n| `updated_at` | `timestamp(0)` | não | — | Auditoria técnica. |\n\nUma exceção não modifica `holidays` e não é um escopo territorial. O cálculo consulta primeiro os feriados aplicáveis e depois substitui o resultado somente para a data e o estágio indicados. Recessos, folgas, pontes e fechamentos específicos devem ser registrados como pausas do estágio. Toda criação, alteração ou invalidação gera Activity Log; o Model proíbe a exclusão física, preservando inclusive exceções que poderão participar de uma previsão. A autoria fica no Activity Log.\n\n## Checklist\n\n- [x] Criar migration com `UNIQUE (internship_id, date)` e `RESTRICT`.\n- [x] Criar Model, factory, relação, validações e Activity Log.\n- [ ] Criar Policy e autorização exclusiva do Setor de Estágio.\n- [ ] Recalcular a previsão após alteração autorizada.\n- [ ] Testar liberação de feriado, bloqueio de dia comum e datas duplicadas no fluxo de cálculo; as regras do registro e a unicidade já têm teste Pest.",
  "sections": [
    {
      "id": "contrato",
      "level": 2,
      "title": "Contrato",
      "text": "| Coluna | Tipo PostgreSQL | Nulo | Chaves/índices | Regra | | --- | --- | --- | --- | --- | | `id` | `bigint` | não | `PK` | Identificador da exceção. | | `internship_id` | `bigint` | não | `FK`, `UQ` com `date` | Estágio afetado; `RESTRICT`. | | `date` | `date` | não | `UQ` com `internship_id` | Uma data por registro; feriadão usa registros separados. | | `is_working_day` | `boolean` | não | — | `true` libera expediente; `false` bloqueia expediente. | | `reason` | `text` | não | — | Justificativa obrigatória. |  | `created_at` | `timestamp(0)` | não | — | Auditoria. | | `updated_at` | `timestamp(0)` | não | — | Auditoria técnica. |  Uma exceção não modifica `holidays` e não é um escopo territorial. O cálculo consulta primeiro os feriados aplicáveis e depois substitui o resultado somente para a data e o estágio indicados. Recessos, folgas, pontes e fechamentos específicos devem ser registrados como pausas do estágio. Toda criação, alteração ou invalidação gera Activity Log; o Model proíbe a exclusão física, preservando inclusive exceções que poderão participar de uma previsão. A autoria fica no Activity Log.",
      "line": 4
    },
    {
      "id": "checklist",
      "level": 2,
      "title": "Checklist",
      "text": "- [x] Criar migration com `UNIQUE (internship_id, date)` e `RESTRICT`. - [x] Criar Model, factory, relação, validações e Activity Log. - [ ] Criar Policy e autorização exclusiva do Setor de Estágio. - [ ] Recalcular a previsão após alteração autorizada. - [ ] Testar liberação de feriado, bloqueio de dia comum e datas duplicadas no fluxo de cálculo; as regras do registro e a unicidade já têm teste Pest.",
      "line": 19
    }
  ],
  "sourcePath": "content/migration-22-internship-calendar-overrides.md",
  "visuals": [],
  "apiVersion": 1
}
