{
  "id": "migration-17-internship-pauses",
  "title": "Migration 17 — internship_pauses",
  "description": "Contrato das pausas de estágio e sua validação temporal.",
  "type": "migration-reference",
  "status": "implemented",
  "visibility": "public",
  "tags": [
    "sge/migrations",
    "sge/estagio",
    "sge/historico"
  ],
  "related": [
    "migration-15-internships",
    "service-internshipenddatecalculator",
    "schedules"
  ],
  "sourceRefs": [],
  "authors": [],
  "updated": null,
  "diagram": null,
  "body": "> [!success] Estado\n> Migration, Model, factory, relação e validação de datas/sobreposição implementados. A sincronização do status e o recálculo do término permanecem no fluxo funcional.\n\n## Contrato\n\n| Campo                   | Regra                                                   |\n| ----------------------- | ------------------------------------------------------- |\n| `id`                    | bigint, chave primária.                                 |\n| `internship_id`         | FK obrigatória.                                         |\n| `starts_at` / `ends_at` | `date` obrigatórios; início e fim inclusivos da pausa.  |\n| `reason`                | motivo obrigatório.                                     |\n| timestamps              | auditoria.                                              |\n\nPausas não podem se sobrepor, só podem ser criadas em estágio `InProgress`, não podem começar antes de `planned_start_date` e devem participar do recálculo da previsão de término. O intervalo é inclusivo e não credita horas, mesmo que contenha dia programado. A FK deve preservar o histórico de pausas. A Action de criação ou alteração usa lock no estágio, chama [Service — InternshipEndDateCalculator](doc:service-internshipenddatecalculator) e sincroniza o status efetivo; [Schedules](doc:schedules) repete essa conferência diariamente.\n\n## Checklist\n\n- [x] Criar migration, Model, factory, relação e índice por estágio/período.\n- [x] Definir validação de intervalo e sobreposição no Model.\n- [ ] Atualizar status `Paused`/`InProgress` pela Action de sincronização, com autorização e sem update direto.\n- [x] Registrar criação, alteração e remoção no Activity Log.\n- [ ] Testar pausa válida, sobreposição, intervalo invertido e impacto na data final.\n- [x] Testar migrate/rollback na ordem completa.",
  "sections": [
    {
      "id": "contrato",
      "level": 2,
      "title": "Contrato",
      "text": "| Campo                   | Regra                                                   | | ----------------------- | ------------------------------------------------------- | | `id`                    | bigint, chave primária.                                 | | `internship_id`         | FK obrigatória.                                         | | `starts_at` / `ends_at` | `date` obrigatórios; início e fim inclusivos da pausa.  | | `reason`                | motivo obrigatório.                                     | | timestamps              | auditoria.                                              |  Pausas não podem se sobrepor, só podem ser criadas em estágio `InProgress`, não podem começar antes de `planned_start_date` e devem participar do recálculo da previsão de término. O intervalo é inclusivo e não credita horas, mesmo que contenha dia programado. A FK deve preservar o histórico de pausas. A Action de criação ou alteração usa lock no estágio, chama [Service — InternshipEndDateCalculator](doc:service-internshipenddatecalculator) e sincroniza o status efetivo; [Schedules](doc:schedules) repete essa conferência diariamente.",
      "line": 4
    },
    {
      "id": "checklist",
      "level": 2,
      "title": "Checklist",
      "text": "- [x] Criar migration, Model, factory, relação e índice por estágio/período. - [x] Definir validação de intervalo e sobreposição no Model. - [ ] Atualizar status `Paused`/`InProgress` pela Action de sincronização, com autorização e sem update direto. - [x] Registrar criação, alteração e remoção no Activity Log. - [ ] Testar pausa válida, sobreposição, intervalo invertido e impacto na data final. - [x] Testar migrate/rollback na ordem completa.",
      "line": 16
    }
  ],
  "sourcePath": "content/migration-17-internship-pauses.md",
  "visuals": [],
  "apiVersion": 1
}
