Manual de Herramientas Administrativas
Documentación completa de todas las herramientas de recálculo del sistema HerdData ARROYOS.
1 Recalcular Movimientos entre Lotes
Propósito
Corrige el ValorCierre de todas las transferencias entre lotes, usando el precio de venta registrado en tabla_ingresos.
Cuándo usarla
- Cuando se hayan corregido precios de venta en ingresos de forma retroactiva
- Cuando se detecten inconsistencias entre el ValorCierre de un traslado y el precio real de venta
- Después de importar correcciones masivas de facturación
Flujo de Ejecución
1. BACKUP AUTOMÁTICO
→ Crea tabla: tabla_movimientos_backup_YYYYMMDD_HHMMSS
→ Copia COMPLETA de tabla_movimientos
→ Registra en tabla_movimientos_backups
2. BUSCAR LOTES DESTINO DE TRASLADOS
→ SELECT DISTINCT lotes que tengan movimientos
WHERE IdLoteDestino = lote
AND TipoMovimiento IN ('Traslado','LOTE','GRANJA')
3. POR CADA LOTE → BUSCAR MOVIMIENTOS ENTRANTES
→ SELECT movimientos WHERE IdLoteDestino = lote
4. POR CADA MOVIMIENTO → RECALCULAR ValorCierre
→ Busca en tabla_ingresos el último Importe del animal
en el lote ORIGEN con fecha <= movimiento
→ Si no hay ingreso o es 0 → SKIP
→ Si diferencia <= 0.01€ → SKIP
→ Si diferencia > 0.01€ → UPDATE ValorCierre
5. RESULTADO → Lotes procesados, movimientos actualizados, diferencia total
Fórmula
ValorCierre = tabla_ingresos.Importe (último ingreso del animal en el lote origen, con fecha ≤ fecha del movimiento)
Tipos de Movimiento
| Traslado | ✅ Sí |
| LOTE / GRANJA | ✅ Sí |
| Matadero / Venta | ❌ No |
| CORRAL / BAJA | ❌ No |
Archivos
api/herramientas/recalcular_movimientos.php | Backend |
api/helpers/valor_cierre_transferencias.php | Helper |
2 Recalcular Lotes Específicos
Propósito
Recalcula el ValorCierre de los movimientos de salida de lotes seleccionados, usando el coste acumulado real del animal (gastos durante su estancia en cada lote).
Cuándo usarla
- Cuando se hayan imputado gastos con fecha retroactiva (facturas que llegan tarde)
- Cuando se hayan corregido gastos de lotes ya cerrados
Flujo de Ejecución
1. SELECCIÓN → Multi-select de lotes + rango de fechas (opcional)
2. BACKUP → Igual que Herramienta 1
3. POR CADA LOTE → Buscar movimientos de SALIDA (IdLoteOrigen = lote)
→ Incluye: Traslado, LOTE, GRANJA, Matadero, Venta
4. POR CADA MOVIMIENTO → calcularCosteTotalAcumuladoAnimal():
a) Obtiene todos los movimientos del animal
b) Construye segmentos de estancia por lote
c) Para cada segmento: busca gastos en ese lote/periodo
d) Reparte gastos entre animales vivos del lote en la fecha del gasto
e) Suma todos los segmentos = coste total acumulado
5. RESULTADO → Lotes procesados, animales actualizados, diferencia total
Fórmula
ValorCierre = Σ coste_segmento (para cada lote por el que pasó el animal)
coste_segmento = Σ (importe_gasto / num_animales)
num_animales = animales vivos en el lote en la fecha del gasto (o animales de la importación si el gasto tiene IdImportacion)
Distribución de Gastos
Gasto CON IdImportacion: Se reparte SOLO entre animales de ESA importación → importe / NumeroAnimales
Gasto SIN IdImportacion: Se reparte entre TODOS los animales vivos del lote en la fecha exacta → importe / animales_vivos_en_fecha
Tipos de Movimiento
| Traslado / LOTE / GRANJA | ✅ Sí |
| Matadero / Venta | ✅ Sí |
| CORRAL / BAJA | ❌ No |
Línea Temporal
Animal 1234:
Lote A [──entrada──gasto1──gasto2──salida──]
Lote B [──entrada──gasto3──salida──]
Lote C [──entrada──..vive aquí..──]
ValorCierre = coste(Lote A) + coste(Lote B) + coste(Lote C)
coste(Lote A) = gasto1/animales_vivos_fecha1 + gasto2/animales_vivos_fecha2
coste(Lote B) = gasto3/animales_vivos_fecha3
coste(Lote C) = 0 (sin gastos aún)
3 Recálculo Integral de Lotes
NUEVA — Incluye pre-validación antes de ejecutar.
Propósito
Recalcula ValorCierre, CosteFinanciero y muestra las métricas SSOT completas (GMD, IC, kg engordados, mortalidad) siguiendo la línea temporal real de cada animal.
Cómo funciona: Pre-validación
Antes de modificar NINGÚN dato, la herramienta muestra una tabla comparativa con valor actual vs valor nuevo. Solo después de revisar se habilita el botón "Ejecutar".
Flujo
PASO 1: SELECCIÓN
→ Seleccionar lotes (multi-select)
→ Click "Pre-validar (Ver cambios)"
PASO 2: PRE-VALIDACIÓN (sin tocar datos)
→ Para cada lote seleccionado:
a) getLoteMetricas() → GMD, IC, kg engordados, mortalidad
b) Buscar movimientos de salida (todos los tipos)
c) Recalcular ValorCierre = coste acumulado real
d) Recalcular CosteFinanciero = kg_engordados × interes
e) Comparar actual vs nuevo → mostrar tabla
→ Si hay cambios → se habilita "Ejecutar Recálculo"
PASO 3: EJECUCIÓN (con backup previo)
→ Confirmación del usuario
→ Backup automático de tabla_movimientos
→ UPDATE de ValorCierre y CosteFinanciero
→ Mostrar resultado con backup_id
Qué Recalcula
| Campo | Fórmula |
| ValorCierre | Σ coste_segmento para cada lote por el que pasó el animal (gastos repartidos proporcionalmente) |
| CosteFinanciero | (PesoSalida − PesoEntrada) × interés_granja |
Métricas SSOT (solo lectura)
Se muestran las métricas calculadas por getLoteMetricas() — la función SSOT del sistema:
| GMD Global | Media del lote (real + estimado) |
| GMD Real | Solo animales con 2+ pesadas |
| IC | kg pienso / kg engordados |
| Kg Engordados | Total (vivos + salidas) |
| Animales Cálculo | vivos + salidas + bajas |
| Mortalidad % | bajas / entradas × 100 |
Tipos de Movimiento
| Tipo | ValorCierre | CosteFinanciero |
| Traslado / LOTE / GRANJA | ✅ | ✅ |
| Matadero / Venta | ✅ | ✅ |
| CORRAL / BAJA | ❌ | ❌ |
Línea Temporal
Animal #1234 sale del Lote A con destino Matadero:
Lote X [──entrada──gasto1──gasto2──salida(traslado)──]
Lote A [──entrada(traslado)──gasto3──gasto4──salida──]
ValorCierre = coste(Lote X) + coste(Lote A)
coste(Lote X) = gasto1/animales_vivos + gasto2/animales
coste(Lote A) = gasto3/animales_vivos + gasto4/animales
CosteFinanciero = (PesoSalida - PesoEntradaLoteA) × interes_granja_LoteA
Archivos
api/herramientas/recalcular_integral.php | Backend (preview + ejecutar) |
api/helpers/lote_metricas.php | SSOT: getLoteMetricas |
api/helpers/periodos_movimientos.php | calcularCosteTotalAcumuladoAnimal |
api/helpers/calculos_gmd.php | CTE GMD por animal |
Reglas de Negocio
Regla 1: Backup Obligatorio
Todas las herramientas crean un backup automático de tabla_movimientos ANTES de cualquier modificación. El backup se registra en tabla_movimientos_backups.
Regla 2: Umbral de Cambio
Solo se actualizan registros donde la diferencia supera 0.01€. Esto evita updates innecesarios por redondeos.
Regla 3: Sobrescritura
Los cambios son UPDATE directo. No se crean registros nuevos. El backup previo es la única forma de revertir.
Regla 4: Distribución de Gastos
Gasto de importación: Se reparte entre animales de ESA importación.
Gasto general (pienso, vet, etc.): Se reparte entre TODOS los animales vivos del lote en la fecha del gasto.
Regla 5: CosteFinanciero
CosteFinanciero = max(0, PesoSalida - PesoEntrada) × interés_granja
Solo lo recalcula la Herramienta 3 (Integral). Las Herramientas 1 y 2 solo tocan ValorCierre.
Diagrama de Flujo de Datos
TABLA MOVIMIENTOS
(ValorCierre + CosteFinanciero)
│
┌─────────────────┼─────────────────┐
│ │ │
┌────────▼────────┐ │ ┌──────────▼──────────┐
│ HERRAMIENTA 1 │ │ │ HERRAMIENTA 2 │
│ "Movimientos" │ │ │ "Lotes" │
│ │ │ │ │
│ Fuente: │ │ │ Fuente: │
│ tabla_ingresos │ │ │ gastos repartidos │
│ (precio venta) │ │ │ (coste acumulado) │
└─────────────────┘ │ └─────────────────────┘
│
┌──────────▼──────────────────────────────┐
│ HERRAMIENTA 3 "Recálculo Integral" │
│ │
│ Fuente: gastos + peso + interes │
│ Campos: ValorCierre + CosteFinanciero │
│ Extra: Métricas SSOT (GMD, IC, etc.) │
│ Pre-validación antes de ejecutar │
└──────────────────────────────────────────┘
| Herramienta 1 | Herramienta 2 | Herramienta 3 |
| Fuente ValorCierre | Precio venta (ingresos) | Coste acumulado (gastos) | Coste acumulado (gastos) |
| CosteFinanciero | No | No | Sí |
| Métricas SSOT | No | No | Sí |
| Pre-validación | No | No | Sí |
| Filtros | Ninguno | Lote + fecha | Lote |
| Cuándo usar | Precios corregidos | Gastos retroactivos | Recálculo completo |
Problemas Conocidos
🟡 Sin transacción envolvente: Si el proceso falla a la mitad, algunos registros quedan actualizados y otros no. El backup es la única forma de revertir manualmente.
🟡 Herramientas 1 y 2 se "pisan": La Herramienta 1 pone ValorCierre = precio de venta. La Herramienta 2 pone ValorCierre = coste acumulado. Si se ejecuta la 2 después de la 1, sobrescribe los valores.
🟡 Tipos LOTE/GRANJA no tratados en segmentos: calcularCosteTotalAcumuladoAnimal() solo cierra segmentos con tipo Traslado. Actualmente todos los movimientos son Traslado, pero si se usan LOTE/GRANJA en el futuro, los segmentos se calcularían mal.