# Friggitrici

> Le friggitrici e i loro controlli sulla qualità dell'olio: due collezioni, e perché il valore misurato può mancare mentre la decisione non manca mai.

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

L'olio di frittura si degrada con l'uso, e oltre un certo punto deve essere
filtrato o buttato. Il ristorante lo analizza, decide cosa fare, e registra
entrambe le cose. Due collezioni: le friggitrici, e i controlli effettuati su
di esse.

| Collezione | Scope | Che cos'è un record |
| --- | --- | --- |
| `fryer-equipment` | `fryer-equipment:read` | Una friggitrice. |
| `fryer-checks` | `fryer-checks:read` | Un controllo della qualità dell'olio su una di esse, e cosa è stato deciso. |

Entrambe condividono l'[involucro di snapshot](https://developers.backresto.com/it/docs/collections): `id`,
`deleted`, `capturedAt`, `receivedAt`, `sequence` e gli altri stanno accanto al
`data` descritto qui sotto.

## `fryer-equipment`

Le friggitrici stesse, come le elenca il ristorante. Un record breve: un nome,
una posizione nell'elenco, e dove si trova.

| Campo | Tipo | Significato |
| --- | --- | --- |
| `index` | integer, **obbligatorio** | La posizione della friggitrice nell'elenco, nell'ordine in cui le dispone l'app. |
| `name` | string, **obbligatorio** | Come la chiama il ristorante. |
| `areaId` | string \| null | L'[area](https://developers.backresto.com/it/docs/facilities) in cui si trova. `null` in un ristorante che non si suddivide in aree. |
| `isDeleted` | boolean, **obbligatorio** | Il soft delete proprio dell'app. Legga la nota qui sotto. |

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

**Qui non ci sono soglie.** A differenza delle
[apparecchiature](https://developers.backresto.com/it/docs/facilities), una friggitrice non porta alcun `min` e
alcun `max`: niente nel record dice quale sia una buona lettura dell'olio. Se un
controllo sia stato accettabile è un giudizio del ristorante, e l'unica traccia
che ne resta è l'azione che ha intrapreso.

**`isDeleted` non è il `deleted` dell'involucro.** Una friggitrice che il
ristorante ha rimosso torna con `isDeleted: true` e `deleted: false`: è ancora
un record vivo, che descrive una friggitrice non più in servizio. Filtri su
entrambi, e conservi quelle rimosse: i vecchi controlli le indicano ancora.

## `fryer-checks`

Un controllo su una friggitrice: cosa ha mostrato il test, e cosa è stato fatto
di conseguenza.

| Campo | Tipo | Significato |
| --- | --- | --- |
| `timestamp` | string, **obbligatorio** | Quando è stato effettuato il controllo, millisecondi dall'epoch come stringa. |
| `testValue` | string \| null | Cosa ha mostrato il test, come testo. `null` quando non è stato misurato nulla. |
| `action` | string, **obbligatorio** | Cosa è stato deciso sull'olio: filtrarlo, cambiarlo, lasciarlo com'è. |
| `fryerEquipmentId` | string, **obbligatorio** | La friggitrice controllata. |
| `userId` | string \| null | Il [membro del personale](https://developers.backresto.com/it/docs/facilities) che ha effettuato il controllo, quando l'app ne ha registrato 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` è una stringa, non un numero.** È ciò che ha mostrato la striscia
o la sonda, registrato come testo, e il record non porta né unità né scala: un
ristorante che usa strisce reattive e uno che usa un misuratore di composti
polari finiscono entrambi qui. Lo tenga come testo. Convertirlo in un float su
ristoranti diversi le dà una colonna i cui valori non sono confrontabili tra
loro.

**`action` è testo libero** nella lingua del ristorante. Lo schema non lo
vincola, quindi legga il valore anziché confrontarlo con un elenco suo, e non
costruisca un enum a partire da quello che vede nei dati di un solo ristorante.

## Cosa significa un controllo senza valore

`testValue` ammette null e `action` è obbligatorio, e quell'asimmetria è la cosa
attorno a cui progettare. Un controllo può essere registrato come un'azione
intrapresa senza alcun valore misurato dietro: qualcuno ha cambiato l'olio
perché sembrava sbagliato, perché era fine settimana, perché la friggitrice
veniva comunque pulita.

Quindi un controllo non è una misurazione. È una decisione, a volte con una
misurazione allegata. Se sta costruendo una tabella delle letture dell'olio nel
tempo, si aspetti una buona quota di righe senza nulla nella colonna del valore,
e le conti anziché scartarle: un'azione senza valore è comunque un controllo
che è avvenuto.

## Lavorare con questi dati

**Unisca su `fryerEquipmentId`.** Un controllo indica la sua friggitrice e
nient'altro; il nome della friggitrice sta su `fryer-equipment`, che percorre
separatamente. Due percorsi, uniti dalla sua parte.

**Faccia i report su `capturedAt`, sincronizzi su `receivedAt`.** Un tablet
carica i dati quando trova segnale, quindi un controllo effettuato alle 09:00
può arrivare alle 14:00. [La pagina sull'involucro](https://developers.backresto.com/it/docs/collections) racconta
tutta la storia.

**L'assenza non prova nulla.** Una friggitrice senza controlli questa settimana
può non essere stata controllata, oppure può trovarsi su un dispositivo che non
ha caricato i dati. Non trasformi un conteggio di questi record in un dato di
conformità. Veda [l'avvertenza](https://developers.backresto.com/it/docs/support).
