Katalog

Lieferanten, Produkte und eigene Zubereitungen — die Referenzlisten, auf die der Rest der Datensätze zeigt.

Der Katalog ist das, wovon ein Restaurant eine Liste führt, statt es zu messen: wer liefert, was durch die Tür kommt und was die Küche selbst macht. Nichts hier ist eine Kontrolle oder eine Messung. Das sind die Zeilen, die alles andere benennt, sie sind also meist das Erste, was Sie laden, und das Letzte, was sich ändert.

CollectionBerechtigungWas ein Datensatz ist
supplierssuppliers:readEin Unternehmen, das liefert, und wie man es erreicht.
productsproducts:readEtwas, das das Restaurant annimmt und verwendet, mit Namen.
preparationspreparations:readEtwas, das die Küche macht, mit Haltbarkeit und Allergenen.

Alle drei teilen sich den Snapshot-Umschlag: id, deleted, capturedAt, receivedAt, sequence und der Rest stehen neben dem data, das unten beschrieben ist.

suppliers

Ein Datensatz pro Lieferant, den das Restaurant eingetragen hat, ganz gleich, ob zuletzt etwas von ihm gekommen ist.

FeldTypBedeutung
namestring, PflichtDer Lieferant, so wie das Restaurant ihn nennt. Freitext, kein Handelsregister.
isDeletedboolean, PflichtDas eigene Kennzeichen der App für ausgemusterte Einträge. Nicht das deleted des Umschlags — siehe unten.
contactMethodsobject[]Wie man ihn erreicht. Jeder Eintrag ist { "type": string, "value": string }.
accountNumberstring | nullDie Kundennummer des Restaurants bei diesem Lieferanten, sofern eine eingetragen wurde.
{
  "id": "1f3c2a76-5b94-4b0e-9c1a-6d8f0a2e7b31",
  "collection": "suppliers",
  "deleted": false,
  "capturedAt": "1789431600214",
  "receivedAt": "1789431604771",
  "sequence": "412",
  "data": {
    "name": "Metro Nanterre",
    "isDeleted": false,
    "contactMethods": [
      { "type": "phone", "value": "+33 1 41 20 30 40" },
      { "type": "email", "value": "commandes@example.test" }
    ],
    "accountNumber": "FR-884213"
  }
}

contactMethods[].type ist kein Enum. Das Schema sagt string und hört auf, und die Werte oben sind eine Veranschaulichung, keine Liste. Verzweigen Sie darauf mit einem Standardfall und zeigen Sie den value, wie auch immer der type geschrieben ist.

Eine Lieferung bettet ihren Lieferanten als { id, name } direkt ein — genug für den Bildschirm und nicht mehr. In dieser Collection stehen die Kundennummer und die Telefonnummer.

products

Was das Restaurant annimmt und verwendet. Der Datensatz ist so dünn, wie er aussieht.

FeldTypBedeutung
namestring, PflichtDas Produkt, so wie das Restaurant es benannt hat.
isDeletedboolean, PflichtDas Kennzeichen der App für ausgemusterte Einträge. Siehe unten.
{
  "id": "6b0d4ea2-91c7-4f3d-a0be-2c5f7d1e8a44",
  "collection": "products",
  "deleted": false,
  "capturedAt": "1789431980551",
  "receivedAt": "1789432001903",
  "sequence": "413",
  "data": {
    "name": "Beurre doux 250 g",
    "isDeleted": false
  }
}

Das ist der ganze Datensatz: keine Referenz, keine Kategorie, keine Einheit, kein Lieferant. Wenn Ihr Modell etwas davon braucht, halten Sie es selbst, geschlüsselt auf das id des Umschlags.

Nichts sonst zeigt über eine Kennung auf ein Produkt. Eine Lieferung erfasst das Gemessene als temperatureRecords[].product, Freitext, während der Kontrolle getippt — siehe Lieferungen. Das mit dieser Liste abzugleichen ist Arbeit an Zeichenketten auf Ihrer Seite, und „Beurre doux 250 g“ ist nicht „beurre doux“. Tun Sie es, wenn es sein muss, aber geben Sie das Ergebnis nicht als Join aus.

preparations

Etwas, das im Haus gemacht wird, statt angenommen zu werden — eine Sauce, ein Fond, eine Terrine.

FeldTypBedeutung
namestring, PflichtDie Zubereitung, so wie die Küche sie nennt.
lifespannumber, PflichtWie lange sie hält. Eine nackte Zahl.
allergensstring[]Was sie enthält. Freie Zeichenketten, keine geschlossene Menge.
isDeletedboolean, PflichtDas Kennzeichen der App für ausgemusterte Einträge. Siehe unten.
{
  "id": "c47e8b13-0a52-4d96-8f1b-73ae2905cd6f",
  "collection": "preparations",
  "deleted": false,
  "capturedAt": "1789455120087",
  "receivedAt": "1789455133642",
  "sequence": "418",
  "data": {
    "name": "Sauce béarnaise",
    "lifespan": 3,
    "allergens": ["oeuf", "lait"],
    "isDeleted": false
  }
}

lifespan trägt keine Einheit. Das Schema gibt Ihnen eine Zahl und nichts, womit Sie sie deuten könnten. Drucken Sie nicht „3 Tage“, weil drei nach Tagen aussieht — klären Sie, was die App für das Restaurant damit meint, das Sie lesen, und schreiben Sie es klar dazu, wenn Sie es nicht klären können.

allergens ist eine Liste von Zeichenketten, keine Liste aus einer Verordnung. Die Einträge kommen aus der App, in der Sprache des Restaurants. Bilden Sie sie nicht auf die vierzehn benannten Allergene ab, ohne zu prüfen, was die Zeichenketten tatsächlich sagen, und behandeln Sie ein leeres Array nicht als bestandene Allergenprüfung — es heißt auch, dass niemand es ausgefüllt hat.

isDeleted ist nicht deleted

Jede Collection auf dieser Seite trägt beides, sie bedeuten Verschiedenes, und wer nur auf eines davon filtert, bekommt eine falsche Liste.

  • deleted, auf dem Umschlag, ist die Löschmarkierung der Schattenkopie. true heißt, dass der Datensatz in der App gelöscht wurde und data weg ist. So erfahren Sie, dass etwas verschwunden ist — die Seite zum Umschlag hat die Regeln.
  • isDeleted, innerhalb von data, ist das eigene Kennzeichen der App für die weiche Löschung der Zeile. Der Datensatz ist weiterhin da, hat weiterhin seinen Namen und kommt weiterhin mit deleted: false an. Das Restaurant hat ihn ausgemustert: Es bietet ihn in Auswahllisten nicht mehr an und hat ihn behalten, damit alte Datensätze sich weiterhin auflösen lassen.

Filtern Sie also auf beides. Beachten Sie nur deleted, füllt sich Ihre Lieferantenliste mit Lieferanten, die das Restaurant vor zwei Jahren fallen gelassen hat. Beachten Sie nur isDeleted, behalten Sie Zeilen, die ganz gelöscht wurden, denn eine Löschmarkierung hat kein data, aus dem sich das Kennzeichen lesen ließe.

Behalten Sie die ausgemusterten Zeilen trotzdem, statt sie wegzuwerfen. Eine Lieferung vom vergangenen März benennt weiterhin einen Lieferanten, der heute isDeleted: true ist, und diesen Namen aufzulösen ist der ganze Grund, aus dem Sie diese Liste halten.

Den Katalog lesen

Diese drei sind klein, ändern sich langsam und werden von fast allem anderen gebraucht; das macht sie zum billigen Teil eines Abgleichs und zu dem Teil, bei dem man leicht unauffällig danebenliegt.

  • Durchlaufen Sie sie zuerst, behalten Sie sie, frischen Sie sie nach Plan auf. Der ganze Katalog eines Restaurants sind bei limit=100 eine Handvoll Seiten. Halten Sie ihn in Ihrem eigenen Speicher, geschlüsselt auf das id des Umschlags, und lösen Sie Namen von dort auf, statt pro Datensatz abzurufen.
  • Namen ändern sich, Kennungen nicht. name ist Freitext, den das Restaurant während des Betriebs bearbeitet. Speichern Sie das id als Ihren Schlüssel und behandeln Sie den Namen als Beschriftung, die Sie auffrischen — nie als etwas, worüber Sie verbinden.
  • Auch hier ist Abwesenheit mehrdeutig. Ein Lieferant, der nicht auftaucht, wurde vielleicht nie eingetragen oder hat uns noch nicht erreicht. Lesen Sie die Anmerkung dazu, bevor Sie eine Anzahl melden.

Zuletzt aktualisiert am 2026-09-20.