Apariencia
0043. Raleos: extender Harvest con estado planificado/ejecutado (no un modelo aparte)
Estado
Aceptada
Contexto
La guía de campo del socio incluye una sección de planificación de raleo (gramaje objetivo, # de bines, fecha tentativa → proyecta lb/ha, total y c/m² de raleo) que hoy no existía en raleos: el módulo solo registraba la pesca ya realizada (pounds, avgWeightG requeridos).
Se evaluaron 3 opciones para modelar el plan (ver _planning/alimentacion-teorica-plan.md):
- Extender
Harvestcon un estado (planificado | ejecutado). - Guardar el plan como campos sueltos del ciclo, sin tocar
raleos(una calculadora persistida, sin vínculo con el harvest real). - Una calculadora en vivo, sin persistir nada.
Se eligió la opción 1 pese a ser la más cara (migración de un módulo ya implementado y testeado en 3 repos), porque da un solo historial: el mismo registro nace planificado y se completa al pescar, permitiendo comparar plan vs. real sin un segundo sistema de IDs. Las opciones 2 y 3 hubieran duplicado el concepto de "un raleo" en dos lugares.
Decisión
Harvestganastatus(planificado | ejecutado, defaultejecutado) y campos de plan (targetWeightG,bins);pounds/avgWeightGpasan a nullable (obligatorios solo cuandostatus = ejecutado).- Un plan no cuenta en
summary.totalRaleoLbni en los derivados de sobrevivencia (harvestedCount/survivalPctquedannull); tampoco cierra el ciclo si escosecha_final. Ejecutar (PATCHconpounds+avgWeightG,status → ejecutado) sí hace ambas cosas. - Un
ejecutadono puede volver aplanificado(ya es un registro real; retroceder perdería el dato de la pesca). - Migración de datos: como es un cambio de nullability sobre un módulo con datos reales potenciales, el default
ejecutadopara filas existentes preserva el comportamiento actual sin backfill manual.
Consecuencias
- El módulo
raleospasa a ser también el lugar donde se planifica un raleo, no solo donde se registra. La UI (admin/mobile) gana un flujo "Planificar" (crear constatus=planificado) y "Ejecutar" (completar libras/peso reales sobre un plan existente), separado de "Editar" (que solo toca fecha/notas/campos de plan). - La suite e2e existente de
raleos(creada antes de esta tarea) sirvió de red de regresión: pasó sin cambios de expectativas tras la migración, confirmando que el defaultejecutadoes retrocompatible. - Reporte "plan vs. real" (comparar lo planificado contra lo ejecutado del mismo registro) queda fuera de esta tarea — es la evolución natural ahora que ambos viven en la misma fila; ver backlog.
Referencias
- Tarea
alimentacion-teorica(2026-07-16). camaroneras_backend/src/modules/raleos/raleos.service.ts.camaroneras_docs/modulos/07-raleos-flow.md.- ADR-0005 — orden de implementación por módulo, seguido también para esta extensión.
- ADR-0033 — decisión previa de unificar raleo y cosecha_final en una sola entidad
Harvestcontype; esta ADR le suma el eje ortogonalstatus(planificado/ejecutado) sobre esa misma entidad.