Sistema NEXUS v3.4 migrado con: Estructura principal: - core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles) - core/catalog: Catalogo de funcionalidades reutilizables - shared/knowledge-base: Base de conocimiento compartida - devtools/scripts: Herramientas de desarrollo - control-plane/registries: Control de servicios y CI/CD - orchestration/: Configuracion de orquestacion de agentes Proyectos incluidos (11): - gamilit (submodule -> GitHub) - trading-platform (OrbiquanTIA) - erp-suite con 5 verticales: - erp-core, construccion, vidrio-templado - mecanicas-diesel, retail, clinicas - betting-analytics - inmobiliaria-analytics - platform_marketing_content - pos-micro, erp-basico Configuracion: - .gitignore completo para Node.js/Python/Docker - gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git) - Sistema de puertos estandarizado (3005-3199) Generated with NEXUS v3.4 Migration System EPIC-010: Configuracion Git y Repositorios
465 lines
15 KiB
YAML
465 lines
15 KiB
YAML
# TRACEABILITY.yml - OQI-002 Módulo Educativo
|
|
# Mapeo de requerimientos a implementación
|
|
|
|
version: "1.0.0"
|
|
epic: OQI-002
|
|
name: "Módulo Educativo - Cursos de Trading"
|
|
updated: "2025-12-05"
|
|
status: pending
|
|
|
|
# Resumen de trazabilidad
|
|
summary:
|
|
total_requirements: 6
|
|
total_specs: 6
|
|
total_user_stories: 8
|
|
total_files_to_implement: 35
|
|
test_coverage: "TBD"
|
|
story_points: 45
|
|
|
|
# Mapeo de Requerimientos Funcionales
|
|
requirements:
|
|
RF-EDU-001:
|
|
name: "Catálogo de Cursos"
|
|
status: pending
|
|
specs:
|
|
- ET-EDU-001
|
|
- ET-EDU-002
|
|
- ET-EDU-003
|
|
user_stories:
|
|
- US-EDU-001
|
|
- US-EDU-002
|
|
implementation:
|
|
backend:
|
|
- path: apps/backend/src/modules/education/services/course.service.ts
|
|
description: "Servicio de gestión de cursos"
|
|
methods:
|
|
- getCourses
|
|
- getCourseBySlug
|
|
- getCourseById
|
|
- searchCourses
|
|
- getCoursesbyCategory
|
|
- path: apps/backend/src/modules/education/controllers/education.controller.ts
|
|
methods:
|
|
- listCourses
|
|
- getCourse
|
|
- path: apps/backend/src/modules/education/education.routes.ts
|
|
routes:
|
|
- "GET /education/courses"
|
|
- "GET /education/courses/:slug"
|
|
- "GET /education/categories"
|
|
frontend:
|
|
- path: apps/frontend/src/modules/education/pages/Courses.tsx
|
|
description: "Página de catálogo de cursos"
|
|
- path: apps/frontend/src/modules/education/pages/CourseDetail.tsx
|
|
description: "Página de detalle de curso"
|
|
- path: apps/frontend/src/modules/education/components/CourseCard.tsx
|
|
description: "Tarjeta de curso"
|
|
- path: apps/frontend/src/modules/education/components/CourseFilters.tsx
|
|
description: "Filtros de búsqueda"
|
|
database:
|
|
- path: apps/database/schemas/02_education_schema.sql
|
|
tables:
|
|
- courses
|
|
- course_categories
|
|
- course_tags
|
|
enums:
|
|
- course_level_enum
|
|
- course_status_enum
|
|
tests:
|
|
- path: apps/backend/tests/education/course.service.test.ts
|
|
status: pending
|
|
|
|
RF-EDU-002:
|
|
name: "Sistema de Lecciones"
|
|
status: pending
|
|
specs:
|
|
- ET-EDU-001
|
|
- ET-EDU-004
|
|
user_stories:
|
|
- US-EDU-003
|
|
- US-EDU-004
|
|
implementation:
|
|
backend:
|
|
- path: apps/backend/src/modules/education/services/lesson.service.ts
|
|
description: "Servicio de lecciones"
|
|
methods:
|
|
- getLessonsByCourse
|
|
- getLessonById
|
|
- getNextLesson
|
|
- getPreviousLesson
|
|
- path: apps/backend/src/modules/education/controllers/education.controller.ts
|
|
methods:
|
|
- getLessons
|
|
- getLesson
|
|
- path: apps/backend/src/modules/education/education.routes.ts
|
|
routes:
|
|
- "GET /education/courses/:id/lessons"
|
|
- "GET /education/lessons/:id"
|
|
frontend:
|
|
- path: apps/frontend/src/modules/education/pages/LessonViewer.tsx
|
|
description: "Visor de lecciones"
|
|
- path: apps/frontend/src/modules/education/components/LessonList.tsx
|
|
description: "Lista de lecciones del curso"
|
|
- path: apps/frontend/src/modules/education/components/LessonNavigation.tsx
|
|
description: "Navegación entre lecciones"
|
|
- path: apps/frontend/src/modules/education/components/VideoPlayer.tsx
|
|
description: "Reproductor de video"
|
|
database:
|
|
- path: apps/database/schemas/02_education_schema.sql
|
|
tables:
|
|
- lessons
|
|
- lesson_resources
|
|
enums:
|
|
- lesson_type_enum
|
|
- resource_type_enum
|
|
tests:
|
|
- path: apps/backend/tests/education/lesson.service.test.ts
|
|
status: pending
|
|
|
|
RF-EDU-003:
|
|
name: "Tracking de Progreso"
|
|
status: pending
|
|
specs:
|
|
- ET-EDU-001
|
|
- ET-EDU-003
|
|
user_stories:
|
|
- US-EDU-005
|
|
- US-EDU-007
|
|
implementation:
|
|
backend:
|
|
- path: apps/backend/src/modules/education/services/progress.service.ts
|
|
description: "Servicio de progreso"
|
|
methods:
|
|
- getProgress
|
|
- updateLessonProgress
|
|
- completeCourse
|
|
- getEnrolledCourses
|
|
- calculateCourseProgress
|
|
- path: apps/backend/src/modules/education/controllers/education.controller.ts
|
|
methods:
|
|
- getMyProgress
|
|
- markLessonComplete
|
|
- enrollInCourse
|
|
- path: apps/backend/src/modules/education/education.routes.ts
|
|
routes:
|
|
- "POST /education/courses/:id/enroll"
|
|
- "GET /education/my-courses"
|
|
- "POST /education/lessons/:id/progress"
|
|
- "GET /education/courses/:id/progress"
|
|
frontend:
|
|
- path: apps/frontend/src/modules/education/pages/MyLearning.tsx
|
|
description: "Página de mis cursos"
|
|
- path: apps/frontend/src/modules/education/components/ProgressBar.tsx
|
|
description: "Barra de progreso"
|
|
- path: apps/frontend/src/modules/education/components/ProgressSummary.tsx
|
|
description: "Resumen de progreso"
|
|
database:
|
|
- path: apps/database/schemas/02_education_schema.sql
|
|
tables:
|
|
- enrollments
|
|
- lesson_progress
|
|
tests:
|
|
- path: apps/backend/tests/education/progress.service.test.ts
|
|
status: pending
|
|
|
|
RF-EDU-004:
|
|
name: "Sistema de Quizzes"
|
|
status: pending
|
|
specs:
|
|
- ET-EDU-005
|
|
user_stories:
|
|
- US-EDU-006
|
|
implementation:
|
|
backend:
|
|
- path: apps/backend/src/modules/education/services/quiz.service.ts
|
|
description: "Servicio de quizzes"
|
|
methods:
|
|
- getQuiz
|
|
- submitQuiz
|
|
- getQuizResults
|
|
- calculateScore
|
|
- getQuizAttempts
|
|
- path: apps/backend/src/modules/education/controllers/education.controller.ts
|
|
methods:
|
|
- getQuiz
|
|
- submitQuizAnswers
|
|
- getQuizResults
|
|
- path: apps/backend/src/modules/education/education.routes.ts
|
|
routes:
|
|
- "GET /education/quizzes/:id"
|
|
- "POST /education/quizzes/:id/submit"
|
|
- "GET /education/quizzes/:id/results"
|
|
frontend:
|
|
- path: apps/frontend/src/modules/education/pages/QuizPage.tsx
|
|
description: "Página de quiz"
|
|
- path: apps/frontend/src/modules/education/components/QuizForm.tsx
|
|
description: "Formulario de quiz"
|
|
- path: apps/frontend/src/modules/education/components/QuizResults.tsx
|
|
description: "Resultados de quiz"
|
|
- path: apps/frontend/src/modules/education/components/QuizQuestion.tsx
|
|
description: "Componente de pregunta"
|
|
database:
|
|
- path: apps/database/schemas/02_education_schema.sql
|
|
tables:
|
|
- quizzes
|
|
- quiz_questions
|
|
- quiz_answers
|
|
- quiz_attempts
|
|
enums:
|
|
- question_type_enum
|
|
tests:
|
|
- path: apps/backend/tests/education/quiz.service.test.ts
|
|
status: pending
|
|
|
|
RF-EDU-005:
|
|
name: "Certificados"
|
|
status: pending
|
|
specs:
|
|
- ET-EDU-003
|
|
user_stories:
|
|
- US-EDU-008
|
|
implementation:
|
|
backend:
|
|
- path: apps/backend/src/modules/education/services/certificate.service.ts
|
|
description: "Servicio de certificados"
|
|
methods:
|
|
- generateCertificate
|
|
- getCertificates
|
|
- verifyCertificate
|
|
- downloadCertificate
|
|
- path: apps/backend/src/modules/education/controllers/education.controller.ts
|
|
methods:
|
|
- getMyCertificates
|
|
- downloadCertificate
|
|
- verifyCertificate
|
|
- path: apps/backend/src/modules/education/education.routes.ts
|
|
routes:
|
|
- "GET /education/certificates"
|
|
- "GET /education/certificates/:id/download"
|
|
- "GET /education/certificates/verify/:code"
|
|
frontend:
|
|
- path: apps/frontend/src/modules/education/pages/Certificates.tsx
|
|
description: "Página de certificados"
|
|
- path: apps/frontend/src/modules/education/components/CertificateCard.tsx
|
|
description: "Tarjeta de certificado"
|
|
- path: apps/frontend/src/modules/education/components/CertificateModal.tsx
|
|
description: "Modal de certificado"
|
|
database:
|
|
- path: apps/database/schemas/02_education_schema.sql
|
|
tables:
|
|
- certificates
|
|
tests:
|
|
- path: apps/backend/tests/education/certificate.service.test.ts
|
|
status: pending
|
|
|
|
RF-EDU-006:
|
|
name: "Gamificación"
|
|
status: pending
|
|
specs:
|
|
- ET-EDU-006
|
|
user_stories: []
|
|
implementation:
|
|
backend:
|
|
- path: apps/backend/src/modules/education/services/gamification.service.ts
|
|
description: "Servicio de gamificación"
|
|
methods:
|
|
- awardPoints
|
|
- getLeaderboard
|
|
- getBadges
|
|
- checkAchievements
|
|
- getStreak
|
|
- path: apps/backend/src/modules/education/controllers/education.controller.ts
|
|
methods:
|
|
- getLeaderboard
|
|
- getMyAchievements
|
|
- getMyBadges
|
|
- path: apps/backend/src/modules/education/education.routes.ts
|
|
routes:
|
|
- "GET /education/leaderboard"
|
|
- "GET /education/achievements"
|
|
- "GET /education/badges"
|
|
frontend:
|
|
- path: apps/frontend/src/modules/education/components/Leaderboard.tsx
|
|
description: "Tabla de clasificación"
|
|
- path: apps/frontend/src/modules/education/components/AchievementBadge.tsx
|
|
description: "Badge de logro"
|
|
- path: apps/frontend/src/modules/education/components/StreakCounter.tsx
|
|
description: "Contador de racha"
|
|
database:
|
|
- path: apps/database/schemas/02_education_schema.sql
|
|
tables:
|
|
- achievements
|
|
- user_achievements
|
|
- badges
|
|
- user_badges
|
|
- learning_streaks
|
|
tests:
|
|
- path: apps/backend/tests/education/gamification.service.test.ts
|
|
status: pending
|
|
|
|
# Mapeo de archivos de configuración
|
|
config_files:
|
|
backend:
|
|
- path: apps/backend/src/modules/education/education.module.ts
|
|
description: "Módulo de educación"
|
|
- path: apps/backend/src/modules/education/validators/education.validators.ts
|
|
description: "Validadores Zod"
|
|
- path: apps/backend/src/modules/education/types/education.types.ts
|
|
description: "Tipos TypeScript"
|
|
frontend:
|
|
- path: apps/frontend/src/modules/education/stores/education.store.ts
|
|
description: "Store de educación Zustand"
|
|
- path: apps/frontend/src/modules/education/hooks/useEducation.ts
|
|
description: "Hook principal de educación"
|
|
- path: apps/frontend/src/modules/education/services/education.api.ts
|
|
description: "Cliente API de educación"
|
|
|
|
# Dependencias externas
|
|
external_dependencies:
|
|
npm_backend:
|
|
- name: pdfkit
|
|
version: "^0.14.0"
|
|
usage: "Generación de certificados PDF"
|
|
- name: qrcode
|
|
version: "^1.5.3"
|
|
usage: "QR en certificados"
|
|
- name: sharp
|
|
version: "^0.33.0"
|
|
usage: "Procesamiento de imágenes"
|
|
npm_frontend:
|
|
- name: react-player
|
|
version: "^2.13.0"
|
|
usage: "Reproductor de video"
|
|
- name: "@tanstack/react-query"
|
|
version: "^5.0.0"
|
|
usage: "Data fetching"
|
|
services:
|
|
- name: Cloudflare Stream
|
|
purpose: "Video hosting y streaming"
|
|
alternative: "Vimeo OTT"
|
|
- name: AWS S3
|
|
purpose: "Almacenamiento de recursos"
|
|
|
|
# APIs de terceros
|
|
third_party_apis:
|
|
- name: Cloudflare Stream API
|
|
docs: https://developers.cloudflare.com/stream/
|
|
usage:
|
|
- Upload de videos
|
|
- Signed URLs
|
|
- Analytics de reproducciones
|
|
- name: AWS S3
|
|
docs: https://docs.aws.amazon.com/s3/
|
|
usage:
|
|
- Almacenamiento de recursos
|
|
- Certificados PDF
|
|
|
|
# Endpoints API
|
|
api_endpoints:
|
|
base_path: /api/v1/education
|
|
endpoints:
|
|
# Cursos
|
|
- method: GET
|
|
path: /courses
|
|
requirement: RF-EDU-001
|
|
auth: false
|
|
description: "Listar catálogo de cursos"
|
|
- method: GET
|
|
path: /courses/:slug
|
|
requirement: RF-EDU-001
|
|
auth: false
|
|
description: "Detalle de curso por slug"
|
|
- method: GET
|
|
path: /categories
|
|
requirement: RF-EDU-001
|
|
auth: false
|
|
description: "Listar categorías"
|
|
# Inscripción
|
|
- method: POST
|
|
path: /courses/:id/enroll
|
|
requirement: RF-EDU-003
|
|
auth: true
|
|
description: "Inscribirse a un curso"
|
|
- method: GET
|
|
path: /my-courses
|
|
requirement: RF-EDU-003
|
|
auth: true
|
|
description: "Mis cursos inscritos"
|
|
# Lecciones
|
|
- method: GET
|
|
path: /courses/:id/lessons
|
|
requirement: RF-EDU-002
|
|
auth: true
|
|
description: "Lecciones de un curso"
|
|
- method: GET
|
|
path: /lessons/:id
|
|
requirement: RF-EDU-002
|
|
auth: true
|
|
description: "Detalle de lección"
|
|
- method: POST
|
|
path: /lessons/:id/progress
|
|
requirement: RF-EDU-003
|
|
auth: true
|
|
description: "Actualizar progreso"
|
|
# Quizzes
|
|
- method: GET
|
|
path: /quizzes/:id
|
|
requirement: RF-EDU-004
|
|
auth: true
|
|
description: "Obtener quiz"
|
|
- method: POST
|
|
path: /quizzes/:id/submit
|
|
requirement: RF-EDU-004
|
|
auth: true
|
|
description: "Enviar respuestas"
|
|
- method: GET
|
|
path: /quizzes/:id/results
|
|
requirement: RF-EDU-004
|
|
auth: true
|
|
description: "Ver resultados"
|
|
# Certificados
|
|
- method: GET
|
|
path: /certificates
|
|
requirement: RF-EDU-005
|
|
auth: true
|
|
description: "Mis certificados"
|
|
- method: GET
|
|
path: /certificates/:id/download
|
|
requirement: RF-EDU-005
|
|
auth: true
|
|
description: "Descargar certificado"
|
|
- method: GET
|
|
path: /certificates/verify/:code
|
|
requirement: RF-EDU-005
|
|
auth: false
|
|
description: "Verificar certificado"
|
|
# Gamificación
|
|
- method: GET
|
|
path: /leaderboard
|
|
requirement: RF-EDU-006
|
|
auth: true
|
|
description: "Ver clasificación"
|
|
- method: GET
|
|
path: /achievements
|
|
requirement: RF-EDU-006
|
|
auth: true
|
|
description: "Mis logros"
|
|
|
|
# Dependencias de épicas
|
|
dependencies:
|
|
blocks: []
|
|
blocked_by:
|
|
- epic: OQI-001
|
|
reason: "Requiere autenticación de usuarios"
|
|
- epic: OQI-005
|
|
reason: "Compra de cursos requiere sistema de pagos"
|
|
type: partial
|
|
|
|
# Notas y decisiones
|
|
notes:
|
|
- "Videos almacenados en Cloudflare Stream con URLs firmadas"
|
|
- "Progreso guardado automáticamente cada 30 segundos"
|
|
- "Certificados con QR de verificación único"
|
|
- "Quizzes con intentos ilimitados pero score máximo registrado"
|
|
- "Sistema de puntos: 10 por lección, 50 por quiz aprobado, 100 por certificado"
|