migration-reference · implemented
Migration 11 — internship_types
Contrato dos tipos de estágio e suas regras configuráveis.
Contrato
| Campo | Regra |
|---|---|
id | bigint autoincremental, chave primária. |
course_id | bigint obrigatório, FK para courses.id com ON DELETE RESTRICT. |
name | Nome obrigatório, varchar(255). |
required_hours | Carga horária obrigatória, inteiro positivo. |
supervisor_evaluation_weight | Peso da avaliação do supervisor, inteiro positivo. |
report_weight | Peso do relatório, inteiro positivo. |
presentation_weight | Peso da apresentação, inteiro positivo. |
very_good_value, good_value, satisfactory_value, unsatisfactory_value | Valores configuráveis dos conceitos, numeric(5,1). |
max_daily_hours | Máximo de horas por dia, inteiro com padrão 6; não pode ser menor que 6. |
max_weekly_hours | Máximo de horas por semana, inteiro com padrão 30; não pode ser menor que 30. |
safety_margin_days | Margem de segurança para previsão do término, inteiro não negativo com padrão 7. |
deactivated_at | Timestamp nullable; nulo significa tipo ativo. |
created_at, updated_at | Timestamps convencionais do Laravel. |
Os campos escalares substituem a coluna JSONB rules. Eles têm casts declarados no Model, incluindo cast integer para os pesos e cast decimal:1 para os valores configuráveis dos conceitos. EvaluationConcept define os nomes persistidos e seus rótulos em português: a chave histórica excellent aparece como “Ótimo” na interface. O valor de excellent é o próprio supervisor_evaluation_weight e não tem coluna. unsatisfactory tem valor inicial 0, mas permanece configurável por tipo de estágio na coluna unsatisfactory_value. Os limites de jornada e a margem são inteiros.
Regras de negócio em PHP
As regras são aplicadas pela validação Laravel no Model ao salvar. A migration não adiciona constraints CHECK para validar regras de negócio; a validação acontece na aplicação.
required_hoursdeve ser inteiro positivo.- Os três pesos devem ser inteiros positivos e sua soma deve ser exatamente
10. O peso da avaliação do supervisor também define o valor deexcellente o limite superior dos demais conceitos. - Os quatro conceitos configuráveis devem ser números não negativos com até uma casa decimal. A sequência completa —
excellent,very_good,good,satisfactoryeunsatisfactory— deve ser estritamente decrescente; valores iguais não são permitidos. Os conceitos configuráveis não podem ultrapassarsupervisor_evaluation_weight.unsatisfactorycostuma começar em zero, mas cada tipo pode definir outro valor, como1.0. excellentusa diretamentesupervisor_evaluation_weight, sem duplicar esse valor em uma coluna.max_daily_hoursemax_weekly_hourssão inteiros. O formulário começa preenchido com6e30; esses valores são limites mínimos, não podem ser reduzidos e podem ser aumentados. A jornada informada deve respeitar os limites configurados para cada dia e para a soma semanal.safety_margin_daysé inteiro não negativo, inicialmente7, e será congelado no estágio. O cálculo automático usa essa margem e grava somente a previsão eminternships.projected_end_date; não persiste fórmula, versão de algoritmo ou entradas. A regra completa está definida por este contrato e pelo serviço de cálculo de término.
A validação também exige curso ativo na criação, troca de curso ou reativação. Uma desativação posterior do curso não bloqueia a edição de um tipo já existente enquanto sua associação não mudar. active() filtra tipos não desativados; esta migration não cria índices secundários explícitos.
Os pesos e os valores dos conceitos são configurados no tipo de estágio, nunca na resposta da avaliação nem livremente em cada estágio. Na criação do estágio, o snapshot pode agrupar esses valores no contrato histórico internship_type_snapshot.rules, montado a partir das colunas escalares, usando o peso do supervisor para excellent; alterar o tipo depois não pode recalcular históricos já formalizados.
Checklist
- Definir que pesos e valores dos conceitos pertencem ao tipo de estágio.
- Definir campos escalares, precisão dos pesos e conceitos, limites de jornada e margem do cálculo de término.
- Criar migration sem constraints
CHECKde regras de negócio e sem índice secundário explícito. - Criar Model com casts e validação Laravel em PHP.
- Criar factory com regras completas.
- Implementar validação da carga horária obrigatória, dos pesos, conceitos e limites diário e semanal da jornada.
- Testar consulta de tipos por curso/campus e ciclo de desativação.
- Testar snapshot e alteração do tipo após uso no estágio, quando a Migration 15 existir.
- Testar conceitos fora do peso,
excellentderivado do peso do supervisor, valores repetidos, ordem inválida, limites menores que 6/30 e margem negativa. - Testar migrate/rollback das Migrations 15, 11, 10 e 09 na ordem das FKs.