Consegne
Il record del controllo in accettazione — ogni campo, il suo tipo e cosa significa sul campo.
Una consegna è un controllo in accettazione: un membro del personale che riceve un ordine, registra le temperature e decide se accettarlo. È il registro che chiede un ispettore della sicurezza alimentare.
Entrambi gli endpoint richiedono l'ambito deliveries:read sul ristorante
indicato nel percorso.
Le consegne sono l'unica risorsa modellata a mano qui: un oggetto progettato, immutabile una volta registrato, elencato per intervallo di tempo. Tutto il resto che l'app registra — temperature di cottura e raffreddamento, pulizie, etichette — passa dalle collezioni, che condividono invece un unico involucro generico.
Elencare le consegne
GET /v1/restaurants/{restaurantId}/deliveries?from=…&to=…&limit=…&cursor=…
Restituisce { "data": Delivery[], "nextCursor": string | null }, dal più
recente. Veda Paginazione per le regole sull'intervallo e
per il cursore.
Recuperare una consegna
GET /v1/restaurants/{restaurantId}/deliveries/{deliveryId}
Restituisce un singolo Delivery, oppure 404 se l'identificatore è
sconosciuto oppure la chiave non ha alcuna concessione per quel ristorante.
L'oggetto consegna
| Campo | Tipo | Significato |
|---|---|---|
id | stringa | Identificatore stabile della consegna, univoco all'interno del ristorante. |
restaurantId | stringa | Il ristorante a cui appartiene il record. Ripete il percorso. |
occurredAt | stringa | Quando è avvenuto il controllo, in millisecondi dall'epoch come stringa. |
isCompliant | booleano | Il verdetto del membro del personale sulla consegna nel suo insieme. |
supplier | oggetto | null | { "id": string, "name": string }, oppure null quando la consegna è stata registrata senza. |
temperatureRecords | array | Una voce per ogni prodotto misurato. Veda più sotto. |
nonComplianceReasons | array di stringhe | Perché la consegna è stata rifiutata o accettata con riserva. Testo libero scelto dal membro del personale; vuoto quando è conforme. |
correctiveActions | array di stringhe | Cosa è stato fatto al riguardo. Vuoto quando non serviva nulla. |
commentary | stringa | null | Nota in testo libero. Spesso null. |
imageCount | intero | Quante fotografie sono allegate. 0 significa che l'endpoint delle immagini non ha nulla da restituire. |
temperatureRecords[]
| Campo | Tipo | Significato |
|---|---|---|
product | stringa | Cosa è stato misurato, come lo ha chiamato il membro del personale. Mai vuoto. |
value | numero | null | La lettura. null quando il prodotto è stato registrato senza una misurazione. |
unit | "C" | Sempre Celsius. Presente perché chi consuma i dati non debba mai fare supposizioni. |
lotNumber | stringa | null | Il lotto o la partita, quando è stato acquisito. |
Leggerlo correttamente
isCompliant è il registro, non un calcolo. È ciò che ha deciso la persona
che ha ricevuto la consegna, e può non coincidere con quello che concluderebbe
lei dalle sole temperature — una lettura presa con una sonda di superficie, un
prodotto con una soglia propria, una valutazione discrezionale. Lo presenti come
il loro verdetto. Se ne vuole uno suo, lo calcoli accanto al loro e lo etichetti
come suo.
I campi in testo libero sono testo libero. nonComplianceReasons,
correctiveActions e product vengono digitati dal personale durante il
servizio, nella lingua del ristorante, con l'ortografia di un martedì di corsa.
Non ne costruisca un enum, non ci basi sopra la chiave di una join, e non dia
per scontato il francese.
value può essere null. Un prodotto registrato senza una lettura è
normale — spesso è un prodotto secco. Tratti null come «non misurato», mai
come 0.
I timestamp sono stringhe. occurredAt è una stringa decimale di
millisecondi dall'epoch, perché l'intera piattaforma BackResto memorizza così i
timestamp. Number(occurredAt) è sicuro oggi e per le prossime centinaia di
migliaia di anni, ma non lasci che un parser JSON lo converta in silenzio e poi
lo riscriva con la precisione persa.
Esempio
{
"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
}