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.
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 | Permiso | 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 instantánea: 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 en que está. null en un restaurante que no se divide en zonas. |
isDeleted | boolean, obligatorio | El borrado lógico propio de la aplicación. Lea la nota de abajo. |
{
"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, 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 que hizo el control, cuando la aplicación registró uno. |
{
"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.
Ordene por capturedAt, no 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 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.