# Fritteusen

> Die Fritteusen und die Prüfungen ihrer Ölqualität: zwei Collections, und warum der gemessene Wert fehlen kann, die Entscheidung aber nie.

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

Frittieröl verdirbt mit dem Gebrauch, und ab einem bestimmten Punkt muss es
gefiltert oder weggeworfen werden. Das Restaurant prüft es, entscheidet, was zu
tun ist, und erfasst beides. Zwei Collections: die Fritteusen und die
Kontrollen, die daran gemacht werden.

| Collection | Scope | Was ein Datensatz ist |
| --- | --- | --- |
| `fryer-equipment` | `fryer-equipment:read` | Eine Fritteuse. |
| `fryer-checks` | `fryer-checks:read` | Eine Prüfung der Ölqualität an einer von ihnen, und was entschieden wurde. |

Beide teilen sich den [Snapshot-Umschlag](https://developers.backresto.com/de/docs/collections): `id`, `deleted`,
`capturedAt`, `receivedAt`, `sequence` und der Rest stehen neben dem `data`, das
unten beschrieben ist.

## `fryer-equipment`

Die Fritteusen selbst, so wie das Restaurant sie auflistet. Ein kurzer
Datensatz: ein Name, eine Position in der Liste und wo sie steht.

| Feld | Typ | Bedeutung |
| --- | --- | --- |
| `index` | integer, **Pflicht** | Die Position der Fritteuse in der Liste, so wie die App sie ordnet. |
| `name` | string, **Pflicht** | Wie das Restaurant sie nennt. |
| `areaId` | string \| null | Der [Bereich](https://developers.backresto.com/de/docs/facilities), in dem sie steht. `null` bei einem Restaurant, das sich nicht in Bereiche aufteilt. |
| `isDeleted` | boolean, **Pflicht** | Das eigene Soft-Delete-Flag der App. Lesen Sie die Anmerkung unten. |

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

**Hier gibt es keine Schwellen.** Anders als ein [Gerät](https://developers.backresto.com/de/docs/facilities) trägt
eine Fritteuse kein `min` und kein `max`: Nichts im Datensatz sagt, was ein
guter Ölwert ist. Ob eine Kontrolle in Ordnung war, ist das Urteil des
Restaurants, und die einzige Spur davon ist die Maßnahme, die es ergriffen hat.

**`isDeleted` ist nicht das `deleted` des Umschlags.** Eine Fritteuse, die das
Restaurant entfernt hat, kommt mit `isDeleted: true` und `deleted: false`
zurück: weiterhin ein lebender Datensatz, der eine Fritteuse beschreibt, die
nicht mehr im Einsatz ist. Filtern Sie auf beides und behalten Sie die
entfernten: Alte Kontrollen zeigen weiterhin auf sie.

## `fryer-checks`

Eine Kontrolle an einer Fritteuse: was die Prüfung ergeben hat und was daraufhin
getan wurde.

| Feld | Typ | Bedeutung |
| --- | --- | --- |
| `timestamp` | string, **Pflicht** | Wann die Kontrolle gemacht wurde, als String mit Millisekunden seit Epoch. |
| `testValue` | string \| null | Was die Prüfung ergeben hat, als Text. `null`, wenn nichts gemessen wurde. |
| `action` | string, **Pflicht** | Was über das Öl entschieden wurde: es filtern, es wechseln, es so lassen. |
| `fryerEquipmentId` | string, **Pflicht** | Die Fritteuse, die geprüft wurde. |
| `userId` | string \| null | Der [Mitarbeiter](https://developers.backresto.com/de/docs/facilities), der die Kontrolle gemacht hat, sofern die App einen erfasst hat. |

```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` ist ein String, keine Zahl.** Es ist, was der Teststreifen oder
der Messfühler angezeigt hat, als Text erfasst, und der Datensatz trägt weder
Einheit noch Skala: Ein Restaurant mit Teststreifen und eines mit einem
Messgerät für polare Anteile landen beide hier. Behalten Sie es als Text. Wer
es über Restaurants hinweg in einen Float parst, bekommt eine Spalte, deren
Werte nicht vergleichbar sind.

**`action` ist Freitext** in der Sprache des Restaurants. Das Schema schränkt es
nicht ein, lesen Sie den Wert also, statt ihn gegen eine eigene Liste
abzugleichen, und bauen Sie kein Enum aus dem, was Sie in den Daten eines
einzelnen Restaurants sehen.

## Was eine Kontrolle ohne Wert bedeutet

`testValue` darf `null` sein und `action` ist Pflicht, und um diese Ungleichheit
herum sollten Sie entwerfen. Eine Kontrolle kann als ergriffene Maßnahme ohne
gemessenen Wert dahinter erfasst werden: Jemand hat das Öl gewechselt, weil es
falsch aussah, weil das Wochenende bevorstand, weil die Fritteuse ohnehin
gereinigt wurde.

Eine Kontrolle ist also keine Messung. Sie ist eine Entscheidung, manchmal mit
einer Messung daran. Wenn Sie eine Tabelle der Ölwerte über die Zeit bauen,
rechnen Sie mit einem guten Teil Zeilen, in denen die Wertspalte leer ist, und
zählen Sie sie, statt sie wegzulassen: Eine Maßnahme ohne Wert ist trotzdem
eine Kontrolle, die stattgefunden hat.

## Damit arbeiten

**Verbinden Sie über `fryerEquipmentId`.** Eine Kontrolle benennt ihre Fritteuse
und sonst nichts; der Name der Fritteuse steht in `fryer-equipment`, das Sie
getrennt durchlaufen. Zwei Durchläufe, auf Ihrer Seite verbunden.

**Für Berichte `capturedAt`, für den Abgleich `receivedAt`.** Ein Tablet lädt
hoch, sobald es Empfang findet; eine Kontrolle um 09:00 Uhr kann also um
14:00 Uhr ankommen. [Die Seite zum Umschlag](https://developers.backresto.com/de/docs/collections) erzählt die
ganze Geschichte.

**Abwesenheit beweist nichts.** Eine Fritteuse ohne Kontrolle in dieser Woche
wurde vielleicht nicht kontrolliert oder liegt auf einem Gerät, das noch nicht
hochgeladen hat. Machen Sie aus einer Anzahl davon keine Compliance-Kennzahl
(siehe [die Anmerkung zur Vollständigkeit](https://developers.backresto.com/de/docs/support)).
