# Freidoras

> Las freidoras y sus controles de calidad del aceite: dos colecciones y por qué el valor medido puede faltar mientras que la decisión nunca falta.

Source: https://developers.backresto.com/es/docs/fryers

El aceite de fritura se degrada con el uso y, pasado cierto punto, hay que
filtrarlo o tirarlo. El restaurante lo analiza, decide qué hacer y registra las
dos cosas. Dos colecciones: las freidoras y los controles que se hacen sobre
ellas.

| Colección | Scope | Qué es un registro |
| --- | --- | --- |
| `fryer-equipment` | `fryer-equipment:read` | Una freidora. |
| `fryer-checks` | `fryer-checks:read` | Un control de la calidad del aceite en una de ellas, y qué se decidió. |

Las dos comparten el [sobre de snapshot](https://developers.backresto.com/es/docs/collections): `id`, `deleted`,
`capturedAt`, `receivedAt`, `sequence` y los demás campos acompañan al `data`
que se describe más abajo.

## `fryer-equipment`

Las freidoras en sí, tal como las lista el restaurante. Un registro corto: un
nombre, una posición en la lista y dónde está.

| Campo | Tipo | Significado |
| --- | --- | --- |
| `index` | integer, **obligatorio** | La posición de la freidora en la lista, según la ordena la aplicación. |
| `name` | string, **obligatorio** | Cómo la llama el restaurante. |
| `areaId` | string \| null | La [zona](https://developers.backresto.com/es/docs/facilities) en que está. `null` en un restaurante que no se divide en zonas. |
| `isDeleted` | boolean, **obligatorio** | El soft delete propio de la aplicación. Lea la nota de abajo. |

```json
{
  "id": "6b1d0f54-8e27-4c93-a7b0-52fd3e1c9a86",
  "collection": "fryer-equipment",
  "deleted": false,
  "capturedAt": "1789598411206",
  "receivedAt": "1789598603471",
  "sequence": "1",
  "data": {
    "index": 1,
    "name": "Friteuse gauche",
    "areaId": "7d2c0b61-4e8a-49f3-9c27-5a1b8e60d3f4",
    "isDeleted": false
  }
}
```

**Aquí no hay umbrales.** A diferencia de los [equipos](https://developers.backresto.com/es/docs/facilities), una
freidora no lleva `min` ni `max`: nada en el registro dice qué es una buena
lectura de aceite. Si un control fue aceptable es un juicio del restaurante, y
el único rastro que queda es la acción que tomó.

**`isDeleted` no es el `deleted` del sobre.** Una freidora que el restaurante
quitó vuelve con `isDeleted: true` y `deleted: false`: sigue siendo un registro
vivo, que describe una freidora que ya no está en servicio. Filtre por los dos y
conserve las retiradas: los controles antiguos siguen apuntando a ellas.

## `fryer-checks`

Un control sobre una freidora: qué mostró la prueba y qué se hizo al respecto.

| Campo | Tipo | Significado |
| --- | --- | --- |
| `timestamp` | string, **obligatorio** | Cuándo se hizo el control, en milisegundos desde la época Unix como cadena. |
| `testValue` | string \| null | Qué mostró la prueba, como texto. `null` cuando no se midió nada. |
| `action` | string, **obligatorio** | Qué se decidió sobre el aceite: filtrarlo, cambiarlo, dejarlo como está. |
| `fryerEquipmentId` | string, **obligatorio** | La freidora que se controló. |
| `userId` | string \| null | El [miembro del personal](https://developers.backresto.com/es/docs/facilities) que hizo el control, cuando la aplicación registró uno. |

```json
{
  "id": "e07a5c92-4f61-48b8-9d3a-b18c60e5427f",
  "collection": "fryer-checks",
  "deleted": false,
  "capturedAt": "1789777348215",
  "receivedAt": "1789777510964",
  "sequence": "2",
  "data": {
    "timestamp": "1789777200000",
    "testValue": "18",
    "action": "Filtration de l'huile",
    "fryerEquipmentId": "6b1d0f54-8e27-4c93-a7b0-52fd3e1c9a86",
    "userId": "2774953d-8d9b-4a68-8ec4-1209edd90777"
  }
}
```

**`testValue` es una cadena, no un número.** Es lo que mostró la tira o la
sonda, registrado como texto, y el registro no lleva unidad ni escala: un
restaurante que usa tiras reactivas y otro que usa un medidor de compuestos
polares acaban los dos aquí. Consérvelo como texto. Convertirlo a coma flotante
entre restaurantes le da una columna cuyos valores no se pueden comparar.

**`action` es texto libre** en el idioma del restaurante. El esquema no lo
restringe, así que lea el valor en lugar de compararlo con una lista suya, y no
construya un enum a partir de lo que vea en los datos de un solo restaurante.

## Qué significa un control sin valor

`testValue` admite `null` y `action` es obligatorio, y esa asimetría es lo que
hay que tener en cuenta al diseñar. Un control puede registrarse como una acción
tomada sin ningún valor medido detrás: alguien cambió el aceite porque tenía mal
aspecto, porque era final de semana, porque de todas formas se estaba limpiando
la freidora.

Así que un control no es una medición. Es una decisión, a veces con una medición
adjunta. Si está construyendo una tabla de lecturas de aceite a lo largo del
tiempo, cuente con una buena proporción de filas sin nada en la columna del
valor, y cuéntelas en lugar de descartarlas: una acción sin valor sigue siendo
un control que ocurrió.

## Trabajar con estas colecciones

**Cruce por `fryerEquipmentId`.** Un control nombra su freidora y nada más; el
nombre de la freidora está en `fryer-equipment`, que se recorre aparte. Dos
recorridos, unidos por su parte.

**Informe sobre `capturedAt`, sincronice por `receivedAt`.** Una tableta sube los
datos cuando encuentra cobertura, así que un control hecho a las 09:00 puede
llegar a las 14:00. [La página del sobre](https://developers.backresto.com/es/docs/collections) cuenta la historia completa.

**La ausencia no prueba nada.** Una freidora sin ningún control esta semana
puede que no se haya controlado, o puede estar en un dispositivo que no ha
subido nada. No convierta un recuento de estos en una cifra de cumplimiento:
consulte [la nota sobre exhaustividad](https://developers.backresto.com/es/docs/support).
