diff --git a/backend/src/main/java/es/asepeyo/recordalexia/bootstrap/DataSeeder.java b/backend/src/main/java/es/asepeyo/recordalexia/bootstrap/DataSeeder.java index b93f89c..48fa9a5 100644 --- a/backend/src/main/java/es/asepeyo/recordalexia/bootstrap/DataSeeder.java +++ b/backend/src/main/java/es/asepeyo/recordalexia/bootstrap/DataSeeder.java @@ -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) { } diff --git a/backend/src/test/java/es/asepeyo/recordalexia/bootstrap/DataSeederIT.java b/backend/src/test/java/es/asepeyo/recordalexia/bootstrap/DataSeederIT.java index a232eba..c243731 100644 --- a/backend/src/test/java/es/asepeyo/recordalexia/bootstrap/DataSeederIT.java +++ b/backend/src/test/java/es/asepeyo/recordalexia/bootstrap/DataSeederIT.java @@ -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