Apariencia
Guía de campo de alimentación — referencia de fórmulas
Respaldo de las fórmulas de la guía de campo de alimentación del socio (Excel Guia de campo ab LA.xlsx, hoja "Guia de campo ab."), implementadas en el módulo alimentacion (feeding-curves + feeding-guide). Ver también sabana-calculos.md para las fórmulas de la sábana semanal (biometría, FCR, raleo) — este documento cubre específicamente la guía diaria que sugiere cuánto alimentar y proyecta la cosecha.
Ver ADR-0042 para la decisión de unidades del factor, y ADR-0043 para la planificación de raleo (sección 6).
1. Curvas de alimentación (tabla peso → factor)
La Hoja2 "Factores de Alimentacion" del Excel trae 4 curvas de referencia, sembradas (idempotente) para cada organización nueva:
| Curva | Columna del Excel | Uso |
|---|---|---|
| Teórica Invierno | KG/100 MIL - I | Default (la que usa el Excel hoy) |
| Teórica Verano | KG/100 MIL - V | Alternativa por estación |
| Balao 2024 - Invierno | I- 2024 BALAO | Curva real observada, calibración |
| Balao 2024 - Verano | V- 2024 BALAO | Curva real observada, calibración |
Cada curva tiene un punto por peso de camarón (1–42 g). Son editables por organización (CRUD en /feeding-curves); el seed solo carga los 4 valores iniciales del Excel.
Lookup del factor (VLOOKUP aproximado)
factor(peso) = el punto de mayor `weightG` que NO supere `peso`Réplica exacta del VLOOKUP(peso, tabla, columna, TRUE) del Excel: coincidencia aproximada hacia abajo. Ej.: con la curva Invierno, factor(15.22) = factor(15) = 6.5 (no hay punto entre 15 y 16, se usa el de 15). Por debajo del primer punto → sin factor (igual que el #N/A del Excel, que la celda muestra en blanco). Por encima del último punto → se usa el último factor (comportamiento estándar de un VLOOKUP aproximado).
Implementación: lookupFactor() en feeding-guide.calc.ts.
2. Guía por ciclo (una fila por piscina)
Entradas resueltas por ciclo antes de calcular:
| Entrada | De dónde sale |
|---|---|
hectares | Pool.hectares |
peso | peso del último Muestreo del ciclo (g) |
cM2 | override manual (Cycle.populationOverride), o derivado del último Population: sobrevivencia% × sembrados ÷ (ha × 10000) |
kgReales | kg del último Feeding (registro diario) del ciclo |
factor | lookupFactor(curva del ciclo o default de la org, peso) |
Fórmulas (semántica del Excel — ver ADR-0042)
| Derivado | Fórmula | Significado |
|---|---|---|
| Kg sugeridos | cM2 × ha × factor | ración diaria que "debería" darse |
| Desviación | kgSugeridos − kgReales | > 0 = alimentar más; < 0 = se está dando de más |
| C/m² a cosecha | kgReales ÷ ha ÷ factor | densidad implícita por el consumo real (censo por consumo) |
| Libras a cosecha | cM2Cosecha × ha × 10000 × peso ÷ 454 | proyección de biomasa a cosechar |
| # de bines | librasCosecha ÷ 1100 | 1 bin = 1100 lb |
| Rendimiento/saco | librasCosecha ÷ (kgReales ÷ 25) | lb cosechadas por saco de 25 kg de balanceado |
| % de rendimiento | (librasCosecha ÷ 100) ÷ kgReales | fracción |
| Lb/ha actuales | librasCosecha ÷ ha |
Constantes: 454 g/lb, 1100 lb/bin, 25 kg/saco, 10 000 m²/ha (mismas que sabana-calculos.md).
Precisión: los intermedios se encadenan en precisión completa (como las celdas del Excel, que guardan el double y solo redondean al mostrar); redondear un intermedio y reusarlo propaga error de forma silenciosa — el redondeo se aplica una sola vez, al construir cada campo de salida. Implementación: computeGuide() en feeding-guide.calc.ts.
Entradas faltantes → null (igual que las celdas en blanco del Excel): sin muestreo, sin población/override, o sin registro de alimentación, el/los derivados que dependen de ese dato quedan null en vez de propagar un error.
Ejemplo verificado (piscina 1 del Excel, fila 3)
Entradas: ha 12.09 · c/m² 24.2 · peso 15.22 g · kg reales 1700 · curva Invierno (factor(15) = 6.5).
| Derivado | Cálculo | Resultado |
|---|---|---|
| Kg sugeridos | 24.2 × 12.09 × 6.5 | 1901.757 |
| Desviación | 1901.757 − 1700 | 201.757 |
| C/m² a cosecha | 1700 / 12.09 / 6.5 | 21.6326 |
| Libras a cosecha | 21.6326 × 12.09 × 10000 × 15.22 / 454 | 87678.75 |
| # de bines | 87678.75 / 1100 | 79.71 |
| Rendimiento/saco | 87678.75 / (1700/25) | 1289.39 |
| % de rendimiento | (87678.75/100) / 1700 | 0.5158 |
| Lb/ha actuales | 87678.75 / 12.09 | 7252.17 |
Cubierto por el test de regresión feeding-guide.calc.spec.ts (unit, celda por celda) y feeding-guide.e2e-spec.ts (flujo completo vía API).
3. Densidad c/m² derivada del muestreo
cM2 = (sobrevivencia% ÷ 100 × cantidad_sembrada) ÷ (hectareas × 10000)Misma lógica de "animales vivos" que la biomasa de la sábana (sabana-calculos.md §3), expresada como densidad por m² en vez de biomasa en libras. Implementación: deriveCM2().
4. Curva y override por ciclo
Cada Cycle puede fijar:
feedingCurveId— qué curva de la org usa esta piscina (null = la marcadaisDefaultde la organización).populationOverride— c/m² manual, cuando el técnico tiene mejor dato que el muestreo (null = usar el derivado del últimoPopulation).
Ambos se ajustan vía PATCH /cycles/:cycleId/feeding-guide.
5. Raleo planificado — proyecciones del plan
Ver 07-raleos-flow.md para el modelo completo (Harvest.status). Fórmulas del plan (columnas M–R del Excel):
| Métrica | Fórmula | Significado |
|---|---|---|
| Total de raleo (lb) | bines × 1100 | libras proyectadas a sacar |
| Lb de raleo/ha | totalRaleo ÷ ha | |
| C/m² de raleo | (lbRaleoHa × 454 ÷ gramajeObjetivo) ÷ 10000 | densidad que representa el raleo |
Entradas: bins (# de bines a sacar) y targetWeightG (gramaje objetivo), cargados al planificar. Un plan sin bins no proyecta (todo null). Implementación: planProjection() en raleos.service.ts.