workspace-v1/projects/gamilit/database/seeds/prod/social_features/02-classrooms.sql
Adrian Flores Cortes 967ab360bb Initial commit: Workspace v1 with 3-layer architecture
Structure:
- control-plane/: Registries, SIMCO directives, CI/CD templates
- projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics
- shared/: Libs catalog, knowledge-base

Key features:
- Centralized port, domain, database, and service registries
- 23 SIMCO directives + 6 fundamental principles
- NEXUS agent profiles with delegation rules
- Validation scripts for workspace integrity
- Dockerfiles for all services
- Path aliases for quick reference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 00:35:19 -06:00

472 lines
15 KiB
SQL

-- =====================================================
-- Seed: social_features.classrooms (PROD)
-- Description: Aulas demo para testing y demostraciones
-- Environment: PRODUCTION
-- Dependencies: social_features.schools, auth_management.profiles
-- Order: 02
-- Created: 2025-01-11
-- Version: 2.0 (Actualizado para alineación con DDL)
-- =====================================================
--
-- AULAS INCLUIDAS:
-- - Sin Asignar (DEFAULT - Sistema) ← NUEVO: Para asignación automática
-- - 5to A (Escuela Marie Curie, Profesor 1)
-- - 5to B (Escuela Marie Curie, Profesor 2)
-- - 6to A (Escuela Marie Curie, Profesor 1)
-- - Aula de Pruebas (IEI, Director)
-- - Aula Demo Parent Portal (IEI, Profesor 2)
--
-- TOTAL: 6 aulas (1 sistema + 5 demo)
--
-- IMPORTANTE: Estas aulas están asociadas a las escuelas y profesores demo.
--
-- CAMBIOS v2.0:
-- - Agregado tenant_id (requerido)
-- - Removido status (columna legacy)
-- - Actualizada estructura de bloques DO $$
-- =====================================================
SET search_path TO social_features, auth_management, public;
-- =====================================================
-- Obtener tenant_id y validar dependencias
-- =====================================================
DO $$
DECLARE
v_tenant_id UUID;
v_school_count INTEGER;
v_teacher_count INTEGER;
BEGIN
-- Obtener el tenant principal
SELECT id INTO v_tenant_id
FROM auth_management.tenants
WHERE name = 'GAMILIT Platform'
LIMIT 1;
IF v_tenant_id IS NULL THEN
RAISE EXCEPTION 'Tenant "GAMILIT Platform" no encontrado. Ejecutar primero seed de tenants.';
END IF;
-- Validar que existan escuelas
SELECT COUNT(*) INTO v_school_count
FROM social_features.schools;
IF v_school_count = 0 THEN
RAISE EXCEPTION 'No hay escuelas. Ejecutar primero seed de schools.';
END IF;
-- Validar que existan profesores
SELECT COUNT(*) INTO v_teacher_count
FROM auth_management.profiles
WHERE email IN ('teacher@gamilit.com', 'teacher2@gamilit.com', 'director@gamilit.com');
IF v_teacher_count = 0 THEN
RAISE WARNING 'No se encontraron profesores demo. Las aulas se crearán pero pueden tener profesores inválidos.';
END IF;
RAISE NOTICE 'Usando tenant_id: %', v_tenant_id;
RAISE NOTICE 'Escuelas disponibles: %', v_school_count;
RAISE NOTICE 'Profesores demo disponibles: %', v_teacher_count;
-- =====================================================
-- INSERT: Aulas Demo
-- =====================================================
INSERT INTO social_features.classrooms (
id,
school_id,
tenant_id,
teacher_id,
name,
code,
grade_level,
section,
subject,
description,
capacity,
current_students_count,
start_date,
end_date,
schedule,
is_active,
settings,
metadata,
created_at,
updated_at
) VALUES
-- =====================================================
-- Aula 0: CLASSROOM DEFAULT (Sistema - Sin Asignar)
-- IMPORTANTE: Este classroom es usado automáticamente para
-- asignar estudiantes nuevos que aún no tienen aula.
-- =====================================================
(
'00000000-0000-0000-0000-000000000001'::uuid, -- UUID predecible para default
'50000000-0000-0000-0000-000000000001'::uuid, -- Escuela Marie Curie (default)
v_tenant_id,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid, -- Teacher default (teacher@gamilit.com)
'Sin Asignar - Aula Default',
'DEFAULT',
'todos', -- Todos los niveles
'DEFAULT',
'General',
'Aula de sistema para estudiantes pendientes de asignación. Los administradores y profesores pueden reasignar estudiantes a aulas específicas.',
999, -- Capacidad alta para no limitar
0,
'2025-01-01'::date,
'2099-12-31'::date, -- Sin fecha de fin
jsonb_build_object(
'days', jsonb_build_array('Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes'),
'time', 'flexible',
'room', 'Virtual',
'weekly_hours', 0
),
true,
jsonb_build_object(
'allow_student_self_enrollment', false,
'enable_gamification', true,
'require_parental_consent', false,
'grading_system', 'none',
'attendance_required', false,
'is_system_classroom', true
),
jsonb_build_object(
'is_default', true,
'system_classroom', true,
'auto_assignment', true,
'description', 'Classroom para asignación automática de estudiantes nuevos'
),
gamilit.now_mexico(),
gamilit.now_mexico()
),
-- =====================================================
-- Aula 1: 5to A - Escuela Marie Curie (Profesor 1)
-- =====================================================
(
'60000000-0000-0000-0000-000000000001'::uuid,
'50000000-0000-0000-0000-000000000001'::uuid, -- Escuela Marie Curie
v_tenant_id,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid, -- Profesor 1 (teacher@gamilit.com)
'5to A - Comprensión Lectora',
'5A-COMP-2025',
'5',
'A',
'Comprensión Lectora',
'Grupo de 5to grado, sección A. Enfoque en comprensión literal e inferencial.',
35,
2, -- 2 estudiantes inicialmente
'2025-08-15'::date,
'2026-07-15'::date,
jsonb_build_object(
'days', jsonb_build_array('Lunes', 'Miércoles', 'Viernes'),
'time', '08:00-09:30',
'room', 'Aula 501',
'weekly_hours', 4.5
),
true,
jsonb_build_object(
'allow_student_self_enrollment', false,
'enable_gamification', true,
'require_parental_consent', true,
'grading_system', 'numerical',
'attendance_required', true,
'homework_policy', jsonb_build_object(
'frequency', 'weekly',
'submission_platform', 'gamilit',
'late_penalty', 10
)
),
jsonb_build_object(
'academic_year', '2025-2026',
'demo_classroom', true
),
gamilit.now_mexico(),
gamilit.now_mexico()
),
-- =====================================================
-- Aula 2: 5to B - Escuela Marie Curie (Profesor 2)
-- =====================================================
(
'60000000-0000-0000-0000-000000000002'::uuid,
'50000000-0000-0000-0000-000000000001'::uuid, -- Escuela Marie Curie
v_tenant_id,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid, -- Profesor 2 (teacher2@gamilit.com)
'5to B - Lectura Digital',
'5B-DIGI-2025',
'5',
'B',
'Lectura Digital',
'Grupo de 5to grado, sección B. Enfoque en competencias digitales y multimedia.',
35,
1,
'2025-08-15'::date,
'2026-07-15'::date,
jsonb_build_object(
'days', jsonb_build_array('Martes', 'Jueves'),
'time', '10:00-11:30',
'room', 'Lab Cómputo 1',
'weekly_hours', 3
),
true,
jsonb_build_object(
'allow_student_self_enrollment', false,
'enable_gamification', true,
'require_parental_consent', true,
'grading_system', 'numerical',
'attendance_required', true,
'technology_requirements', jsonb_build_object(
'devices', 'tablets',
'software', jsonb_build_array('GAMILIT Platform', 'Browser')
)
),
jsonb_build_object(
'academic_year', '2025-2026',
'demo_classroom', true
),
gamilit.now_mexico(),
gamilit.now_mexico()
),
-- =====================================================
-- Aula 3: 6to A - Escuela Marie Curie (Profesor 1)
-- =====================================================
(
'60000000-0000-0000-0000-000000000003'::uuid,
'50000000-0000-0000-0000-000000000001'::uuid, -- Escuela Marie Curie
v_tenant_id,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid, -- Profesor 1
'6to A - Producción de Textos',
'6A-PROD-2025',
'6',
'A',
'Producción de Textos',
'Grupo de 6to grado, sección A. Enfoque en escritura creativa y argumentativa.',
35,
1,
'2025-08-15'::date,
'2026-07-15'::date,
jsonb_build_object(
'days', jsonb_build_array('Lunes', 'Miércoles', 'Viernes'),
'time', '09:45-11:15',
'room', 'Aula 601',
'weekly_hours', 4.5
),
true,
jsonb_build_object(
'allow_student_self_enrollment', false,
'enable_gamification', true,
'require_parental_consent', true,
'grading_system', 'numerical',
'attendance_required', true,
'writing_portfolio', true
),
jsonb_build_object(
'academic_year', '2025-2026',
'demo_classroom', true
),
gamilit.now_mexico(),
gamilit.now_mexico()
),
-- =====================================================
-- Aula 4: Aula de Pruebas - IEI (Director)
-- =====================================================
(
'60000000-0000-0000-0000-000000000004'::uuid,
'50000000-0000-0000-0000-000000000002'::uuid, -- Instituto IEI
v_tenant_id,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid, -- Director (director@gamilit.com)
'Aula de Pruebas - Todos los Niveles',
'TEST-ALL-2025',
'variable',
'TEST',
'Testing y Demos',
'Aula para pruebas técnicas y demostraciones del sistema GAMILIT.',
50,
0,
'2025-01-01'::date,
'2025-12-31'::date,
jsonb_build_object(
'days', jsonb_build_array('Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes'),
'time', 'flexible',
'room', 'Virtual',
'weekly_hours', 10
),
true,
jsonb_build_object(
'allow_student_self_enrollment', true,
'enable_gamification', true,
'require_parental_consent', false,
'grading_system', 'pass_fail',
'attendance_required', false,
'testing_environment', true
),
jsonb_build_object(
'academic_year', '2025',
'demo_classroom', true,
'environment', 'testing'
),
gamilit.now_mexico(),
gamilit.now_mexico()
),
-- =====================================================
-- Aula 5: Parent Portal Demo - IEI (Profesor 2)
-- =====================================================
(
'60000000-0000-0000-0000-000000000005'::uuid,
'50000000-0000-0000-0000-000000000002'::uuid, -- Instituto IEI
v_tenant_id,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid, -- Profesor 2
'Demo Parent Portal - 4to A',
'4A-PARENT-2025',
'4',
'A',
'Comprensión General',
'Aula demo para mostrar funcionalidad de Parent Portal con comunicación padre-maestro.',
30,
0,
'2025-08-15'::date,
'2026-06-30'::date,
jsonb_build_object(
'days', jsonb_build_array('Lunes', 'Miércoles', 'Viernes'),
'time', '08:00-09:30',
'room', 'Aula 401',
'weekly_hours', 4.5
),
true,
jsonb_build_object(
'allow_student_self_enrollment', false,
'enable_gamification', true,
'require_parental_consent', true,
'grading_system', 'numerical',
'attendance_required', true,
'parent_portal_features', jsonb_build_object(
'notifications', true,
'progress_reports', true,
'messaging', true,
'calendar', true
)
),
jsonb_build_object(
'academic_year', '2025-2026',
'demo_classroom', true,
'parent_portal_demo', true
),
gamilit.now_mexico(),
gamilit.now_mexico()
)
ON CONFLICT (code) DO UPDATE SET
name = EXCLUDED.name,
description = EXCLUDED.description,
capacity = EXCLUDED.capacity,
current_students_count = EXCLUDED.current_students_count,
start_date = EXCLUDED.start_date,
end_date = EXCLUDED.end_date,
schedule = EXCLUDED.schedule,
is_active = EXCLUDED.is_active,
settings = EXCLUDED.settings,
metadata = EXCLUDED.metadata,
updated_at = gamilit.now_mexico();
END $$;
-- =====================================================
-- Verification Query
-- =====================================================
DO $$
DECLARE
classroom_count INTEGER;
marie_curie_count INTEGER;
iei_count INTEGER;
BEGIN
SELECT COUNT(*) INTO classroom_count
FROM social_features.classrooms
WHERE metadata->>'demo_classroom' = 'true';
SELECT COUNT(*) INTO marie_curie_count
FROM social_features.classrooms c
JOIN social_features.schools s ON c.school_id = s.id
WHERE s.code = 'EP-MC-CDMX' AND c.metadata->>'demo_classroom' = 'true';
SELECT COUNT(*) INTO iei_count
FROM social_features.classrooms c
JOIN social_features.schools s ON c.school_id = s.id
WHERE s.code = 'IEI-GDL' AND c.metadata->>'demo_classroom' = 'true';
RAISE NOTICE '========================================';
RAISE NOTICE 'AULAS DEMO CREADAS EXITOSAMENTE';
RAISE NOTICE '========================================';
RAISE NOTICE 'Total aulas: %', classroom_count;
RAISE NOTICE ' - Marie Curie: %', marie_curie_count;
RAISE NOTICE ' - IEI: %', iei_count;
RAISE NOTICE '========================================';
IF classroom_count >= 5 THEN
RAISE NOTICE '✓ Todas las aulas fueron creadas correctamente (incluyendo DEFAULT)';
ELSE
RAISE WARNING '⚠ Se esperaban al menos 5 aulas, se crearon %', classroom_count;
END IF;
END $$;
-- =====================================================
-- SYNC teacher_classrooms (many-to-many)
-- =====================================================
-- Asegurar que todos los classrooms tienen su entrada en teacher_classrooms
-- Esto es necesario porque algunos servicios usan classrooms.teacher_id
-- y otros usan la tabla teacher_classrooms
-- =====================================================
INSERT INTO social_features.teacher_classrooms (id, teacher_id, classroom_id, tenant_id, role, assigned_at, created_at)
SELECT
gen_random_uuid(),
c.teacher_id,
c.id,
c.tenant_id,
'owner',
c.created_at,
NOW()
FROM social_features.classrooms c
WHERE c.teacher_id IS NOT NULL
ON CONFLICT DO NOTHING;
-- =====================================================
-- Listado de aulas
-- =====================================================
DO $$
DECLARE
classroom_record RECORD;
tc_count INTEGER;
BEGIN
-- Contar teacher_classrooms sincronizados
SELECT COUNT(*) INTO tc_count FROM social_features.teacher_classrooms;
RAISE NOTICE '';
RAISE NOTICE 'Listado de aulas demo:';
RAISE NOTICE '========================================';
FOR classroom_record IN
SELECT c.name, c.code, s.name as school_name, c.grade_level, c.section
FROM social_features.classrooms c
JOIN social_features.schools s ON c.school_id = s.id
WHERE c.metadata->>'demo_classroom' = 'true'
ORDER BY s.name, c.grade_level, c.section
LOOP
RAISE NOTICE ' - % (%) - % %° %',
classroom_record.name,
classroom_record.code,
classroom_record.school_name,
classroom_record.grade_level,
classroom_record.section;
END LOOP;
RAISE NOTICE '========================================';
RAISE NOTICE 'teacher_classrooms sincronizados: %', tc_count;
END $$;