# SGETECBA — Estado del Proyecto
**Fecha:** 09/06/2026  
**Desarrollador:** Mirko | **Branch:** `features/MirkoALS`  
**Repo:** https://github.com/ZIS-TECBA/sgetecba  
**Stack:** FastAPI + PostgreSQL 18 (schema: `sgetecba`) + React + TypeScript + Vite + TailwindCSS

---

## 1. Módulos operativos confirmados

- Login, Dashboard (Admin, Secretaría, Docente)
- Carreras, Asignaturas, Períodos Académicos — CRUD completo
- Estudiantes — CRUD completo
- Matriculaciones — CRUD base + flujo masivo por carrera (sprint 1)
- Asistencias Admin y Secretaría — filtro `estudiante_q` corregido
- PDF Planilla e Historial de asistencia
- Realtime refresh via SSE

---

## 2. Lo completado en esta sesión (09/06/2026)

### 2.1 Bug crítico — `reportes.py`
`current_user["id"]` reemplazado por `current_user["user_id"]` en líneas 75, 253 y 625.  
Causa: el token JWT almacena el ID bajo la clave `user_id`, no `id`. Producía HTTP 500 en todos los reportes del docente.

### 2.2 Seguridad del repositorio — `.gitignore`
`.gitignore` raíz actualizado. Ahora cubre:
- `contraseña.txt`
- `backend/_temp_*.py` (8 archivos de debug)
- `.env` y variantes
- `frontend/node_modules/`

Pendiente ejecutar los `git rm --cached` correspondientes antes del próximo commit, y rotar contraseña de BD y `JWT_SECRET` después del push.

### 2.3 Matriculaciones — pre-carga masiva y filtros

**Backend (`matriculaciones.py`):**
- Nuevo endpoint `POST /masiva` — crea inscripciones en bloque para un estudiante en múltiples ofertas de una vez
- `GET /catalogos/ofertas` ahora acepta `carrera_id` y `periodo_activo=true` como filtros
- `GET /matriculaciones` ahora acepta `search`, `carrera_id`, `periodo_academico_id`, `fecha_desde`, `fecha_hasta`

**Frontend (`Matriculaciones.tsx`):**
- Flujo de 2 pasos: selección de estudiante + carrera → lista de materias con checkboxes (todos marcados por defecto, secretaria desmarca las que no aplica)
- Barra de filtros completa (carrera, materia, rango de fechas, búsqueda por nombre/CI con debounce)
- Tabla actualizada con columnas CI y Estado

---

## 3. Módulos incompletos o sin página frontend

| Módulo | Estado |
|--------|--------|
| Docentes | Página existe, asignación a oferta sin implementar |
| Oferta de Asignaturas | CRUD base, sin asignación docente ni vista pensum |
| Pensum / Malla curricular | No existe tabla dedicada ni vista — derivado de `ofertas_asignaturas` |
| Usuarios | Sin página frontend |
| Panel Docente | Horario parcial, pasar lista y clases planificadas sin construir |
| Importación Excel | Componente existe, flujo real sin conectar al pipeline de staging |
| Faltas y Abandonos | Sin páginas frontend |

---

## 4. Hallazgos de auditoría pendientes de atender

### 4.1 Normalización de respuestas API
Varios endpoints devuelven `HTTP 200 { ok: false }` en lugar de los códigos HTTP correctos.

| Situación | Código actual | Código correcto |
|-----------|---------------|-----------------|
| Recurso no encontrado | 200 `{ ok: false }` | 404 |
| Dato duplicado | 200 `{ ok: false }` | 409 |
| Validación fallida | 200 `{ ok: false }` | 422 |
| Error de negocio | 200 `{ ok: false }` | 400 |

Archivos afectados: `asistencias.py`, `matriculaciones.py`, `estudiantes.py`, `sesiones.py`.

### 4.2 Importación Excel — pipeline de staging sin gobernar
La BD ya tiene las tablas de staging (`staging_excel_1/2/3`, `staging_estudiantes_unificados`, `conflictos_datos`, `lotes_importacion`). El flujo correcto es: subir → staging → validar → resolver conflictos → importar. Pendiente verificar si `importacion_service.py` usa staging o inserta directo.

### 4.3 Pruebas mínimas críticas (sin cobertura actualmente)
- Auth por roles: DOCENTE no debe acceder a endpoints de ADMIN
- Reportes docente: verificar que el fix de `user_id` funciona
- Importación con duplicados: el upsert no debe crear registros dobles
- Asistencia duplicada: `UniqueViolationError` debe devolver 409, no 500
- Login y navegación por rol: cada rol ve solo su panel

### 4.4 Refactor pendiente (después de bugs críticos)

| Archivo | Problema |
|---------|----------|
| `AsistenciasSecretaria.tsx` | Componente demasiado grande, múltiples tabs con lógica mezclada |
| `importacion_service.py` | Sin flujo de staging claro, lógica de validación dispersa |
| `reportes.py` | Funciones largas, sin separación clara por rol |
| `client.ts` | Mezcla de helpers, interceptores y llamadas concretas |

---

## 5. Próximo — Asignación docente a oferta con fechas

La tabla `asignaciones_docente` ya tiene `fecha_inicio` y `fecha_fin`. El horario (`horario_clases`) apunta a `asignacion_docente_id`. Lo que falta es el formulario en el frontend y verificar/crear el endpoint.

**Backend:**
- Verificar si existe `POST /oferta-asignaturas/{id}/asignar-docente`
- Si no existe: crear en `oferta_asignaturas.py` con validación de solapamiento de fechas
- `GET /oferta-asignaturas/{id}/docente-actual` — mostrar quién tiene la materia actualmente

**Frontend (`Ofertas.tsx`):**
- Sección "Docente asignado" con combobox de búsqueda por nombre/CI (debounce)
- Inputs `fecha_inicio` y `fecha_fin` con validación de rango
- Mostrar docente actual con opción de reasignar

**Restricciones de BD a tener en cuenta:**
- `CHECK fecha_fin >= fecha_inicio` ya existe en `asignaciones_docente`
- `UNIQUE(docente_id, oferta_asignatura_id)` — verificar si existe o agregar con `ALTER TABLE`
- Una oferta puede tener solo un docente activo — lógica a implementar en backend

---

## 6. Tabla resumen de pendientes

| Área | Tarea | Tipo | Prioridad |
|------|-------|------|-----------|
| Seguridad | Ejecutar `git rm --cached` + rotar credenciales | SEGURIDAD | CRÍTICA |
| Matriculaciones | Confirmar flujo masivo en browser | VERIFICACIÓN | CRÍTICA |
| Docentes | Asignación docente a oferta con fechas | NUEVO | CRÍTICA |
| Matriculaciones | Fecha de hoy por defecto en formulario | BUG | ALTA |
| Matriculaciones | Estado ACTIVA por defecto al crear | BUG | ALTA |
| Matriculaciones | Combobox oferta con búsqueda en tiempo real | BUG | ALTA |
| Matriculaciones | Enter para pasar al siguiente campo | BUG | ALTA |
| Matriculaciones | Editar materias de estudiante ya inscrito | NUEVO | ALTA |
| Backend | Normalizar respuestas API: 400/404/409/422 | BUG | ALTA |
| Frontend | Vista Pensum por Carrera en sidebar admin | NUEVO | ALTA |
| Frontend | Responsividad global en todas las páginas | BUG | ALTA |
| Panel Docente | Mis Asignaturas + Pasar Lista | NUEVO | ALTA |
| Importación | Flujo completo staging → validar → confirmar | REFACTOR | MEDIA |
| Usuarios | Página CRUD de usuarios del sistema | NUEVO | MEDIA |
| Faltas | Página justificación de faltas (Secretaría) | NUEVO | MEDIA |
| Abandonos | Página registro de retiro de alumno | NUEVO | MEDIA |
| Reportes | Reportes PDF consolidados para Dirección | NUEVO | MEDIA |
| Refactor | Dividir `AsistenciasSecretaria.tsx` | REFACTOR | BAJA |
| Refactor | Reorganizar `client.ts` en módulos | REFACTOR | BAJA |
| Tests | Auth por roles — test automatizado | NUEVO | BAJA |
| Tests | Importación con duplicados — test automatizado | NUEVO | BAJA |
