feat(demo): horario real de 4t A para Leo en el seeder

La familia demo siembra el horario escolar real de 4º de primaria para
Leo (11 asignaturas nuevas bilingües + 29 entradas semanales en orden
cronológico; Piscina lleva la Toalla asociada). Nora y Mía conservan el
horario genérico. Test que fija el lunes completo de Leo.
This commit is contained in:
Jaume Garriga Maestre
2026-07-12 22:29:17 +02:00
parent 1db262f8ea
commit 4eccee9b05
2 changed files with 61 additions and 3 deletions

View File

@@ -94,8 +94,14 @@ public class DataSeeder implements ApplicationRunner {
Child leo = childRepository.save(child(family, "Leo", "🐢", "#5BC0BE", 9, 28, LocalTime.of(8, 30)));
Child mia = childRepository.save(child(family, "Mía", "🦉", "#A78BD0", 6, 55, LocalTime.of(8, 15)));
for (Child c : List.of(nora, leo, mia)) {
// Nora y Mía llevan el horario genérico de ejemplo; Leo (9 años, 4º de
// primaria) lleva un horario real de 4t A, como en una familia de verdad.
for (Child c : List.of(nora, mia)) {
seedWeeklyMornings(c, activities);
}
seedWeekly4tA(leo, family, activities);
for (Child c : List.of(nora, leo, mia)) {
// Rutinas de tarde escalonadas por edad, desde el catálogo de la familia.
initialDataset.provisionChildRoutines(c);
}
@@ -190,6 +196,44 @@ public class DataSeeder implements ApplicationRunner {
templateRepository.save(new WeeklyTemplateEntry(child, day, activity, 0));
}
/**
* Horario REAL de 4º de primaria (4t A, curso 2025-26) para Leo: asignaturas
* propias del curso más las genéricas reutilizadas (Matemáticas, Música,
* Gimnasia=Ed. Física), en el orden cronológico de cada día. El patio no se
* siembra: no es una actividad con material que preparar.
*/
private void seedWeekly4tA(Child leo, Family family, ActivitiesCatalog base) {
// La toalla (extra de la demo) acompaña a Piscina: hay que meterla en la mochila.
MaterialItem toalla = fromBase(materialRepository.findByFamilyId(family.getId()), "Toalla");
Activity catala = activity(family, "Català", "Català", "📕", "#F4C95D");
Activity castellano = activity(family, "Castellano", "Castellà", "📙", "#F2A65A");
Activity medio = activity(family, "Medio", "Medi", "🌍", "#7FBF6B");
Activity ingles = activity(family, "Inglés", "Anglès", "🇬🇧", "#A78BD0");
Activity piscina = activity(family, "Piscina", "Piscina", "🏊", "#5BC0BE", toalla);
Activity lectura = activity(family, "Lectura", "Lectura", "📖", "#EC8FA4");
Activity religiosa = activity(family, "Cultura religiosa", "Cultura religiosa", "🙏", "#F2A65A");
Activity workshop = activity(family, "Workshop", "Workshop", "🛠️", "#A78BD0");
Activity robotica = activity(family, "Robótica", "Robòtica", "🤖", "#EC8FA4");
Activity plastica = activity(family, "Plástica", "Plàstica", "🎨", "#EC8FA4");
Activity tutoria = activity(family, "Tutoría", "Tutoria", "💬", "#5BC0BE");
addDay(leo, DayOfWeek.MONDAY, base.matematicas(), medio, castellano, piscina, ingles, catala);
addDay(leo, DayOfWeek.TUESDAY, catala, base.musica(), base.gimnasia(), ingles, religiosa,
base.matematicas());
addDay(leo, DayOfWeek.WEDNESDAY, catala, medio, ingles, lectura, base.matematicas(), castellano);
addDay(leo, DayOfWeek.THURSDAY, workshop, base.matematicas(), medio, base.musica(), robotica,
base.gimnasia());
addDay(leo, DayOfWeek.FRIDAY, base.matematicas(), plastica, catala, castellano, tutoria);
}
/** Añade las asignaturas de un día en orden cronológico (orderIndex incremental). */
private void addDay(Child child, DayOfWeek day, Activity... subjects) {
for (int i = 0; i < subjects.length; i++) {
templateRepository.save(new WeeklyTemplateEntry(child, day, subjects[i], i));
}
}
private record ActivitiesCatalog(Activity gimnasia, Activity musica, Activity matematicas,
Activity lengua) {
}

View File

@@ -14,6 +14,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.springframework.transaction.annotation.Transactional;
/**
* Verifica que el sembrado del prototipo (familia demo + sus datos) se ejecuta
@@ -41,8 +42,21 @@ class DataSeederIT {
assertThat(familyRepository.findByEmailIgnoreCase("demo@recordalexia.local")).isPresent();
assertThat(childRepository.count()).isEqualTo(3); // Nora, Leo, Mía
assertThat(rewardRepository.count()).isEqualTo(6); // 6 premios
assertThat(activityRepository.count()).isEqualTo(4); // 4 actividades
assertThat(templateRepository.count()).isEqualTo(15); // 3 niños x 5 días
assertThat(activityRepository.count()).isEqualTo(15); // 4 genéricas + 11 de 4t A
// Nora y Mía: 5 días x 1 asignatura; Leo: horario real 4t A (29 entradas).
assertThat(templateRepository.count()).isEqualTo(5 + 5 + 29);
}
// Transaccional: navega la relación LAZY entrada→actividad, que requiere sesión.
@Test
@Transactional(readOnly = true)
void leoLlevaElHorarioRealDe4tA() {
Long leoId = childRepository.findAll().stream()
.filter(c -> c.getName().equals("Leo")).findFirst().orElseThrow().getId();
var lunes = templateRepository
.findByChildIdAndDayOfWeekOrderByOrderIndexAsc(leoId, java.time.DayOfWeek.MONDAY);
assertThat(lunes).extracting(e -> e.getActivity().getLabelEs())
.containsExactly("Matemáticas", "Medio", "Castellano", "Piscina", "Inglés", "Català");
}
@Test