Apariencia
Flujo Muestreos — Biometría y sobrevivencia
Base URL: /api/v1. Backend: camaroneras_backend (módulo muestreos). Admin/mobile: pendientes (tareas muestreos-admin, muestreos-mobile). Tercer módulo de negocio; depende de ciclos. Fórmulas reales de los derivados en referencia/sabana-calculos.md.
Requests y responses 2xx: bodies (tipos, opcionales, enums) y el shape de las respuestas exitosas están en la API Reference, generada desde el spec OpenAPI. Acá quedan solo las respuestas de error (4xx/5xx) y las reglas de negocio/flujo.
Modelo
Cycle ──< Sampling (muestreo de biometría: peso promedio; frecuente)
──< Population (evaluación de sobrevivencia %; por aguaje)- Sampling:
date,avgWeightG(g),notes. Los derivados se calculan en el service. - Population:
date,survivalPct(0–100),notes. - Mismo módulo RBAC (
muestreos) para ambas entidades.
Derivados (calculados por muestreo; ver sabana-calculos.md)
incremento= peso − peso del muestreo previo (null en el primero).crecimientoPorDia= peso ÷ días de engorde.crecDesdeInicioSemanal= (peso − peso inicial de siembra) ÷ (días/7).promIncremento= promedio de incrementos de los muestreos en la ventana de 4 semanas.diasEngorde= fecha del muestreo − fecha de siembra del ciclo.- biomasa/lb-ha — solo si hay una Población del mismo día que el muestreo (si no,
null):biomasaLb= peso × (survivalPct/100 × cantidad sembrada) ÷ 454.lbHa= biomasaLb ÷ hectáreas de la piscina (sin raleo por ahora).
RBAC
- Módulo
muestreosen el catálogo, clients["web","mobile"]. - Defaults: Administrador todo; Técnico
ver/crear/editar; Bodeguerover. - Backfill automático a roles por defecto existentes al arrancar.
Endpoints (protegidos: AccessJwtGuard + PermissionGuard; tenant del JWT)
Muestreos
GET /cycles/:cycleId/samplings — (muestreos:ver)
Lista los muestreos del ciclo con sus derivados (ordenados por fecha).
Nota: survivalPct, biomasaLb y lbHa son null si no hay una población del mismo día.
POST /cycles/:cycleId/samplings — (muestreos:crear)
Registra un muestreo de biometría. Devuelve la lista completa con derivados recalculados.
json
// response 404 (ciclo no existe / de otra org)
{ "error": "...", "message": "Ciclo no encontrado", "statusCode": 404 }PATCH /samplings/:id — (muestreos:editar)
Edita un muestreo (campos parciales).
DELETE /samplings/:id — (muestreos:eliminar)
Poblaciones (sobrevivencia por aguaje)
GET /cycles/:cycleId/populations — (muestreos:ver)
Lista las evaluaciones de sobrevivencia del ciclo (ordenadas por fecha desc).
POST /cycles/:cycleId/populations — (muestreos:crear)
Registra una evaluación de sobrevivencia (por aguaje). Alimenta la biomasa de los muestreos del mismo día.
json
// response 400 (survivalPct fuera de 0–100)
{ "error": "...", "message": "survivalPct must not be greater than 100", "statusCode": 400 }