# Corrección de Login por Rol Estable — SGETECBA

Fecha: 30-05-2026

## 1. Objetivo

Corregir el flujo de login por rol para que la redirección del frontend y la protección de navegación no dependan de `rol_nombre`, ya que ese campo llegaba con problemas de encoding para algunos perfiles.

## 2. Problema detectado

Durante la validación en vivo del login se confirmó que:

- La URL `http://127.0.0.1:4173/login` ya cargaba correctamente.
- El backend autenticaba usuarios válidos.
- El frontend seguía decidiendo la redirección según `rol_nombre`.
- Para `secretaria` y `direccion`, `rol_nombre` llegaba con mojibake desde la API.

Ejemplo del problema:

- `SecretarÃ­a AcadÃ©mica`
- `DirecciÃ³n / Gerencia`

Riesgo técnico:

- redirección incorrecta después del login
- guards de rutas inconsistentes
- menú lateral con permisos visuales erróneos
- dependencia de texto corrupto para lógica de autorización cliente

## 3. Decisión técnica aplicada

Se dejó de usar `rol_nombre` como fuente de verdad para navegación y autorización frontend.

En su lugar se implementó un identificador estable:

- `rol_codigo`

Valores validados:

- `ADMIN`
- `SECRETARIA`
- `DOCENTE`
- `DIRECCION`

Justificación:

- el código de rol es estable
- no depende de tildes ni de encoding
- no cambia por textos de catálogo o presentación
- permite mantener lógica de navegación, guards y menú de forma consistente

## 4. Cambios realizados

### Backend

Se amplió el contrato de autenticación para devolver `rol_codigo` en el `user` del `TokenResponse`.

Archivos:

- [backend/app/schemas/auth.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/schemas/auth.py:1)
- [backend/app/services/auth_service.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/services/auth_service.py:1)
- [backend/tests/test_auth_service.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/tests/test_auth_service.py:1)

Cambios clave:

- detección de columna `codigo`/`code` en tabla `roles`
- exposición de `auth_role_code` en la consulta de autenticación
- inclusión de `role_code` en claims del token
- inclusión de `rol_codigo` en el `user` retornado al frontend

### Frontend

Se creó una capa central de resolución de rol para evitar lógica dispersa y frágil.

Archivos:

- [frontend/src/auth/roles.ts](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/auth/roles.ts:1)
- [frontend/src/pages/Login.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/pages/Login.tsx:1)
- [frontend/src/routes/AppRouter.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/routes/AppRouter.tsx:1)
- [frontend/src/components/Sidebar.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/components/Sidebar.tsx:1)
- [frontend/src/types/api.ts](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/types/api.ts:1)

Cambios clave:

- nueva utilidad `getUserRoleCode(...)`
- nueva utilidad `getDefaultRouteForUser(...)`
- nueva utilidad `userHasAnyRole(...)`
- login redirige por `rol_codigo`
- guards de rutas validan por `rol_codigo`
- sidebar filtra opciones por `rol_codigo`
- fallback por `role_id` para compatibilidad

## 5. Validación ejecutada

### Backend

```bash
cd backend
.\.venv\Scripts\python.exe -m pytest
```

Resultado:

- `12 passed`

### Frontend

```bash
cd frontend
npm run build
```

Resultado:

- `PASS`

### Validación runtime

Se reinició el backend persistente y se verificó `auth/login` contra usuarios de prueba por rol.

Resultado observado:

- `admin -> ADMIN`
- `secretaria -> SECRETARIA`
- `docente -> DOCENTE`
- `direccion -> DIRECCION`

También se verificó:

- `http://127.0.0.1:4173/login -> 200`

## 6. Resultado esperado después de la corrección

- `docente` redirige a `/docente/dashboard`
- `secretaria` redirige a `/secretaria/dashboard`
- `admin` redirige a `/dashboard`
- `direccion` redirige a `/dashboard`

## 7. Estado

Corrección aplicada y validada técnicamente con:

- pruebas backend en verde
- build frontend en verde
- contrato de autenticación actualizado
- navegación desacoplada de texto con encoding defectuoso

## 8. Observación importante

El problema de encoding en `rol_nombre` sigue existiendo en la respuesta para algunos datos legacy, pero ya no afecta la lógica crítica de login y autorización cliente porque la navegación dejó de depender de ese campo.
