# Rückverfolgbarkeitsetiketten

> Die Zweitetiketten, die Mitarbeiter drucken und auf einen Behälter kleben, mit der gedruckten Datei daran und einer Gruppenkennung pro Druckvorgang.

Source: https://developers.backresto.com/de/docs/traceability-labels

Wenn ein Behälter geöffnet oder eine Zubereitung gemacht wird, drucken die
Mitarbeiter ein Etikett und kleben es auf: was es ist, woher es kam, wann es
geöffnet wurde, wann es weg muss. Das sind die Zweitetiketten zur Haltbarkeit,
die ein Kontrolleur in der Hand umdreht, und diese Collection ist der Datensatz
jedes einzelnen gedruckten Etiketts, mit der gedruckten Datei daran.

| Collection | Scope | Was ein Datensatz ist |
| --- | --- | --- |
| `traceability-labels` | `traceability-labels:read` | Ein Etikett, das gedruckt wurde, und die Datei, die gedruckt wurde. |

Sie teilt sich den [Snapshot-Umschlag](https://developers.backresto.com/de/docs/collections): `id`, `deleted`,
`capturedAt`, `receivedAt`, `sequence` und der Rest stehen um das `data`
darunter herum.

## `traceability-labels`

| Feld | Typ | Bedeutung |
| --- | --- | --- |
| `timestamp` | string, **Pflicht** | Wann das Etikett gedruckt wurde, als String mit Millisekunden seit Epoch. |
| `supplier` | string \| null | Wer geliefert hat, worauf das Etikett klebt. Freitext. |
| `part` | number \| null | Nicht dokumentiert. Eine Dezimalzahl, keine ganze Zahl. Lesen Sie die Anmerkung unten, bevor Sie es verwenden. |
| `commentary` | string \| null | Eine Notiz, beim Drucken getippt. Freitext. |
| `groupId` | string \| null | Der Druckvorgang, zu dem dieses Etikett gehört. |
| `userId` | string \| null | Der [Mitarbeiter](https://developers.backresto.com/de/docs/facilities), der es gedruckt hat, sofern die App einen behalten hat. |
| `asset` | object, **Pflicht** | Die Datei, die gedruckt wurde. Lesen Sie den nächsten Abschnitt. |

```json
{
  "id": "0c6a4f2b-9e17-4d50-8b3c-1f7d5a2e9046",
  "collection": "traceability-labels",
  "deleted": false,
  "capturedAt": "1789786412903",
  "receivedAt": "1789786500117",
  "sequence": "2048",
  "data": {
    "timestamp": "1789786380000",
    "supplier": "Metro",
    "part": 1.5,
    "commentary": "Bac 3, ouvert ce matin",
    "groupId": "5e8b1c47-2a90-4f63-b1d8-6c04e7a3f215",
    "userId": "b3f7c1a0-5d42-4e88-9a16-7c0e2d4b9f31",
    "asset": {
      "objectKey": "restaurants/36eaa3fa/labels/c58d10b7e4a9",
      "status": "uploaded",
      "contentType": "image/jpeg",
      "byteLength": 48210,
      "sha256": "3c9e…"
    }
  }
}
```

**`supplier` ist ein Name, keine Referenz.** Es ist Text, nicht die Kennung
eines [Lieferanten](https://developers.backresto.com/de/docs/catalogue), und nichts hält die beiden im
Gleichschritt: Ein im Katalog umbenannter Lieferant schreibt keine Etiketten um,
die letzten Monat gedruckt wurden. Gleichen Sie darauf ab, wenn es sein muss,
aber behandeln Sie einen Treffer als Vermutung und einen Fehlschlag als normal.

## Die Datei

Jedes Etikett trägt eine: `data.asset` sagt, dass eine Datei existiert, und die
Bytes kommen vom Assets-Endpunkt.

```http
GET /v1/restaurants/{restaurantId}/collections/traceability-labels/records/{recordId}/assets
```

Er antwortet mit signierten URLs, die **fünfzehn Minuten** gültig sind, jede mit
ihrer eigenen Autorisierung, sodass der Download keinen Header braucht. Die
vollständigen Regeln (wie die Antwort aussieht, warum `sha256` Ihnen einen
Download erspart, warum Sie die Bytes speichern und nicht den Link) stehen auf
[der Collections-Seite](https://developers.backresto.com/de/docs/collections). Zwei Dinge lohnt es sich hier
trotzdem zu sagen.

**`asset` beschreibt die Datei; herausgeben tut sie nur der Endpunkt.** Es trägt
`objectKey`, `status`, `contentType`, `byteLength` und `sha256`, aber keine
URL: Ein Link, der nie abläuft, wäre ein dauerhafter unauthentifizierter Weg in
die Aufzeichnungen eines Restaurants. Verzweigen Sie auf `status`: `uploaded`
heißt, dass die Bytes angekommen und geprüft sind, `pending` heißt, dass ein
Gerät sie noch sendet, und ein Asset mit `pending` fehlt beim Assets-Endpunkt
mit Absicht. Es ist nicht defekt.

**Ein gedrucktes Etikett ist nicht zwingend ein Bild.** Lesen Sie den
`contentType`, den der Assets-Endpunkt Ihnen gibt, statt ein Foto anzunehmen,
und benennen Sie auf dem Weg in Ihren eigenen Speicher nicht alles `.jpg`.

## Gemeinsam gedruckte Etiketten

`groupId` ist das Feld, das aus einem Strom von Etiketten wieder etwas macht,
das ein Mensch wiedererkennt. Wenn Mitarbeiter einen Stapel drucken (mehrere
Etiketten für mehrere Behälter derselben Zubereitung, in einem Rutsch), trägt
jedes Etikett dieses Vorgangs dieselbe `groupId`. Gruppieren Sie darauf, bevor
Sie etwas anzeigen: Ein Druckvorgang ist ein Ereignis in einem Verlauf, nicht
acht.

`part` ist das Feld, dessen Bedeutung wir Ihnen noch nicht sagen können, und das
sagen wir lieber, als dass Sie falsch raten. Es ist eine **Dezimalzahl**, kein
Zähler, was die naheliegende Lesart „Etikett 3 von 8“ ausschließt und eher auf
eine Portion oder eine Menge hindeutet, aber nichts im Schema sagt das, und wir
tun nicht so, als wüssten wir es. Führen Sie es unverändert mit, zeigen Sie es
roh an, wenn es sein muss, und [fragen Sie uns](https://developers.backresto.com/de/docs/support), wenn Ihre
Integration davon abhängt: Die Antwort ist ein Gespräch mit den Leuten, die den
Etikettenbildschirm gebaut haben.

Beide dürfen `null` sein. Ein einzeln gedrucktes Etikett kann ohne beides
ankommen, und das ist ein Druckvorgang mit einem einzigen Etikett und kein
kaputter Datensatz: Greifen Sie auf die `id` des Umschlags zurück und zeigen Sie
es allein.
