# Friteuses

> Les friteuses et leurs contrôles de la qualité de l'huile : deux collections, et pourquoi la valeur mesurée peut manquer alors que la décision, jamais.

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

L'huile de friture se dégrade à l'usage, et passé un certain point elle doit
être filtrée ou jetée. Le restaurant la teste, décide quoi faire, et enregistre
les deux. Deux collections : les friteuses, et les contrôles effectués dessus.

| Collection | Scope | Ce qu'est un enregistrement |
| --- | --- | --- |
| `fryer-equipment` | `fryer-equipment:read` | Une friteuse. |
| `fryer-checks` | `fryer-checks:read` | Un contrôle de la qualité de l'huile sur l'une d'elles, et ce qui a été décidé. |

Les deux partagent l'[enveloppe de snapshot](https://developers.backresto.com/fr/docs/collections) : `id`,
`deleted`, `capturedAt`, `receivedAt`, `sequence` et le reste entourent le
`data` décrit ci-dessous.

## `fryer-equipment`

Les friteuses elles-mêmes, telles que le restaurant les liste. Un
enregistrement court : un nom, une position dans la liste, et l'endroit où elle
se trouve.

| Champ | Type | Signification |
| --- | --- | --- |
| `index` | integer, **obligatoire** | La position de la friteuse dans la liste, telle que l'application l'ordonne. |
| `name` | string, **obligatoire** | Le nom que lui donne le restaurant. |
| `areaId` | string \| null | La [zone](https://developers.backresto.com/fr/docs/facilities) où elle se trouve. `null` dans un restaurant qui ne se découpe pas en zones. |
| `isDeleted` | boolean, **obligatoire** | Le soft delete propre à l'application. Lisez la note ci-dessous. |

```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
  }
}
```

**Il n'y a pas de seuils ici.** Contrairement à
l'[équipement](https://developers.backresto.com/fr/docs/facilities), une friteuse ne porte ni `min` ni `max` :
rien sur l'enregistrement ne dit ce qu'est un bon relevé d'huile. Qu'un
contrôle ait été acceptable ou non relève de l'appréciation du restaurant, et
la seule trace qu'il en reste est l'action qu'il a prise.

**`isDeleted` n'est pas le `deleted` de l'enveloppe.** Une friteuse que le
restaurant a retirée revient avec `isDeleted: true` et `deleted: false` :
toujours un enregistrement vivant, qui décrit une friteuse qui n'est plus en
service. Filtrez sur les deux, et gardez celles qui ont été retirées : de
vieux contrôles pointent encore vers elles.

## `fryer-checks`

Un contrôle sur une friteuse : ce que le test a montré, et ce qui en a été
fait.

| Champ | Type | Signification |
| --- | --- | --- |
| `timestamp` | string, **obligatoire** | Quand le contrôle a été fait, en millisecondes depuis l'epoch sous forme de chaîne de caractères. |
| `testValue` | string \| null | Ce que le test a montré, sous forme de texte. `null` quand rien n'a été mesuré. |
| `action` | string, **obligatoire** | Ce qui a été décidé pour l'huile : la filtrer, la changer, la laisser telle quelle. |
| `fryerEquipmentId` | string, **obligatoire** | La friteuse qui a été contrôlée. |
| `userId` | string \| null | Le [membre du personnel](https://developers.backresto.com/fr/docs/facilities) qui a fait le contrôle, quand l'application en a enregistré un. |

```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` est une chaîne de caractères, pas un nombre.** C'est ce qu'a
montré la bandelette ou la sonde, consigné sous forme de texte, et
l'enregistrement ne porte ni unité ni échelle : un restaurant qui utilise des
bandelettes et un autre qui utilise un mesureur de composés polaires
atterrissent tous les deux ici. Gardez-le sous forme de texte. Le convertir en
nombre flottant d'un restaurant à l'autre vous donne une colonne dont les
valeurs ne se comparent pas.

**`action` est du texte libre**, dans la langue du restaurant. Le schéma ne le
contraint pas : lisez la valeur plutôt que de la confronter à une liste à vous,
et n'en tirez pas une énumération à partir de ce que vous voyez dans les
données d'un seul restaurant.

## Ce que veut dire un contrôle sans valeur

`testValue` peut être `null` et `action` est obligatoire : c'est cette
asymétrie qu'il faut prendre en compte dans votre conception. Un contrôle peut
être enregistré comme une action prise sans aucune valeur mesurée derrière :
quelqu'un a changé l'huile parce qu'elle avait mauvaise allure, parce que
c'était la fin de la semaine, parce que la friteuse était nettoyée de toute
façon.

Un contrôle n'est donc pas une mesure. C'est une décision, parfois accompagnée
d'une mesure. Si vous construisez une table des relevés d'huile dans le temps,
attendez-vous à une bonne part de lignes sans rien dans la colonne de valeur,
et comptez-les plutôt que de les écarter : une action sans valeur reste un
contrôle qui a eu lieu.

## Travailler avec ces enregistrements

**Joignez sur `fryerEquipmentId`.** Un contrôle nomme sa friteuse et rien
d'autre ; le nom de la friteuse est sur `fryer-equipment`, que vous parcourez
séparément. Deux parcours, joints de votre côté.

**Faites vos rapports sur `capturedAt`, synchronisez sur `receivedAt`.** Une
tablette téléverse quand elle trouve du réseau : un contrôle fait à 09:00 peut
arriver à 14:00. [La page de l'enveloppe](https://developers.backresto.com/fr/docs/collections) raconte toute
l'histoire.

**L'absence ne prouve rien.** Une friteuse sans contrôle cette semaine n'a
peut-être pas été contrôlée, ou dort peut-être sur un appareil qui n'a pas
téléversé. Ne transformez pas un décompte en chiffre de conformité. Voyez
[la mise en garde](https://developers.backresto.com/fr/docs/support).
