-
Notifications
You must be signed in to change notification settings - Fork 0
Stack Tecnológico
- Descripción General
- Arquitectura del Sistema
- Flujo de Generación del Informe
- Formato de Datos
- API Endpoints
- Implementación Frontend
- Configuración del Mock Server
- Manejo de Errores
- Ejemplos de Uso
- Troubleshooting
El Informe de Carga Docente es una funcionalidad que permite visualizar información detallada sobre la distribución de materias y estudiantes asignados a cada docente del sistema ProfeSort.
Características principales:
- Visualización de estadísticas generales (totales y promedios)
- Tabla detallada por docente con información de carga
- Datos en tiempo real mediante API REST
- Manejo robusto de errores y estados de carga
- Interfaz responsive con Bootstrap
graph TD
A[Componente AdminDocente] --> B[AdminDocenteService]
B --> C[HttpClient]
C --> D[Mock API Server]
D --> E[JSON Database]
F[Usuario] --> G[Click 'Ver Informe']
G --> H[toggleInformeCarga()]
H --> I[cargarInformeCarga()]
I --> J[getDocentesCarga()]
J --> K[HTTP GET /carga]
K --> L[Procesar Respuesta]
L --> M[Actualizar UI]
- Frontend: Angular 17 con Reactive Forms
- Servicio: AdminDocenteService para comunicación HTTP
- Mock API: JSON Server para simular backend
- Base de datos: Archivo JSON con datos mock
- Activación del Informe
// Usuario hace clic en "Ver Informe de Carga"
toggleInformeCarga(): void {
this.mostrarInformeCarga = !this.mostrarInformeCarga;
if (this.mostrarInformeCarga && this.docentesCarga.length === 0) {
this.cargarInformeCarga(); // Cargar datos si no existen
}
}
- Solicitud de Datos
// Llamada al servicio para obtener datos
cargarInformeCarga(): void {
this.cargandoDatos = true;
this.errorCarga = '';
this.adminDocenteService.getDocentesCarga().subscribe({
next: (data: DocenteCarga[]) => {
this.docentesCarga = data;
this.cargandoDatos = false;
},
error: (error) => {
this.errorCarga = error.message;
this.cargandoDatos = false;
}
});
}
- Procesamiento de Datos
// Cálculo de estadísticas en tiempo real
obtenerEstadisticas() {
const totalDocentes = this.docentesCarga.length;
const docentesActivos = this.docentesCarga.filter(d => d.estado === 'Activo').length;
const totalMaterias = this.docentesCarga.reduce((sum, d) => sum + d.cantidadMaterias, 0);
const totalEstudiantes = this.docentesCarga.reduce((sum, d) => sum + d.cantidadEstudiantes, 0);
return { totalDocentes, docentesActivos, totalMaterias, totalEstudiantes };
}
- Renderización de la UI
- Estadísticas generales: Cards con totales
- Tabla detallada: Información por docente
- Estados visuales: Loading, error, datos vacíos
Estructura de datos esperada (DocenteCarga):
interface DocenteCarga {
id: number; // Identificador único del docente
nombre: string; // Nombre completo del docente
email: string; // Correo electrónico
legajo: string; // Número de legajo institucional
estado: 'Activo' | 'Inactivo'; // Estado del docente
cantidadMaterias: number; // Número de materias asignadas
cantidadEstudiantes: number; // Total de estudiantes a cargo
materias: string[]; // Array con nombres de materias
fechaIngreso?: string; // Fecha de ingreso (opcional)
departamento?: string; // Departamento (opcional)
}
Ejemplo de datos JSON:
{
"carga": [
{
"id": 1,
"nombre": "Karina del Valle Quinteros",
"email": "karinaq38@gmail.com",
"legajo": "DOC001",
"estado": "Activo",
"cantidadMaterias": 3,
"cantidadEstudiantes": 45,
"materias": ["Matemática", "Física", "Química"],
"fechaIngreso": "2020-03-15",
"departamento": "Ciencias Exactas"
},
{
"id": 2,
"nombre": "Juan Pablo Sanchez Brandán",
"email": "sanchezbrandan@gmail.com",
"legajo": "DOC002",
"estado": "Activo",
"cantidadMaterias": 2,
"cantidadEstudiantes": 38,
"materias": ["Historia", "Geografía"],
"fechaIngreso": "2019-08-10",
"departamento": "Ciencias Sociales"
}
]
}
GET /carga
Descripción: Obtiene la lista completa de docentes con información de carga
URL: http://localhost:3001/carga
Método: GET
Headers: Content-Type: application/json
Respuesta exitosa (200):
[
{
"id": 1,
"nombre": "Karina del Valle Quinteros",
"email": "karinaq38@gmail.com",
"legajo": "DOC001",
"estado": "Activo",
"cantidadMaterias": 3,
"cantidadEstudiantes": 45,
"materias": ["Matemática", "Física", "Química"],
"fechaIngreso": "2020-03-15",
"departamento": "Ciencias Exactas"
}
]
Códigos de error:
- 404: Recurso no encontrado
- 500: Error interno del servidor
- 0: Error de conexión
Servicio AdminDocenteService:
@Injectable({ providedIn: 'root' })
export class AdminDocenteService {
private apiUrl = 'http://localhost:3001/carga';
constructor(private http: HttpClient) {}
getDocentesCarga(): Observable<DocenteCarga[]> {
return this.http.get<DocenteCarga[]>(this.apiUrl)
.pipe(
retry(1), // Reintentar una vez
catchError(this.handleError) // Manejo de errores
);
}
private handleError(error: HttpErrorResponse) {
// Lógica de manejo de errores...
}
}
- docentesCarga: DocenteCarga[] = [] // Array de datos de carga
- cargandoDatos = false // Estado de carga
- errorCarga = '' // Mensaje de error
- mostrarInformeCarga = false // Visibilidad del informe
- toggleInformeCarga(): Alternar visibilidad
- cargarInformeCarga(): Obtener datos del API
- obtenerEstadisticas(): Calcular estadísticas
Instalación: npm install -g json-server
Estructura de archivos: ProfeSort/ ├── mock-api/ │ ├── db.json # Base de datos JSON │ ├── routes.json # Configuración de rutas (opcional) │ └── middleware.js # Middleware personalizado (opcional)
Ejecución:
json-server --watch mock-api/db.json --port 3001
# Con configuración avanzada
json-server --watch mock-api/db.json --routes mock-api/routes.json --port 3001
Script en package.json:
{
"scripts": {
"mock-api": "json-server --watch mock-api/db.json --port 3001",
"dev:with-mock": "concurrently \"npm run mock-api\" \"ng serve\""
}
}
Tipos de errores manejados:
- Error de conexión (Status 0): "No se puede conectar al servidor. Verifique que el mock API esté ejecutándose en el puerto 3001."
- Recurso no encontrado (Status 404): "Recurso no encontrado."
- Error del servidor (Status 500): "Error interno del servidor."
Estrategia:
- Retry automático (1 reintento)
- Mensajes descriptivos
- Logging (console.error)
- Botón de reintento en UI
Ejemplo 1: Carga exitosa
- Usuario hace clic en "Ver Informe de Carga"
- toggleInformeCarga()
- cargarInformeCarga()
- GET http://localhost:3001/carga
- Respuesta procesada → tabla + estadísticas
Ejemplo 2: Manejo de error
- Mock server apagado
- HTTP request falla con status 0
- Mensaje: "No se puede conectar al servidor..."
- Botón "Reintentar"
- Nuevo intento con cargarInformeCarga()
Ejemplo 3: Datos vacíos
- Mock responde []
- Se ocultan estadísticas
- Mensaje: "No hay datos disponibles"
Problema: "Error de conexión"
Solución:
- Verificar server en puerto 3001
- Comprobar db.json válido
- Revisar CORS
curl http://localhost:3001/carga
Problema: "Property does not exist"
Solución:
- Revisar métodos implementados
- Comprobar imports
- Revisar interfaces
Problema: "JSON Server options not supported"
Solución:
- Instalar versión: npm install -g json-server@0.17.4
- Usar JSON simplificado
Problema: "Datos no se muestran"
Solución:
- Revisar estructura de db.json
- Comprobar URL del servicio
- Confirmar HttpClient en app.config.ts
Rendimiento
- Carga inicial solo al abrir el informe
- Estadísticas en tiempo real (cliente)
- Considerar caché para datasets grandes
Futuras mejoras
- Filtros: depto, estado, fechas
- Exportación: PDF, Excel, CSV
- Paginación
- Gráficos: Chart.js / D3
- Tiempo real: WebSockets
Seguridad
- En producción usar JWT
- Validar datos en backend
- Sanitización de inputs
- Rate limiting en API
Te proporciono una documentación completa para la Wiki sobre el flujo de generación del informe de carga docente:
- Descripción General
- Arquitectura del Sistema
- Flujo de Generación del Informe
- Formato de Datos
- API Endpoints
- Implementación Frontend
- Configuración del Mock Server
- Manejo de Errores
- Ejemplos de Uso
- Troubleshooting
El Informe de Carga Docente es una funcionalidad que permite visualizar información detallada sobre la distribución de materias y estudiantes asignados a cada docente del sistema ProfeSort.
- Visualización de estadísticas generales (totales y promedios)
- Tabla detallada por docente con información de carga
- Datos en tiempo real mediante API REST
- Manejo robusto de errores y estados de carga
- Interfaz responsive con Bootstrap
graph TD
A[Componente AdminDocente] --> B[AdminDocenteService]
B --> C[HttpClient]
C --> D[Mock API Server]
D --> E[JSON Database]
F[Usuario] --> G[Click 'Ver Informe']
G --> H[toggleInformeCarga()]
H --> I[cargarInformeCarga()]
I --> J[getDocentesCarga()]
J --> K[HTTP GET /carga]
K --> L[Procesar Respuesta]
L --> M[Actualizar UI]
- Frontend: Angular 17 con Reactive Forms
- Servicio: AdminDocenteService para comunicación HTTP
- Mock API: JSON Server para simular backend
- Base de datos: Archivo JSON con datos mock
// Usuario hace clic en "Ver Informe de Carga"
toggleInformeCarga(): void {
this.mostrarInformeCarga = !this.mostrarInformeCarga;
if (this.mostrarInformeCarga && this.docentesCarga.length === 0) {
this.cargarInformeCarga(); // Cargar datos si no existen
}
}// Llamada al servicio para obtener datos
cargarInformeCarga(): void {
this.cargandoDatos = true;
this.errorCarga = '';
this.adminDocenteService.getDocentesCarga().subscribe({
next: (data: DocenteCarga[]) => {
this.docentesCarga = data;
this.cargandoDatos = false;
},
error: (error) => {
this.errorCarga = error.message;
this.cargandoDatos = false;
}
});
}// Cálculo de estadísticas en tiempo real
obtenerEstadisticas() {
const totalDocentes = this.docentesCarga.length;
const docentesActivos = this.docentesCarga.filter(d => d.estado === 'Activo').length;
const totalMaterias = this.docentesCarga.reduce((sum, d) => sum + d.cantidadMaterias, 0);
const totalEstudiantes = this.docentesCarga.reduce((sum, d) => sum + d.cantidadEstudiantes, 0);
return { totalDocentes, docentesActivos, totalMaterias, totalEstudiantes };
}- Estadísticas generales: Cards con totales
- Tabla detallada: Información por docente
- Estados visuales: Loading, error, datos vacíos
interface DocenteCarga {
id: number; // Identificador único del docente
nombre: string; // Nombre completo del docente
email: string; // Correo electrónico
legajo: string; // Número de legajo institucional
estado: 'Activo' | 'Inactivo'; // Estado del docente
cantidadMaterias: number; // Número de materias asignadas
cantidadEstudiantes: number; // Total de estudiantes a cargo
materias: string[]; // Array con nombres de materias
fechaIngreso?: string; // Fecha de ingreso (opcional)
departamento?: string; // Departamento al que pertenece (opcional)
}{
"carga": [
{
"id": 1,
"nombre": "Karina del Valle Quinteros",
"email": "karinaq38@gmail.com",
"legajo": "DOC001",
"estado": "Activo",
"cantidadMaterias": 3,
"cantidadEstudiantes": 45,
"materias": ["Matemática", "Física", "Química"],
"fechaIngreso": "2020-03-15",
"departamento": "Ciencias Exactas"
},
{
"id": 2,
"nombre": "Juan Pablo Sanchez Brandán",
"email": "sanchezbrandan@gmail.com",
"legajo": "DOC002",
"estado": "Activo",
"cantidadMaterias": 2,
"cantidadEstudiantes": 38,
"materias": ["Historia", "Geografía"],
"fechaIngreso": "2019-08-10",
"departamento": "Ciencias Sociales"
}
]
}Descripción: Obtiene la lista completa de docentes con información de carga
URL: http://localhost:3001/carga
Método: GET
Headers:
Content-Type: application/json
Respuesta exitosa (200):
[
{
"id": 1,
"nombre": "Karina del Valle Quinteros",
"email": "karinaq38@gmail.com",
"legajo": "DOC001",
"estado": "Activo",
"cantidadMaterias": 3,
"cantidadEstudiantes": 45,
"materias": ["Matemática", "Física", "Química"],
"fechaIngreso": "2020-03-15",
"departamento": "Ciencias Exactas"
}
]Códigos de error:
-
404: Recurso no encontrado -
500: Error interno del servidor -
0: Error de conexión
@Injectable({ providedIn: 'root' })
export class AdminDocenteService {
private apiUrl = 'http://localhost:3001/carga';
constructor(private http: HttpClient) {}
getDocentesCarga(): Observable<DocenteCarga[]> {
return this.http.get<DocenteCarga[]>(this.apiUrl)
.pipe(
retry(1), // Reintentar una vez
catchError(this.handleError) // Manejo centralizado de errores
);
}
private handleError(error: HttpErrorResponse) {
// Lógica de manejo de errores...
}
}Propiedades principales:
docentesCarga: DocenteCarga[] = []; // Array de datos de carga
cargandoDatos = false; // Estado de carga
errorCarga = ''; // Mensaje de error
mostrarInformeCarga = false; // Visibilidad del informeMétodos principales:
-
toggleInformeCarga(): Alternar visibilidad -
cargarInformeCarga(): Obtener datos del API -
obtenerEstadisticas(): Calcular estadísticas
npm install -g json-serverProfeSort/
├── mock-api/
│ ├── db.json # Base de datos JSON
│ ├── routes.json # Configuración de rutas (opcional)
│ └── middleware.js # Middleware personalizado (opcional)
# Servidor básico
json-server --watch mock-api/db.json --port 3001
# Con configuración avanzada
json-server --watch mock-api/db.json --routes mock-api/routes.json --port 3001{
"scripts": {
"mock-api": "json-server --watch mock-api/db.json --port 3001",
"dev:with-mock": "concurrently \"npm run mock-api\" \"ng serve\""
}
}-
Error de conexión (Status 0)
"No se puede conectar al servidor. Verifique que el mock API esté ejecutándose en el puerto 3001." -
Recurso no encontrado (Status 404)
"Recurso no encontrado." -
Error del servidor (Status 500)
"Error interno del servidor."
- Retry automático: 1 reintento automático
- Mensajes descriptivos: Errores claros para el usuario
- Logging: Console.error para debugging
- Botón de reintento: Permite al usuario volver a intentar
// 1. Usuario hace clic en "Ver Informe de Carga"
// 2. Se ejecuta toggleInformeCarga()
// 3. Se llama a cargarInformeCarga()
// 4. HTTP GET a http://localhost:3001/carga
// 5. Respuesta procesada y mostrada en UI
// Resultado: Tabla con 4 docentes y estadísticas calculadas// 1. Mock server no está ejecutándose
// 2. HTTP request falla con status 0
// 3. Se muestra mensaje: "No se puede conectar al servidor..."
// 4. Usuario puede hacer clic en "Reintentar"
// 5. Se vuelve a ejecutar cargarInformeCarga()// 1. Mock server responde con array vacío: []
// 2. Se ocultan las estadísticas
// 3. Se muestra mensaje: "No hay datos disponibles"Solución:
- Verificar que el mock server esté ejecutándose en puerto 3001
- Comprobar que el archivo
db.jsonexiste y es válido - Verificar configuración de CORS
# Verificar si el servidor está ejecutándose
curl http://localhost:3001/cargaSolución:
- Verificar que todos los métodos estén implementados en el componente
- Comprobar imports en el módulo
- Verificar que las interfaces estén correctamente definidas
Solución:
- Instalar versión específica:
npm install -g json-server@0.17.4 - O usar estructura JSON simplificada sin routes
Solución:
- Verificar estructura del JSON en
db.json - Comprobar URL del endpoint en el servicio
- Verificar que HttpClient esté configurado en
app.config.ts
- Los datos se cargan solo cuando se abre el informe por primera vez
- Las estadísticas se calculan en tiempo real (cliente)
- Implementar caché si se requiere para datasets grandes
- Filtros: Por departamento, estado, rango de fechas
- Exportación: PDF, Excel, CSV
- Paginación: Para datasets grandes
- Gráficos: Visualizaciones con Chart.js o D3
- Tiempo real: WebSockets para datos dinámicos
- En producción, implementar autenticación JWT
- Validación de datos en backend
- Sanitización de inputs
- Rate limiting en API
Última actualización: Septiembre 2025
Versión del documento: 1.0
Autor: Equipo de Desarrollo ProfeSort
Esta documentación está completa y lista para ser incluida en tu Wiki. Puedes copiar y pegar las secciones que necesites o usar todo el documento como referencia.
Última actualización: Septiembre 2025
Versión: 1.0
Autor: Equipo de Desarrollo ProCoders