# AN-003: Historias de Usuario

**Proyecto:** Sistema de Registro de Estudiantes - Inter Rapidísimo
**Rol:** Product Owner
**Fecha:** 2026-01-07

---

## 1. Épica Principal

**EP-001: Sistema de Inscripción de Estudiantes**

Como institución educativa, necesito un sistema web que permita a los estudiantes registrarse e inscribirse en materias siguiendo las reglas del programa de créditos, para gestionar eficientemente el proceso de matrícula.

---

## 2. Historias de Usuario

### US-001: Registro de Estudiante

| Campo | Valor |
|-------|-------|
| **ID** | US-001 |
| **Épica** | EP-001 |
| **Prioridad** | Alta |
| **Story Points** | 5 |
| **Sprint** | 1 |

**Historia:**
> Como **estudiante nuevo**,
> quiero **registrarme en el sistema con mi nombre y correo electrónico**,
> para **poder acceder al programa de inscripción de materias**.

**Criterios de Aceptación:**

```gherkin
Scenario: Registro exitoso de estudiante
  Given estoy en la página de registro
  When ingreso un nombre válido "Juan Pérez"
  And ingreso un email válido "juan@email.com"
  And presiono el botón "Registrar"
  Then el sistema crea mi cuenta
  And veo un mensaje de confirmación
  And soy redirigido a la página de inscripción

Scenario: Registro con email duplicado
  Given existe un estudiante con email "juan@email.com"
  When intento registrarme con el mismo email
  Then veo el mensaje "Ya existe un estudiante con este email"
  And el formulario no se envía

Scenario: Registro con email inválido
  Given estoy en la página de registro
  When ingreso un email inválido "juanemail.com"
  Then veo el mensaje "Formato de email no válido"
  And el botón de registro está deshabilitado
```

**Notas Técnicas:**
- Validación de email en frontend y backend
- Email almacenado en minúsculas (normalización)

---

### US-002: Consulta de Materias Disponibles

| Campo | Valor |
|-------|-------|
| **ID** | US-002 |
| **Épica** | EP-001 |
| **Prioridad** | Alta |
| **Story Points** | 3 |
| **Sprint** | 1 |

**Historia:**
> Como **estudiante registrado**,
> quiero **ver el catálogo de las 10 materias disponibles**,
> para **conocer mis opciones de inscripción**.

**Criterios de Aceptación:**

```gherkin
Scenario: Ver catálogo completo
  Given estoy autenticado como estudiante
  When accedo a la sección de materias
  Then veo una lista de 10 materias
  And cada materia muestra nombre, créditos (3) y profesor

Scenario: Ver detalle de materia
  Given estoy viendo el catálogo de materias
  When selecciono "Matemáticas I"
  Then veo el nombre del profesor asignado
  And veo que equivale a 3 créditos
```

---

### US-003: Inscripción en Materia

| Campo | Valor |
|-------|-------|
| **ID** | US-003 |
| **Épica** | EP-001 |
| **Prioridad** | Alta |
| **Story Points** | 8 |
| **Sprint** | 1 |

**Historia:**
> Como **estudiante registrado**,
> quiero **inscribirme en una materia disponible**,
> para **acumular créditos en mi programa académico**.

**Criterios de Aceptación:**

```gherkin
Scenario: Inscripción exitosa
  Given tengo menos de 3 materias inscritas
  And la materia "Física I" está disponible para mí
  When presiono "Inscribir" en "Física I"
  Then la materia se agrega a mis inscripciones
  And mis créditos aumentan en 3
  And veo mensaje de confirmación

Scenario: Intento inscripción con máximo alcanzado
  Given ya tengo 3 materias inscritas
  When intento inscribir otra materia
  Then veo el mensaje "Ya tienes el máximo de 3 materias"
  And el botón de inscripción está deshabilitado

Scenario: Intento inscripción con mismo profesor
  Given estoy inscrito en "Matemáticas I" (Profesor A)
  When intento inscribir "Matemáticas II" (Profesor A)
  Then veo el mensaje "Ya tienes una materia con este profesor"
  And la inscripción no se procesa
```

**Notas Técnicas:**
- Validaciones RN-003 y RN-005 en capa de dominio
- Transacción atómica para inscripción

---

### US-004: Cancelación de Inscripción

| Campo | Valor |
|-------|-------|
| **ID** | US-004 |
| **Épica** | EP-001 |
| **Prioridad** | Media |
| **Story Points** | 3 |
| **Sprint** | 1 |

**Historia:**
> Como **estudiante inscrito**,
> quiero **cancelar la inscripción de una materia**,
> para **liberar espacio y poder inscribir otra**.

**Criterios de Aceptación:**

```gherkin
Scenario: Cancelación exitosa
  Given estoy inscrito en "Física I"
  When presiono "Cancelar inscripción" en esa materia
  And confirmo la acción
  Then la materia se elimina de mis inscripciones
  And mis créditos disminuyen en 3
  And la materia vuelve a estar disponible

Scenario: Cancelar con confirmación
  Given estoy inscrito en "Física I"
  When presiono "Cancelar inscripción"
  Then veo un diálogo de confirmación
  And puedo cancelar o confirmar la acción
```

---

### US-005: Visualización de Materias No Disponibles

| Campo | Valor |
|-------|-------|
| **ID** | US-005 |
| **Épica** | EP-001 |
| **Prioridad** | Media |
| **Story Points** | 3 |
| **Sprint** | 2 |

**Historia:**
> Como **estudiante registrado**,
> quiero **ver claramente qué materias no puedo inscribir y por qué**,
> para **tomar decisiones informadas sobre mi inscripción**.

**Criterios de Aceptación:**

```gherkin
Scenario: Ver materias bloqueadas por profesor
  Given estoy inscrito en "Matemáticas I" (Profesor A)
  When veo el catálogo de materias
  Then "Matemáticas II" aparece deshabilitada
  And veo el tooltip "Ya tienes materia con Profesor A"

Scenario: Ver contador de materias restantes
  Given tengo 2 materias inscritas
  When veo mi panel de inscripción
  Then veo "2/3 materias inscritas"
  And veo "Puedes inscribir 1 materia más"
```

---

### US-006: Consulta de Otros Estudiantes

| Campo | Valor |
|-------|-------|
| **ID** | US-006 |
| **Épica** | EP-001 |
| **Prioridad** | Baja |
| **Story Points** | 2 |
| **Sprint** | 2 |

**Historia:**
> Como **estudiante registrado**,
> quiero **ver la lista de otros estudiantes en el sistema**,
> para **conocer quiénes están en el programa**.

**Criterios de Aceptación:**

```gherkin
Scenario: Ver lista de estudiantes
  Given estoy autenticado como estudiante
  When accedo a la sección de estudiantes
  Then veo una lista de todos los estudiantes registrados
  And cada estudiante muestra solo su nombre
```

**Notas:**
- Por privacidad, no se muestra email ni materias de otros estudiantes

---

### US-007: Ver Compañeros de Clase

| Campo | Valor |
|-------|-------|
| **ID** | US-007 |
| **Épica** | EP-001 |
| **Prioridad** | Media |
| **Story Points** | 5 |
| **Sprint** | 2 |

**Historia:**
> Como **estudiante inscrito en materias**,
> quiero **ver los nombres de mis compañeros en cada clase**,
> para **conocer con quiénes compartiré el curso**.

**Criterios de Aceptación:**

```gherkin
Scenario: Ver compañeros por materia
  Given estoy inscrito en "Física I"
  And otros estudiantes también están inscritos en "Física I"
  When accedo a "Mis compañeros de clase"
  Then veo "Física I" como sección
  And bajo ella veo la lista de nombres de compañeros

Scenario: Sin compañeros en materia
  Given estoy inscrito en "Redes I"
  And ningún otro estudiante está inscrito en "Redes I"
  When accedo a "Mis compañeros de clase"
  Then veo "Redes I" con mensaje "Sin compañeros aún"

Scenario: Privacidad de datos
  Given estoy viendo mis compañeros de clase
  Then solo veo los nombres
  And NO veo emails ni otras materias de mis compañeros
```

---

### US-008: Actualización de Datos Personales

| Campo | Valor |
|-------|-------|
| **ID** | US-008 |
| **Épica** | EP-001 |
| **Prioridad** | Baja |
| **Story Points** | 2 |
| **Sprint** | 2 |

**Historia:**
> Como **estudiante registrado**,
> quiero **actualizar mi nombre o correo electrónico**,
> para **mantener mis datos actualizados**.

**Criterios de Aceptación:**

```gherkin
Scenario: Actualización exitosa de nombre
  Given estoy en mi perfil
  When cambio mi nombre a "Juan Carlos Pérez"
  And presiono "Guardar"
  Then mis datos se actualizan
  And veo mensaje de confirmación

Scenario: Cambio de email a uno existente
  Given existe otro estudiante con email "otro@email.com"
  When intento cambiar mi email a "otro@email.com"
  Then veo el mensaje "Este email ya está registrado"
  And el cambio no se procesa
```

---

### US-009: Eliminación de Cuenta

| Campo | Valor |
|-------|-------|
| **ID** | US-009 |
| **Épica** | EP-001 |
| **Prioridad** | Baja |
| **Story Points** | 2 |
| **Sprint** | 2 |

**Historia:**
> Como **estudiante registrado**,
> quiero **eliminar mi cuenta del sistema**,
> para **remover mis datos si ya no deseo participar**.

**Criterios de Aceptación:**

```gherkin
Scenario: Eliminación con confirmación
  Given estoy en mi perfil
  When presiono "Eliminar cuenta"
  Then veo un diálogo de confirmación
  When confirmo la eliminación
  Then mi cuenta y todas mis inscripciones se eliminan
  And soy redirigido a la página de inicio
```

---

### US-010: Activación de Cuenta de Estudiante

| Campo | Valor |
|-------|-------|
| **ID** | US-010 |
| **Épica** | EP-001 |
| **Prioridad** | Alta |
| **Story Points** | 8 |
| **Sprint** | 1 |

**Historia:**
> Como **estudiante nuevo**,
> quiero **activar mi cuenta usando el código proporcionado por el administrador**,
> para **crear mis credenciales y acceder al sistema**.

**Criterios de Aceptación:**

```gherkin
Scenario: Validación de código de activación
  Given tengo un código de activación válido
  When accedo a la URL de activación con el código
  Then el sistema valida el código
  And veo un mensaje de bienvenida con mi nombre

Scenario: Creación de credenciales
  Given mi código de activación fue validado
  When ingreso un nombre de usuario único
  And ingreso una contraseña válida (mín. 6 caracteres)
  And confirmo la contraseña
  And presiono "Activar Cuenta"
  Then mi cuenta se activa exitosamente
  And veo mi código de recuperación (una sola vez)
  And soy redirigido al login

Scenario: Código de activación expirado
  Given mi código de activación expiró (>48 horas)
  When accedo a la URL de activación
  Then veo el mensaje "Código de activación expirado"
  And veo instrucciones para contactar al administrador
```

---

### US-011: Creación de Estudiante por Administrador

| Campo | Valor |
|-------|-------|
| **ID** | US-011 |
| **Épica** | EP-001 |
| **Prioridad** | Alta |
| **Story Points** | 5 |
| **Sprint** | 1 |

**Historia:**
> Como **administrador del sistema**,
> quiero **crear estudiantes y obtener su código de activación**,
> para **permitirles activar sus cuentas de forma segura**.

**Criterios de Aceptación:**

```gherkin
Scenario: Crear estudiante con código de activación
  Given estoy autenticado como administrador
  When navego al panel de gestión de estudiantes
  And presiono "Nuevo Estudiante"
  And ingreso nombre y email válidos
  And presiono "Crear"
  Then el estudiante se crea sin credenciales
  And veo un modal con el código de activación
  And veo la URL de activación completa
  And veo la fecha de expiración del código

Scenario: Copiar código de activación
  Given se muestra el modal de activación
  When presiono el botón de copiar código
  Then el código se copia al portapapeles
  And veo confirmación visual
```

---

### US-012: Control de Acceso por Roles

| Campo | Valor |
|-------|-------|
| **ID** | US-012 |
| **Épica** | EP-001 |
| **Prioridad** | Alta |
| **Story Points** | 5 |
| **Sprint** | 1 |

**Historia:**
> Como **sistema**,
> quiero **restringir el acceso según el rol del usuario**,
> para **garantizar que cada usuario solo acceda a funcionalidades autorizadas**.

**Criterios de Aceptación:**

```gherkin
Scenario: Estudiante accede a su dashboard
  Given estoy autenticado como estudiante
  When accedo a /dashboard
  Then veo mi información personal
  And veo opciones: "Mi Portal", "Mis Materias", "Compañeros"
  And NO veo: "Panel Admin", "Gestión Estudiantes"

Scenario: Estudiante intenta acceder a rutas de admin
  Given estoy autenticado como estudiante
  When intento navegar a /admin o /students
  Then soy redirigido automáticamente a /dashboard

Scenario: Administrador accede al panel completo
  Given estoy autenticado como administrador
  When accedo a /admin
  Then veo el panel de administración completo
  And puedo gestionar todos los estudiantes
```

---

## 3. Backlog Priorizado

| Prioridad | Historia | Story Points | Sprint |
|-----------|----------|--------------|--------|
| 1 | US-001: Registro de Estudiante | 5 | 1 |
| 2 | US-011: Creación por Admin | 5 | 1 |
| 3 | US-010: Activación de Cuenta | 8 | 1 |
| 4 | US-012: Control de Acceso | 5 | 1 |
| 5 | US-002: Consulta de Materias | 3 | 1 |
| 6 | US-003: Inscripción en Materia | 8 | 1 |
| 7 | US-004: Cancelación de Inscripción | 3 | 1 |
| 8 | US-005: Materias No Disponibles | 3 | 2 |
| 9 | US-007: Ver Compañeros | 5 | 2 |
| 10 | US-006: Consulta de Estudiantes | 2 | 2 |
| 11 | US-008: Actualizar Datos | 2 | 2 |
| 12 | US-009: Eliminar Cuenta | 2 | 2 |

**Total Story Points:** 51

---

## 4. Definición de Listo (DoR)

- [ ] Historia tiene criterios de aceptación claros
- [ ] Dependencias identificadas
- [ ] Estimación en story points
- [ ] Diseño de UI aprobado (si aplica)
- [ ] APIs definidas

## 5. Definición de Terminado (DoD)

- [ ] Código implementado y revisado
- [ ] Tests unitarios (>80% coverage)
- [ ] Tests de integración pasando
- [ ] Documentación actualizada
- [ ] Validaciones de negocio probadas
- [ ] Sin deuda técnica crítica

---

## 6. Aprobación

| Rol | Nombre | Fecha | Firma |
|-----|--------|-------|-------|
| Product Owner | Sistema | 2026-01-07 | ✓ |
| Scrum Master | Pendiente | - | - |
| Tech Lead | Pendiente | - | - |
