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.phpBackend
api/helpers/valor_cierre_transferencias.phpHelper

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

CampoFó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 GlobalMedia del lote (real + estimado)
GMD RealSolo animales con 2+ pesadas
ICkg pienso / kg engordados
Kg EngordadosTotal (vivos + salidas)
Animales Cálculovivos + salidas + bajas
Mortalidad %bajas / entradas × 100

Tipos de Movimiento

TipoValorCierreCosteFinanciero
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.phpBackend (preview + ejecutar)
api/helpers/lote_metricas.phpSSOT: getLoteMetricas
api/helpers/periodos_movimientos.phpcalcularCosteTotalAcumuladoAnimal
api/helpers/calculos_gmd.phpCTE 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 1Herramienta 2Herramienta 3
Fuente ValorCierrePrecio venta (ingresos)Coste acumulado (gastos)Coste acumulado (gastos)
CosteFinancieroNoNo
Métricas SSOTNoNo
Pre-validaciónNoNo
FiltrosNingunoLote + fechaLote
Cuándo usarPrecios corregidosGastos retroactivosRecá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.