UC-SISGHA-GH-001 — Gerar horário acadêmico
Informações gerais
| Campo | Valor |
|---|---|
| Ator primário | DAPE |
| Atores secundários | timetable-generator (sistema), management-service (sistema) |
| Nível | User Goal |
| Escopo | SISGHA |
| Pré-condições | DAPE autenticado; ao menos uma oferta de formação com diários configurados; calendário letivo ativo; horários de aula definidos para o campus |
| Garantia de sucesso (pós-condições) | Grade horária gerada e armazenada em gerar_horario.resposta_gerador com status SUCESSO; grade disponível para visualização |
| Garantia mínima | Registro gerar_horario criado com status ERRO e detalhes do problema armazenados em resposta_gerador |
| Trigger | DAPE clica em "Gerar Horário" no modal de geração |
Cenário principal (fluxo de sucesso)
- DAPE acessa o módulo de geração de horário (
/sisgha/dape/horario). - DAPE clica em "Gerar Horário" e sistema exibe modal de configuração.
- DAPE seleciona oferta(s) de formação e calendário(s) letivo(s) no escopo.
- DAPE escolhe tipo de geração: Permanente (com data de início) ou Temporário (com data de término).
- DAPE configura parâmetros opcionais: grade anterior para otimização incremental (pinning).
- DAPE confirma a geração.
- Sistema cria registro
gerar_horariocom statusSOLICITADOe persisterequisicao_gerador(JSONB) com oGenerateRequestserializado. - Sistema publica mensagem na fila RabbitMQ para o timetable-generator (ADR-006).
- Status atualiza para
PENDENTE. Sistema exibe modal de loading com polling a cada 3s. - timetable-generator recebe o
GenerateRequest, executa o solver CP-SAT com 10 constraints hard e sistema de scoring. - Solver retorna
ServiceGenerateResponsecom lista deGeneratedTimetable[]ordenadas por score. - management-service persiste
resposta_geradore atualiza status paraSUCESSO. - Sistema exibe modal de sucesso com formações incluídas.
- DAPE clica em "Visualizar Horário" e navega para a grade gerada.
Extensões
3a. Nenhuma oferta de formação tem diários configurados:
- Sistema exibe alerta: "As ofertas selecionadas não possuem diários configurados."
- Botão de confirmação permanece desabilitado.
- DAPE precisa configurar diários antes de prosseguir.
5a. DAPE fornece grade anterior (pinning):
- Sistema inclui
previous_timetable_gridnoGenerateRequest. - Solver aplica boost weights para estabilidade (BoostSameDayOfWeekAndTimeSlot = 100).
- Células da grade anterior tendem a manter posição.
9a. DAPE cancela a geração:
- Sistema envia sinal de cancelamento.
- Status muda para
ERROcom motivo "Cancelado pelo usuário". - Modal fecha e DAPE retorna à tela anterior.
10a. Solver encontra infeasibilidade (sem solução possível):
- Solver retorna
ServiceGenerateResponseResultErrorcomerror_codeeerror_message. - management-service persiste erro e atualiza status para
ERRO. - Sistema exibe modal de erro com botão "Ver detalhes".
- DAPE acessa log de conflitos (UC-SISGHA-GH-001 extensão → UC-SISGHA-GH-002 para edição manual).
10b. Solver demora mais que o timeout:
- [a definir — timeout máximo não configurado ainda]
12a. Horário permanente substitui vigente:
- Sistema desativa grade anterior da mesma oferta de formação.
- Nova grade entra em vigência a partir de
data_inicio.
Constraints aplicadas pelo solver
Referência completa: Constraints do Solver
- Turma: sem aula duplicada no mesmo slot
- Professor: sem aula duplicada no mesmo slot
- Diário: limite semanal de aulas
- Diário: limite total de aulas restantes
- Professor: buffer de almoço (11:30–13:30)
- Turma: buffer de almoço (11:30–13:30)
- Professor: sem turnos opostos no mesmo dia
- Professor: 12h de descanso após noturno
- Turma: sem sobreposição de horários
- Professor: sem sobreposição de horários
Contrato de dados
Referência completa: Contrato do Solver (TypeSpec)
Input: GenerateRequest com groups, teachers, diaries, time_slots, date range, grade anterior opcional.
Output: ServiceGenerateResponse — sucesso (grades + scores) ou erro (code + message).
Fonte: Relatório NotebookLM Seções 4, 5, 11. TypeSpec: messages/apis/timetable-generator-v1/src/. Solver: timetable-generator/Core/Generator/Generator.cs.