# Sesión de Trabajo — 22 de Junio 2026

**Rama:** `feature/santi`  
**Responsable:** Santiago Caballero  
**Asistido por:** Claude Sonnet 4.6  

---

## 1. Creación del Rol Marketing (MKT) en base de datos

**Situación previa:** El rol `MKT` existía en el código (`backend/app/core/roles.py`) pero **no estaba registrado en la tabla `sgetecba.roles`**. Solo había 4 roles en DB: ADMIN, ASISTENTE_ACADEMICO, DOCENTE, DIRECCION.

**SQL aplicado:**
```sql
INSERT INTO sgetecba.roles (codigo, nombre, descripcion, activo)
VALUES ('MKT', 'Marketing', 'Puede ver reportes gerenciales y registrar estudiantes', true);
-- → id=5 asignado
```

**Resultado:** 5 roles activos en DB.

---

## 2. Creación del Usuario Marketing

**SQL aplicado:**
```sql
-- Usuario
INSERT INTO sgetecba.usuarios (nombre_usuario, correo, hash_contrasena, nombre_completo, activo)
VALUES ('marketing', 'marketing@tecba.edu.bo', '<bcrypt Admin123*>', 'Usuario Marketing', true);

-- Vínculo con rol MKT
INSERT INTO sgetecba.usuario_roles (usuario_id, rol_id)
SELECT u.id, r.id
FROM sgetecba.usuarios u, sgetecba.roles r
WHERE u.nombre_usuario = 'marketing' AND r.codigo = 'MKT';
```

**Credenciales:**
| Campo | Valor |
|-------|-------|
| Usuario | `marketing` |
| Contraseña | `Admin123*` |
| Correo | `marketing@tecba.edu.bo` |
| Rol | `MKT` |

---

## 3. Permisos del Rol Marketing

**Permisos solicitados:**
1. **Ver reportes gerenciales** — `/reportes/gerencial/facultades`, `/gerencial/carreras`, `/gerencial/modalidades`
2. **Registrar estudiantes** — `POST /estudiantes` (ya estaba en `INSCRIPTION_ROLES`)

### 3.1 Nuevo grupo de roles — `roles.py`

**Archivo:** `backend/app/core/roles.py`

```python
# ANTES
# MKT — inscripciones (registro + lectura) y reportes por modalidad
INSCRIPTION_ROLES  = (ROLE_ADMIN, ROLE_ASISTENTE_ACADEMICO, ROLE_MKT)
CATALOG_READ_ROLES = (ROLE_ADMIN, ROLE_ASISTENTE_ACADEMICO, ROLE_DIRECCION, ROLE_MKT)

# DESPUÉS — se agrega GERENCIAL_READ_ROLES
# MKT — inscripciones (registro + lectura), reportes gerenciales y catálogos
INSCRIPTION_ROLES    = (ROLE_ADMIN, ROLE_ASISTENTE_ACADEMICO, ROLE_MKT)
CATALOG_READ_ROLES   = (ROLE_ADMIN, ROLE_ASISTENTE_ACADEMICO, ROLE_DIRECCION, ROLE_MKT)
GERENCIAL_READ_ROLES = (ROLE_ADMIN, ROLE_DIRECCION, ROLE_MKT)
```

### 3.2 Endpoints gerenciales actualizados — `reportes.py`

**Archivo:** `backend/app/api/v1/routes/reportes.py`

```python
# ANTES (3 endpoints con roles inline)
_: dict = Depends(require_roles(ROLE_ADMIN, ROLE_DIRECCION))

# DESPUÉS (3 endpoints con grupo centralizado)
_: dict = Depends(require_roles(*GERENCIAL_READ_ROLES))
```

Endpoints afectados:
- `GET /reportes/gerencial/facultades`
- `GET /reportes/gerencial/carreras`
- `GET /reportes/gerencial/modalidades`

---

## 4. QA — Pre y Post cambios

### Pre-cambios

| Check | Estado |
|-------|--------|
| Rol MKT en DB | ❌ No existía |
| Usuario marketing | ❌ No existía |
| Login marketing | ❌ "Credenciales inválidas" |
| GET /reportes/gerencial/* con MKT | ❌ 403 — solo ADMIN/DIRECCION |

### Post-cambios — 15/15 checks OK ✅

| Check | Rol | Resultado |
|-------|-----|-----------|
| Login marketing / Admin123* | MKT | ✅ 200 — token rol=MKT |
| GET /reportes/gerencial/facultades | MKT | ✅ 200 |
| GET /reportes/gerencial/carreras | MKT | ✅ 200 |
| GET /reportes/gerencial/modalidades | MKT | ✅ 200 |
| GET /estudiantes | MKT | ✅ 200 |
| POST /estudiantes | MKT | ✅ 201 — estudiante creado |
| POST /grupos | MKT | ✅ 403 — bloqueado (correcto) |
| PUT /estudiantes/1 | MKT | ✅ 403 — bloqueado (correcto) |
| GET /calificaciones | MKT | ✅ 403 — bloqueado (correcto) |
| GET /docente/mis-asignaturas | MKT | ✅ 403 — bloqueado (correcto) |
| GET /parametros-institucionales | MKT | ✅ 403 — bloqueado (correcto) |
| GET /reportes/gerencial/facultades | ADMIN | ✅ 200 — sin regresión |
| GET /reportes/gerencial/carreras | ADMIN | ✅ 200 — sin regresión |
| GET /reportes/gerencial/modalidades | DIRECCION | ✅ 200 — sin regresión |
| GET /reportes/gerencial/carreras | DIRECCION | ✅ 200 — sin regresión |

**Regresiones detectadas: 0**

---

## 5. Archivos modificados

| Archivo | Tipo | Cambio |
|---------|------|--------|
| `sgetecba.roles` (DB) | DB | INSERT rol MKT (id=5) |
| `sgetecba.usuarios` (DB) | DB | INSERT usuario marketing (id=5) |
| `sgetecba.usuario_roles` (DB) | DB | INSERT vínculo marketing → MKT |
| `backend/app/core/roles.py` | Código | Nuevo grupo `GERENCIAL_READ_ROLES` |
| `backend/app/api/v1/routes/reportes.py` | Código | 3 endpoints gerenciales usan `*GERENCIAL_READ_ROLES` |

---

## 6. Usuarios de prueba (estado actual)

| Usuario | Contraseña | Rol |
|---------|-----------|-----|
| `admin` | `Admin123*` | ADMIN |
| `asistente_academico` | `Admin123*` | ASISTENTE_ACADEMICO |
| `docente` | `Admin123*` | DOCENTE |
| `decano` | `Admin123*` | DIRECCION |
| `marketing` | `Admin123*` | MKT ← **nuevo** |
