# Explotaciones

`Explotaciones` es la ficha operativa de explotación dentro de la carpeta `Clientes y explotaciones`. Comparte la carpeta con Clientes porque ambas pantallas parten de las mismas entidades maestras, pero mantiene una responsabilidad distinta: preparar y seguir el trabajo veterinario sin duplicar la edición fiscal y de contactos. `DataHub` vive en `Salud y datos`, donde conserva el explorador técnico de datos productivos sin dejar de enlazarse por explotación.

## Responsabilidad del módulo

- `Clientes` mantiene nombre fiscal, contactos, dirección y edición de explotaciones.
- `Explotaciones` presenta la situación veterinaria y permite saltar a los flujos de trabajo.
- `DataHub` conserva y permite inspeccionar los registros normalizados de cada proveedor.
- `Calidad lechera`, `SIGE` y `Vetiquín` siguen siendo los módulos que crean y editan sus documentos.

La identidad común es `farm_id + customer_id + REGA`. No se asignan datos a una explotación por semejanza aproximada de nombres.

El alta se realiza desde `Clientes`. El flujo guiado `Nuevo cliente` puede crear
la primera explotación en la misma transacción y la marca como principal con
`customer_farms.is_primary`. Un cliente solo puede tener una explotación
principal activa; si se archiva, el backend promociona la siguiente. El REGA se
normaliza para búsqueda y se rechaza si ya pertenece a otra explotación activa.

## Pantalla

Ruta: `#granjas`.

El directorio lateral mantiene siempre visible la búsqueda por nombre, REGA,
cliente, dirección o zona. `Filtros` abre el popover común de estado para elegir
`Nuevas LIGAL`, `Con avisos`, `Críticas` o `Sin avisos`; el contador indica si
esa condición está activa y `Limpiar` vuelve a `Todas`. Cada cambio filtra la
lista al instante, sin un paso `Aplicar`. Las filas muestran índice de salud,
avisos, fecha de actualización y si `CEGCOL sí/no` está habilitado para
priorizar la jornada.

En iPad Air vertical, el foco `Explotaciones` dedica toda la altura disponible al
directorio antes de abrir la ficha, de modo que la lista no queda reducida por la
composición apilada de tablet. La misma superficie muestra estados explícitos de
carga, error, ausencia de explotaciones y ausencia de coincidencias con los filtros.

La cabecera de la ficha muestra `Pertenece al cliente` como relación principal,
no como un dato secundario. El nombre abre los ajustes del cliente. A su lado se
separan dos acciones: `Abrir ficha del cliente` lleva a `Clientes > Ajustes
cliente` y `Editar explotación` lleva a `Clientes > Explotaciones` con el
mismo `customer_id` y `farm_id` seleccionados. Explotaciones no mantiene un segundo
formulario maestro.

La ficha tiene cinco vistas:

| Vista | Contenido |
|---|---|
| `Resumen` | Avisos, animales, tratamientos, visitas, SIGE, documentos, próximas citas y resumen de salud de ubre CEGCOL. |
| `Calidad` | Pago por calidad LIGAL a fecha de hoy, gráficas filtrables de medias y muestras, producción y carga celular del rebaño, índices de lactación/secado y tabla consolidada por vaca. |
| `Vacas` | Directorio por crotal/DIB con clases S/NI/C/CR/SP/IP/NIP/CS/NCS, CEGCOL, bacteriología/mamitis LIGAL, tratamientos, visitas, cronología y procedencia. |
| `Actividad` | Cronología de visitas, tratamientos, calendario, SIGE y documentos vinculados. |
| `Datos` | Cobertura de LIGAL y CEGCOL, progreso, último intento, próxima sincronización y posibles bloqueos. |

En `Datos > Fuentes y sincronización`, LIGAL y CEGCOL reutilizan las mismas
tarjetas de progreso de la ficha de cliente. Cada una muestra estado, barra de
cuatro hitos, último intento, próxima sincronización y el paso bloqueado o
pendiente. Así una falta de permiso LIGAL o un error CEGCOL queda visible en la
ficha operativa sin confundir `integración activada` con `datos disponibles`.
Cuando una fuente está activa y el usuario tiene permisos, puede ejecutar desde
esta vista `Sincronizar LIGAL` o `Sincronizar CEGCOL`; la petición sigue pasando
por el backend y al terminar se recargan la ficha y sus indicadores.

`Buscar nuevas explotaciones` consulta en ese momento todas las cuentas LIGAL
configuradas. Los REGA que todavía no existen se crean con su cliente y cuenta
LIGAL, respetando la deduplicación habitual. Estas altas aparecen primero en el
directorio con la etiqueta `Nuevo` y mantienen dentro de la ficha el aviso
`Nuevo desde LIGAL`. Un usuario con permisos debe pulsar `Confirmar alta`; hasta
entonces la etiqueta no desaparece. La confirmación queda fechada y auditada.
Si la búsqueda encuentra altas, el directorio activa el filtro `Nuevas LIGAL` y
abre la primera pendiente. Al confirmar una, la ficha avanza a la siguiente;
cuando ya no quedan, recupera automáticamente el directorio completo.

La agenda actual se vincula por `customer_id`, porque `calendar_events` todavía no tiene `farm_id`. La interfaz lo identifica como `Agenda del cliente`; no afirma que todos los eventos pertenezcan de forma exacta a la explotación seleccionada.

## Calidad LIGAL

`Explotaciones` reutiliza `client_farm_overview()` como única lógica de cálculo. El backend entrega todo el histórico LIGAL materializado y agrega `monthlyPoints` por parámetro; el navegador solo filtra fechas y series, sin volver a consultar LIGAL ni recalcular el pago.

El pago por calidad usa la fecha real de hoy como extremo superior:

- recuento celular: media geométrica desde el primer día del mes de hace tres meses hasta hoy;
- bacteriología: media geométrica desde el primer día del mes de hace dos meses hasta hoy;
- grasa, proteína, punto crioscópico, urea y extracto seco magro: media geométrica desde el primer día del mes de hace tres meses hasta hoy.

El punto crioscópico es negativo. Su media conserva el signo y aplica la media geométrica sobre los valores absolutos; una mezcla de signos no produce resultado. Las gráficas usan SVG común y permiten elegir fechas y cualquiera de los ocho parámetros LIGAL. `Gráfica de medias` nace con RCS y bacteriología del último año de datos terminado en la última muestra disponible; `Gráfica de muestras`, con esos dos parámetros de los dos meses terminados en esa misma muestra. Así una fuente temporalmente atrasada sigue mostrando su histórico más reciente sin confundirlo con el cálculo de pago, que sí se cierra en la fecha real de hoy. Cuando se superponen parámetros de unidades distintas, cada serie usa su propia escala y conserva el valor exacto en el tooltip.

## Producción y carga celular

`productionQuality.control` se calcula exclusivamente con las vacas del último control común CEGCOL que tienen producción y RCS:

```text
carga celular individual = kg/día × RCS en miles de células/ml
carga celular total = suma de cargas individuales
RCS estimado del tanque = carga celular total / producción total
aportación individual = carga individual / carga celular total × 100
```

La carga se expresa como millones de células/día aproximados, usando kg de leche como aproximación de litros. No se suman RCS individuales sin ponderarlos por producción.

`productionQuality.realMilk` aplica las mismas fórmulas con la media real de siete días por vaca procedente de registros `source_id='milking_parlor'`. DataHub puede materializarlos desde `Explorador > Importar AFIMILK`: el usuario elige la explotación, analiza el archivo exportado, asigna las columnas de vaca, fecha y kg con el orden de fecha exacto, valida filas y totales y confirma el volcado. Las unidades distintas de kg se rechazan. Las sesiones con hora se suman por vaca y día sin mezclarlas con una fila de total diario; la clave de vaca ignora puntuación y mayúsculas igual que el enlazado CEGCOL, pero no se aproxima por nombre. Si no existe esa fuente o sus registros no se pueden enlazar con las vacas del último control, la API devuelve `available=false` y una explicación. Los valores guardados en informes técnicos que proceden de CEGCOL no se reutilizan como leche real de sala.

La vista ordena además las vacas por carga celular y separa la prioridad del control lechero de la prioridad calculada con leche real. Para cada fuente entrega la líder, las cinco principales, la aportación acumulada y cuántas vacas son necesarias para alcanzar el 50 % y el 80 % de la carga calculable. La sala solo aparece si existen datos individuales enlazados; nunca se sustituye con leche del control.

La tabla individual de `Calidad` incluye nombre, crotal corto/DIB, RCS anteriores desde un mes seleccionable —seis meses por defecto—, último RCS, DEL, producción, aportación celular, rango y acumulado, aislamientos LIGAL posteriores al último parto, fechas reproductivas, estado reproductivo y leche real. Permite buscar por nombre, crotal o DIB; filtrar por `RCS >= 200`, grupo que acumula el 80 %, aislamiento LIGAL o leche real; ordenar por aportación, RCS, producción o nombre; y exportar a CSV exactamente las filas y meses visibles. `Gestante` o `No gestante` solo se muestran si una fuente los declara; una inseminación por sí sola no confirma gestación.

El índice de salud y los avisos son indicadores operativos para orientar la visita. No sustituyen límites contractuales, diagnóstico veterinario ni normativa.

## Vínculos operativos

Desde la cabecera de una explotación se puede:

- abrir los ajustes fiscales y de contacto del cliente propietario;
- editar esa explotación concreta en `Clientes`, sin perder la selección;
- iniciar una visita o informe CMT con cliente, explotación y REGA precargados;
- abrir o preparar el SIGE asociado;
- abrir el DataHub filtrado por la explotación;
- abrir Google Maps con la dirección y el REGA.

Desde `Vacas`, al seleccionar un crotal se carga bajo demanda su ficha individual. El directorio se agrega en SQL sobre todos los registros disponibles y no limita la identificación a una ventana fija de filas. La ficha reúne:

- identidad y estado en el censo CEGCOL;
- último control lechero, control acumulado y lactación en curso;
- RCS, Linear Score y clasificación de salud de ubre entre controles, al parto y durante el periodo seco;
- laboratorio extendido, partos e inseminaciones;
- bacteriología y mamitis LIGAL con fecha, cuarterón, identificación, RCS, N+L, sensibles, resistencias y descarga del PDF;
- tratamientos cuyo crotal esté enlazado exactamente en Vetiquín;
- animales incluidos en visitas técnicas y sus informes vinculados;
- cronología consolidada y procedencia por fuente;
- acceso secundario al explorador de `DataHub` filtrado por ese animal.

La ficha separa dos alcances LIGAL:

- `LIGAL · vaca`: muestras `04` de sanidad animal enlazadas por nombre CEGCOL inequívoco. Las ambiguas o no encontradas aparecen con identidad `LIGAL-NAME-*` y aviso pendiente.
- `LIGAL · alcance explotación`: `Contexto del tanque de la explotación`, que nunca se atribuye a la vaca seleccionada.

## API interna

```http
GET /api/farms?q={texto}
Authorization: Bearer {token}
```

Devuelve el directorio con explotación, cliente, REGA, salud, avisos, fuentes, número de vacas, tratamientos activos, visitas, SIGE y próxima cita del cliente.

```http
GET /api/farms/{farm_id}
Authorization: Bearer {token}
```

Devuelve la ficha agregada:

- `farm` y `overview` desde la vista rápida LIGAL;
- `animals` desde `client_data_records` con `subject_type='animal'`;
- `treatments` desde `medicine_prescriptions` vinculadas por `farm_id`;
- `visits` desde la fuente `technical_visits` del DataHub;
- `events` y `upcomingEvents` por `customer_id`;
- `sige` por `farm_id` y, para históricos sin enlace interno, por REGA o nombre exacto;
- `documents`, `sources`, `activity` y contadores operativos. Los documentos
  reutilizan el payload público saneado: indican si existe adjunto, pero nunca
  publican una ruta interna `/media/customer-documents/*`; la apertura y
  descarga se realizan desde Clientes mediante sus endpoints autenticados.
- `farm.cegcol_enabled` y `cegcolEnabled` en el directorio para distinguir las explotaciones autorizadas para sincronización CEGCOL.
- `udderHealth`, con umbral, cobertura, indicadores, numeradores, denominadores, objetivos y clasificación individual.
- `productionQuality.control`, con producción, carga celular, RCS ponderado y cobertura del último control común.
- `productionQuality.realMilk`, con los mismos cálculos sobre la media de siete días de sala o `available=false` con su causa.
- `productionQuality.priority.control` y `.realMilk`, con líder, vacas necesarias hasta el 50 % y 80 %, ranking completo, acumulado y cinco principales; cada métrica individual conserva también su rango y acumulado.
- `productionQuality.animals`, con histórico RCS, último control, aportaciones, aislamientos posteriores al parto, reproducción y leche real individual.

```http
GET /api/farms/{farm_id}/animals/{identifier}
Authorization: Bearer {token}
```

Devuelve la ficha individual con:

- `animal`: identidad, censo, fuentes y número total de registros;
- `cegcol`: último control, acumulados, lactación, laboratorio y reproducción;
- `udderHealth`: RCS y LS actuales, control previo y clases individuales aplicables;
- `ligal`: muestras e informes de mamitis individual y resumen de patógenos/resistencias;
- `treatments` y `visits` enlazados por identificador exacto;
- `timeline`, `records` y `provenance` para trazabilidad;
- `tankContext` con `scope=farm_tank`, que conserva explícitamente el alcance de explotación de los datos LIGAL.

El PDF se obtiene con `GET /api/integrations/ligal/samples/{code}/download`. El navegador envía el bearer de Animal Charlie; las credenciales y el token LIGAL permanecen en backend.

La respuesta individual se limita a 600 registros normalizados y marca `animal.truncated=true` si existe más histórico. El contador total y el directorio no se truncan.

Permiso: `farms.read`. Los roles `technician` y `reviewer` lo reciben por defecto. La edición de una explotación sigue requiriendo `clients.write` dentro de `Clientes`.

El directorio y las fichas solo admiten explotaciones activas cuyo cliente no
esté archivado. Archivar un cliente retira sus explotaciones de `Explotaciones` y de los
enlaces activos de DataHub, pero no borra el histórico técnico almacenado.

## Estado del control lechero

El check se edita en `Clientes > Explotaciones`. Al activarlo, Animal Charlie sincroniza por REGA el último control, censo activo, lactaciones, inseminaciones, partos, controles acumulados y laboratorio extendido. Una sincronización manual recorre además el histórico de fechas de control necesario para comparar cada vaca con su registro inmediatamente anterior.

En la misma ficha de gestión, `Datos de LIGAL` controla por separado las analíticas de tanque, muestras, informes y sanidad animal. Activarlo exige REGA y sincroniza inmediatamente; desactivarlo conserva los datos ya importados, pero detiene nuevas consultas LIGAL.

Los índices siguen el contrato de `INDICES_SALUD_UBRE.md`: infección con RCS `>=200` en la unidad CEGCOL y NC1 cuando `NumeroControl=1`. NIP, CS y NCS recorren todos los NC1 multíparos del histórico sincronizado, localizan la lactación anterior por número de parto y usan el último control anterior o igual a su `fechaSecado`, sin exigir controles consecutivos. Si falta la lactación finalizada se usa un respaldo anterior al parto y la ficha lo declara. NCS divide las vacas que siguen `>=200` en NC1 entre todas las que estaban `>=200` en ese control presecado. No se inventan valores cuando falta la base.
