🎓 KENDI - Explicación Completa del Tree
Análisis detallado de cada carpeta y archivo del proyecto
📑 Índice de Contenidos
-
🔷 1. CORE - Núcleo del Sistema
-
🎯 2. FEATURES - Módulos Funcionales
-
🔐 2.1. Auth - Autenticación
-
🏆 2.2. Competitions - Competencias
-
📊 2.3. Kendi Dashboard - Panel Principal
-
👨🎓 2.4. Student Dashboard
-
👨🏫 2.5. Teacher Dashboard
-
🔧 3. SHARED - Componentes Compartidos
-
🚀 4. Archivos Raíz
🌲 Estructura Visual Completa
lib/
├── core/ 📁 Componentes fundamentales compartidos
│ ├── constants/
│ │ └── education_systems/ 🌎 Sistemas educativos de cada país
│ ├── models/ 📦 Modelos de datos básicos
│ ├── router/ 🧭 Sistema de navegación
│ ├── services/ ⚙️ Servicios compartidos
│ ├── themes/ 🎨 Temas y estilos
│ └── utils/ 🔧 Utilidades generales
│
├── features/ 🎯 Módulos funcionales independientes
│ ├── auth/ ✅ IMPLEMENTADO
│ ├── competitions/ ⚠️ ESTRUCTURA VACÍA
│ ├── home/
│ ├── kendi_dashboard/ ✅ IMPLEMENTADO
│ ├── student_dashboard/ ⚠️ SOLO UI
│ ├── supervisor_dashboard/ ❌ VACÍO
│ └── teacher_dashboard/ ❌ VACÍO
│
├── shared/ 🔄 Widgets reutilizables
│ ├── constants/
│ ├── models/
│ └── widgets/
│
├── firebase_options.dart 🔥 Config de Firebase
└── main.dart 🚀 Punto de entrada
🔷 1. CORE - Núcleo del Sistema
Propósito: Contiene todos los componentes fundamentales compartidos por toda la aplicación.
📂 core/constants/education_systems/
Almacena la configuración de los niveles educativos de cada país soportado por KENDI.
📄 bo.json
Bolivia: Define los 18 niveles educativos del sistema boliviano.
Ejemplo: Inicial (4 niveles), Primaria (9 niveles), etc.
📄 br.json
Brasil: Sistema educativo brasileño con su nomenclatura específica.
📄 py.json
Paraguay: Niveles educativos del sistema paraguayo.
📄 main.txt
Posiblemente un archivo de configuración principal o documentación.
🔑 Puntos Clave:
- Los 18 niveles del PDF están aquí definidos
- Permite que KENDI funcione en múltiples países
- Son archivos JSON estáticos (no se modifican en runtime)
- Estructura probable:
{ "nivel_id": "preescolar", "nombre": "Preescolar", "edad_min": 5, "edad_max": 6 }
📂 core/models/
Clases Dart que representan las entidades fundamentales del sistema.
📄 country_model.dart
Modelo de País:
• Representa un país (Bolivia, Brasil, Paraguay)
• Probables campos: id, nombre, codigo, sistema_educativo
• Usado para seleccionar el sistema educativo correcto
📄 grade_model.dart
Modelo de Grado/Nivel:
• Representa un nivel educativo (Preescolar, Primer Grado, etc.)
• Campos esperados: id, nombre, categoria, edad_min, edad_max
• Conecta con los JSONs de education_systems
🔑 Puntos Clave:
- Son modelos de dominio, no de datos
- Representan conceptos del negocio, no tablas de BD
- Probablemente tienen métodos como
toJson(), fromJson()
📂 core/router/
Controla cómo los usuarios navegan entre las diferentes pantallas de la app.
📄 app_router.dart
Router Principal:
• Configura el sistema de navegación (probablemente usando go_router o auto_route)
• Define las rutas globales de la app
• Maneja autenticación y redirecciones
• Importa todas las rutas de las subcarpetas
📂 router/routes/
📄 admin_routes.dart
Rutas del Administrador:
• Rutas para usuarios con rol de administrador
• Ejemplo: /admin/dashboard, /admin/usuarios
📄 auth_routes.dart
Rutas de Autenticación:
• /login, /register, /forgot-password
• /select-user-type, /verify-code
📄 student_routes.dart
Rutas del Estudiante:
• /student/dashboard
• /student/menu/:menuId (navegación por menús)
• /student/activity/:activityId (contenido educativo)
📄 teacher_routes.dart
Rutas del Docente:
• /teacher/dashboard
• /teacher/create-menu
• /teacher/create-content
🔑 Puntos Clave:
- Separación de rutas por rol de usuario (seguridad)
- Facilita agregar guards de autenticación por grupo
- Estructura escalable para múltiples tipos de usuario
📂 core/services/
📄 education_system_service.dart
Servicio de Sistemas Educativos:
• Lee los archivos JSON de education_systems/
• Proporciona métodos para obtener niveles por país
• Ejemplo: getGradesByCountry('bo') → retorna los 18 niveles de Bolivia
• Valida que el nivel educativo del usuario sea válido
🔑 Puntos Clave:
- Es un servicio de infraestructura, no de negocio
- Probablemente es un Singleton
- Cachea los datos para no leer el JSON cada vez
📂 core/themes/
Carpeta vacía actualmente. Aquí irían los temas visuales de la app (colores, tipografías, etc.)
📂 core/utils/
Carpeta vacía. Aquí irían funciones helper, extensiones, constantes globales, etc.
🎯 2. FEATURES - Módulos Funcionales
Arquitectura: Clean Architecture con separación Data / Domain / Presentation
DATA - Fuentes de datos
DOMAIN - Lógica de negocio
PRESENTATION - UI + BLoC
🔐 2.1. AUTH - Autenticación
✅ COMPLETAMENTE IMPLEMENTADO
Propósito: Maneja todo el flujo de autenticación y registro de usuarios.
📂 auth/data/
datasources/
• Conexión con Firebase Auth
• APIs de autenticación
• Ejemplo: AuthRemoteDataSource con métodos como login(), register()
models/
• Modelos de datos específicos para la capa de datos
• Conversión JSON ↔ Objetos Dart
• Ejemplo: UserModel con fromJson(), toEntity()
repositories/
• Implementación concreta de los repositorios
• Usa los datasources para obtener datos
• Ejemplo: AuthRepositoryImpl implements AuthRepository
📂 auth/domain/
entities/
• Entidades puras del negocio (sin dependencias de Flutter/Firebase)
• Ejemplo: User con campos: id, email, role, name
repositories/
• Contratos (interfaces) de los repositorios
• Define QUÉ hacer, no CÓMO
• Ejemplo: abstract class AuthRepository { Future<User> login(String email, String password); }
usecases/
• Casos de uso del negocio (una acción específica)
• Ejemplos probables:
• LoginUseCase
• RegisterStudentUseCase
• RegisterTeacherUseCase
• ForgotPasswordUseCase
• VerifyCodeUseCase
📂 auth/presentation/
bloc/
• Gestión de estado con BLoC pattern
• Archivos esperados:
• auth_bloc.dart - Lógica de estado
• auth_event.dart - Eventos (LoginPressed, RegisterPressed)
• auth_state.dart - Estados (Loading, Success, Error)
pages/
📄 login_page.dart
Pantalla de inicio de sesión
📄 forgot_password_page.dart
Recuperación de contraseña
📄 select_user_type_page.dart
Elegir si registrarse como estudiante, docente, etc.
📄 select_grade_page.dart
Seleccionar el nivel educativo (de los 18 disponibles)
📄 verify_code_page.dart
Verificación de código (email o SMS)
pages/register/
Carpeta con los flujos de registro según tipo de usuario:
📄 register_student_page.dart
Registro de estudiantes (navegación por steps)
📄 register_teacher_page.dart
Registro de docentes (más complejo, con validaciones)
📄 register_administrative_page.dart
Registro de usuarios administrativos
📄 register_public_user_page.dart
Registro de usuarios públicos (padres, tutores, etc.)
widgets/
Widgets específicos para cada tipo de registro:
widgets/student/
📄 student_step1_form.dart
Paso 1: Datos básicos (nombre, email, etc.)
📄 student_step2_form.dart
Paso 2: Nivel educativo, país, etc.
📄 student_welcome_screen.dart
Pantalla de bienvenida inicial
📄 student_success_screen.dart
Registro exitoso
widgets/teacher/
📄 teacher_step1_form.dart
Paso 1: Datos personales
📄 teacher_step2_form.dart
Paso 2: Información académica
📄 teacher_step3_form.dart
Paso 3: Experiencia docente
📄 teacher_step4_form.dart
Paso 4: Validación final
📄 teacher_welcome_screen.dart
Bienvenida para docentes
📄 teacher_success_screen.dart
Registro exitoso
widgets/administrative/ y widgets/public_user/
Carpetas vacías - Widgets pendientes de implementar
🔑 Puntos Clave del Módulo Auth:
- ✅ Completamente funcional - Todo el flujo de autenticación está implementado
- 🎯 Múltiples tipos de usuario - Estudiante, Docente, Admin, Público
- 📱 Registro por pasos - UX optimizada con wizards
- 🏗️ Clean Architecture - Separación clara de capas
- 🔄 BLoC para estado - Gestión de estado profesional
🏆 2.2. COMPETITIONS - Competencias
❌ ESTRUCTURA VACÍA
Estado Actual: Solo tiene la estructura de carpetas, sin archivos implementados.
Tiene las carpetas data/, domain/, presentation/ con sus subcarpetas (datasources, models, repositories, entities, usecases, bloc, pages, widgets)
pero están completamente vacías.
⚠️ PENDIENTE DE IMPLEMENTAR:
Este módulo está en la lista de espera. Según el PDF del sistema, aquí irían:
- Gestión de competencias educativas
- Rankings de estudiantes
- Desafíos y torneos
- Sistema de puntos y premios
🏠 2.3. HOME
⚠️ ESTRUCTURA BÁSICA
Estado: Tiene carpetas data/, domain/, presentation/ pero probablemente con implementación mínima.
Esta carpeta podría ser:
- Una pantalla de inicio genérica antes de autenticarse
- Un dashboard inicial que redirige según el rol del usuario
- Onboarding o tutorial inicial de la app
📊 2.4. KENDI DASHBOARD - Panel Principal
✅ MÓDULO MÁS DESARROLLADO
Propósito: Gestión de menús y submenús dinámicos por nivel educativo (el corazón del punto 2 del PDF).
📂 kendi_dashboard/data/
📄 datasources/menu_remote_datasource.dart
Fuente de Datos de Menús:
• Conexión con Firebase/Backend para CRUD de menús
• Métodos: createMenu(), getMenusByLevel(), updateMenu(), deleteMenu()
• Maneja también submenús
📄 models/menu_model.dart
Modelo de Menú:
• Estructura: { id, nivel, nombre, icono, descripcion, submenus[] }
• Convierte entre JSON (Firebase) y objetos Dart
• Método toEntity() para convertir a la entidad de dominio
📄 models/submenu_model.dart
Modelo de Submenú:
• Estructura: { id, menu_id, nombre, orden }
• Soporta jerarquía: menú → submenús → contenido
📄 repositories/menu_repository_impl.dart
Implementación del Repositorio:
• Usa MenuRemoteDataSource para obtener datos
• Implementa la interfaz MenuRepository del dominio
• Maneja errores y caché si es necesario
📂 kendi_dashboard/domain/
entities/
📄 menu_entity.dart
Entidad pura de Menú (sin dependencias de Firebase/Flutter)
📄 submenu_entity.dart
Entidad pura de Submenú
repositories/
📄 menu_repository.dart
Contrato (interfaz) del repositorio:
abstract class MenuRepository {
Future<List<Menu>> getMenusByLevel(String nivel);
Future<void> createMenu(Menu menu);
// etc...
}
usecases/
📄 create_menu_usecase.dart
Caso de uso: Crear un menú nuevo
📄 create_submenu_usecase.dart
Caso de uso: Crear un submenú dentro de un menú
📄 delete_menu_usecase.dart
Caso de uso: Eliminar un menú
📄 get_menus_by_level_usecase.dart
Caso de uso: Obtener todos los menús de un nivel específico (ej: "preescolar")
📄 get_submenus_usecase.dart
Caso de uso: Obtener submenús de un menú
📄 update_menu_usecase.dart
Caso de uso: Actualizar un menú existente
📂 kendi_dashboard/presentation/
bloc/
📄 menu_bloc.dart
BLoC para gestionar el estado de los menús
📄 menu_event.dart
Eventos:
• LoadMenusByLevel
• CreateMenu
• UpdateMenu
• DeleteMenu
• CreateSubmenu
📄 menu_state.dart
Estados:
• MenuInitial
• MenuLoading
• MenuLoaded
• MenuError
pages/
📄 kendi_dashboard_home_page.dart
Pantalla principal del dashboard de KENDI (probablemente para docentes)
📄 select_level_page.dart
Selector de Nivel Educativo:
• Muestra los 18 niveles disponibles
• Al seleccionar uno, muestra los menús de ese nivel
📄 menus_grid_page.dart
Grid de Menús:
• Muestra todos los menús del nivel seleccionado
• Vista tipo tarjetas/grid con iconos
• Permite navegar a crear/editar
📄 create_menu_page.dart
Crear Menú:
• Formulario para crear un menú nuevo
• Campos: nombre, icono, nivel, descripción
📄 create_submenu_page.dart
Crear Submenú:
• Formulario para agregar submenús a un menú existente
• Permite jerarquía ilimitada
widgets/
📄 menu_form_widget.dart
Widget reutilizable con el formulario de menú
(usado en crear y editar)
📄 submenu_form_widget.dart
Widget reutilizable para formulario de submenú
🔑 Puntos Clave del Kendi Dashboard:
- ✅ Completamente funcional - CRUD de menús implementado
- 🎯 Mapea directamente al Punto 2 del PDF - Menús y Submenús dinámicos
- 📚 Trabaja con los 18 niveles - Usa el servicio de education_systems
- 🔧 Permite configuración total - Nombre, icono, jerarquía ilimitada
- ⚠️ FALTA - La conexión con Bancos de Contenido (Punto 4 del PDF)
👨🎓 2.5. STUDENT DASHBOARD - Panel del Estudiante
⚠️ SOLO UI - SIN LÓGICA
Estado: Tiene la estructura y widgets de UI, pero probablemente sin datos reales ni BLoC.
📂 student_dashboard/presentation/
📄 pages/student_dashboard_page.dart
Pantalla principal del dashboard del estudiante
widgets/
📄 student_header.dart
Header con foto, nombre y nivel del estudiante
📄 achievement_card.dart
Tarjeta individual de logro/insignia
📄 achievements_section.dart
Sección que muestra todos los logros del estudiante
📄 progress_by_subject_card.dart
Tarjeta mostrando progreso por materia (probablemente con barras de progreso)
📄 quick_actions_row.dart
Botones de acciones rápidas (ej: Iniciar actividad, Ver tareas, etc.)
📄 top_of_class_card.dart
Tarjeta de "Top de la clase" / Ranking
⚠️ PROBLEMA DETECTADO:
Las carpetas data/ y domain/ están vacías. Esto significa que:
- No hay conexión con backend para obtener datos reales
- Los widgets probablemente muestran datos mockeados/hardcodeados
- Falta implementar el BLoC para gestión de estado
- No hay casos de uso ni repositorios
Es solo una "cáscara visual"
👔 2.6. SUPERVISOR DASHBOARD
❌ COMPLETAMENTE VACÍO
Estructura preparada pero sin ningún archivo. Rol probablemente para directores o coordinadores académicos.
👨🏫 2.7. TEACHER DASHBOARD - Panel del Docente
❌ COMPLETAMENTE VACÍO
Estado: Solo estructura de carpetas, sin archivos.
⚠️ CRÍTICO - PENDIENTE:
Este debería ser uno de los módulos MÁS IMPORTANTES porque aquí el docente debería:
- Crear Bancos de Contenido (Punto 4 del PDF)
- Asignar contenido a menús/submenús (Punto 5 del PDF)
- Ver estadísticas de sus estudiantes
- Gestionar actividades y evaluaciones
Actualmente, el kendi_dashboard tiene parte de esto (crear menús), pero falta TODO lo de contenido.
🔧 3. SHARED - Componentes Compartidos
Propósito: Widgets y modelos reutilizables en toda la app.
📂 shared/constants/
📄 icons_catalog.dart
Catálogo de Iconos:
• Lista de iconos disponibles para menús/submenús
• Probablemente una lista de IconData o emojis
• Ejemplo: {"colores": "🌈", "numeros": "🔢", "animales": "🐶"}
📂 shared/models/
📄 kendi_icon_model.dart
Modelo de Icono:
• Estructura: { id, nombre, icono, categoria }
• Usado para mostrar y seleccionar iconos
📂 shared/widgets/
📄 icon_selector_widget.dart
Selector de Iconos:
• Widget reutilizable para elegir un icono
• Usado en create_menu y create_submenu
• Muestra el catálogo de iconos en un grid/lista
🔑 Puntos Clave de Shared:
- 🎨 Sistema de iconos flexible - Los menús pueden tener iconos personalizados
- ♻️ Reutilizable - Estos widgets se usan en múltiples features
- 📦 Separación correcta - No pertenece a ningún feature específico
🚀 4. Archivos en la Raíz
📄 main.dart
Punto de Entrada de la App:
• Configura Firebase
• Inicializa providers/BLoCs
• Define el MaterialApp con el router
• Probablemente usa runApp(MyApp())
📄 firebase_options.dart
Configuración de Firebase:
• Generado automáticamente por FlutterFire CLI
• Contiene las credenciales de Firebase para iOS, Android, Web
• Usado en Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform)
🎯 RESUMEN EJECUTIVO
✅ LO QUE ESTÁ IMPLEMENTADO:
- Auth completo - Login, registro multi-rol, recuperación de contraseña
- Kendi Dashboard funcional - CRUD de menús y submenús por nivel
- Sistemas educativos - 18 niveles de Bolivia, Brasil, Paraguay
- Navegación por roles - Router separado por tipo de usuario
- Widgets compartidos - Sistema de iconos para menús
❌ LO QUE FALTA (CRÍTICO):
- PLANTILLAS DE CONTENIDO - 0% (13 tipos del PDF)
- BANCOS DE CONTENIDO - 0% (el contenido real educativo)
- SISTEMA DE ASIGNACIONES - 0% (vincular todo)
- RENDERIZADO DINÁMICO - 0% (mostrar el contenido al estudiante)
- Teacher Dashboard - 0% (crear contenido)
- Student Dashboard lógica - 0% (solo tiene UI)
- Competitions - 0%
- Supervisor Dashboard - 0%
📊 PORCENTAJE DE COMPLETITUD:
Arquitectura y estructura: ✅ 90%
Autenticación: ✅ 95%
Gestión de menús: ✅ 100%
Sistema de contenido educativo: ❌ 5%
TOTAL DEL SISTEMA: ~25%
🔥 PRÓXIMO PASO
Ahora que entiendes TODO el tree a fondo, vamos a crear la estrategia
para implementar lo que falta y salir campeones en LATAM Edtech! 🏆