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>
472 lines
15 KiB
SQL
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 $$;
|