Livraisons
L'enregistrement du contrôle à réception — chaque champ, son type, et ce qu'il signifie sur le terrain.
Une livraison est un contrôle à réception : un membre du personnel qui réceptionne une commande, relève des températures, et décide de l'accepter ou non. C'est l'enregistrement que demande un inspecteur de la sécurité alimentaire.
Les deux endpoints exigent la portée deliveries:read sur le restaurant présent
dans le chemin.
Les livraisons sont la seule ressource façonnée à la main ici : un objet conçu pour vous, immuable une fois enregistré, listé par plage de temps. Tout le reste de ce que l'application enregistre — températures de cuisson et de refroidissement, nettoyage, étiquettes — passe par les collections, qui partagent à la place une seule enveloppe générique.
Lister les livraisons
GET /v1/restaurants/{restaurantId}/deliveries?from=…&to=…&limit=…&cursor=…
Renvoie { "data": Delivery[], "nextCursor": string | null }, les plus récentes
d'abord. Voyez Pagination pour les règles de plage et pour
le curseur.
Récupérer une livraison
GET /v1/restaurants/{restaurantId}/deliveries/{deliveryId}
Renvoie un seul Delivery, ou 404 si l'identifiant est inconnu ou si la
clé ne détient aucune autorisation pour ce restaurant.
L'objet livraison
| Champ | Type | Signification |
|---|---|---|
id | string | Identifiant stable de la livraison, unique au sein du restaurant. |
restaurantId | string | Le restaurant auquel l'enregistrement appartient. Reprend le chemin. |
occurredAt | string | Quand le contrôle a eu lieu, en millisecondes depuis l'epoch, sous forme de chaîne de caractères. |
isCompliant | boolean | Le verdict du membre du personnel sur la livraison dans son ensemble. |
supplier | object | null | { "id": string, "name": string }, ou null quand la livraison a été enregistrée sans fournisseur. |
temperatureRecords | array | Une entrée par produit mesuré. Voir ci-dessous. |
nonComplianceReasons | string[] | Pourquoi la livraison a été refusée ou acceptée avec réserve. Texte libre choisi par le membre du personnel ; vide quand la livraison est conforme. |
correctiveActions | string[] | Ce qui a été fait en réponse. Vide quand rien n'était nécessaire. |
commentary | string | null | Note en texte libre. Souvent null. |
imageCount | integer | Combien de photographies sont attachées. 0 signifie que l'endpoint images n'a rien à renvoyer. |
temperatureRecords[]
| Champ | Type | Signification |
|---|---|---|
product | string | Ce qui a été mesuré, tel que le membre du personnel l'a nommé. Jamais vide. |
value | number | null | Le relevé. null quand le produit a été consigné sans mesure. |
unit | "C" | Toujours des degrés Celsius. Présent pour qu'un consommateur n'ait jamais à le supposer. |
lotNumber | string | null | Le lot ou le numéro de lot, quand il a été saisi. |
Le lire correctement
isCompliant est l'enregistrement, pas un calcul. C'est ce qu'a décidé la
personne qui a réceptionné la livraison, et cela peut diverger de ce que vous
concluriez des seules températures — une mesure prise avec une sonde de surface,
un produit qui a son propre seuil, une appréciation. Présentez-le comme leur
verdict. Si vous voulez le vôtre, calculez-le à côté du leur et indiquez qu'il
est de vous.
Les champs en texte libre sont du texte libre. nonComplianceReasons,
correctiveActions et product sont saisis par le personnel pendant le
service, dans la langue du restaurant, avec l'orthographe d'un mardi chargé.
N'en tirez pas une énumération, n'en faites pas la clé d'une jointure, et ne
supposez pas que c'est du français.
value peut être null. Un produit consigné sans relevé est normal — c'est
souvent une denrée sèche. Traitez null comme « non mesuré », jamais comme 0.
Les horodatages sont des chaînes de caractères. occurredAt est une chaîne
de caractères en millisecondes depuis l'epoch, en notation décimale, parce que
toute la plateforme BackResto stocke les horodatages ainsi.
Number(occurredAt) est sûr aujourd'hui et pour les quelques centaines de
milliers d'années à venir, mais ne laissez pas un analyseur JSON le convertir
silencieusement pour le réécrire ensuite avec une précision perdue.
Exemple
{
"id": "8f2c1b04-0d5a-4b7e-9f31-6ad2c0e77a51",
"restaurantId": "restaurant-1",
"occurredAt": "1787932800000",
"isCompliant": false,
"supplier": { "id": "supplier-7", "name": "Metro Nord" },
"temperatureRecords": [
{ "product": "Poulet fermier", "lotNumber": "L2291", "unit": "C", "value": 6.4 },
{ "product": "Farine T55", "lotNumber": null, "unit": "C", "value": null }
],
"nonComplianceReasons": ["Température trop élevée"],
"correctiveActions": ["Produit refusé", "Fournisseur prévenu"],
"commentary": "Camion en retard, rupture de chaîne du froid probable",
"imageCount": 2
}