workspace/projects/gamilit/apps/database/seeds/dev/CREAR-USUARIOS-TESTING.sql
rckrdmrd a249c99be2
Some checks failed
CI Pipeline / changes (push) Has been cancelled
CI Pipeline / core (push) Has been cancelled
CI Pipeline / trading-backend (push) Has been cancelled
CI Pipeline / trading-data-service (push) Has been cancelled
CI Pipeline / trading-frontend (push) Has been cancelled
CI Pipeline / erp-core (push) Has been cancelled
CI Pipeline / erp-mecanicas (push) Has been cancelled
CI Pipeline / gamilit-backend (push) Has been cancelled
CI Pipeline / gamilit-frontend (push) Has been cancelled
feat: Sincronizacion completa workspace 2025-12-26
## Backend
- fix(ranks): Reordenar rutas en RanksController para evitar conflictos 404
- feat(gamification): Agregar MayaRankEntity al modulo
- feat(ml-coins): Expandir funcionalidad del servicio
- feat(teacher): Mejoras en dashboard, mensajes y reportes
- feat(entities): Nuevas entidades admin, educational, progress, social

## Frontend
- feat(gamificationAPI): API completa para ranks con endpoints
- feat(RubricEvaluator): Nuevo componente para evaluacion docente
- refactor(admin): Mejoras en hooks y paginas
- refactor(teacher): Mejoras en paginas del portal

## Database
- fix(initialize_user_stats): Agregar is_current y achieved_at a user_ranks
- fix(notifications-policies): Corregir RLS con JOIN correcto
- feat(friendships): Agregar columna status con estados
- sync(seeds): Homologacion completa DEV <-> PROD

## Docs & Orchestration
- docs(api): Actualizar API-TEACHER-MODULE.md
- docs(frontend): COMPONENTES-INVENTARIO.md
- docs(database): VIEWS-INVENTARIO.md, VALIDACION-DDL-SEEDS
- Reportes de analisis y validacion

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 17:53:38 -06:00

407 lines
11 KiB
SQL

-- =====================================================
-- SCRIPT DE EMERGENCIA: CREAR USUARIOS DE TESTING
-- =====================================================
-- Fecha: 2025-11-11
-- Propósito: Crear usuarios de testing manualmente
-- Usuarios: admin@gamilit.com, teacher@gamilit.com, student@gamilit.com
-- Password: Test1234 (para todos)
-- =====================================================
-- Habilitar extensión pgcrypto si no está habilitada
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- Verificar tenant por defecto
DO $$
DECLARE
default_tenant_id uuid;
BEGIN
-- Buscar o crear tenant por defecto
SELECT id INTO default_tenant_id
FROM auth_management.tenants
WHERE name = 'GAMILIT Platform'
LIMIT 1;
IF default_tenant_id IS NULL THEN
INSERT INTO auth_management.tenants (
id, name, slug, status, settings, created_at, updated_at
) VALUES (
'00000000-0000-0000-0000-000000000001'::uuid,
'GAMILIT Platform',
'gamilit-platform',
'active',
'{}'::jsonb,
NOW(),
NOW()
) ON CONFLICT (id) DO NOTHING;
default_tenant_id := '00000000-0000-0000-0000-000000000001'::uuid;
END IF;
RAISE NOTICE 'Tenant ID: %', default_tenant_id;
END $$;
-- =====================================================
-- PASO 1: CREAR USUARIOS EN auth.users
-- =====================================================
INSERT INTO auth.users (
id,
instance_id,
email,
encrypted_password,
email_confirmed_at,
raw_app_meta_data,
raw_user_meta_data,
gamilit_role,
created_at,
updated_at,
confirmation_token,
email_change,
email_change_token_new,
recovery_token
) VALUES
-- ADMIN
(
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'::uuid,
'00000000-0000-0000-0000-000000000000'::uuid,
'admin@gamilit.com',
crypt('Test1234', gen_salt('bf', 10)),
NOW(),
jsonb_build_object(
'provider', 'email',
'providers', ARRAY['email']
),
jsonb_build_object(
'name', 'Admin GAMILIT',
'role', 'super_admin'
),
'super_admin'::auth_management.gamilit_role,
NOW(),
NOW(),
'',
'',
'',
''
),
-- TEACHER
(
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,
'00000000-0000-0000-0000-000000000000'::uuid,
'teacher@gamilit.com',
crypt('Test1234', gen_salt('bf', 10)),
NOW(),
jsonb_build_object(
'provider', 'email',
'providers', ARRAY['email']
),
jsonb_build_object(
'name', 'Profesor Testing',
'role', 'teacher'
),
'teacher'::auth_management.gamilit_role,
NOW(),
NOW(),
'',
'',
'',
''
),
-- STUDENT
(
'cccccccc-cccc-cccc-cccc-cccccccccccc'::uuid,
'00000000-0000-0000-0000-000000000000'::uuid,
'student@gamilit.com',
crypt('Test1234', gen_salt('bf', 10)),
NOW(),
jsonb_build_object(
'provider', 'email',
'providers', ARRAY['email']
),
jsonb_build_object(
'name', 'Estudiante Testing',
'role', 'student'
),
'student'::auth_management.gamilit_role,
NOW(),
NOW(),
'',
'',
'',
''
)
ON CONFLICT (email) DO UPDATE SET
encrypted_password = EXCLUDED.encrypted_password,
updated_at = NOW();
-- =====================================================
-- PASO 2: CREAR PROFILES EN auth_management.profiles
-- =====================================================
INSERT INTO auth_management.profiles (
id,
user_id,
tenant_id,
email,
full_name,
first_name,
last_name,
role,
status,
email_verified,
preferences,
created_at,
updated_at
) VALUES
-- ADMIN PROFILE
(
'aaaaaaaa-aaaa-aaaa-bbbb-aaaaaaaaaaaa'::uuid,
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'::uuid,
'00000000-0000-0000-0000-000000000001'::uuid,
'admin@gamilit.com',
'Admin GAMILIT',
'Admin',
'GAMILIT',
'super_admin'::auth_management.gamilit_role,
'active'::auth_management.user_status,
true,
jsonb_build_object(
'theme', 'detective',
'language', 'es',
'timezone', 'America/Mexico_City',
'sound_enabled', true,
'notifications_enabled', true
),
NOW(),
NOW()
),
-- TEACHER PROFILE
(
'bbbbbbbb-bbbb-bbbb-cccc-bbbbbbbbbbbb'::uuid,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,
'00000000-0000-0000-0000-000000000001'::uuid,
'teacher@gamilit.com',
'Profesor Testing',
'Profesor',
'Testing',
'teacher'::auth_management.gamilit_role,
'active'::auth_management.user_status,
true,
jsonb_build_object(
'theme', 'detective',
'language', 'es',
'timezone', 'America/Mexico_City',
'sound_enabled', true,
'notifications_enabled', true
),
NOW(),
NOW()
),
-- STUDENT PROFILE
(
'cccccccc-cccc-cccc-dddd-cccccccccccc'::uuid,
'cccccccc-cccc-cccc-cccc-cccccccccccc'::uuid,
'00000000-0000-0000-0000-000000000001'::uuid,
'student@gamilit.com',
'Estudiante Testing',
'Estudiante',
'Testing',
'student'::auth_management.gamilit_role,
'active'::auth_management.user_status,
true,
jsonb_build_object(
'theme', 'detective',
'language', 'es',
'timezone', 'America/Mexico_City',
'sound_enabled', true,
'notifications_enabled', true,
'grade_level', '5'
),
NOW(),
NOW()
)
ON CONFLICT (user_id) DO UPDATE SET
full_name = EXCLUDED.full_name,
updated_at = NOW();
-- =====================================================
-- PASO 3: INICIALIZAR user_stats (gamification)
-- =====================================================
-- Nota: El trigger trg_initialize_user_stats debería hacer esto automáticamente
-- pero lo agregamos manualmente por si acaso
INSERT INTO gamification_system.user_stats (
id,
user_id,
tenant_id,
level,
total_xp,
xp_to_next_level,
current_rank,
ml_coins,
ml_coins_earned_total,
created_at,
updated_at
) VALUES
(
'aaaaaaaa-aaaa-stat-aaaa-aaaaaaaaaaaa'::uuid,
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'::uuid,
'00000000-0000-0000-0000-000000000001'::uuid,
1,
0,
100,
'Ajaw'::gamification_system.maya_rank,
100,
100,
NOW(),
NOW()
),
(
'bbbbbbbb-bbbb-stat-bbbb-bbbbbbbbbbbb'::uuid,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,
'00000000-0000-0000-0000-000000000001'::uuid,
1,
0,
100,
'Ajaw'::gamification_system.maya_rank,
100,
100,
NOW(),
NOW()
),
(
'cccccccc-cccc-stat-cccc-cccccccccccc'::uuid,
'cccccccc-cccc-cccc-cccc-cccccccccccc'::uuid,
'00000000-0000-0000-0000-000000000001'::uuid,
1,
0,
100,
'Ajaw'::gamification_system.maya_rank,
100,
100,
NOW(),
NOW()
)
ON CONFLICT (user_id) DO UPDATE SET
updated_at = NOW();
-- =====================================================
-- PASO 4: INICIALIZAR user_ranks (gamification)
-- =====================================================
-- NOTA: La tabla user_ranks tiene estructura actualizada (2025-12)
-- Columnas requeridas: id, user_id, tenant_id, current_rank, is_current
INSERT INTO gamification_system.user_ranks (
id,
user_id,
tenant_id,
current_rank,
previous_rank,
rank_progress_percentage,
is_current,
achieved_at,
created_at,
updated_at
) VALUES
-- Admin rank
(
'aaaaaaaa-aaaa-rank-aaaa-aaaaaaaaaaaa'::uuid,
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'::uuid,
'00000000-0000-0000-0000-000000000001'::uuid,
'Ajaw'::gamification_system.maya_rank,
NULL,
0,
true,
gamilit.now_mexico(),
gamilit.now_mexico(),
gamilit.now_mexico()
),
-- Teacher rank
(
'bbbbbbbb-bbbb-rank-bbbb-bbbbbbbbbbbb'::uuid,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,
'00000000-0000-0000-0000-000000000001'::uuid,
'Ajaw'::gamification_system.maya_rank,
NULL,
0,
true,
gamilit.now_mexico(),
gamilit.now_mexico(),
gamilit.now_mexico()
),
-- Student rank (usuario principal de testing)
(
'cccccccc-cccc-rank-cccc-cccccccccccc'::uuid,
'cccccccc-cccc-cccc-cccc-cccccccccccc'::uuid,
'00000000-0000-0000-0000-000000000001'::uuid,
'Ajaw'::gamification_system.maya_rank,
NULL,
0,
true,
gamilit.now_mexico(),
gamilit.now_mexico(),
gamilit.now_mexico()
)
ON CONFLICT (user_id) DO UPDATE SET
current_rank = EXCLUDED.current_rank,
is_current = EXCLUDED.is_current,
updated_at = gamilit.now_mexico();
-- =====================================================
-- VERIFICACIÓN FINAL
-- =====================================================
DO $$
DECLARE
users_count INTEGER;
profiles_count INTEGER;
stats_count INTEGER;
ranks_count INTEGER;
BEGIN
SELECT COUNT(*) INTO users_count FROM auth.users
WHERE email IN ('admin@gamilit.com', 'teacher@gamilit.com', 'student@gamilit.com');
SELECT COUNT(*) INTO profiles_count FROM auth_management.profiles
WHERE email IN ('admin@gamilit.com', 'teacher@gamilit.com', 'student@gamilit.com');
SELECT COUNT(*) INTO stats_count FROM gamification_system.user_stats
WHERE user_id IN (
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'::uuid,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,
'cccccccc-cccc-cccc-cccc-cccccccccccc'::uuid
);
SELECT COUNT(*) INTO ranks_count FROM gamification_system.user_ranks
WHERE user_id IN (
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'::uuid,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,
'cccccccc-cccc-cccc-cccc-cccccccccccc'::uuid
);
RAISE NOTICE '========================================';
RAISE NOTICE 'USUARIOS DE TESTING CREADOS';
RAISE NOTICE '========================================';
RAISE NOTICE 'auth.users: % usuarios', users_count;
RAISE NOTICE 'auth_management.profiles: % profiles', profiles_count;
RAISE NOTICE 'gamification_system.user_stats: % stats', stats_count;
RAISE NOTICE 'gamification_system.user_ranks: % ranks', ranks_count;
RAISE NOTICE '========================================';
IF users_count = 3 AND profiles_count = 3 AND stats_count = 3 AND ranks_count = 3 THEN
RAISE NOTICE '✅ TODOS LOS USUARIOS CREADOS EXITOSAMENTE';
RAISE NOTICE '';
RAISE NOTICE 'Credenciales de testing:';
RAISE NOTICE ' - admin@gamilit.com / Test1234';
RAISE NOTICE ' - teacher@gamilit.com / Test1234';
RAISE NOTICE ' - student@gamilit.com / Test1234';
ELSE
RAISE WARNING '⚠️ ALGUNOS USUARIOS NO SE CREARON CORRECTAMENTE';
RAISE WARNING 'Esperado: 3 users, 3 profiles, 3 stats, 3 ranks';
RAISE WARNING 'Creado: % users, % profiles, % stats, % ranks',
users_count, profiles_count, stats_count, ranks_count;
END IF;
END $$;
-- =====================================================
-- FIN DEL SCRIPT
-- =====================================================