04 — Flujos de usuario — SURCO
Convenciones
- Actor: FARMER | TECHNICIAN | Guest
- Éxito: resultado observable
- Errores: UI + código HTTP cuando aplica
F1 — Descubrimiento y entrada (Guest)
Home (/) → CTA "Abrir cuaderno" | "Entrar" | "Soy agricultor/técnico"
→ Login (/login)
| Paso | Acción | Sistema |
|---|
| 1 | Lee valor y pasos 01–03 | Render estático |
| 2 | Click CTA | Router → /login |
| 3 | Opcional: lee credenciales demo en footer | Copy |
Éxito: formulario de login visible.
No hay registro público en v1 (solo seed).
F2 — Login JWT
/login → POST /api/auth/login { email, password }
→ 200 { accessToken, user } → localStorage → /app/tasks
→ 401 → mensaje error en form
| Campo | Validación cliente (mín.) | API |
|---|
| email | required, email | @IsEmail() |
| password | required, min 6 | @MinLength(6) |
Éxito: token guardado; user con role FARMER o TECHNICIAN.
Errores:
| Caso | Comportamiento |
|---|
| Credenciales inválidas | 401 + mensaje “No se pudo entrar…” |
| Red caída | Error de red en UI |
| Ya autenticado visita /login | Puede re-login; lista exige token |
F3 — Listar tareas + stats
/app/tasks (guard token en cliente)
→ GET /api/tasks
→ GET /api/tasks/stats/summary
→ Render cards + 4 métricas
| Rol | Filtro servidor |
|---|
| FARMER | farmerId = userId |
| TECHNICIAN | technicianId = userId |
Orden: dueAt ASC.
Include: farmer, technician, parcel.
Variantes de UI
| Estado datos | UI |
|---|
| loading | (implícito hasta next) |
| items.length = 0 | Empty L-0 + CTA crear si FARMER |
| error HTTP | Mensaje rojo M-0 |
| OK | Lista + stats TOTAL / ABIERTAS / ACTIVAS / HECHAS |
AC:
- Sin token → redirect
/login.
- Técnico no ve botón “+ Tarea”.
- Stats
open = PENDING + ACTIVE.
F4 — Crear tarea (solo FARMER)
/app/tasks → + Tarea → /app/tasks/new
→ submit → POST /api/tasks
→ 201/200 task → navegar a lista o detalle
→ 403 si TECHNICIAN
Campos
| Campo | Obligatorio | Notas |
|---|
| title | Sí | min 3 |
| parcelName | Sí | min 2; upsert parcela del farmer |
| crop | No | default “Cultivo” si parcela nueva |
| dueAt | Sí | ISO date string |
| notes | No | default "" |
| technicianEmail | No | si válido TECHNICIAN → status ACTIVE |
Lógica de negocio
- Buscar parcela del farmer por
name; si no existe, crear con hectares: 1 y crop dado.
- Si
technicianEmail: buscar user role TECHNICIAN; si no, 404 “Técnico no encontrado”.
- Generar
code = SU- + MMDD + - + random 100–999.
- Status inicial:
PENDING sin técnico; ACTIVE con técnico.
Errores:
| Caso | HTTP | UI |
|---|
| TECHNICIAN llama create | 403 | No debería llegar (sin nav) |
| Email técnico inexistente | 404 | Mensaje form |
| Validación | 400 | Mensaje campos |
| Red | — | Error genérico |
AC: FARMER con datos válidos ve la nueva tarea en la lista ordenada por dueAt.
F5 — Detalle y cambio de estado
/app/tasks/:id
→ GET /api/tasks/:id
→ usuario elige nuevo status
→ PATCH /api/tasks/:id/status { status }
→ UI actualiza badge
Permisos get
| Rol | Condición | Si falla |
|---|
| FARMER | task.farmerId === userId | 403 |
| TECHNICIAN | task.technicianId === userId | 403 |
| — | no existe | 404 |
Permisos patch (resumen API)
- Debe ser parte (mismas reglas que get).
- TECHNICIAN: status permitido en subconjunto
ACTIVE | DONE | CANCELLED (no impone PENDING según guard de servicio).
- FARMER: puede actualizar status de sus tareas (incluye cancelar).
Transiciones de diseño (happy)
PENDING ──► ACTIVE ──► DONE
│ │
└───────────┴──► CANCELLED
AC: tras DONE, la lista muestra badge “Hecha” y stats HECHAS incrementa al refrescar.
F6 — Logout
Click Salir → clear token/user → /login
AC: volver a /app/tasks redirige a login.
F7 — Flujos de error transversales
| ID | Escenario | Respuesta |
|---|
| E-401 | Token ausente/expirado en API | 401; cliente → login |
| E-403 | Técnico crea tarea / ve tarea ajena | 403; mensaje o redirect |
| E-404 | id inexistente o técnico email | 404 |
| E-net | API caída | Copy de error; reintento manual (reload) |
| E-empty | 0 tareas | Empty state amable |
Diagrama resumen ( Mermaid )
flowchart TD
H[Home] --> L[Login]
L -->|JWT OK| T[Tasks list]
L -->|401| L
T -->|FARMER| N[New task]
N -->|POST| T
T --> D[Detail]
D -->|PATCH status| D
T -->|logout| L
Matriz flujo × rol
| Flujo | Guest | FARMER | TECHNICIAN |
|---|
| F1 Home | ✓ | ✓ | ✓ |
| F2 Login | ✓ | ✓ | ✓ |
| F3 List | — | ✓ | ✓ |
| F4 Create | — | ✓ | ✗ |
| F5 Status | — | ✓ | ✓ (asignadas) |
| F6 Logout | — | ✓ | ✓ |