SURCO · 04-user-flows.md · 6 de 22

En esta página Convenciones 0%

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)
PasoAcciónSistema
1Lee valor y pasos 01–03Render estático
2Click CTARouter → /login
3Opcional: lee credenciales demo en footerCopy

É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
CampoValidación cliente (mín.)API
emailrequired, email@IsEmail()
passwordrequired, min 6@MinLength(6)

Éxito: token guardado; user con role FARMER o TECHNICIAN.
Errores:

CasoComportamiento
Credenciales inválidas401 + mensaje “No se pudo entrar…”
Red caídaError de red en UI
Ya autenticado visita /loginPuede 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
RolFiltro servidor
FARMERfarmerId = userId
TECHNICIANtechnicianId = userId

Orden: dueAt ASC.
Include: farmer, technician, parcel.

Variantes de UI

Estado datosUI
loading(implícito hasta next)
items.length = 0Empty L-0 + CTA crear si FARMER
error HTTPMensaje rojo M-0
OKLista + stats TOTAL / ABIERTAS / ACTIVAS / HECHAS

AC:

  1. Sin token → redirect /login.
  2. Técnico no ve botón “+ Tarea”.
  3. 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

CampoObligatorioNotas
titlemin 3
parcelNamemin 2; upsert parcela del farmer
cropNodefault “Cultivo” si parcela nueva
dueAtISO date string
notesNodefault ""
technicianEmailNosi válido TECHNICIAN → status ACTIVE

Lógica de negocio

  1. Buscar parcela del farmer por name; si no existe, crear con hectares: 1 y crop dado.
  2. Si technicianEmail: buscar user role TECHNICIAN; si no, 404 “Técnico no encontrado”.
  3. Generar code = SU- + MMDD + - + random 100–999.
  4. Status inicial: PENDING sin técnico; ACTIVE con técnico.

Errores:

CasoHTTPUI
TECHNICIAN llama create403No debería llegar (sin nav)
Email técnico inexistente404Mensaje form
Validación400Mensaje campos
RedError 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

RolCondiciónSi falla
FARMERtask.farmerId === userId403
TECHNICIANtask.technicianId === userId403
no existe404

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

IDEscenarioRespuesta
E-401Token ausente/expirado en API401; cliente → login
E-403Técnico crea tarea / ve tarea ajena403; mensaje o redirect
E-404id inexistente o técnico email404
E-netAPI caídaCopy de error; reintento manual (reload)
E-empty0 tareasEmpty 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

FlujoGuestFARMERTECHNICIAN
F1 Home
F2 Login
F3 List
F4 Create
F5 Status✓ (asignadas)
F6 Logout