# Fritadeiras

> As fritadeiras e os controlos de qualidade do óleo: duas coleções, e porque é que o valor medido pode faltar quando a decisão nunca falta.

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

O óleo de fritura degrada-se à medida que é utilizado e, a partir de certo
ponto, tem de ser filtrado ou deitado fora. O restaurante testa-o, decide o que
fazer, e regista as duas coisas. Duas coleções: as fritadeiras, e os controlos
feitos sobre elas.

| Coleção | Scope | O que é um registo |
| --- | --- | --- |
| `fryer-equipment` | `fryer-equipment:read` | Uma fritadeira. |
| `fryer-checks` | `fryer-checks:read` | Um controlo da qualidade do óleo numa delas, e o que foi decidido. |

As duas partilham o [envelope de snapshot](https://developers.backresto.com/pt/docs/collections): `id`,
`deleted`, `capturedAt`, `receivedAt`, `sequence` e os restantes ficam ao lado
do `data` descrito abaixo.

## `fryer-equipment`

As fritadeiras em si, tal como o restaurante as lista. Um registo curto: um
nome, uma posição na lista, e onde ela está.

| Campo | Tipo | Significado |
| --- | --- | --- |
| `index` | integer, **obrigatório** | A posição da fritadeira na lista, tal como a aplicação a ordena. |
| `name` | string, **obrigatório** | Como o restaurante lhe chama. |
| `areaId` | string \| null | A [zona](https://developers.backresto.com/pt/docs/facilities) em que está. `null` num restaurante que não se divide em zonas. |
| `isDeleted` | boolean, **obrigatório** | O soft delete da própria aplicação. Leia a nota abaixo. |

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

**Aqui não há limiares.** Ao contrário do [equipamento](https://developers.backresto.com/pt/docs/facilities), uma
fritadeira não traz `min` nem `max`: nada no registo diz o que é uma boa leitura
de óleo. Se um controlo foi aceitável é um juízo do restaurante, e o único
vestígio dele é a ação que tomaram.

**`isDeleted` não é o `deleted` do envelope.** Uma fritadeira que o restaurante
retirou volta com `isDeleted: true` e `deleted: false`: continua a ser um
registo vivo, que descreve uma fritadeira que já não está em serviço. Filtre
pelos dois, e guarde as retiradas: os controlos antigos ainda apontam para
elas.

## `fryer-checks`

Um controlo numa fritadeira: o que o teste mostrou, e o que foi feito a esse
respeito.

| Campo | Tipo | Significado |
| --- | --- | --- |
| `timestamp` | string, **obrigatório** | Quando o controlo foi feito, em milissegundos desde a época Unix, em forma de cadeia de caracteres. |
| `testValue` | string \| null | O que o teste mostrou, em texto. `null` quando não foi medido nada. |
| `action` | string, **obrigatório** | O que foi decidido quanto ao óleo: filtrá-lo, mudá-lo, deixá-lo como está. |
| `fryerEquipmentId` | string, **obrigatório** | A fritadeira que foi controlada. |
| `userId` | string \| null | O [funcionário](https://developers.backresto.com/pt/docs/facilities) que fez o controlo, quando a aplicação registou um. |

```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` é uma cadeia de caracteres, não um número.** É o que a tira ou a
sonda mostrou, registado como texto, e o registo não traz unidade nem escala:
um restaurante que use tiras de teste e outro que use um medidor de compostos
polares vão os dois parar aqui. Guarde-o como texto. Convertê-lo num número
decimal para comparar restaurantes dá-lhe uma coluna cujos valores não se
comparam entre si.

**`action` é texto livre** na língua do restaurante. O esquema não o restringe,
por isso leia o valor em vez de o comparar com uma lista sua, e não construa
uma enumeração a partir do que vê nos dados de um único restaurante.

## O que significa um controlo sem valor

`testValue` admite `null` e `action` é obrigatório, e é essa assimetria que
tem de ter em conta ao desenhar. Um controlo pode ser registado como uma ação
tomada sem qualquer valor medido por trás: alguém mudou o óleo porque parecia
mal, porque era o fim da semana, porque a fritadeira ia ser limpa de qualquer
maneira.

Ou seja, um controlo não é uma medição. É uma decisão, às vezes com uma medição
anexada. Se está a construir uma tabela de leituras de óleo ao longo do tempo,
conte com uma boa parte de linhas sem nada na coluna do valor, e conte-as em vez
de as deitar fora: uma ação sem valor continua a ser um controlo que aconteceu.

## Trabalhar com estes

**Una pelo `fryerEquipmentId`.** Um controlo identifica a sua fritadeira e mais
nada; o nome da fritadeira está em `fryer-equipment`, que percorre à parte. Dois
percursos, unidos do seu lado.

**Faça os relatórios por `capturedAt`, sincronize por `receivedAt`.** Um tablet
carrega quando encontra sinal, por isso um controlo feito às 09:00 pode chegar
às 14:00. [A página do envelope](https://developers.backresto.com/pt/docs/collections) conta a história toda.

**A ausência não prova nada.** Uma fritadeira sem controlo esta semana pode não
ter sido controlada, ou pode estar num dispositivo que ainda não carregou os
dados. Não transforme uma contagem destes num número de conformidade. Veja
[a nota de aviso](https://developers.backresto.com/pt/docs/support).
