workspace-v1/projects/gamilit/database/seeds/dev/progress_tracking/02-exercise-attempts.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

597 lines
23 KiB
SQL

-- =====================================================================================
-- SEED: Exercise Attempts and Submissions for Progress Tracking
-- =====================================================================================
-- Description: Exercise attempts, submissions and detailed performance tracking
-- Dependencies: auth.users, educational_content.exercises, module_progress
-- Idempotency: Uses ON CONFLICT to handle re-runs safely
-- =====================================================================================
SET search_path TO progress_tracking, educational_content, auth, public;
-- =====================================================================================
-- EXERCISE ATTEMPTS & SUBMISSIONS
-- =====================================================================================
DO $$
DECLARE
student1_id UUID;
student2_id UUID;
student3_id UUID;
exercise_1_1_id UUID; -- Crucigrama Científico
exercise_1_2_id UUID; -- Línea de Tiempo
exercise_1_3_id UUID; -- Completar Biografía
exercise_2_1_id UUID; -- Detective de Motivaciones
exercise_2_2_id UUID; -- Predictor de Consecuencias
exercise_3_1_id UUID; -- Juez de Argumentos
BEGIN
-- ==================================================================================
-- GET USER IDS (Demo Students)
-- ==================================================================================
SELECT user_id INTO student1_id
FROM auth.users
WHERE email = 'estudiante1@demo.glit.edu.mx';
SELECT user_id INTO student2_id
FROM auth.users
WHERE email = 'estudiante2@demo.glit.edu.mx';
SELECT user_id INTO student3_id
FROM auth.users
WHERE email = 'estudiante3@demo.glit.edu.mx';
-- ==================================================================================
-- GET EXERCISE IDS (by title patterns)
-- ==================================================================================
-- Module 1 Exercises (Literal)
SELECT exercise_id INTO exercise_1_1_id
FROM educational_content.exercises
WHERE title ILIKE '%Crucigrama%'
ORDER BY created_at LIMIT 1;
SELECT exercise_id INTO exercise_1_2_id
FROM educational_content.exercises
WHERE title ILIKE '%Línea de Tiempo%'
ORDER BY created_at LIMIT 1;
SELECT exercise_id INTO exercise_1_3_id
FROM educational_content.exercises
WHERE title ILIKE '%Biografía%'
ORDER BY created_at LIMIT 1;
-- Module 2 Exercises (Inferencial)
SELECT exercise_id INTO exercise_2_1_id
FROM educational_content.exercises
WHERE title ILIKE '%Detective%'
ORDER BY created_at LIMIT 1;
SELECT exercise_id INTO exercise_2_2_id
FROM educational_content.exercises
WHERE title ILIKE '%Predictor%'
ORDER BY created_at LIMIT 1;
-- Module 3 Exercises (Crítica)
SELECT exercise_id INTO exercise_3_1_id
FROM educational_content.exercises
WHERE title ILIKE '%Juez%'
ORDER BY created_at LIMIT 1;
-- ==================================================================================
-- EXERCISE ATTEMPTS: Detailed Attempt Tracking
-- ==================================================================================
RAISE NOTICE 'Inserting exercise attempts data...';
INSERT INTO progress_tracking.exercise_attempts (
user_id, exercise_id,
attempt_number, status,
score, max_score, score_percentage,
time_spent_seconds, started_at, completed_at,
hints_used, comodines_used,
metadata, created_at, updated_at
) VALUES
-- ================================================================================
-- ESTUDIANTE 1: Crucigrama Científico (Progressive Improvement - 3 attempts)
-- ================================================================================
-- Attempt 1: First Try (Good but not perfect)
(
student1_id, exercise_1_1_id,
1, 'completed',
75, 100, 75,
420, -- 7 minutes
NOW() - INTERVAL '9 days',
NOW() - INTERVAL '9 days' + INTERVAL '7 minutes',
1, ARRAY[]::text[],
'{
"mistakes": 5,
"corrections": 3,
"completion_path": "sequential",
"words_completed": ["RADIO", "NOBEL", "SORBONA"],
"words_struggled": ["PECHBLENDA", "POLONIO"],
"hint_words": ["PECHBLENDA"]
}'::jsonb,
NOW() - INTERVAL '9 days',
NOW() - INTERVAL '9 days' + INTERVAL '7 minutes'
),
-- Attempt 2: Second Try (Significant Improvement)
(
student1_id, exercise_1_1_id,
2, 'completed',
90, 100, 90,
360, -- 6 minutes
NOW() - INTERVAL '8 days',
NOW() - INTERVAL '8 days' + INTERVAL '6 minutes',
0, ARRAY['vision_lectora']::text[],
'{
"mistakes": 2,
"corrections": 1,
"improvements": ["mejor tiempo", "menos pistas", "mejor vocabulario"],
"words_completed": ["RADIO", "POLONIO", "NOBEL", "SORBONA"],
"words_struggled": ["RADIOACTIVIDAD"],
"power_up_impact": "high"
}'::jsonb,
NOW() - INTERVAL '8 days',
NOW() - INTERVAL '8 days' + INTERVAL '6 minutes'
),
-- Attempt 3: Mastery Achievement (Perfect Score)
(
student1_id, exercise_1_1_id,
3, 'completed',
100, 100, 100,
300, -- 5 minutes
NOW() - INTERVAL '7 days',
NOW() - INTERVAL '7 days' + INTERVAL '5 minutes',
0, ARRAY[]::text[],
'{
"mistakes": 0,
"perfect_score": true,
"mastery_achieved": true,
"all_words_correct": ["RADIO", "POLONIO", "RADIOACTIVIDAD", "NOBEL", "SORBONA", "PECHBLENDA"],
"speed_improvement": "40%",
"bonus_points": 25
}'::jsonb,
NOW() - INTERVAL '7 days',
NOW() - INTERVAL '7 days' + INTERVAL '5 minutes'
),
-- ================================================================================
-- ESTUDIANTE 1: Línea de Tiempo (1 attempt - High Performance)
-- ================================================================================
(
student1_id, exercise_1_2_id,
1, 'completed',
95, 100, 95,
480, -- 8 minutes
NOW() - INTERVAL '6 days',
NOW() - INTERVAL '6 days' + INTERVAL '8 minutes',
0, ARRAY[]::text[],
'{
"date_errors": 0,
"sequence_errors": 1,
"events_placed": 8,
"chronological_accuracy": "excellent",
"minor_error": "Nobel Química date slightly off"
}'::jsonb,
NOW() - INTERVAL '6 days',
NOW() - INTERVAL '6 days' + INTERVAL '8 minutes'
),
-- ================================================================================
-- ESTUDIANTE 1: Detective de Motivaciones (Module 2 - Current)
-- ================================================================================
(
student1_id, exercise_2_1_id,
1, 'completed',
95, 100, 95,
540, -- 9 minutes
NOW() - INTERVAL '1 hour',
NOW() - INTERVAL '1 hour' + INTERVAL '9 minutes',
1, ARRAY['pistas']::text[],
'{
"clues_found": 8,
"clues_total": 8,
"inference_accuracy": "excellent",
"motivation_identified": "pasión por la ciencia",
"supporting_evidence": ["sacrificios personales", "dedicación", "persistencia"]
}'::jsonb,
NOW() - INTERVAL '1 hour',
NOW() - INTERVAL '1 hour' + INTERVAL '9 minutes'
),
-- ================================================================================
-- ESTUDIANTE 2: Línea de Tiempo (2 attempts - Improvement Pattern)
-- ================================================================================
-- Attempt 1: First Try (Needs Improvement)
(
student2_id, exercise_1_2_id,
1, 'completed',
70, 100, 70,
540, -- 9 minutes
NOW() - INTERVAL '12 days',
NOW() - INTERVAL '12 days' + INTERVAL '9 minutes',
2, ARRAY['pistas']::text[],
'{
"date_errors": 3,
"sequence_errors": 2,
"events_placed": 8,
"common_mistakes": ["confusión entre Nobels", "fecha matrimonio incorrecta"],
"hints_used_for": ["Nobel Física", "Descubrimiento Polonio"]
}'::jsonb,
NOW() - INTERVAL '12 days',
NOW() - INTERVAL '12 days' + INTERVAL '9 minutes'
),
-- Attempt 2: Retry with Power-up (Good Improvement)
(
student2_id, exercise_1_2_id,
2, 'completed',
85, 100, 85,
480, -- 8 minutes
NOW() - INTERVAL '11 days',
NOW() - INTERVAL '11 days' + INTERVAL '8 minutes',
1, ARRAY['segunda_oportunidad']::text[],
'{
"date_errors": 1,
"sequence_errors": 0,
"improvement": "significant",
"events_placed": 8,
"corrected_mistakes": ["Nobels diferenciados", "matrimonio correcto"],
"remaining_issue": "fecha descubrimiento Radio"
}'::jsonb,
NOW() - INTERVAL '11 days',
NOW() - INTERVAL '11 days' + INTERVAL '8 minutes'
),
-- ================================================================================
-- ESTUDIANTE 2: Completar Biografía (1 attempt - Good)
-- ================================================================================
(
student2_id, exercise_1_3_id,
1, 'completed',
80, 100, 80,
600, -- 10 minutes
NOW() - INTERVAL '10 days',
NOW() - INTERVAL '10 days' + INTERVAL '10 minutes',
1, ARRAY[]::text[],
'{
"blanks_total": 10,
"blanks_correct": 8,
"vocabulary_accuracy": "good",
"context_understanding": "solid",
"errors": ["confusión: Pechblenda/Uranio", "sintaxis menor"]
}'::jsonb,
NOW() - INTERVAL '10 days',
NOW() - INTERVAL '10 days' + INTERVAL '10 minutes'
),
-- ================================================================================
-- ESTUDIANTE 2: Juez de Argumentos (Module 3 - Challenge Level)
-- ================================================================================
-- Attempt 1: First Try (Struggling with Critical Analysis)
(
student2_id, exercise_3_1_id,
1, 'completed',
70, 100, 70,
720, -- 12 minutes
NOW() - INTERVAL '3 hours',
NOW() - INTERVAL '3 hours' + INTERVAL '12 minutes',
2, ARRAY['segunda_oportunidad']::text[],
'{
"arguments_analyzed": 5,
"correct_evaluations": 3,
"critical_thinking_level": "developing",
"struggles": ["identificar falacias", "diferenciar hecho/opinión"],
"strengths": ["comprensión literal", "identificar evidencia"]
}'::jsonb,
NOW() - INTERVAL '3 hours',
NOW() - INTERVAL '3 hours' + INTERVAL '12 minutes'
),
-- ================================================================================
-- ESTUDIANTE 3: Crucigrama Científico (2 attempts - Foundational Level)
-- ================================================================================
-- Attempt 1: First Try (Significant Vocabulary Challenges)
(
student3_id, exercise_1_1_id,
1, 'completed',
60, 100, 60,
600, -- 10 minutes
NOW() - INTERVAL '4 days',
NOW() - INTERVAL '4 days' + INTERVAL '10 minutes',
3, ARRAY['pistas', 'vision_lectora']::text[],
'{
"mistakes": 8,
"corrections": 5,
"vocabulary_struggles": ["PECHBLENDA", "RADIOACTIVIDAD", "POLONIO"],
"words_completed": ["RADIO", "NOBEL"],
"words_incomplete": ["PECHBLENDA", "RADIOACTIVIDAD"],
"hints_used_for": ["PECHBLENDA", "POLONIO", "RADIOACTIVIDAD"],
"reading_support_needed": true
}'::jsonb,
NOW() - INTERVAL '4 days',
NOW() - INTERVAL '4 days' + INTERVAL '10 minutes'
),
-- Attempt 2: Retry (Currently In Progress)
(
student3_id, exercise_1_1_id,
2, 'in_progress',
0, 100, 0,
180, -- 3 minutes so far
NOW() - INTERVAL '3 hours',
NULL,
1, ARRAY['pistas']::text[],
'{
"current_progress": 40,
"words_completed": ["RADIO", "NOBEL"],
"current_word": "SORBONA",
"pause_reason": "break",
"session_active": true
}'::jsonb,
NOW() - INTERVAL '3 hours',
NOW()
),
-- ================================================================================
-- ESTUDIANTE 3: Línea de Tiempo (1 attempt - Needs Support)
-- ================================================================================
(
student3_id, exercise_1_2_id,
1, 'completed',
65, 100, 65,
720, -- 12 minutes
NOW() - INTERVAL '3 days',
NOW() - INTERVAL '3 days' + INTERVAL '12 minutes',
2, ARRAY['pistas', 'vision_lectora']::text[],
'{
"date_errors": 4,
"sequence_errors": 3,
"events_placed": 8,
"chronological_confusion": "high",
"hints_used_for": ["Nobel Física fecha", "Descubrimiento Radio"],
"support_recommendation": "review timeline concepts"
}'::jsonb,
NOW() - INTERVAL '3 days',
NOW() - INTERVAL '3 days' + INTERVAL '12 minutes'
)
ON CONFLICT (user_id, exercise_id, attempt_number) DO UPDATE SET
status = EXCLUDED.status,
score = EXCLUDED.score,
score_percentage = EXCLUDED.score_percentage,
time_spent_seconds = EXCLUDED.time_spent_seconds,
completed_at = EXCLUDED.completed_at,
hints_used = EXCLUDED.hints_used,
comodines_used = EXCLUDED.comodines_used,
metadata = EXCLUDED.metadata,
updated_at = NOW();
RAISE NOTICE 'Exercise attempts data inserted successfully';
-- ==================================================================================
-- EXERCISE SUBMISSIONS: Detailed Submission Data
-- ==================================================================================
RAISE NOTICE 'Inserting exercise submissions data...';
INSERT INTO progress_tracking.exercise_submissions (
user_id, exercise_id, attempt_number,
submission_type, answer_data, submission_files,
auto_graded, score, feedback,
submitted_at, graded_at, graded_by,
metadata, created_at, updated_at
) VALUES
-- ================================================================================
-- ESTUDIANTE 1: Crucigrama Perfect Score Submission
-- ================================================================================
(
student1_id, exercise_1_1_id, 3,
'interactive',
'{
"exercise_type": "crossword",
"answers": {
"1_across": "RADIO",
"2_across": "POLONIO",
"3_down": "RADIOACTIVIDAD",
"4_down": "NOBEL",
"5_across": "SORBONA",
"6_down": "PECHBLENDA"
},
"completion_time_seconds": 300,
"all_correct": true
}'::jsonb,
ARRAY[]::text[],
true, 100,
'{
"correct_answers": 6,
"total_answers": 6,
"feedback": "¡Perfecto! Dominas el vocabulario científico de Marie Curie.",
"feedback_details": {
"vocabulary": "excelente",
"spelling": "perfecto",
"context_understanding": "avanzado"
},
"encouragement": "Has demostrado un dominio completo del tema."
}'::jsonb,
NOW() - INTERVAL '7 days' + INTERVAL '5 minutes',
NOW() - INTERVAL '7 days' + INTERVAL '5 minutes',
NULL,
'{
"auto_grade_confidence": 100,
"perfect_score_bonus": 25,
"mastery_badge_earned": true,
"grading_algorithm": "exact_match_v2"
}'::jsonb,
NOW() - INTERVAL '7 days',
NOW() - INTERVAL '7 days'
),
-- ================================================================================
-- ESTUDIANTE 1: Línea de Tiempo High Performance Submission
-- ================================================================================
(
student1_id, exercise_1_2_id, 1,
'interactive',
'{
"exercise_type": "timeline",
"timeline": [
{"year": 1867, "event": "Nacimiento en Varsovia", "correct": true},
{"year": 1891, "event": "Llegada a París", "correct": true},
{"year": 1895, "event": "Matrimonio con Pierre", "correct": true},
{"year": 1898, "event": "Descubrimientos Radio y Polonio", "correct": true},
{"year": 1903, "event": "Premio Nobel de Física", "correct": true},
{"year": 1906, "event": "Muerte de Pierre", "correct": true},
{"year": 1911, "event": "Premio Nobel de Química", "correct": false, "student_answer": 1910},
{"year": 1934, "event": "Fallecimiento", "correct": true}
],
"sequence_accuracy": "perfect"
}'::jsonb,
ARRAY[]::text[],
true, 95,
'{
"correct_events": 7,
"total_events": 8,
"date_precision": "high",
"sequence_accuracy": "perfect",
"feedback": "Excelente trabajo. Solo un pequeño error en la fecha del segundo Nobel (1911, no 1910).",
"feedback_details": {
"chronological_thinking": "excelente",
"attention_to_detail": "muy bueno",
"historical_context": "sólido"
}
}'::jsonb,
NOW() - INTERVAL '6 days' + INTERVAL '8 minutes',
NOW() - INTERVAL '6 days' + INTERVAL '8 minutes',
NULL,
'{
"auto_grade_confidence": 98,
"grading_algorithm": "timeline_matcher_v1"
}'::jsonb,
NOW() - INTERVAL '6 days',
NOW() - INTERVAL '6 days'
),
-- ================================================================================
-- ESTUDIANTE 2: Línea de Tiempo Retry Submission
-- ================================================================================
(
student2_id, exercise_1_2_id, 2,
'interactive',
'{
"exercise_type": "timeline",
"timeline": [
{"year": 1867, "event": "Nacimiento en Varsovia", "correct": true},
{"year": 1891, "event": "Llegada a París", "correct": true},
{"year": 1895, "event": "Matrimonio con Pierre", "correct": true},
{"year": 1898, "event": "Descubrimientos Radio y Polonio", "correct": false, "student_answer": 1897},
{"year": 1903, "event": "Premio Nobel de Física", "correct": true},
{"year": 1906, "event": "Muerte de Pierre", "correct": true},
{"year": 1911, "event": "Premio Nobel de Química", "correct": true},
{"year": 1934, "event": "Fallecimiento", "correct": true}
],
"sequence_accuracy": "perfect"
}'::jsonb,
ARRAY[]::text[],
true, 85,
'{
"correct_events": 7,
"total_events": 8,
"date_precision": "good",
"sequence_accuracy": "perfect",
"feedback": "Muy bien. Has mejorado significativamente. Pequeño error en fecha descubrimiento Radio (1898, no 1897).",
"feedback_details": {
"improvement": "notable",
"nobel_dates_mastered": true,
"minor_date_confusion": "discovery dates"
},
"encouragement": "Has corregido los errores principales. ¡Buen trabajo!"
}'::jsonb,
NOW() - INTERVAL '11 days' + INTERVAL '8 minutes',
NOW() - INTERVAL '11 days' + INTERVAL '8 minutes',
NULL,
'{
"auto_grade_confidence": 95,
"improvement_from_attempt_1": 15,
"grading_algorithm": "timeline_matcher_v1"
}'::jsonb,
NOW() - INTERVAL '11 days',
NOW() - INTERVAL '11 days'
),
-- ================================================================================
-- ESTUDIANTE 2: Completar Biografía Submission
-- ================================================================================
(
student2_id, exercise_1_3_id, 1,
'fill_in_blank',
'{
"exercise_type": "fill_in_blank",
"blanks": [
{"position": 1, "correct_answer": "Varsovia", "student_answer": "Varsovia", "correct": true},
{"position": 2, "correct_answer": "Polonia", "student_answer": "Polonia", "correct": true},
{"position": 3, "correct_answer": "física", "student_answer": "física", "correct": true},
{"position": 4, "correct_answer": "Pierre Curie", "student_answer": "Pierre Curie", "correct": true},
{"position": 5, "correct_answer": "radio", "student_answer": "radio", "correct": true},
{"position": 6, "correct_answer": "polonio", "student_answer": "polonio", "correct": true},
{"position": 7, "correct_answer": "pechblenda", "student_answer": "uranio", "correct": false},
{"position": 8, "correct_answer": "Nobel", "student_answer": "Nobel", "correct": true},
{"position": 9, "correct_answer": "radioactividad", "student_answer": "radioactividad", "correct": true},
{"position": 10, "correct_answer": "Sorbona", "student_answer": "Sorbona", "correct": true}
]
}'::jsonb,
ARRAY[]::text[],
true, 80,
'{
"correct_answers": 8,
"total_answers": 10,
"vocabulary_accuracy": "good",
"feedback": "Buen trabajo. Solo un error: el mineral es pechblenda, no uranio (aunque uranio está relacionado).",
"feedback_details": {
"names_accuracy": "perfecto",
"scientific_terms": "muy bueno",
"context_understanding": "sólido",
"area_for_improvement": "vocabulario mineralógico"
}
}'::jsonb,
NOW() - INTERVAL '10 days' + INTERVAL '10 minutes',
NOW() - INTERVAL '10 days' + INTERVAL '10 minutes',
NULL,
'{
"auto_grade_confidence": 95,
"partial_credit_given": false,
"grading_algorithm": "exact_match_with_synonyms_v1"
}'::jsonb,
NOW() - INTERVAL '10 days',
NOW() - INTERVAL '10 days'
)
ON CONFLICT (user_id, exercise_id, attempt_number) DO UPDATE SET
answer_data = EXCLUDED.answer_data,
score = EXCLUDED.score,
feedback = EXCLUDED.feedback,
metadata = EXCLUDED.metadata,
updated_at = NOW();
RAISE NOTICE 'Exercise submissions data inserted successfully';
RAISE NOTICE '✓ Exercise attempts and submissions seeds completed';
RAISE NOTICE ' - Exercise attempts: 11';
RAISE NOTICE ' - Exercise submissions: 4';
RAISE NOTICE ' - Students tracked: 3';
RAISE NOTICE ' - Exercises covered: 6';
END $$;