Apariencia
Flujo Prioridades
Base URL: /api/v1. Backend: camaroneras_backend (mismo módulo reportes, controller ReportesController) ✅. Admin: camaroneras_admin (feature prioridades) ✅. Mobile: no aplica (igual que el reporte semanal y el dashboard de producción). Undécimo módulo; cierra la hoja Prioridades del Excel v4 (Winston Loaiza) — el ranking operativo de lagunas por índice de salud, consumiendo el motor de scoring de 10 · Parámetros KPI.
Bodies de request: no aplica — este endpoint no recibe body, solo
date?en query. Responses 2xx: el shape de la respuesta exitosa está en la API Reference, generada desde el spec OpenAPI. Acá quedan solo las respuestas de error (4xx/5xx) y las reglas de negocio/flujo de cliente.
📐 Cómo se calculan el índice de salud, la prioridad y la recomendación que ordenan y llenan esta tabla: WL Aqua Intelligence v4 — fórmulas de scoring y KPIs.
Ver ADR-0059 por el detalle de por qué
Prioridadeses página + endpoint propios, en vez de una sección del dashboard de producción o una vista sobre/reports/dashboard.
Modelo
No agrega tablas propias ni un query nuevo: reutiliza el mismo fetch Prisma y el mismo buildRow por piscina que getWeekly/getDashboard (ver 09 · Dashboard de producción), aplanado a una fila por piscina y ordenado por índice de salud ascendente (peor primero). Sin series ni la agregación de sectores/kpis que esa vista sí trae — Prioridades es una lista, no un panorama.
Solo entran piscinas con ciclo: una piscina vacía evalúa sus 5 criterios en sin_dato y siempre da índice 100 (ver 10 · Parámetros KPI) — no aporta al ranking operativo y se excluye, igual que en los kpis agregados del dashboard.
RBAC
- Mismo permiso que el dashboard de producción: módulo
dashboard, acciónver(dashboard:ver). No es un módulo nuevo — es la misma superficie ejecutiva, no la sábana dereportes.
Endpoints (protegidos: AccessJwtGuard + PermissionGuard; tenant del JWT)
GET /reports/priorities — (dashboard:ver)
Ranking de piscinas por índice de salud ascendente, a una fecha de corte.
Query: date? (ISO 8601; default hoy).
json
// response 400 (fecha de corte inválida)
{ "error": "...", "message": "Fecha de corte inválida", "statusCode": 400 }Flujo admin (camaroneras_admin, feature prioridades)
- Ruta:
/prioridades— protegida (ProtectedRoute module="dashboard" action="ver"), mismo permiso y mismo ítem de nav "Operación" que/produccion. - Selector de fecha de corte (default hoy) recalcula el ranking (
['reports','priorities',date]), igual que en/producciony/reportes. - Tabla: sector, piscina, peso actual, los 5 semáforos por criterio (
EstadoBadge), índice de salud, prioridad (PrioridadBadge) y recomendación — mismos componentes compartidos que usa la tabla de/reportes(shared/components/KpiBadges.tsx, ver ADR-0059). - Sin filtros propios: a diferencia de
/produccion, esta vista no tiene año/sector/piscina — es el ranking completo, pensado para consultarse entero. - Estados límite:
- Cargando: mensaje centrado, igual que el resto de las páginas de reportes.
- Vacío (sin piscinas con ciclo en el corte): mensaje explícito, distinto del de carga/error.
- Error (fecha inválida, red, sesión): mensaje con el detalle del backend (
getErrorMessage), sin reintento automático — el usuario ajusta la fecha o recarga.
Backlog / a futuro
- Export de la vista (xlsx/csv/PDF) — no implementado, igual que en
/reportesy/produccion. - Mobile: fuera de alcance.